From 5f49ce35474022acf979c71fb71fe216f590fdbd Mon Sep 17 00:00:00 2001 From: murat Date: Tue, 14 Jan 2025 00:26:09 +0300 Subject: [PATCH] scrollback patch FiraMono Nerd Font size=9 --- config.def.h | 6 +- config.def.h.orig | 54 +- patches/st-scrollback-0.9.2.diff | 351 ++++ patches/st-scrollback-mouse-0.9.2.diff | 25 + st | Bin 101472 -> 101672 bytes st.c | 125 +- st.c.orig | 2678 ++++++++++++++++++++++++ st.h | 2 + st.o | Bin 78600 -> 81488 bytes x.o | Bin 73552 -> 73880 bytes 10 files changed, 3183 insertions(+), 58 deletions(-) create mode 100644 patches/st-scrollback-0.9.2.diff create mode 100644 patches/st-scrollback-mouse-0.9.2.diff create mode 100644 st.c.orig diff --git a/config.def.h b/config.def.h index 01f5efc..45f48ad 100644 --- a/config.def.h +++ b/config.def.h @@ -5,7 +5,7 @@ * * font: see http://freedesktop.org/software/fontconfig/fontconfig-user.html */ -static char *font = "Liberation Mono:pixelsize=12:antialias=true:autohint=true"; +static char *font = "FiraMono Nerd Font:size=9:antialias=true:autohint=true"; static int borderpx = 2; /* @@ -168,6 +168,8 @@ static uint forcemousemod = ShiftMask; */ static MouseShortcut mshortcuts[] = { /* mask button function argument release */ + { 0, Button4, kscrollup, {.i = 1} }, + { 0, Button5, kscrolldown, {.i = 1} }, { XK_ANY_MOD, Button2, selpaste, {.i = 0}, 1 }, { ShiftMask, Button4, ttysend, {.s = "\033[5;2~"} }, { XK_ANY_MOD, Button4, ttysend, {.s = "\031"} }, @@ -193,6 +195,8 @@ static Shortcut shortcuts[] = { { TERMMOD, XK_Y, selpaste, {.i = 0} }, { ShiftMask, XK_Insert, selpaste, {.i = 0} }, { TERMMOD, XK_Num_Lock, numlock, {.i = 0} }, + { ShiftMask, XK_Page_Up, kscrollup, {.i = -1} }, + { ShiftMask, XK_Page_Down, kscrolldown, {.i = -1} }, }; /* diff --git a/config.def.h.orig b/config.def.h.orig index 2cd740a..1d23807 100644 --- a/config.def.h.orig +++ b/config.def.h.orig @@ -95,43 +95,35 @@ unsigned int tabspaces = 8; /* Terminal colors (16 first used in escape sequence) */ static const char *colorname[] = { - /* 8 normal colors */ - "black", - "red3", - "green3", - "yellow3", - "blue2", - "magenta3", - "cyan3", - "gray90", + /* 8 normal colors */ + [0] = "#282828", /* hard contrast: #1d2021 / soft contrast: #32302f */ + [1] = "#cc241d", /* red */ + [2] = "#98971a", /* green */ + [3] = "#d79921", /* yellow */ + [4] = "#458588", /* blue */ + [5] = "#b16286", /* magenta */ + [6] = "#689d6a", /* cyan */ + [7] = "#a89984", /* white */ - /* 8 bright colors */ - "gray50", - "red", - "green", - "yellow", - "#5c5cff", - "magenta", - "cyan", - "white", - - [255] = 0, - - /* more colors can be added after 255 to use with DefaultXX */ - "#cccccc", - "#555555", - "gray90", /* default foreground colour */ - "black", /* default background colour */ + /* 8 bright colors */ + [8] = "#928374", /* black */ + [9] = "#fb4934", /* red */ + [10] = "#b8bb26", /* green */ + [11] = "#fabd2f", /* yellow */ + [12] = "#83a598", /* blue */ + [13] = "#d3869b", /* magenta */ + [14] = "#8ec07c", /* cyan */ + [15] = "#ebdbb2", /* white */ }; /* * Default colors (colorname index) - * foreground, background, cursor, reverse cursor + * foreground, background, cursor */ -unsigned int defaultfg = 258; -unsigned int defaultbg = 259; -unsigned int defaultcs = 256; +unsigned int defaultfg = 15; +unsigned int defaultbg = 0; +unsigned int defaultcs = 15; static unsigned int defaultrcs = 257; /* @@ -201,6 +193,8 @@ static Shortcut shortcuts[] = { { TERMMOD, XK_Y, selpaste, {.i = 0} }, { ShiftMask, XK_Insert, selpaste, {.i = 0} }, { TERMMOD, XK_Num_Lock, numlock, {.i = 0} }, + { ShiftMask, XK_Page_Up, kscrollup, {.i = -1} }, + { ShiftMask, XK_Page_Down, kscrolldown, {.i = -1} }, }; /* diff --git a/patches/st-scrollback-0.9.2.diff b/patches/st-scrollback-0.9.2.diff new file mode 100644 index 0000000..f9782e8 --- /dev/null +++ b/patches/st-scrollback-0.9.2.diff @@ -0,0 +1,351 @@ +diff --git a/config.def.h b/config.def.h +index 2cd740a..40b7d93 100644 +--- a/config.def.h ++++ b/config.def.h +@@ -201,6 +201,8 @@ static Shortcut shortcuts[] = { + { TERMMOD, XK_Y, selpaste, {.i = 0} }, + { ShiftMask, XK_Insert, selpaste, {.i = 0} }, + { TERMMOD, XK_Num_Lock, numlock, {.i = 0} }, ++ { ShiftMask, XK_Page_Up, kscrollup, {.i = -1} }, ++ { ShiftMask, XK_Page_Down, kscrolldown, {.i = -1} }, + }; + + /* +diff --git a/st.c b/st.c +index b9f66e7..2478942 100644 +--- a/st.c ++++ b/st.c +@@ -35,6 +35,7 @@ + #define ESC_ARG_SIZ 16 + #define STR_BUF_SIZ ESC_BUF_SIZ + #define STR_ARG_SIZ ESC_ARG_SIZ ++#define HISTSIZE 2000 + + /* macros */ + #define IS_SET(flag) ((term.mode & (flag)) != 0) +@@ -42,6 +43,9 @@ + #define ISCONTROLC1(c) (BETWEEN(c, 0x80, 0x9f)) + #define ISCONTROL(c) (ISCONTROLC0(c) || ISCONTROLC1(c)) + #define ISDELIM(u) (u && wcschr(worddelimiters, u)) ++#define TLINE(y) ((y) < term.scr ? term.hist[((y) + term.histi - \ ++ term.scr + HISTSIZE + 1) % HISTSIZE] : \ ++ term.line[(y) - term.scr]) + + enum term_mode { + MODE_WRAP = 1 << 0, +@@ -115,6 +119,9 @@ typedef struct { + int col; /* nb col */ + Line *line; /* screen */ + Line *alt; /* alternate screen */ ++ Line hist[HISTSIZE]; /* history buffer */ ++ int histi; /* history index */ ++ int scr; /* scroll back */ + int *dirty; /* dirtyness of lines */ + TCursor c; /* cursor */ + int ocx; /* old cursor col */ +@@ -185,8 +192,8 @@ static void tnewline(int); + static void tputtab(int); + static void tputc(Rune); + static void treset(void); +-static void tscrollup(int, int); +-static void tscrolldown(int, int); ++static void tscrollup(int, int, int); ++static void tscrolldown(int, int, int); + static void tsetattr(const int *, int); + static void tsetchar(Rune, const Glyph *, int, int); + static void tsetdirt(int, int); +@@ -409,10 +416,10 @@ tlinelen(int y) + { + int i = term.col; + +- if (term.line[y][i - 1].mode & ATTR_WRAP) ++ if (TLINE(y)[i - 1].mode & ATTR_WRAP) + return i; + +- while (i > 0 && term.line[y][i - 1].u == ' ') ++ while (i > 0 && TLINE(y)[i - 1].u == ' ') + --i; + + return i; +@@ -521,7 +528,7 @@ selsnap(int *x, int *y, int direction) + * Snap around if the word wraps around at the end or + * beginning of a line. + */ +- prevgp = &term.line[*y][*x]; ++ prevgp = &TLINE(*y)[*x]; + prevdelim = ISDELIM(prevgp->u); + for (;;) { + newx = *x + direction; +@@ -536,14 +543,14 @@ selsnap(int *x, int *y, int direction) + yt = *y, xt = *x; + else + yt = newy, xt = newx; +- if (!(term.line[yt][xt].mode & ATTR_WRAP)) ++ if (!(TLINE(yt)[xt].mode & ATTR_WRAP)) + break; + } + + if (newx >= tlinelen(newy)) + break; + +- gp = &term.line[newy][newx]; ++ gp = &TLINE(newy)[newx]; + delim = ISDELIM(gp->u); + if (!(gp->mode & ATTR_WDUMMY) && (delim != prevdelim + || (delim && gp->u != prevgp->u))) +@@ -564,14 +571,14 @@ selsnap(int *x, int *y, int direction) + *x = (direction < 0) ? 0 : term.col - 1; + if (direction < 0) { + for (; *y > 0; *y += direction) { +- if (!(term.line[*y-1][term.col-1].mode ++ if (!(TLINE(*y-1)[term.col-1].mode + & ATTR_WRAP)) { + break; + } + } + } else if (direction > 0) { + for (; *y < term.row-1; *y += direction) { +- if (!(term.line[*y][term.col-1].mode ++ if (!(TLINE(*y)[term.col-1].mode + & ATTR_WRAP)) { + break; + } +@@ -602,13 +609,13 @@ getsel(void) + } + + if (sel.type == SEL_RECTANGULAR) { +- gp = &term.line[y][sel.nb.x]; ++ gp = &TLINE(y)[sel.nb.x]; + lastx = sel.ne.x; + } else { +- gp = &term.line[y][sel.nb.y == y ? sel.nb.x : 0]; ++ gp = &TLINE(y)[sel.nb.y == y ? sel.nb.x : 0]; + lastx = (sel.ne.y == y) ? sel.ne.x : term.col-1; + } +- last = &term.line[y][MIN(lastx, linelen-1)]; ++ last = &TLINE(y)[MIN(lastx, linelen-1)]; + while (last >= gp && last->u == ' ') + --last; + +@@ -844,6 +851,9 @@ void + ttywrite(const char *s, size_t n, int may_echo) + { + const char *next; ++ Arg arg = (Arg) { .i = term.scr }; ++ ++ kscrolldown(&arg); + + if (may_echo && IS_SET(MODE_ECHO)) + twrite(s, n, 1); +@@ -1055,13 +1065,53 @@ tswapscreen(void) + } + + void +-tscrolldown(int orig, int n) ++kscrolldown(const Arg* a) ++{ ++ int n = a->i; ++ ++ if (n < 0) ++ n = term.row + n; ++ ++ if (n > term.scr) ++ n = term.scr; ++ ++ if (term.scr > 0) { ++ term.scr -= n; ++ selscroll(0, -n); ++ tfulldirt(); ++ } ++} ++ ++void ++kscrollup(const Arg* a) ++{ ++ int n = a->i; ++ ++ if (n < 0) ++ n = term.row + n; ++ ++ if (term.scr <= HISTSIZE-n) { ++ term.scr += n; ++ selscroll(0, n); ++ tfulldirt(); ++ } ++} ++ ++void ++tscrolldown(int orig, int n, int copyhist) + { + int i; + Line temp; + + LIMIT(n, 0, term.bot-orig+1); + ++ if (copyhist) { ++ term.histi = (term.histi - 1 + HISTSIZE) % HISTSIZE; ++ temp = term.hist[term.histi]; ++ term.hist[term.histi] = term.line[term.bot]; ++ term.line[term.bot] = temp; ++ } ++ + tsetdirt(orig, term.bot-n); + tclearregion(0, term.bot-n+1, term.col-1, term.bot); + +@@ -1071,17 +1121,28 @@ tscrolldown(int orig, int n) + term.line[i-n] = temp; + } + +- selscroll(orig, n); ++ if (term.scr == 0) ++ selscroll(orig, n); + } + + void +-tscrollup(int orig, int n) ++tscrollup(int orig, int n, int copyhist) + { + int i; + Line temp; + + LIMIT(n, 0, term.bot-orig+1); + ++ if (copyhist) { ++ term.histi = (term.histi + 1) % HISTSIZE; ++ temp = term.hist[term.histi]; ++ term.hist[term.histi] = term.line[orig]; ++ term.line[orig] = temp; ++ } ++ ++ if (term.scr > 0 && term.scr < HISTSIZE) ++ term.scr = MIN(term.scr + n, HISTSIZE-1); ++ + tclearregion(0, orig, term.col-1, orig+n-1); + tsetdirt(orig+n, term.bot); + +@@ -1091,7 +1152,8 @@ tscrollup(int orig, int n) + term.line[i+n] = temp; + } + +- selscroll(orig, -n); ++ if (term.scr == 0) ++ selscroll(orig, -n); + } + + void +@@ -1120,7 +1182,7 @@ tnewline(int first_col) + int y = term.c.y; + + if (y == term.bot) { +- tscrollup(term.top, 1); ++ tscrollup(term.top, 1, 1); + } else { + y++; + } +@@ -1285,14 +1347,14 @@ void + tinsertblankline(int n) + { + if (BETWEEN(term.c.y, term.top, term.bot)) +- tscrolldown(term.c.y, n); ++ tscrolldown(term.c.y, n, 0); + } + + void + tdeleteline(int n) + { + if (BETWEEN(term.c.y, term.top, term.bot)) +- tscrollup(term.c.y, n); ++ tscrollup(term.c.y, n, 0); + } + + int32_t +@@ -1730,11 +1792,11 @@ csihandle(void) + case 'S': /* SU -- Scroll line up */ + if (csiescseq.priv) break; + DEFAULT(csiescseq.arg[0], 1); +- tscrollup(term.top, csiescseq.arg[0]); ++ tscrollup(term.top, csiescseq.arg[0], 0); + break; + case 'T': /* SD -- Scroll line down */ + DEFAULT(csiescseq.arg[0], 1); +- tscrolldown(term.top, csiescseq.arg[0]); ++ tscrolldown(term.top, csiescseq.arg[0], 0); + break; + case 'L': /* IL -- Insert blank lines */ + DEFAULT(csiescseq.arg[0], 1); +@@ -2306,7 +2368,7 @@ eschandle(uchar ascii) + return 0; + case 'D': /* IND -- Linefeed */ + if (term.c.y == term.bot) { +- tscrollup(term.top, 1); ++ tscrollup(term.top, 1, 1); + } else { + tmoveto(term.c.x, term.c.y+1); + } +@@ -2319,7 +2381,7 @@ eschandle(uchar ascii) + break; + case 'M': /* RI -- Reverse index */ + if (term.c.y == term.top) { +- tscrolldown(term.top, 1); ++ tscrolldown(term.top, 1, 1); + } else { + tmoveto(term.c.x, term.c.y-1); + } +@@ -2542,7 +2604,7 @@ twrite(const char *buf, int buflen, int show_ctrl) + void + tresize(int col, int row) + { +- int i; ++ int i, j; + int minrow = MIN(row, term.row); + int mincol = MIN(col, term.col); + int *bp; +@@ -2579,6 +2641,14 @@ tresize(int col, int row) + term.dirty = xrealloc(term.dirty, row * sizeof(*term.dirty)); + term.tabs = xrealloc(term.tabs, col * sizeof(*term.tabs)); + ++ for (i = 0; i < HISTSIZE; i++) { ++ term.hist[i] = xrealloc(term.hist[i], col * sizeof(Glyph)); ++ for (j = mincol; j < col; j++) { ++ term.hist[i][j] = term.c.attr; ++ term.hist[i][j].u = ' '; ++ } ++ } ++ + /* resize each row to new width, zero-pad if needed */ + for (i = 0; i < minrow; i++) { + term.line[i] = xrealloc(term.line[i], col * sizeof(Glyph)); +@@ -2637,7 +2707,7 @@ drawregion(int x1, int y1, int x2, int y2) + continue; + + term.dirty[y] = 0; +- xdrawline(term.line[y], x1, y, x2); ++ xdrawline(TLINE(y), x1, y, x2); + } + } + +@@ -2658,8 +2728,9 @@ draw(void) + cx--; + + drawregion(0, 0, term.col, term.row); +- xdrawcursor(cx, term.c.y, term.line[term.c.y][cx], +- term.ocx, term.ocy, term.line[term.ocy][term.ocx]); ++ if (term.scr == 0) ++ xdrawcursor(cx, term.c.y, term.line[term.c.y][cx], ++ term.ocx, term.ocy, term.line[term.ocy][term.ocx]); + term.ocx = cx; + term.ocy = term.c.y; + xfinishdraw(); +diff --git a/st.h b/st.h +index fd3b0d8..818a6f8 100644 +--- a/st.h ++++ b/st.h +@@ -81,6 +81,8 @@ void die(const char *, ...); + void redraw(void); + void draw(void); + ++void kscrolldown(const Arg *); ++void kscrollup(const Arg *); + void printscreen(const Arg *); + void printsel(const Arg *); + void sendbreak(const Arg *); diff --git a/patches/st-scrollback-mouse-0.9.2.diff b/patches/st-scrollback-mouse-0.9.2.diff new file mode 100644 index 0000000..a956d2b --- /dev/null +++ b/patches/st-scrollback-mouse-0.9.2.diff @@ -0,0 +1,25 @@ +From 6b7e7e6c5c44dd6347ad49691b80d808c1b0cb77 Mon Sep 17 00:00:00 2001 +From: Jernej Jakob +Date: Mon, 1 Jul 2024 14:00:02 +0200 +Subject: [PATCH] [st][patch] Update st-scrollback-mouse for 0.9.2 + +--- + config.def.h | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/config.def.h b/config.def.h +index 8b25d40..d259675 100644 +--- a/config.def.h ++++ b/config.def.h +@@ -176,6 +176,8 @@ static uint forcemousemod = ShiftMask; + */ + static MouseShortcut mshortcuts[] = { + /* mask button function argument release */ ++ { ShiftMask, Button4, kscrollup, {.i = 1} }, ++ { ShiftMask, Button5, kscrolldown, {.i = 1} }, + { XK_ANY_MOD, Button2, selpaste, {.i = 0}, 1 }, + { ShiftMask, Button4, ttysend, {.s = "\033[5;2~"} }, + { XK_ANY_MOD, Button4, ttysend, {.s = "\031"} }, +-- +2.44.2 + diff --git a/st b/st index a8893e69955884ff2d4a57094d9718b8d6a58bc0..69eb9e5f4bf9e64c0d9d91a67d78f6d9be6dbc2c 100755 GIT binary patch literal 101672 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 NlitIN{OL}${|jm^^b7z1 literal 101472 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 0 && term.line[y][i - 1].u == ' ') + while (i > 0 && TLINE(y)[i - 1].u == ' ') --i; return i; @@ -521,7 +528,7 @@ selsnap(int *x, int *y, int direction) * Snap around if the word wraps around at the end or * beginning of a line. */ - prevgp = &term.line[*y][*x]; + prevgp = &TLINE(*y)[*x]; prevdelim = ISDELIM(prevgp->u); for (;;) { newx = *x + direction; @@ -536,14 +543,14 @@ selsnap(int *x, int *y, int direction) yt = *y, xt = *x; else yt = newy, xt = newx; - if (!(term.line[yt][xt].mode & ATTR_WRAP)) + if (!(TLINE(yt)[xt].mode & ATTR_WRAP)) break; } if (newx >= tlinelen(newy)) break; - gp = &term.line[newy][newx]; + gp = &TLINE(newy)[newx]; delim = ISDELIM(gp->u); if (!(gp->mode & ATTR_WDUMMY) && (delim != prevdelim || (delim && gp->u != prevgp->u))) @@ -564,14 +571,14 @@ selsnap(int *x, int *y, int direction) *x = (direction < 0) ? 0 : term.col - 1; if (direction < 0) { for (; *y > 0; *y += direction) { - if (!(term.line[*y-1][term.col-1].mode + if (!(TLINE(*y-1)[term.col-1].mode & ATTR_WRAP)) { break; } } } else if (direction > 0) { for (; *y < term.row-1; *y += direction) { - if (!(term.line[*y][term.col-1].mode + if (!(TLINE(*y)[term.col-1].mode & ATTR_WRAP)) { break; } @@ -602,13 +609,13 @@ getsel(void) } if (sel.type == SEL_RECTANGULAR) { - gp = &term.line[y][sel.nb.x]; + gp = &TLINE(y)[sel.nb.x]; lastx = sel.ne.x; } else { - gp = &term.line[y][sel.nb.y == y ? sel.nb.x : 0]; + gp = &TLINE(y)[sel.nb.y == y ? sel.nb.x : 0]; lastx = (sel.ne.y == y) ? sel.ne.x : term.col-1; } - last = &term.line[y][MIN(lastx, linelen-1)]; + last = &TLINE(y)[MIN(lastx, linelen-1)]; while (last >= gp && last->u == ' ') --last; @@ -844,6 +851,9 @@ void ttywrite(const char *s, size_t n, int may_echo) { const char *next; + Arg arg = (Arg) { .i = term.scr }; + + kscrolldown(&arg); if (may_echo && IS_SET(MODE_ECHO)) twrite(s, n, 1); @@ -1055,13 +1065,53 @@ tswapscreen(void) } void -tscrolldown(int orig, int n) +kscrolldown(const Arg* a) +{ + int n = a->i; + + if (n < 0) + n = term.row + n; + + if (n > term.scr) + n = term.scr; + + if (term.scr > 0) { + term.scr -= n; + selscroll(0, -n); + tfulldirt(); + } +} + +void +kscrollup(const Arg* a) +{ + int n = a->i; + + if (n < 0) + n = term.row + n; + + if (term.scr <= HISTSIZE-n) { + term.scr += n; + selscroll(0, n); + tfulldirt(); + } +} + +void +tscrolldown(int orig, int n, int copyhist) { int i; Line temp; LIMIT(n, 0, term.bot-orig+1); + if (copyhist) { + term.histi = (term.histi - 1 + HISTSIZE) % HISTSIZE; + temp = term.hist[term.histi]; + term.hist[term.histi] = term.line[term.bot]; + term.line[term.bot] = temp; + } + tsetdirt(orig, term.bot-n); tclearregion(0, term.bot-n+1, term.col-1, term.bot); @@ -1071,17 +1121,28 @@ tscrolldown(int orig, int n) term.line[i-n] = temp; } - selscroll(orig, n); + if (term.scr == 0) + selscroll(orig, n); } void -tscrollup(int orig, int n) +tscrollup(int orig, int n, int copyhist) { int i; Line temp; LIMIT(n, 0, term.bot-orig+1); + if (copyhist) { + term.histi = (term.histi + 1) % HISTSIZE; + temp = term.hist[term.histi]; + term.hist[term.histi] = term.line[orig]; + term.line[orig] = temp; + } + + if (term.scr > 0 && term.scr < HISTSIZE) + term.scr = MIN(term.scr + n, HISTSIZE-1); + tclearregion(0, orig, term.col-1, orig+n-1); tsetdirt(orig+n, term.bot); @@ -1091,7 +1152,8 @@ tscrollup(int orig, int n) term.line[i+n] = temp; } - selscroll(orig, -n); + if (term.scr == 0) + selscroll(orig, -n); } void @@ -1120,7 +1182,7 @@ tnewline(int first_col) int y = term.c.y; if (y == term.bot) { - tscrollup(term.top, 1); + tscrollup(term.top, 1, 1); } else { y++; } @@ -1288,14 +1350,14 @@ void tinsertblankline(int n) { if (BETWEEN(term.c.y, term.top, term.bot)) - tscrolldown(term.c.y, n); + tscrolldown(term.c.y, n, 0); } void tdeleteline(int n) { if (BETWEEN(term.c.y, term.top, term.bot)) - tscrollup(term.c.y, n); + tscrollup(term.c.y, n, 0); } int32_t @@ -1733,11 +1795,11 @@ csihandle(void) case 'S': /* SU -- Scroll line up */ if (csiescseq.priv) break; DEFAULT(csiescseq.arg[0], 1); - tscrollup(term.top, csiescseq.arg[0]); + tscrollup(term.top, csiescseq.arg[0], 0); break; case 'T': /* SD -- Scroll line down */ DEFAULT(csiescseq.arg[0], 1); - tscrolldown(term.top, csiescseq.arg[0]); + tscrolldown(term.top, csiescseq.arg[0], 0); break; case 'L': /* IL -- Insert blank lines */ DEFAULT(csiescseq.arg[0], 1); @@ -2309,7 +2371,7 @@ eschandle(uchar ascii) return 0; case 'D': /* IND -- Linefeed */ if (term.c.y == term.bot) { - tscrollup(term.top, 1); + tscrollup(term.top, 1, 1); } else { tmoveto(term.c.x, term.c.y+1); } @@ -2322,7 +2384,7 @@ eschandle(uchar ascii) break; case 'M': /* RI -- Reverse index */ if (term.c.y == term.top) { - tscrolldown(term.top, 1); + tscrolldown(term.top, 1, 1); } else { tmoveto(term.c.x, term.c.y-1); } @@ -2545,7 +2607,7 @@ twrite(const char *buf, int buflen, int show_ctrl) void tresize(int col, int row) { - int i; + int i, j; int minrow = MIN(row, term.row); int mincol = MIN(col, term.col); int *bp; @@ -2582,6 +2644,14 @@ tresize(int col, int row) term.dirty = xrealloc(term.dirty, row * sizeof(*term.dirty)); term.tabs = xrealloc(term.tabs, col * sizeof(*term.tabs)); + for (i = 0; i < HISTSIZE; i++) { + term.hist[i] = xrealloc(term.hist[i], col * sizeof(Glyph)); + for (j = mincol; j < col; j++) { + term.hist[i][j] = term.c.attr; + term.hist[i][j].u = ' '; + } + } + /* resize each row to new width, zero-pad if needed */ for (i = 0; i < minrow; i++) { term.line[i] = xrealloc(term.line[i], col * sizeof(Glyph)); @@ -2640,7 +2710,7 @@ drawregion(int x1, int y1, int x2, int y2) continue; term.dirty[y] = 0; - xdrawline(term.line[y], x1, y, x2); + xdrawline(TLINE(y), x1, y, x2); } } @@ -2661,8 +2731,9 @@ draw(void) cx--; drawregion(0, 0, term.col, term.row); - xdrawcursor(cx, term.c.y, term.line[term.c.y][cx], - term.ocx, term.ocy, term.line[term.ocy][term.ocx]); + if (term.scr == 0) + xdrawcursor(cx, term.c.y, term.line[term.c.y][cx], + term.ocx, term.ocy, term.line[term.ocy][term.ocx]); term.ocx = cx; term.ocy = term.c.y; xfinishdraw(); diff --git a/st.c.orig b/st.c.orig new file mode 100644 index 0000000..2e3800e --- /dev/null +++ b/st.c.orig @@ -0,0 +1,2678 @@ +/* See LICENSE for license details. */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "st.h" +#include "win.h" + +#if defined(__linux) + #include +#elif defined(__OpenBSD__) || defined(__NetBSD__) || defined(__APPLE__) + #include +#elif defined(__FreeBSD__) || defined(__DragonFly__) + #include +#endif + +/* Arbitrary sizes */ +#define UTF_INVALID 0xFFFD +#define UTF_SIZ 4 +#define ESC_BUF_SIZ (128*UTF_SIZ) +#define ESC_ARG_SIZ 16 +#define STR_BUF_SIZ ESC_BUF_SIZ +#define STR_ARG_SIZ ESC_ARG_SIZ + +/* macros */ +#define IS_SET(flag) ((term.mode & (flag)) != 0) +#define ISCONTROLC0(c) (BETWEEN(c, 0, 0x1f) || (c) == 0x7f) +#define ISCONTROLC1(c) (BETWEEN(c, 0x80, 0x9f)) +#define ISCONTROL(c) (ISCONTROLC0(c) || ISCONTROLC1(c)) +#define ISDELIM(u) (u && wcschr(worddelimiters, u)) + +enum term_mode { + MODE_WRAP = 1 << 0, + MODE_INSERT = 1 << 1, + MODE_ALTSCREEN = 1 << 2, + MODE_CRLF = 1 << 3, + MODE_ECHO = 1 << 4, + MODE_PRINT = 1 << 5, + MODE_UTF8 = 1 << 6, +}; + +enum cursor_movement { + CURSOR_SAVE, + CURSOR_LOAD +}; + +enum cursor_state { + CURSOR_DEFAULT = 0, + CURSOR_WRAPNEXT = 1, + CURSOR_ORIGIN = 2 +}; + +enum charset { + CS_GRAPHIC0, + CS_GRAPHIC1, + CS_UK, + CS_USA, + CS_MULTI, + CS_GER, + CS_FIN +}; + +enum escape_state { + ESC_START = 1, + ESC_CSI = 2, + ESC_STR = 4, /* DCS, OSC, PM, APC */ + ESC_ALTCHARSET = 8, + ESC_STR_END = 16, /* a final string was encountered */ + ESC_TEST = 32, /* Enter in test mode */ + ESC_UTF8 = 64, +}; + +typedef struct { + Glyph attr; /* current char attributes */ + int x; + int y; + char state; +} TCursor; + +typedef struct { + int mode; + int type; + int snap; + /* + * Selection variables: + * nb – normalized coordinates of the beginning of the selection + * ne – normalized coordinates of the end of the selection + * ob – original coordinates of the beginning of the selection + * oe – original coordinates of the end of the selection + */ + struct { + int x, y; + } nb, ne, ob, oe; + + int alt; +} Selection; + +/* Internal representation of the screen */ +typedef struct { + int row; /* nb row */ + int col; /* nb col */ + Line *line; /* screen */ + Line *alt; /* alternate screen */ + int *dirty; /* dirtyness of lines */ + TCursor c; /* cursor */ + int ocx; /* old cursor col */ + int ocy; /* old cursor row */ + int top; /* top scroll limit */ + int bot; /* bottom scroll limit */ + int mode; /* terminal mode flags */ + int esc; /* escape state flags */ + char trantbl[4]; /* charset table translation */ + int charset; /* current charset */ + int icharset; /* selected charset for sequence */ + int *tabs; + Rune lastc; /* last printed char outside of sequence, 0 if control */ +} Term; + +/* CSI Escape sequence structs */ +/* ESC '[' [[ [] [;]] []] */ +typedef struct { + char buf[ESC_BUF_SIZ]; /* raw string */ + size_t len; /* raw string length */ + char priv; + int arg[ESC_ARG_SIZ]; + int narg; /* nb of args */ + char mode[2]; +} CSIEscape; + +/* STR Escape sequence structs */ +/* ESC type [[ [] [;]] ] ESC '\' */ +typedef struct { + char type; /* ESC type ... */ + char *buf; /* allocated raw string */ + size_t siz; /* allocation size */ + size_t len; /* raw string length */ + char *args[STR_ARG_SIZ]; + int narg; /* nb of args */ +} STREscape; + +static void execsh(char *, char **); +static void stty(char **); +static void sigchld(int); +static void ttywriteraw(const char *, size_t); + +static void csidump(void); +static void csihandle(void); +static void csiparse(void); +static void csireset(void); +static void osc_color_response(int, int, int); +static int eschandle(uchar); +static void strdump(void); +static void strhandle(void); +static void strparse(void); +static void strreset(void); + +static void tprinter(char *, size_t); +static void tdumpsel(void); +static void tdumpline(int); +static void tdump(void); +static void tclearregion(int, int, int, int); +static void tcursor(int); +static void tdeletechar(int); +static void tdeleteline(int); +static void tinsertblank(int); +static void tinsertblankline(int); +static int tlinelen(int); +static void tmoveto(int, int); +static void tmoveato(int, int); +static void tnewline(int); +static void tputtab(int); +static void tputc(Rune); +static void treset(void); +static void tscrollup(int, int); +static void tscrolldown(int, int); +static void tsetattr(const int *, int); +static void tsetchar(Rune, const Glyph *, int, int); +static void tsetdirt(int, int); +static void tsetscroll(int, int); +static void tswapscreen(void); +static void tsetmode(int, int, const int *, int); +static int twrite(const char *, int, int); +static void tfulldirt(void); +static void tcontrolcode(uchar ); +static void tdectest(char ); +static void tdefutf8(char); +static int32_t tdefcolor(const int *, int *, int); +static void tdeftran(char); +static void tstrsequence(uchar); + +static void drawregion(int, int, int, int); + +static void selnormalize(void); +static void selscroll(int, int); +static void selsnap(int *, int *, int); + +static size_t utf8decode(const char *, Rune *, size_t); +static Rune utf8decodebyte(char, size_t *); +static char utf8encodebyte(Rune, size_t); +static size_t utf8validate(Rune *, size_t); + +static char *base64dec(const char *); +static char base64dec_getc(const char **); + +static ssize_t xwrite(int, const char *, size_t); + +/* Globals */ +static Term term; +static Selection sel; +static CSIEscape csiescseq; +static STREscape strescseq; +static int iofd = 1; +static int cmdfd; +static pid_t pid; + +static const uchar utfbyte[UTF_SIZ + 1] = {0x80, 0, 0xC0, 0xE0, 0xF0}; +static const uchar utfmask[UTF_SIZ + 1] = {0xC0, 0x80, 0xE0, 0xF0, 0xF8}; +static const Rune utfmin[UTF_SIZ + 1] = { 0, 0, 0x80, 0x800, 0x10000}; +static const Rune utfmax[UTF_SIZ + 1] = {0x10FFFF, 0x7F, 0x7FF, 0xFFFF, 0x10FFFF}; + +ssize_t +xwrite(int fd, const char *s, size_t len) +{ + size_t aux = len; + ssize_t r; + + while (len > 0) { + r = write(fd, s, len); + if (r < 0) + return r; + len -= r; + s += r; + } + + return aux; +} + +void * +xmalloc(size_t len) +{ + void *p; + + if (!(p = malloc(len))) + die("malloc: %s\n", strerror(errno)); + + return p; +} + +void * +xrealloc(void *p, size_t len) +{ + if ((p = realloc(p, len)) == NULL) + die("realloc: %s\n", strerror(errno)); + + return p; +} + +char * +xstrdup(const char *s) +{ + char *p; + + if ((p = strdup(s)) == NULL) + die("strdup: %s\n", strerror(errno)); + + return p; +} + +size_t +utf8decode(const char *c, Rune *u, size_t clen) +{ + size_t i, j, len, type; + Rune udecoded; + + *u = UTF_INVALID; + if (!clen) + return 0; + udecoded = utf8decodebyte(c[0], &len); + if (!BETWEEN(len, 1, UTF_SIZ)) + return 1; + for (i = 1, j = 1; i < clen && j < len; ++i, ++j) { + udecoded = (udecoded << 6) | utf8decodebyte(c[i], &type); + if (type != 0) + return j; + } + if (j < len) + return 0; + *u = udecoded; + utf8validate(u, len); + + return len; +} + +Rune +utf8decodebyte(char c, size_t *i) +{ + for (*i = 0; *i < LEN(utfmask); ++(*i)) + if (((uchar)c & utfmask[*i]) == utfbyte[*i]) + return (uchar)c & ~utfmask[*i]; + + return 0; +} + +size_t +utf8encode(Rune u, char *c) +{ + size_t len, i; + + len = utf8validate(&u, 0); + if (len > UTF_SIZ) + return 0; + + for (i = len - 1; i != 0; --i) { + c[i] = utf8encodebyte(u, 0); + u >>= 6; + } + c[0] = utf8encodebyte(u, len); + + return len; +} + +char +utf8encodebyte(Rune u, size_t i) +{ + return utfbyte[i] | (u & ~utfmask[i]); +} + +size_t +utf8validate(Rune *u, size_t i) +{ + if (!BETWEEN(*u, utfmin[i], utfmax[i]) || BETWEEN(*u, 0xD800, 0xDFFF)) + *u = UTF_INVALID; + for (i = 1; *u > utfmax[i]; ++i) + ; + + return i; +} + +char +base64dec_getc(const char **src) +{ + while (**src && !isprint((unsigned char)**src)) + (*src)++; + return **src ? *((*src)++) : '='; /* emulate padding if string ends */ +} + +char * +base64dec(const char *src) +{ + size_t in_len = strlen(src); + char *result, *dst; + static const char base64_digits[256] = { + [43] = 62, 0, 0, 0, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 0, 0, 0, -1, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 0, 0, 0, 0, + 0, 0, 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 + }; + + if (in_len % 4) + in_len += 4 - (in_len % 4); + result = dst = xmalloc(in_len / 4 * 3 + 1); + while (*src) { + int a = base64_digits[(unsigned char) base64dec_getc(&src)]; + int b = base64_digits[(unsigned char) base64dec_getc(&src)]; + int c = base64_digits[(unsigned char) base64dec_getc(&src)]; + int d = base64_digits[(unsigned char) base64dec_getc(&src)]; + + /* invalid input. 'a' can be -1, e.g. if src is "\n" (c-str) */ + if (a == -1 || b == -1) + break; + + *dst++ = (a << 2) | ((b & 0x30) >> 4); + if (c == -1) + break; + *dst++ = ((b & 0x0f) << 4) | ((c & 0x3c) >> 2); + if (d == -1) + break; + *dst++ = ((c & 0x03) << 6) | d; + } + *dst = '\0'; + return result; +} + +void +selinit(void) +{ + sel.mode = SEL_IDLE; + sel.snap = 0; + sel.ob.x = -1; +} + +int +tlinelen(int y) +{ + int i = term.col; + + if (term.line[y][i - 1].mode & ATTR_WRAP) + return i; + + while (i > 0 && term.line[y][i - 1].u == ' ') + --i; + + return i; +} + +void +selstart(int col, int row, int snap) +{ + selclear(); + sel.mode = SEL_EMPTY; + sel.type = SEL_REGULAR; + sel.alt = IS_SET(MODE_ALTSCREEN); + sel.snap = snap; + sel.oe.x = sel.ob.x = col; + sel.oe.y = sel.ob.y = row; + selnormalize(); + + if (sel.snap != 0) + sel.mode = SEL_READY; + tsetdirt(sel.nb.y, sel.ne.y); +} + +void +selextend(int col, int row, int type, int done) +{ + int oldey, oldex, oldsby, oldsey, oldtype; + + if (sel.mode == SEL_IDLE) + return; + if (done && sel.mode == SEL_EMPTY) { + selclear(); + return; + } + + oldey = sel.oe.y; + oldex = sel.oe.x; + oldsby = sel.nb.y; + oldsey = sel.ne.y; + oldtype = sel.type; + + sel.oe.x = col; + sel.oe.y = row; + selnormalize(); + sel.type = type; + + if (oldey != sel.oe.y || oldex != sel.oe.x || oldtype != sel.type || sel.mode == SEL_EMPTY) + tsetdirt(MIN(sel.nb.y, oldsby), MAX(sel.ne.y, oldsey)); + + sel.mode = done ? SEL_IDLE : SEL_READY; +} + +void +selnormalize(void) +{ + int i; + + if (sel.type == SEL_REGULAR && sel.ob.y != sel.oe.y) { + sel.nb.x = sel.ob.y < sel.oe.y ? sel.ob.x : sel.oe.x; + sel.ne.x = sel.ob.y < sel.oe.y ? sel.oe.x : sel.ob.x; + } else { + sel.nb.x = MIN(sel.ob.x, sel.oe.x); + sel.ne.x = MAX(sel.ob.x, sel.oe.x); + } + sel.nb.y = MIN(sel.ob.y, sel.oe.y); + sel.ne.y = MAX(sel.ob.y, sel.oe.y); + + selsnap(&sel.nb.x, &sel.nb.y, -1); + selsnap(&sel.ne.x, &sel.ne.y, +1); + + /* expand selection over line breaks */ + if (sel.type == SEL_RECTANGULAR) + return; + i = tlinelen(sel.nb.y); + if (i < sel.nb.x) + sel.nb.x = i; + if (tlinelen(sel.ne.y) <= sel.ne.x) + sel.ne.x = term.col - 1; +} + +int +selected(int x, int y) +{ + if (sel.mode == SEL_EMPTY || sel.ob.x == -1 || + sel.alt != IS_SET(MODE_ALTSCREEN)) + return 0; + + if (sel.type == SEL_RECTANGULAR) + return BETWEEN(y, sel.nb.y, sel.ne.y) + && BETWEEN(x, sel.nb.x, sel.ne.x); + + return BETWEEN(y, sel.nb.y, sel.ne.y) + && (y != sel.nb.y || x >= sel.nb.x) + && (y != sel.ne.y || x <= sel.ne.x); +} + +void +selsnap(int *x, int *y, int direction) +{ + int newx, newy, xt, yt; + int delim, prevdelim; + const Glyph *gp, *prevgp; + + switch (sel.snap) { + case SNAP_WORD: + /* + * Snap around if the word wraps around at the end or + * beginning of a line. + */ + prevgp = &term.line[*y][*x]; + prevdelim = ISDELIM(prevgp->u); + for (;;) { + newx = *x + direction; + newy = *y; + if (!BETWEEN(newx, 0, term.col - 1)) { + newy += direction; + newx = (newx + term.col) % term.col; + if (!BETWEEN(newy, 0, term.row - 1)) + break; + + if (direction > 0) + yt = *y, xt = *x; + else + yt = newy, xt = newx; + if (!(term.line[yt][xt].mode & ATTR_WRAP)) + break; + } + + if (newx >= tlinelen(newy)) + break; + + gp = &term.line[newy][newx]; + delim = ISDELIM(gp->u); + if (!(gp->mode & ATTR_WDUMMY) && (delim != prevdelim + || (delim && gp->u != prevgp->u))) + break; + + *x = newx; + *y = newy; + prevgp = gp; + prevdelim = delim; + } + break; + case SNAP_LINE: + /* + * Snap around if the the previous line or the current one + * has set ATTR_WRAP at its end. Then the whole next or + * previous line will be selected. + */ + *x = (direction < 0) ? 0 : term.col - 1; + if (direction < 0) { + for (; *y > 0; *y += direction) { + if (!(term.line[*y-1][term.col-1].mode + & ATTR_WRAP)) { + break; + } + } + } else if (direction > 0) { + for (; *y < term.row-1; *y += direction) { + if (!(term.line[*y][term.col-1].mode + & ATTR_WRAP)) { + break; + } + } + } + break; + } +} + +char * +getsel(void) +{ + char *str, *ptr; + int y, bufsize, lastx, linelen; + const Glyph *gp, *last; + + if (sel.ob.x == -1) + return NULL; + + bufsize = (term.col+1) * (sel.ne.y-sel.nb.y+1) * UTF_SIZ; + ptr = str = xmalloc(bufsize); + + /* append every set & selected glyph to the selection */ + for (y = sel.nb.y; y <= sel.ne.y; y++) { + if ((linelen = tlinelen(y)) == 0) { + *ptr++ = '\n'; + continue; + } + + if (sel.type == SEL_RECTANGULAR) { + gp = &term.line[y][sel.nb.x]; + lastx = sel.ne.x; + } else { + gp = &term.line[y][sel.nb.y == y ? sel.nb.x : 0]; + lastx = (sel.ne.y == y) ? sel.ne.x : term.col-1; + } + last = &term.line[y][MIN(lastx, linelen-1)]; + while (last >= gp && last->u == ' ') + --last; + + for ( ; gp <= last; ++gp) { + if (gp->mode & ATTR_WDUMMY) + continue; + + ptr += utf8encode(gp->u, ptr); + } + + /* + * Copy and pasting of line endings is inconsistent + * in the inconsistent terminal and GUI world. + * The best solution seems like to produce '\n' when + * something is copied from st and convert '\n' to + * '\r', when something to be pasted is received by + * st. + * FIXME: Fix the computer world. + */ + if ((y < sel.ne.y || lastx >= linelen) && + (!(last->mode & ATTR_WRAP) || sel.type == SEL_RECTANGULAR)) + *ptr++ = '\n'; + } + *ptr = 0; + return str; +} + +void +selclear(void) +{ + if (sel.ob.x == -1) + return; + sel.mode = SEL_IDLE; + sel.ob.x = -1; + tsetdirt(sel.nb.y, sel.ne.y); +} + +void +die(const char *errstr, ...) +{ + va_list ap; + + va_start(ap, errstr); + vfprintf(stderr, errstr, ap); + va_end(ap); + exit(1); +} + +void +execsh(char *cmd, char **args) +{ + char *sh, *prog, *arg; + const struct passwd *pw; + + errno = 0; + if ((pw = getpwuid(getuid())) == NULL) { + if (errno) + die("getpwuid: %s\n", strerror(errno)); + else + die("who are you?\n"); + } + + if ((sh = getenv("SHELL")) == NULL) + sh = (pw->pw_shell[0]) ? pw->pw_shell : cmd; + + if (args) { + prog = args[0]; + arg = NULL; + } else if (scroll) { + prog = scroll; + arg = utmp ? utmp : sh; + } else if (utmp) { + prog = utmp; + arg = NULL; + } else { + prog = sh; + arg = NULL; + } + DEFAULT(args, ((char *[]) {prog, arg, NULL})); + + unsetenv("COLUMNS"); + unsetenv("LINES"); + unsetenv("TERMCAP"); + setenv("LOGNAME", pw->pw_name, 1); + setenv("USER", pw->pw_name, 1); + setenv("SHELL", sh, 1); + setenv("HOME", pw->pw_dir, 1); + setenv("TERM", termname, 1); + + signal(SIGCHLD, SIG_DFL); + signal(SIGHUP, SIG_DFL); + signal(SIGINT, SIG_DFL); + signal(SIGQUIT, SIG_DFL); + signal(SIGTERM, SIG_DFL); + signal(SIGALRM, SIG_DFL); + + execvp(prog, args); + _exit(1); +} + +void +sigchld(int a) +{ + int stat; + pid_t p; + + if ((p = waitpid(pid, &stat, WNOHANG)) < 0) + die("waiting for pid %hd failed: %s\n", pid, strerror(errno)); + + if (pid != p) + return; + + if (WIFEXITED(stat) && WEXITSTATUS(stat)) + die("child exited with status %d\n", WEXITSTATUS(stat)); + else if (WIFSIGNALED(stat)) + die("child terminated due to signal %d\n", WTERMSIG(stat)); + _exit(0); +} + +void +stty(char **args) +{ + char cmd[_POSIX_ARG_MAX], **p, *q, *s; + size_t n, siz; + + if ((n = strlen(stty_args)) > sizeof(cmd)-1) + die("incorrect stty parameters\n"); + memcpy(cmd, stty_args, n); + q = cmd + n; + siz = sizeof(cmd) - n; + for (p = args; p && (s = *p); ++p) { + if ((n = strlen(s)) > siz-1) + die("stty parameter length too long\n"); + *q++ = ' '; + memcpy(q, s, n); + q += n; + siz -= n + 1; + } + *q = '\0'; + if (system(cmd) != 0) + perror("Couldn't call stty"); +} + +int +ttynew(const char *line, char *cmd, const char *out, char **args) +{ + int m, s; + + if (out) { + term.mode |= MODE_PRINT; + iofd = (!strcmp(out, "-")) ? + 1 : open(out, O_WRONLY | O_CREAT, 0666); + if (iofd < 0) { + fprintf(stderr, "Error opening %s:%s\n", + out, strerror(errno)); + } + } + + if (line) { + if ((cmdfd = open(line, O_RDWR)) < 0) + die("open line '%s' failed: %s\n", + line, strerror(errno)); + dup2(cmdfd, 0); + stty(args); + return cmdfd; + } + + /* seems to work fine on linux, openbsd and freebsd */ + if (openpty(&m, &s, NULL, NULL, NULL) < 0) + die("openpty failed: %s\n", strerror(errno)); + + switch (pid = fork()) { + case -1: + die("fork failed: %s\n", strerror(errno)); + break; + case 0: + close(iofd); + close(m); + setsid(); /* create a new process group */ + dup2(s, 0); + dup2(s, 1); + dup2(s, 2); + if (ioctl(s, TIOCSCTTY, NULL) < 0) + die("ioctl TIOCSCTTY failed: %s\n", strerror(errno)); + if (s > 2) + close(s); +#ifdef __OpenBSD__ + if (pledge("stdio getpw proc exec", NULL) == -1) + die("pledge\n"); +#endif + execsh(cmd, args); + break; + default: +#ifdef __OpenBSD__ + if (pledge("stdio rpath tty proc", NULL) == -1) + die("pledge\n"); +#endif + close(s); + cmdfd = m; + signal(SIGCHLD, sigchld); + break; + } + return cmdfd; +} + +size_t +ttyread(void) +{ + static char buf[BUFSIZ]; + static int buflen = 0; + int ret, written; + + /* append read bytes to unprocessed bytes */ + ret = read(cmdfd, buf+buflen, LEN(buf)-buflen); + + switch (ret) { + case 0: + exit(0); + case -1: + die("couldn't read from shell: %s\n", strerror(errno)); + default: + buflen += ret; + written = twrite(buf, buflen, 0); + buflen -= written; + /* keep any incomplete UTF-8 byte sequence for the next call */ + if (buflen > 0) + memmove(buf, buf + written, buflen); + return ret; + } +} + +void +ttywrite(const char *s, size_t n, int may_echo) +{ + const char *next; + + if (may_echo && IS_SET(MODE_ECHO)) + twrite(s, n, 1); + + if (!IS_SET(MODE_CRLF)) { + ttywriteraw(s, n); + return; + } + + /* This is similar to how the kernel handles ONLCR for ttys */ + while (n > 0) { + if (*s == '\r') { + next = s + 1; + ttywriteraw("\r\n", 2); + } else { + next = memchr(s, '\r', n); + DEFAULT(next, s + n); + ttywriteraw(s, next - s); + } + n -= next - s; + s = next; + } +} + +void +ttywriteraw(const char *s, size_t n) +{ + fd_set wfd, rfd; + ssize_t r; + size_t lim = 256; + + /* + * Remember that we are using a pty, which might be a modem line. + * Writing too much will clog the line. That's why we are doing this + * dance. + * FIXME: Migrate the world to Plan 9. + */ + while (n > 0) { + FD_ZERO(&wfd); + FD_ZERO(&rfd); + FD_SET(cmdfd, &wfd); + FD_SET(cmdfd, &rfd); + + /* Check if we can write. */ + if (pselect(cmdfd+1, &rfd, &wfd, NULL, NULL, NULL) < 0) { + if (errno == EINTR) + continue; + die("select failed: %s\n", strerror(errno)); + } + if (FD_ISSET(cmdfd, &wfd)) { + /* + * Only write the bytes written by ttywrite() or the + * default of 256. This seems to be a reasonable value + * for a serial line. Bigger values might clog the I/O. + */ + if ((r = write(cmdfd, s, (n < lim)? n : lim)) < 0) + goto write_error; + if (r < n) { + /* + * We weren't able to write out everything. + * This means the buffer is getting full + * again. Empty it. + */ + if (n < lim) + lim = ttyread(); + n -= r; + s += r; + } else { + /* All bytes have been written. */ + break; + } + } + if (FD_ISSET(cmdfd, &rfd)) + lim = ttyread(); + } + return; + +write_error: + die("write error on tty: %s\n", strerror(errno)); +} + +void +ttyresize(int tw, int th) +{ + struct winsize w; + + w.ws_row = term.row; + w.ws_col = term.col; + w.ws_xpixel = tw; + w.ws_ypixel = th; + if (ioctl(cmdfd, TIOCSWINSZ, &w) < 0) + fprintf(stderr, "Couldn't set window size: %s\n", strerror(errno)); +} + +void +ttyhangup(void) +{ + /* Send SIGHUP to shell */ + kill(pid, SIGHUP); +} + +int +tattrset(int attr) +{ + int i, j; + + for (i = 0; i < term.row-1; i++) { + for (j = 0; j < term.col-1; j++) { + if (term.line[i][j].mode & attr) + return 1; + } + } + + return 0; +} + +void +tsetdirt(int top, int bot) +{ + int i; + + LIMIT(top, 0, term.row-1); + LIMIT(bot, 0, term.row-1); + + for (i = top; i <= bot; i++) + term.dirty[i] = 1; +} + +void +tsetdirtattr(int attr) +{ + int i, j; + + for (i = 0; i < term.row-1; i++) { + for (j = 0; j < term.col-1; j++) { + if (term.line[i][j].mode & attr) { + tsetdirt(i, i); + break; + } + } + } +} + +void +tfulldirt(void) +{ + tsetdirt(0, term.row-1); +} + +void +tcursor(int mode) +{ + static TCursor c[2]; + int alt = IS_SET(MODE_ALTSCREEN); + + if (mode == CURSOR_SAVE) { + c[alt] = term.c; + } else if (mode == CURSOR_LOAD) { + term.c = c[alt]; + tmoveto(c[alt].x, c[alt].y); + } +} + +void +treset(void) +{ + uint i; + + term.c = (TCursor){{ + .mode = ATTR_NULL, + .fg = defaultfg, + .bg = defaultbg + }, .x = 0, .y = 0, .state = CURSOR_DEFAULT}; + + memset(term.tabs, 0, term.col * sizeof(*term.tabs)); + for (i = tabspaces; i < term.col; i += tabspaces) + term.tabs[i] = 1; + term.top = 0; + term.bot = term.row - 1; + term.mode = MODE_WRAP|MODE_UTF8; + memset(term.trantbl, CS_USA, sizeof(term.trantbl)); + term.charset = 0; + + for (i = 0; i < 2; i++) { + tmoveto(0, 0); + tcursor(CURSOR_SAVE); + tclearregion(0, 0, term.col-1, term.row-1); + tswapscreen(); + } +} + +void +tnew(int col, int row) +{ + term = (Term){ .c = { .attr = { .fg = defaultfg, .bg = defaultbg } } }; + tresize(col, row); + treset(); +} + +void +tswapscreen(void) +{ + Line *tmp = term.line; + + term.line = term.alt; + term.alt = tmp; + term.mode ^= MODE_ALTSCREEN; + tfulldirt(); +} + +void +tscrolldown(int orig, int n) +{ + int i; + Line temp; + + LIMIT(n, 0, term.bot-orig+1); + + tsetdirt(orig, term.bot-n); + tclearregion(0, term.bot-n+1, term.col-1, term.bot); + + for (i = term.bot; i >= orig+n; i--) { + temp = term.line[i]; + term.line[i] = term.line[i-n]; + term.line[i-n] = temp; + } + + selscroll(orig, n); +} + +void +tscrollup(int orig, int n) +{ + int i; + Line temp; + + LIMIT(n, 0, term.bot-orig+1); + + tclearregion(0, orig, term.col-1, orig+n-1); + tsetdirt(orig+n, term.bot); + + for (i = orig; i <= term.bot-n; i++) { + temp = term.line[i]; + term.line[i] = term.line[i+n]; + term.line[i+n] = temp; + } + + selscroll(orig, -n); +} + +void +selscroll(int orig, int n) +{ + if (sel.ob.x == -1 || sel.alt != IS_SET(MODE_ALTSCREEN)) + return; + + if (BETWEEN(sel.nb.y, orig, term.bot) != BETWEEN(sel.ne.y, orig, term.bot)) { + selclear(); + } else if (BETWEEN(sel.nb.y, orig, term.bot)) { + sel.ob.y += n; + sel.oe.y += n; + if (sel.ob.y < term.top || sel.ob.y > term.bot || + sel.oe.y < term.top || sel.oe.y > term.bot) { + selclear(); + } else { + selnormalize(); + } + } +} + +void +tnewline(int first_col) +{ + int y = term.c.y; + + if (y == term.bot) { + tscrollup(term.top, 1); + } else { + y++; + } + tmoveto(first_col ? 0 : term.c.x, y); +} + +void +csiparse(void) +{ + char *p = csiescseq.buf, *np; + long int v; + int sep = ';'; /* colon or semi-colon, but not both */ + + csiescseq.narg = 0; + if (*p == '?') { + csiescseq.priv = 1; + p++; + } + + csiescseq.buf[csiescseq.len] = '\0'; + while (p < csiescseq.buf+csiescseq.len) { + np = NULL; + v = strtol(p, &np, 10); + if (np == p) + v = 0; + if (v == LONG_MAX || v == LONG_MIN) + v = -1; + csiescseq.arg[csiescseq.narg++] = v; + p = np; + if (sep == ';' && *p == ':') + sep = ':'; /* allow override to colon once */ + if (*p != sep || csiescseq.narg == ESC_ARG_SIZ) + break; + p++; + } + csiescseq.mode[0] = *p++; + csiescseq.mode[1] = (p < csiescseq.buf+csiescseq.len) ? *p : '\0'; +} + +/* for absolute user moves, when decom is set */ +void +tmoveato(int x, int y) +{ + tmoveto(x, y + ((term.c.state & CURSOR_ORIGIN) ? term.top: 0)); +} + +void +tmoveto(int x, int y) +{ + int miny, maxy; + + if (term.c.state & CURSOR_ORIGIN) { + miny = term.top; + maxy = term.bot; + } else { + miny = 0; + maxy = term.row - 1; + } + term.c.state &= ~CURSOR_WRAPNEXT; + term.c.x = LIMIT(x, 0, term.col-1); + term.c.y = LIMIT(y, miny, maxy); +} + +void +tsetchar(Rune u, const Glyph *attr, int x, int y) +{ + static const char *vt100_0[62] = { /* 0x41 - 0x7e */ + "↑", "↓", "→", "←", "█", "▚", "☃", /* A - G */ + 0, 0, 0, 0, 0, 0, 0, 0, /* H - O */ + 0, 0, 0, 0, 0, 0, 0, 0, /* P - W */ + 0, 0, 0, 0, 0, 0, 0, " ", /* X - _ */ + "◆", "▒", "␉", "␌", "␍", "␊", "°", "±", /* ` - g */ + "␤", "␋", "┘", "┐", "┌", "└", "┼", "⎺", /* h - o */ + "⎻", "─", "⎼", "⎽", "├", "┤", "┴", "┬", /* p - w */ + "│", "≤", "≥", "π", "≠", "£", "·", /* x - ~ */ + }; + + /* + * The table is proudly stolen from rxvt. + */ + if (term.trantbl[term.charset] == CS_GRAPHIC0 && + BETWEEN(u, 0x41, 0x7e) && vt100_0[u - 0x41]) + utf8decode(vt100_0[u - 0x41], &u, UTF_SIZ); + + if (term.line[y][x].mode & ATTR_WIDE) { + if (x+1 < term.col) { + term.line[y][x+1].u = ' '; + term.line[y][x+1].mode &= ~ATTR_WDUMMY; + } + } else if (term.line[y][x].mode & ATTR_WDUMMY) { + term.line[y][x-1].u = ' '; + term.line[y][x-1].mode &= ~ATTR_WIDE; + } + + term.dirty[y] = 1; + term.line[y][x] = *attr; + term.line[y][x].u = u; +} + +void +tclearregion(int x1, int y1, int x2, int y2) +{ + int x, y, temp; + Glyph *gp; + + if (x1 > x2) + temp = x1, x1 = x2, x2 = temp; + if (y1 > y2) + temp = y1, y1 = y2, y2 = temp; + + LIMIT(x1, 0, term.col-1); + LIMIT(x2, 0, term.col-1); + LIMIT(y1, 0, term.row-1); + LIMIT(y2, 0, term.row-1); + + for (y = y1; y <= y2; y++) { + term.dirty[y] = 1; + for (x = x1; x <= x2; x++) { + gp = &term.line[y][x]; + if (selected(x, y)) + selclear(); + gp->fg = term.c.attr.fg; + gp->bg = term.c.attr.bg; + gp->mode = 0; + gp->u = ' '; + } + } +} + +void +tdeletechar(int n) +{ + int dst, src, size; + Glyph *line; + + LIMIT(n, 0, term.col - term.c.x); + + dst = term.c.x; + src = term.c.x + n; + size = term.col - src; + line = term.line[term.c.y]; + + memmove(&line[dst], &line[src], size * sizeof(Glyph)); + tclearregion(term.col-n, term.c.y, term.col-1, term.c.y); +} + +void +tinsertblank(int n) +{ + int dst, src, size; + Glyph *line; + + LIMIT(n, 0, term.col - term.c.x); + + dst = term.c.x + n; + src = term.c.x; + size = term.col - dst; + line = term.line[term.c.y]; + + memmove(&line[dst], &line[src], size * sizeof(Glyph)); + tclearregion(src, term.c.y, dst - 1, term.c.y); +} + +void +tinsertblankline(int n) +{ + if (BETWEEN(term.c.y, term.top, term.bot)) + tscrolldown(term.c.y, n); +} + +void +tdeleteline(int n) +{ + if (BETWEEN(term.c.y, term.top, term.bot)) + tscrollup(term.c.y, n); +} + +int32_t +tdefcolor(const int *attr, int *npar, int l) +{ + int32_t idx = -1; + uint r, g, b; + + switch (attr[*npar + 1]) { + case 2: /* direct color in RGB space */ + if (*npar + 4 >= l) { + fprintf(stderr, + "erresc(38): Incorrect number of parameters (%d)\n", + *npar); + break; + } + r = attr[*npar + 2]; + g = attr[*npar + 3]; + b = attr[*npar + 4]; + *npar += 4; + if (!BETWEEN(r, 0, 255) || !BETWEEN(g, 0, 255) || !BETWEEN(b, 0, 255)) + fprintf(stderr, "erresc: bad rgb color (%u,%u,%u)\n", + r, g, b); + else + idx = TRUECOLOR(r, g, b); + break; + case 5: /* indexed color */ + if (*npar + 2 >= l) { + fprintf(stderr, + "erresc(38): Incorrect number of parameters (%d)\n", + *npar); + break; + } + *npar += 2; + if (!BETWEEN(attr[*npar], 0, 255)) + fprintf(stderr, "erresc: bad fgcolor %d\n", attr[*npar]); + else + idx = attr[*npar]; + break; + case 0: /* implemented defined (only foreground) */ + case 1: /* transparent */ + case 3: /* direct color in CMY space */ + case 4: /* direct color in CMYK space */ + default: + fprintf(stderr, + "erresc(38): gfx attr %d unknown\n", attr[*npar]); + break; + } + + return idx; +} + +void +tsetattr(const int *attr, int l) +{ + int i; + int32_t idx; + + for (i = 0; i < l; i++) { + switch (attr[i]) { + case 0: + term.c.attr.mode &= ~( + ATTR_BOLD | + ATTR_FAINT | + ATTR_ITALIC | + ATTR_UNDERLINE | + ATTR_BLINK | + ATTR_REVERSE | + ATTR_INVISIBLE | + ATTR_STRUCK ); + term.c.attr.fg = defaultfg; + term.c.attr.bg = defaultbg; + break; + case 1: + term.c.attr.mode |= ATTR_BOLD; + break; + case 2: + term.c.attr.mode |= ATTR_FAINT; + break; + case 3: + term.c.attr.mode |= ATTR_ITALIC; + break; + case 4: + term.c.attr.mode |= ATTR_UNDERLINE; + break; + case 5: /* slow blink */ + /* FALLTHROUGH */ + case 6: /* rapid blink */ + term.c.attr.mode |= ATTR_BLINK; + break; + case 7: + term.c.attr.mode |= ATTR_REVERSE; + break; + case 8: + term.c.attr.mode |= ATTR_INVISIBLE; + break; + case 9: + term.c.attr.mode |= ATTR_STRUCK; + break; + case 22: + term.c.attr.mode &= ~(ATTR_BOLD | ATTR_FAINT); + break; + case 23: + term.c.attr.mode &= ~ATTR_ITALIC; + break; + case 24: + term.c.attr.mode &= ~ATTR_UNDERLINE; + break; + case 25: + term.c.attr.mode &= ~ATTR_BLINK; + break; + case 27: + term.c.attr.mode &= ~ATTR_REVERSE; + break; + case 28: + term.c.attr.mode &= ~ATTR_INVISIBLE; + break; + case 29: + term.c.attr.mode &= ~ATTR_STRUCK; + break; + case 38: + if ((idx = tdefcolor(attr, &i, l)) >= 0) + term.c.attr.fg = idx; + break; + case 39: + term.c.attr.fg = defaultfg; + break; + case 48: + if ((idx = tdefcolor(attr, &i, l)) >= 0) + term.c.attr.bg = idx; + break; + case 49: + term.c.attr.bg = defaultbg; + break; + default: + if (BETWEEN(attr[i], 30, 37)) { + term.c.attr.fg = attr[i] - 30; + } else if (BETWEEN(attr[i], 40, 47)) { + term.c.attr.bg = attr[i] - 40; + } else if (BETWEEN(attr[i], 90, 97)) { + term.c.attr.fg = attr[i] - 90 + 8; + } else if (BETWEEN(attr[i], 100, 107)) { + term.c.attr.bg = attr[i] - 100 + 8; + } else { + fprintf(stderr, + "erresc(default): gfx attr %d unknown\n", + attr[i]); + csidump(); + } + break; + } + } +} + +void +tsetscroll(int t, int b) +{ + int temp; + + LIMIT(t, 0, term.row-1); + LIMIT(b, 0, term.row-1); + if (t > b) { + temp = t; + t = b; + b = temp; + } + term.top = t; + term.bot = b; +} + +void +tsetmode(int priv, int set, const int *args, int narg) +{ + int alt; const int *lim; + + for (lim = args + narg; args < lim; ++args) { + if (priv) { + switch (*args) { + case 1: /* DECCKM -- Cursor key */ + xsetmode(set, MODE_APPCURSOR); + break; + case 5: /* DECSCNM -- Reverse video */ + xsetmode(set, MODE_REVERSE); + break; + case 6: /* DECOM -- Origin */ + MODBIT(term.c.state, set, CURSOR_ORIGIN); + tmoveato(0, 0); + break; + case 7: /* DECAWM -- Auto wrap */ + MODBIT(term.mode, set, MODE_WRAP); + break; + case 0: /* Error (IGNORED) */ + case 2: /* DECANM -- ANSI/VT52 (IGNORED) */ + case 3: /* DECCOLM -- Column (IGNORED) */ + case 4: /* DECSCLM -- Scroll (IGNORED) */ + case 8: /* DECARM -- Auto repeat (IGNORED) */ + case 18: /* DECPFF -- Printer feed (IGNORED) */ + case 19: /* DECPEX -- Printer extent (IGNORED) */ + case 42: /* DECNRCM -- National characters (IGNORED) */ + case 12: /* att610 -- Start blinking cursor (IGNORED) */ + break; + case 25: /* DECTCEM -- Text Cursor Enable Mode */ + xsetmode(!set, MODE_HIDE); + break; + case 9: /* X10 mouse compatibility mode */ + xsetpointermotion(0); + xsetmode(0, MODE_MOUSE); + xsetmode(set, MODE_MOUSEX10); + break; + case 1000: /* 1000: report button press */ + xsetpointermotion(0); + xsetmode(0, MODE_MOUSE); + xsetmode(set, MODE_MOUSEBTN); + break; + case 1002: /* 1002: report motion on button press */ + xsetpointermotion(0); + xsetmode(0, MODE_MOUSE); + xsetmode(set, MODE_MOUSEMOTION); + break; + case 1003: /* 1003: enable all mouse motions */ + xsetpointermotion(set); + xsetmode(0, MODE_MOUSE); + xsetmode(set, MODE_MOUSEMANY); + break; + case 1004: /* 1004: send focus events to tty */ + xsetmode(set, MODE_FOCUS); + break; + case 1006: /* 1006: extended reporting mode */ + xsetmode(set, MODE_MOUSESGR); + break; + case 1034: + xsetmode(set, MODE_8BIT); + break; + case 1049: /* swap screen & set/restore cursor as xterm */ + if (!allowaltscreen) + break; + tcursor((set) ? CURSOR_SAVE : CURSOR_LOAD); + /* FALLTHROUGH */ + case 47: /* swap screen */ + case 1047: + if (!allowaltscreen) + break; + alt = IS_SET(MODE_ALTSCREEN); + if (alt) { + tclearregion(0, 0, term.col-1, + term.row-1); + } + if (set ^ alt) /* set is always 1 or 0 */ + tswapscreen(); + if (*args != 1049) + break; + /* FALLTHROUGH */ + case 1048: + tcursor((set) ? CURSOR_SAVE : CURSOR_LOAD); + break; + case 2004: /* 2004: bracketed paste mode */ + xsetmode(set, MODE_BRCKTPASTE); + break; + /* Not implemented mouse modes. See comments there. */ + case 1001: /* mouse highlight mode; can hang the + terminal by design when implemented. */ + case 1005: /* UTF-8 mouse mode; will confuse + applications not supporting UTF-8 + and luit. */ + case 1015: /* urxvt mangled mouse mode; incompatible + and can be mistaken for other control + codes. */ + break; + default: + fprintf(stderr, + "erresc: unknown private set/reset mode %d\n", + *args); + break; + } + } else { + switch (*args) { + case 0: /* Error (IGNORED) */ + break; + case 2: + xsetmode(set, MODE_KBDLOCK); + break; + case 4: /* IRM -- Insertion-replacement */ + MODBIT(term.mode, set, MODE_INSERT); + break; + case 12: /* SRM -- Send/Receive */ + MODBIT(term.mode, !set, MODE_ECHO); + break; + case 20: /* LNM -- Linefeed/new line */ + MODBIT(term.mode, set, MODE_CRLF); + break; + default: + fprintf(stderr, + "erresc: unknown set/reset mode %d\n", + *args); + break; + } + } + } +} + +void +csihandle(void) +{ + char buf[40]; + int len; + + switch (csiescseq.mode[0]) { + default: + unknown: + fprintf(stderr, "erresc: unknown csi "); + csidump(); + /* die(""); */ + break; + case '@': /* ICH -- Insert blank char */ + DEFAULT(csiescseq.arg[0], 1); + tinsertblank(csiescseq.arg[0]); + break; + case 'A': /* CUU -- Cursor Up */ + DEFAULT(csiescseq.arg[0], 1); + tmoveto(term.c.x, term.c.y-csiescseq.arg[0]); + break; + case 'B': /* CUD -- Cursor Down */ + case 'e': /* VPR --Cursor Down */ + DEFAULT(csiescseq.arg[0], 1); + tmoveto(term.c.x, term.c.y+csiescseq.arg[0]); + break; + case 'i': /* MC -- Media Copy */ + switch (csiescseq.arg[0]) { + case 0: + tdump(); + break; + case 1: + tdumpline(term.c.y); + break; + case 2: + tdumpsel(); + break; + case 4: + term.mode &= ~MODE_PRINT; + break; + case 5: + term.mode |= MODE_PRINT; + break; + } + break; + case 'c': /* DA -- Device Attributes */ + if (csiescseq.arg[0] == 0) + ttywrite(vtiden, strlen(vtiden), 0); + break; + case 'b': /* REP -- if last char is printable print it more times */ + LIMIT(csiescseq.arg[0], 1, 65535); + if (term.lastc) + while (csiescseq.arg[0]-- > 0) + tputc(term.lastc); + break; + case 'C': /* CUF -- Cursor Forward */ + case 'a': /* HPR -- Cursor Forward */ + DEFAULT(csiescseq.arg[0], 1); + tmoveto(term.c.x+csiescseq.arg[0], term.c.y); + break; + case 'D': /* CUB -- Cursor Backward */ + DEFAULT(csiescseq.arg[0], 1); + tmoveto(term.c.x-csiescseq.arg[0], term.c.y); + break; + case 'E': /* CNL -- Cursor Down and first col */ + DEFAULT(csiescseq.arg[0], 1); + tmoveto(0, term.c.y+csiescseq.arg[0]); + break; + case 'F': /* CPL -- Cursor Up and first col */ + DEFAULT(csiescseq.arg[0], 1); + tmoveto(0, term.c.y-csiescseq.arg[0]); + break; + case 'g': /* TBC -- Tabulation clear */ + switch (csiescseq.arg[0]) { + case 0: /* clear current tab stop */ + term.tabs[term.c.x] = 0; + break; + case 3: /* clear all the tabs */ + memset(term.tabs, 0, term.col * sizeof(*term.tabs)); + break; + default: + goto unknown; + } + break; + case 'G': /* CHA -- Move to */ + case '`': /* HPA */ + DEFAULT(csiescseq.arg[0], 1); + tmoveto(csiescseq.arg[0]-1, term.c.y); + break; + case 'H': /* CUP -- Move to */ + case 'f': /* HVP */ + DEFAULT(csiescseq.arg[0], 1); + DEFAULT(csiescseq.arg[1], 1); + tmoveato(csiescseq.arg[1]-1, csiescseq.arg[0]-1); + break; + case 'I': /* CHT -- Cursor Forward Tabulation tab stops */ + DEFAULT(csiescseq.arg[0], 1); + tputtab(csiescseq.arg[0]); + break; + case 'J': /* ED -- Clear screen */ + switch (csiescseq.arg[0]) { + case 0: /* below */ + tclearregion(term.c.x, term.c.y, term.col-1, term.c.y); + if (term.c.y < term.row-1) { + tclearregion(0, term.c.y+1, term.col-1, + term.row-1); + } + break; + case 1: /* above */ + if (term.c.y > 0) + tclearregion(0, 0, term.col-1, term.c.y-1); + tclearregion(0, term.c.y, term.c.x, term.c.y); + break; + case 2: /* all */ + tclearregion(0, 0, term.col-1, term.row-1); + break; + default: + goto unknown; + } + break; + case 'K': /* EL -- Clear line */ + switch (csiescseq.arg[0]) { + case 0: /* right */ + tclearregion(term.c.x, term.c.y, term.col-1, + term.c.y); + break; + case 1: /* left */ + tclearregion(0, term.c.y, term.c.x, term.c.y); + break; + case 2: /* all */ + tclearregion(0, term.c.y, term.col-1, term.c.y); + break; + } + break; + case 'S': /* SU -- Scroll line up */ + if (csiescseq.priv) break; + DEFAULT(csiescseq.arg[0], 1); + tscrollup(term.top, csiescseq.arg[0]); + break; + case 'T': /* SD -- Scroll line down */ + DEFAULT(csiescseq.arg[0], 1); + tscrolldown(term.top, csiescseq.arg[0]); + break; + case 'L': /* IL -- Insert blank lines */ + DEFAULT(csiescseq.arg[0], 1); + tinsertblankline(csiescseq.arg[0]); + break; + case 'l': /* RM -- Reset Mode */ + tsetmode(csiescseq.priv, 0, csiescseq.arg, csiescseq.narg); + break; + case 'M': /* DL -- Delete lines */ + DEFAULT(csiescseq.arg[0], 1); + tdeleteline(csiescseq.arg[0]); + break; + case 'X': /* ECH -- Erase char */ + DEFAULT(csiescseq.arg[0], 1); + tclearregion(term.c.x, term.c.y, + term.c.x + csiescseq.arg[0] - 1, term.c.y); + break; + case 'P': /* DCH -- Delete char */ + DEFAULT(csiescseq.arg[0], 1); + tdeletechar(csiescseq.arg[0]); + break; + case 'Z': /* CBT -- Cursor Backward Tabulation tab stops */ + DEFAULT(csiescseq.arg[0], 1); + tputtab(-csiescseq.arg[0]); + break; + case 'd': /* VPA -- Move to */ + DEFAULT(csiescseq.arg[0], 1); + tmoveato(term.c.x, csiescseq.arg[0]-1); + break; + case 'h': /* SM -- Set terminal mode */ + tsetmode(csiescseq.priv, 1, csiescseq.arg, csiescseq.narg); + break; + case 'm': /* SGR -- Terminal attribute (color) */ + tsetattr(csiescseq.arg, csiescseq.narg); + break; + case 'n': /* DSR -- Device Status Report */ + switch (csiescseq.arg[0]) { + case 5: /* Status Report "OK" `0n` */ + ttywrite("\033[0n", sizeof("\033[0n") - 1, 0); + break; + case 6: /* Report Cursor Position (CPR) ";R" */ + len = snprintf(buf, sizeof(buf), "\033[%i;%iR", + term.c.y+1, term.c.x+1); + ttywrite(buf, len, 0); + break; + default: + goto unknown; + } + break; + case 'r': /* DECSTBM -- Set Scrolling Region */ + if (csiescseq.priv) { + goto unknown; + } else { + DEFAULT(csiescseq.arg[0], 1); + DEFAULT(csiescseq.arg[1], term.row); + tsetscroll(csiescseq.arg[0]-1, csiescseq.arg[1]-1); + tmoveato(0, 0); + } + break; + case 's': /* DECSC -- Save cursor position (ANSI.SYS) */ + tcursor(CURSOR_SAVE); + break; + case 'u': /* DECRC -- Restore cursor position (ANSI.SYS) */ + tcursor(CURSOR_LOAD); + break; + case ' ': + switch (csiescseq.mode[1]) { + case 'q': /* DECSCUSR -- Set Cursor Style */ + if (xsetcursor(csiescseq.arg[0])) + goto unknown; + break; + default: + goto unknown; + } + break; + } +} + +void +csidump(void) +{ + size_t i; + uint c; + + fprintf(stderr, "ESC["); + for (i = 0; i < csiescseq.len; i++) { + c = csiescseq.buf[i] & 0xff; + if (isprint(c)) { + putc(c, stderr); + } else if (c == '\n') { + fprintf(stderr, "(\\n)"); + } else if (c == '\r') { + fprintf(stderr, "(\\r)"); + } else if (c == 0x1b) { + fprintf(stderr, "(\\e)"); + } else { + fprintf(stderr, "(%02x)", c); + } + } + putc('\n', stderr); +} + +void +csireset(void) +{ + memset(&csiescseq, 0, sizeof(csiescseq)); +} + +void +osc_color_response(int num, int index, int is_osc4) +{ + int n; + char buf[32]; + unsigned char r, g, b; + + if (xgetcolor(is_osc4 ? num : index, &r, &g, &b)) { + fprintf(stderr, "erresc: failed to fetch %s color %d\n", + is_osc4 ? "osc4" : "osc", + is_osc4 ? num : index); + return; + } + + n = snprintf(buf, sizeof buf, "\033]%s%d;rgb:%02x%02x/%02x%02x/%02x%02x\007", + is_osc4 ? "4;" : "", num, r, r, g, g, b, b); + if (n < 0 || n >= sizeof(buf)) { + fprintf(stderr, "error: %s while printing %s response\n", + n < 0 ? "snprintf failed" : "truncation occurred", + is_osc4 ? "osc4" : "osc"); + } else { + ttywrite(buf, n, 1); + } +} + +void +strhandle(void) +{ + char *p = NULL, *dec; + int j, narg, par; + const struct { int idx; char *str; } osc_table[] = { + { defaultfg, "foreground" }, + { defaultbg, "background" }, + { defaultcs, "cursor" } + }; + + term.esc &= ~(ESC_STR_END|ESC_STR); + strparse(); + par = (narg = strescseq.narg) ? atoi(strescseq.args[0]) : 0; + + switch (strescseq.type) { + case ']': /* OSC -- Operating System Command */ + switch (par) { + case 0: + if (narg > 1) { + xsettitle(strescseq.args[1]); + xseticontitle(strescseq.args[1]); + } + return; + case 1: + if (narg > 1) + xseticontitle(strescseq.args[1]); + return; + case 2: + if (narg > 1) + xsettitle(strescseq.args[1]); + return; + case 52: + if (narg > 2 && allowwindowops) { + dec = base64dec(strescseq.args[2]); + if (dec) { + xsetsel(dec); + xclipcopy(); + } else { + fprintf(stderr, "erresc: invalid base64\n"); + } + } + return; + case 10: + case 11: + case 12: + if (narg < 2) + break; + p = strescseq.args[1]; + if ((j = par - 10) < 0 || j >= LEN(osc_table)) + break; /* shouldn't be possible */ + + if (!strcmp(p, "?")) { + osc_color_response(par, osc_table[j].idx, 0); + } else if (xsetcolorname(osc_table[j].idx, p)) { + fprintf(stderr, "erresc: invalid %s color: %s\n", + osc_table[j].str, p); + } else { + tfulldirt(); + } + return; + case 4: /* color set */ + if (narg < 3) + break; + p = strescseq.args[2]; + /* FALLTHROUGH */ + case 104: /* color reset */ + j = (narg > 1) ? atoi(strescseq.args[1]) : -1; + + if (p && !strcmp(p, "?")) { + osc_color_response(j, 0, 1); + } else if (xsetcolorname(j, p)) { + if (par == 104 && narg <= 1) { + xloadcols(); + return; /* color reset without parameter */ + } + fprintf(stderr, "erresc: invalid color j=%d, p=%s\n", + j, p ? p : "(null)"); + } else { + /* + * TODO if defaultbg color is changed, borders + * are dirty + */ + tfulldirt(); + } + return; + } + break; + case 'k': /* old title set compatibility */ + xsettitle(strescseq.args[0]); + return; + case 'P': /* DCS -- Device Control String */ + case '_': /* APC -- Application Program Command */ + case '^': /* PM -- Privacy Message */ + return; + } + + fprintf(stderr, "erresc: unknown str "); + strdump(); +} + +void +strparse(void) +{ + int c; + char *p = strescseq.buf; + + strescseq.narg = 0; + strescseq.buf[strescseq.len] = '\0'; + + if (*p == '\0') + return; + + while (strescseq.narg < STR_ARG_SIZ) { + strescseq.args[strescseq.narg++] = p; + while ((c = *p) != ';' && c != '\0') + ++p; + if (c == '\0') + return; + *p++ = '\0'; + } +} + +void +strdump(void) +{ + size_t i; + uint c; + + fprintf(stderr, "ESC%c", strescseq.type); + for (i = 0; i < strescseq.len; i++) { + c = strescseq.buf[i] & 0xff; + if (c == '\0') { + putc('\n', stderr); + return; + } else if (isprint(c)) { + putc(c, stderr); + } else if (c == '\n') { + fprintf(stderr, "(\\n)"); + } else if (c == '\r') { + fprintf(stderr, "(\\r)"); + } else if (c == 0x1b) { + fprintf(stderr, "(\\e)"); + } else { + fprintf(stderr, "(%02x)", c); + } + } + fprintf(stderr, "ESC\\\n"); +} + +void +strreset(void) +{ + strescseq = (STREscape){ + .buf = xrealloc(strescseq.buf, STR_BUF_SIZ), + .siz = STR_BUF_SIZ, + }; +} + +void +sendbreak(const Arg *arg) +{ + if (tcsendbreak(cmdfd, 0)) + perror("Error sending break"); +} + +void +tprinter(char *s, size_t len) +{ + if (iofd != -1 && xwrite(iofd, s, len) < 0) { + perror("Error writing to output file"); + close(iofd); + iofd = -1; + } +} + +void +toggleprinter(const Arg *arg) +{ + term.mode ^= MODE_PRINT; +} + +void +printscreen(const Arg *arg) +{ + tdump(); +} + +void +printsel(const Arg *arg) +{ + tdumpsel(); +} + +void +tdumpsel(void) +{ + char *ptr; + + if ((ptr = getsel())) { + tprinter(ptr, strlen(ptr)); + free(ptr); + } +} + +void +tdumpline(int n) +{ + char buf[UTF_SIZ]; + const Glyph *bp, *end; + + bp = &term.line[n][0]; + end = &bp[MIN(tlinelen(n), term.col) - 1]; + if (bp != end || bp->u != ' ') { + for ( ; bp <= end; ++bp) + tprinter(buf, utf8encode(bp->u, buf)); + } + tprinter("\n", 1); +} + +void +tdump(void) +{ + int i; + + for (i = 0; i < term.row; ++i) + tdumpline(i); +} + +void +tputtab(int n) +{ + uint x = term.c.x; + + if (n > 0) { + while (x < term.col && n--) + for (++x; x < term.col && !term.tabs[x]; ++x) + /* nothing */ ; + } else if (n < 0) { + while (x > 0 && n++) + for (--x; x > 0 && !term.tabs[x]; --x) + /* nothing */ ; + } + term.c.x = LIMIT(x, 0, term.col-1); +} + +void +tdefutf8(char ascii) +{ + if (ascii == 'G') + term.mode |= MODE_UTF8; + else if (ascii == '@') + term.mode &= ~MODE_UTF8; +} + +void +tdeftran(char ascii) +{ + static char cs[] = "0B"; + static int vcs[] = {CS_GRAPHIC0, CS_USA}; + char *p; + + if ((p = strchr(cs, ascii)) == NULL) { + fprintf(stderr, "esc unhandled charset: ESC ( %c\n", ascii); + } else { + term.trantbl[term.icharset] = vcs[p - cs]; + } +} + +void +tdectest(char c) +{ + int x, y; + + if (c == '8') { /* DEC screen alignment test. */ + for (x = 0; x < term.col; ++x) { + for (y = 0; y < term.row; ++y) + tsetchar('E', &term.c.attr, x, y); + } + } +} + +void +tstrsequence(uchar c) +{ + switch (c) { + case 0x90: /* DCS -- Device Control String */ + c = 'P'; + break; + case 0x9f: /* APC -- Application Program Command */ + c = '_'; + break; + case 0x9e: /* PM -- Privacy Message */ + c = '^'; + break; + case 0x9d: /* OSC -- Operating System Command */ + c = ']'; + break; + } + strreset(); + strescseq.type = c; + term.esc |= ESC_STR; +} + +void +tcontrolcode(uchar ascii) +{ + switch (ascii) { + case '\t': /* HT */ + tputtab(1); + return; + case '\b': /* BS */ + tmoveto(term.c.x-1, term.c.y); + return; + case '\r': /* CR */ + tmoveto(0, term.c.y); + return; + case '\f': /* LF */ + case '\v': /* VT */ + case '\n': /* LF */ + /* go to first col if the mode is set */ + tnewline(IS_SET(MODE_CRLF)); + return; + case '\a': /* BEL */ + if (term.esc & ESC_STR_END) { + /* backwards compatibility to xterm */ + strhandle(); + } else { + xbell(); + } + break; + case '\033': /* ESC */ + csireset(); + term.esc &= ~(ESC_CSI|ESC_ALTCHARSET|ESC_TEST); + term.esc |= ESC_START; + return; + case '\016': /* SO (LS1 -- Locking shift 1) */ + case '\017': /* SI (LS0 -- Locking shift 0) */ + term.charset = 1 - (ascii - '\016'); + return; + case '\032': /* SUB */ + tsetchar('?', &term.c.attr, term.c.x, term.c.y); + /* FALLTHROUGH */ + case '\030': /* CAN */ + csireset(); + break; + case '\005': /* ENQ (IGNORED) */ + case '\000': /* NUL (IGNORED) */ + case '\021': /* XON (IGNORED) */ + case '\023': /* XOFF (IGNORED) */ + case 0177: /* DEL (IGNORED) */ + return; + case 0x80: /* TODO: PAD */ + case 0x81: /* TODO: HOP */ + case 0x82: /* TODO: BPH */ + case 0x83: /* TODO: NBH */ + case 0x84: /* TODO: IND */ + break; + case 0x85: /* NEL -- Next line */ + tnewline(1); /* always go to first col */ + break; + case 0x86: /* TODO: SSA */ + case 0x87: /* TODO: ESA */ + break; + case 0x88: /* HTS -- Horizontal tab stop */ + term.tabs[term.c.x] = 1; + break; + case 0x89: /* TODO: HTJ */ + case 0x8a: /* TODO: VTS */ + case 0x8b: /* TODO: PLD */ + case 0x8c: /* TODO: PLU */ + case 0x8d: /* TODO: RI */ + case 0x8e: /* TODO: SS2 */ + case 0x8f: /* TODO: SS3 */ + case 0x91: /* TODO: PU1 */ + case 0x92: /* TODO: PU2 */ + case 0x93: /* TODO: STS */ + case 0x94: /* TODO: CCH */ + case 0x95: /* TODO: MW */ + case 0x96: /* TODO: SPA */ + case 0x97: /* TODO: EPA */ + case 0x98: /* TODO: SOS */ + case 0x99: /* TODO: SGCI */ + break; + case 0x9a: /* DECID -- Identify Terminal */ + ttywrite(vtiden, strlen(vtiden), 0); + break; + case 0x9b: /* TODO: CSI */ + case 0x9c: /* TODO: ST */ + break; + case 0x90: /* DCS -- Device Control String */ + case 0x9d: /* OSC -- Operating System Command */ + case 0x9e: /* PM -- Privacy Message */ + case 0x9f: /* APC -- Application Program Command */ + tstrsequence(ascii); + return; + } + /* only CAN, SUB, \a and C1 chars interrupt a sequence */ + term.esc &= ~(ESC_STR_END|ESC_STR); +} + +/* + * returns 1 when the sequence is finished and it hasn't to read + * more characters for this sequence, otherwise 0 + */ +int +eschandle(uchar ascii) +{ + switch (ascii) { + case '[': + term.esc |= ESC_CSI; + return 0; + case '#': + term.esc |= ESC_TEST; + return 0; + case '%': + term.esc |= ESC_UTF8; + return 0; + case 'P': /* DCS -- Device Control String */ + case '_': /* APC -- Application Program Command */ + case '^': /* PM -- Privacy Message */ + case ']': /* OSC -- Operating System Command */ + case 'k': /* old title set compatibility */ + tstrsequence(ascii); + return 0; + case 'n': /* LS2 -- Locking shift 2 */ + case 'o': /* LS3 -- Locking shift 3 */ + term.charset = 2 + (ascii - 'n'); + break; + case '(': /* GZD4 -- set primary charset G0 */ + case ')': /* G1D4 -- set secondary charset G1 */ + case '*': /* G2D4 -- set tertiary charset G2 */ + case '+': /* G3D4 -- set quaternary charset G3 */ + term.icharset = ascii - '('; + term.esc |= ESC_ALTCHARSET; + return 0; + case 'D': /* IND -- Linefeed */ + if (term.c.y == term.bot) { + tscrollup(term.top, 1); + } else { + tmoveto(term.c.x, term.c.y+1); + } + break; + case 'E': /* NEL -- Next line */ + tnewline(1); /* always go to first col */ + break; + case 'H': /* HTS -- Horizontal tab stop */ + term.tabs[term.c.x] = 1; + break; + case 'M': /* RI -- Reverse index */ + if (term.c.y == term.top) { + tscrolldown(term.top, 1); + } else { + tmoveto(term.c.x, term.c.y-1); + } + break; + case 'Z': /* DECID -- Identify Terminal */ + ttywrite(vtiden, strlen(vtiden), 0); + break; + case 'c': /* RIS -- Reset to initial state */ + treset(); + resettitle(); + xloadcols(); + xsetmode(0, MODE_HIDE); + break; + case '=': /* DECPAM -- Application keypad */ + xsetmode(1, MODE_APPKEYPAD); + break; + case '>': /* DECPNM -- Normal keypad */ + xsetmode(0, MODE_APPKEYPAD); + break; + case '7': /* DECSC -- Save Cursor */ + tcursor(CURSOR_SAVE); + break; + case '8': /* DECRC -- Restore Cursor */ + tcursor(CURSOR_LOAD); + break; + case '\\': /* ST -- String Terminator */ + if (term.esc & ESC_STR_END) + strhandle(); + break; + default: + fprintf(stderr, "erresc: unknown sequence ESC 0x%02X '%c'\n", + (uchar) ascii, isprint(ascii)? ascii:'.'); + break; + } + return 1; +} + +void +tputc(Rune u) +{ + char c[UTF_SIZ]; + int control; + int width, len; + Glyph *gp; + + control = ISCONTROL(u); + if (u < 127 || !IS_SET(MODE_UTF8)) { + c[0] = u; + width = len = 1; + } else { + len = utf8encode(u, c); + if (!control && (width = wcwidth(u)) == -1) + width = 1; + } + + if (IS_SET(MODE_PRINT)) + tprinter(c, len); + + /* + * STR sequence must be checked before anything else + * because it uses all following characters until it + * receives a ESC, a SUB, a ST or any other C1 control + * character. + */ + if (term.esc & ESC_STR) { + if (u == '\a' || u == 030 || u == 032 || u == 033 || + ISCONTROLC1(u)) { + term.esc &= ~(ESC_START|ESC_STR); + term.esc |= ESC_STR_END; + goto check_control_code; + } + + if (strescseq.len+len >= strescseq.siz) { + /* + * Here is a bug in terminals. If the user never sends + * some code to stop the str or esc command, then st + * will stop responding. But this is better than + * silently failing with unknown characters. At least + * then users will report back. + * + * In the case users ever get fixed, here is the code: + */ + /* + * term.esc = 0; + * strhandle(); + */ + if (strescseq.siz > (SIZE_MAX - UTF_SIZ) / 2) + return; + strescseq.siz *= 2; + strescseq.buf = xrealloc(strescseq.buf, strescseq.siz); + } + + memmove(&strescseq.buf[strescseq.len], c, len); + strescseq.len += len; + return; + } + +check_control_code: + /* + * Actions of control codes must be performed as soon they arrive + * because they can be embedded inside a control sequence, and + * they must not cause conflicts with sequences. + */ + if (control) { + /* in UTF-8 mode ignore handling C1 control characters */ + if (IS_SET(MODE_UTF8) && ISCONTROLC1(u)) + return; + tcontrolcode(u); + /* + * control codes are not shown ever + */ + if (!term.esc) + term.lastc = 0; + return; + } else if (term.esc & ESC_START) { + if (term.esc & ESC_CSI) { + csiescseq.buf[csiescseq.len++] = u; + if (BETWEEN(u, 0x40, 0x7E) + || csiescseq.len >= \ + sizeof(csiescseq.buf)-1) { + term.esc = 0; + csiparse(); + csihandle(); + } + return; + } else if (term.esc & ESC_UTF8) { + tdefutf8(u); + } else if (term.esc & ESC_ALTCHARSET) { + tdeftran(u); + } else if (term.esc & ESC_TEST) { + tdectest(u); + } else { + if (!eschandle(u)) + return; + /* sequence already finished */ + } + term.esc = 0; + /* + * All characters which form part of a sequence are not + * printed + */ + return; + } + if (selected(term.c.x, term.c.y)) + selclear(); + + gp = &term.line[term.c.y][term.c.x]; + if (IS_SET(MODE_WRAP) && (term.c.state & CURSOR_WRAPNEXT)) { + gp->mode |= ATTR_WRAP; + tnewline(1); + gp = &term.line[term.c.y][term.c.x]; + } + + if (IS_SET(MODE_INSERT) && term.c.x+width < term.col) { + memmove(gp+width, gp, (term.col - term.c.x - width) * sizeof(Glyph)); + gp->mode &= ~ATTR_WIDE; + } + + if (term.c.x+width > term.col) { + if (IS_SET(MODE_WRAP)) + tnewline(1); + else + tmoveto(term.col - width, term.c.y); + gp = &term.line[term.c.y][term.c.x]; + } + + tsetchar(u, &term.c.attr, term.c.x, term.c.y); + term.lastc = u; + + if (width == 2) { + gp->mode |= ATTR_WIDE; + if (term.c.x+1 < term.col) { + if (gp[1].mode == ATTR_WIDE && term.c.x+2 < term.col) { + gp[2].u = ' '; + gp[2].mode &= ~ATTR_WDUMMY; + } + gp[1].u = '\0'; + gp[1].mode = ATTR_WDUMMY; + } + } + if (term.c.x+width < term.col) { + tmoveto(term.c.x+width, term.c.y); + } else { + term.c.state |= CURSOR_WRAPNEXT; + } +} + +int +twrite(const char *buf, int buflen, int show_ctrl) +{ + int charsize; + Rune u; + int n; + + for (n = 0; n < buflen; n += charsize) { + if (IS_SET(MODE_UTF8)) { + /* process a complete utf8 char */ + charsize = utf8decode(buf + n, &u, buflen - n); + if (charsize == 0) + break; + } else { + u = buf[n] & 0xFF; + charsize = 1; + } + if (show_ctrl && ISCONTROL(u)) { + if (u & 0x80) { + u &= 0x7f; + tputc('^'); + tputc('['); + } else if (u != '\n' && u != '\r' && u != '\t') { + u ^= 0x40; + tputc('^'); + } + } + tputc(u); + } + return n; +} + +void +tresize(int col, int row) +{ + int i; + int minrow = MIN(row, term.row); + int mincol = MIN(col, term.col); + int *bp; + TCursor c; + + if (col < 1 || row < 1) { + fprintf(stderr, + "tresize: error resizing to %dx%d\n", col, row); + return; + } + + /* + * slide screen to keep cursor where we expect it - + * tscrollup would work here, but we can optimize to + * memmove because we're freeing the earlier lines + */ + for (i = 0; i <= term.c.y - row; i++) { + free(term.line[i]); + free(term.alt[i]); + } + /* ensure that both src and dst are not NULL */ + if (i > 0) { + memmove(term.line, term.line + i, row * sizeof(Line)); + memmove(term.alt, term.alt + i, row * sizeof(Line)); + } + for (i += row; i < term.row; i++) { + free(term.line[i]); + free(term.alt[i]); + } + + /* resize to new height */ + term.line = xrealloc(term.line, row * sizeof(Line)); + term.alt = xrealloc(term.alt, row * sizeof(Line)); + term.dirty = xrealloc(term.dirty, row * sizeof(*term.dirty)); + term.tabs = xrealloc(term.tabs, col * sizeof(*term.tabs)); + + /* resize each row to new width, zero-pad if needed */ + for (i = 0; i < minrow; i++) { + term.line[i] = xrealloc(term.line[i], col * sizeof(Glyph)); + term.alt[i] = xrealloc(term.alt[i], col * sizeof(Glyph)); + } + + /* allocate any new rows */ + for (/* i = minrow */; i < row; i++) { + term.line[i] = xmalloc(col * sizeof(Glyph)); + term.alt[i] = xmalloc(col * sizeof(Glyph)); + } + if (col > term.col) { + bp = term.tabs + term.col; + + memset(bp, 0, sizeof(*term.tabs) * (col - term.col)); + while (--bp > term.tabs && !*bp) + /* nothing */ ; + for (bp += tabspaces; bp < term.tabs + col; bp += tabspaces) + *bp = 1; + } + /* update terminal size */ + term.col = col; + term.row = row; + /* reset scrolling region */ + tsetscroll(0, row-1); + /* make use of the LIMIT in tmoveto */ + tmoveto(term.c.x, term.c.y); + /* Clearing both screens (it makes dirty all lines) */ + c = term.c; + for (i = 0; i < 2; i++) { + if (mincol < col && 0 < minrow) { + tclearregion(mincol, 0, col - 1, minrow - 1); + } + if (0 < col && minrow < row) { + tclearregion(0, minrow, col - 1, row - 1); + } + tswapscreen(); + tcursor(CURSOR_LOAD); + } + term.c = c; +} + +void +resettitle(void) +{ + xsettitle(NULL); +} + +void +drawregion(int x1, int y1, int x2, int y2) +{ + int y; + + for (y = y1; y < y2; y++) { + if (!term.dirty[y]) + continue; + + term.dirty[y] = 0; + xdrawline(term.line[y], x1, y, x2); + } +} + +void +draw(void) +{ + int cx = term.c.x, ocx = term.ocx, ocy = term.ocy; + + if (!xstartdraw()) + return; + + /* adjust cursor position */ + LIMIT(term.ocx, 0, term.col-1); + LIMIT(term.ocy, 0, term.row-1); + if (term.line[term.ocy][term.ocx].mode & ATTR_WDUMMY) + term.ocx--; + if (term.line[term.c.y][cx].mode & ATTR_WDUMMY) + cx--; + + drawregion(0, 0, term.col, term.row); + xdrawcursor(cx, term.c.y, term.line[term.c.y][cx], + term.ocx, term.ocy, term.line[term.ocy][term.ocx]); + term.ocx = cx; + term.ocy = term.c.y; + xfinishdraw(); + if (ocx != term.ocx || ocy != term.ocy) + xximspot(term.ocx, term.ocy); +} + +void +redraw(void) +{ + tfulldirt(); + draw(); +} diff --git a/st.h b/st.h index fd3b0d8..818a6f8 100644 --- a/st.h +++ b/st.h @@ -81,6 +81,8 @@ void die(const char *, ...); void redraw(void); void draw(void); +void kscrolldown(const Arg *); +void kscrollup(const Arg *); void printscreen(const Arg *); void printsel(const Arg *); void sendbreak(const Arg *); diff --git a/st.o b/st.o index f92b5941daac29b8d650fd586aa51493a2f44a2b..973f46211e4ee041f9e09a227b4c6d67eda54c51 100644 GIT binary patch literal 81488 zcmeFadwdi{*7)6%3=k00QE|l;Wz?_`MdYdkP%|)SM+2hZii&cXBoGM%lZk+G2~GmE zVSsf}QE^2@msR&sS49>T62eWqfmgf(E0SSE5EUW_dC#djC#f80_j#V*`+k0ZyxSjU zru$o`Pn|k-ukH#n2j*Ov(1t+%XI__Z<#gl8Q_e&^Zn3&?)3%3e|BM5~f(D$j@> zo;msRl^9t~rBYnk4Ap1W&B#l>49_w)&f2&Y?smc(or0YJs(f8^|ol1Wlh9zn$>Ze3Biw&vItg{Cnt~fa5mPWGQ9(*A4*tAhj_!B4QzhBvT z%!%c6_d%RV`T1S!_T>mIh{4ZuBQ%lEDXlCv#J2yk<2DC!Sk_KNSb3-mkBh z)=-p_>QzW>Zhd`yjlpDwsN_d`p$32LIux{5oQziotCJ#GrgNh^j?GmekjzUf z)mbPOtk3)F2WoT*cj=ti;qG^jxf>H-DyrF5C=>g&zRV5Nx44Hi zUZqh*{fry6Z!VzLIE{yK;MeFM$=SQo2aM{iUSG0K`UzLw&AFK2W;7)Wc zh!*eHx5fTgpSjk)it}P>yrL?y%hB4S8$p>b@-bvhWUEs3C!^4zzAv5V9zO(^9!R_p zyfOI4;0?iHHw<;6-*s}_Y3V81?!ln@kv2M7=ZmzB)+O2H4%AyGx~|hLw+2T9Zw=lS z99dJ@Toxx2^2DF_hj0^R41w^r+`Ybc?73emY@tR>C841a+tk(xA9Sj}^&bp% zZRWGfCqWeMzS?cjf@W^B=Z}U<%8fnt{4*gUxAuRLCpne5kSF09%#Li|x`CDb(pO@V z23FKZ+J@X?C(MlC!BBcLzg_W9^Z@wHuK3_+eLZAV`CoycW7~%MUSXF%1XuBu81%k9 z_e$_Nm9bi%QyBs0HwQj{F@y)9WU1-ODtAA5W)qdxO-{j^y0re%(cM^G-#+7) zf;UxZ#n`B=sm!T{ek7ijSm3VB*zAPgZ!}}8Hba-{>YZT5DQLz!zoHqnLAN;-m>V%Q zu@!*HnCclXxoeZveHoi)t<@!BvuVx8)yLXr{6N;ISR2gQs?C|Bis?qoC9Cpxv10V@ z0vifId=Nx5v{IGX=n=5z1(Z;};(F_DwFhr9=av zX`{{a%q=HM&2hG#bRt_1LM@69gH)Lc^?Bm)|4&?24ly3*vLZC&9jr6a?@}sLoiLQ| zDql{_U!gMBKL=XkNY`jxGrRn8ApI+cwfL3uL3>$MR@GFlRGAcAmr@f8`k{sHfztl| zl{qa^uB;5TXzez4x3t_8YFTwzJ*b-8t9oZz^^TO5n?o(vx?8YB_!8Cb=HJwwSo+(+ zvtq#{i1`w?d4Gt}uOhN%j|0Q7Thhhngl5M>DD&Hq#{(eK&~v4PDm$Q$g3({=OHYD+ zDn<8GHI92U+x^*rj^rH2{n2qhbKLJk?r!c)rkw2f);k$BrMm`I?47#Ni8b~$RBTb} zMpZh|p^0UxtE{}(UU92c{&^&n?f$BC8C|S-y3k(nxl@^TFm$sotMnWvy55)Vc23tf zm;P%d#+Eou|Fm{u10mE8p#v?nzNSgvoI=gbDnHz_T35D4W1Xlvx9sw-Ay}u*U7r(E zPRViqm80FAqtiFY-IX|>Mj%=?TH|xvZ8;g+v-?(9(9_$|2SJa$qAw0;D+gK!Lqi|| zZ%6A}Mb3-XpB(8Itv@SrlY2PFJxEX-QrZdU+SwFn(gj)plw)jsk=YAy{cbX zkx6*6zu)#qiF+Wrvrf%D$`0?hE7pPj*U;UopoOYWw0aFrtyNWUZm)R%(EC~Tii77K zaAE_Xy4EF6&U2!_`0niMKvR2XFQvrEe9Lj)b?hsDOys|YIku_{^{jmjr$DQ=P=%zXDS2^y++WQZHQ`~Kdo=PTh5eyE?;YQ1f?!2PqW^5&# z%>5-b?$+uZ&FvL!S_Iv#!RU^vVA(HakuPqkq48Y`4DbAo`?LE&(0!Y`O+6SZdp+rk z%Ryi1g>GH6HW;nDZ1TBoRl`WF-&zMo0Jam0r2AC~tbGugsqFAi4P&e}`)SxA&9?N=ggBS>tH!K>n=Uq&D?O8YV#hP-VJdG31%Ol4rozNr&D)Zx{mAjkapzn|qqF zuSRF$kL3HbT$oLE=!8Civ1LlPDpj*o!{Su7+fr+TN!-m%&xK(J4v1sp_B*~Woyi!sXKUAL4cVR(oJhNA*Ow^NFJ!}cNs@-)jLa)%bstB(7t{r<2+^MX#BCWJ0 zY!aHpfA7BfdX-Ij_<^J8O(4^xPiX6YA z*IG|#_2jnpv!9`_RRSUH(Na64eOB5$voO7NBwODY%v>L|2d#HE@Z~yK9asl#)AsLS zME|+H2>tG>(jI_9)>ikxszp}LOYG5U_LXi;JXb?GVVBo{*-dg((dfHe; ze9}69;{fO>Hzo%_3P(B6$OJRLpBAA00frz~C%5Yza=(W;D=LBoi&cr2@)rg{*opd~ zRnxZ33^nv9tFhd0smj~ZKEh@FPn+lbeEsUqbg(!a5 z1iMF7V+PJl(^I01BiN$-XkYtP#ru()sQG5U`JC`tb7HQhVfzdA*-e&*ed%E9EE@LSo{JCfbF(S7~fQ|{jy zjPBVYr?UCgu{JQy?01IaUQWZq9M}K5Xfb!b?9^VE6CRj zm~SS&S1U;=?osV!-DO1DgRd+0szli#)$+Mt)lPu)VBNXp)*3YxQe77{zu7RnNW8HSXZAwn&+R`oT_!i_i<@gt%n@@b-v}=I%ubf!=y*ZgX?PwnuWV%O#Fb{H} z4yg!fCJ>(u9Z&S|#rB*YaAME72)<$5Olu5b|14N8uirlF@Q2`3yTXQ0Xb^l>h-z`X zk0MY>8%QT40Z4BH`5h2wuOcw9QH3|UDQT`cQEiKM+ne9gtpW#idqsraB z_!bC^c0flSi?4%o2+Xn>S_z`t7T;;F^;IgI0e| z=D+OdLjWPO->y7u)?u{CUf@E@H|y|jD7g0g5pW*6r!BND(YkJvV{R2_o0H?KtKW_# zq@^w)Nr@MA@i>}T4!D$XTH;}i_a**hNT(#C8Xt;J#{R-%H6niV@tw)ge0yJ&eTpi< z^rPLS`vmjc37-xLgSG9Q`f-T4daC90x>re0s&PiMZMQGOd)*CA<)3OVhpyGHCP;ea zvTx8|ysL2tt98MOzBWMz1mSLdmJCOuu$p}u*|~dHJv~gi^;_;=Vkge|GY{3**Uks| zXu?)~L(M-kO4^_3DV4fGF0aMeWou zV%-FFRCiMss%`_GxKIvM`RwQGs&^;B<3~~ok27fa9dZlP+t9##VCGSKK^W9zyX)fp zz(guFkOcj(1(7N{FjTbXzW|poT>M|G=R1`n*0xm%3c*;uja@zsR5`wyftma4^0J1A zvFJdnU_@E+e-LHi+P1;imGwBRg`wyCD=|U^KW{XfJv{uv3I5@DGFVX^rd1*8%FA6xfHOM&-kFW#+!xtvg^b(A@yD zq>2||fmiR3d0q8eJCO1kr(BQ6n1s9zW-v(#;`LUk&+xKh$a&SO1f9c-F^#OQ-llTe;%x%#j zFxG(52nFAKhUY+yY714wO6(Y_i!9U*SSp2u(~S-F0#*R-+XGR6xsa1oD zH1}+@Om_vaq@f0tp!~6wBen9xIl}nWfDRuB$H%Mz_y|#kzjJ8P^=w+NgUQTBEf*FjP%UW1D2J z`02Pi8%I2t#l~U}Hgj!tGiS7Av%YJahE2~gBQ@peDZn5>daVH5taJaedK)G!xlkao z-CZ~kb-#CL`8?bA}Q-ro=nyr{TFlZ~c5A+kM;cMJT-!I09yc9bvqzi&TI|2<|6J0YpAg7e35;2WI2t z@59MzD2ZU;zQ*iwH|jnaTBf-%lz@-!kI+qHq0;Jk5@uYdhGf_k595%18)RQ^osybW zDeOLML+eJ@VwT~^9|fcJN%n%VaG`WN?)r@wqrPfr zC~F+JrTiL@GK(AtE1nA+>W5ukh$oeu)0+rsziaL0d1ViJN~r3F4nG0YLQprG+*=Yj z?q&^|v@MP9YRnrwJ_JK`67?k(ZbKMKsCfzPgn60Dm#Vt!)}(PTrqnbP)Z?>Ng~u0Q z^_XtKlZP`Ea858rqZBu0n^QTyQ`vNA-|W!dcqM4a(M=jW;EPS$}%5nE(LpHiw5^ra_dlS?%o}fR_-Fd$2Pv^5xdQv_< zcFBi9a&s7;u5N<`O|*2-W1KFU?khWHb&R$dBgdM9aB6;(4^ z*60=9#9s6UytX!YKQGrE`bu|{vtY5I_9bNl`UdYmRmZ+kz4Wm^bM1@!+ftc>3TkJI;8*2WVTH1lI_(#`nqA`a;8QU{!r@xJBc%Rz~{Gb(jt2AE?J>9#+2`Au5 zQgWltPC}=?hWkM$zeTmx36B6fVx7N4=i#`*aG<066Av2e`KY?*_!|a=cf)$yQ(7a| zYn(q{hL_ZUsO~bm`Wq-s%6mDnSIRDj=wSui&nw_5iE%J@Nej7$J$uhPpe@V^gC9W^ zq+7+nUWoO)ILF;d9?&5MidSRX0&d93{5dkt0XIVn*Z4qhpauCk{cF`2z@q~5k)&A< z8{Q{%Do=t3r7BhMtQ20PI%%Wd7l8Ce*W#irEW&>>^Yg?4$geh7A~r$Z<%IWVSAUzV z%7o*7=_D&hNHcyTBw7Q;|5#cBk4)2GniiNo6xBOnST}6<5kw77p&%rfu_4>{F~-!W zs&QyI5OSQOZbC``k;9c8!XM@op{mcr>oh}-o*eIBHeXDC^kB_0F=!H>JW}o^I z0Ofo8Rn1RUp*WAA$##e)hV}|20B#S$vmcmhwy}ctV^ssstq!^GsKpYfbt%|9Xs$95+6Nj9s)uT-#f?{BaSCs0Sh{X^FO=JiwfKHo z!?F|2+gK)=fR~IvD`^((Yef!Fy^r~$4w%-~@ojeC(L{6}sNJaE1lMkYx0)9^@Jfz; zSq(&rcf`km4CXwn76oHB*7JzVU;D#1u$o&7p@>874scH!ol&1)$QKyG@0_N%N8F!z ziA2A|v#Jhiq|#Xp^D7)2%96-~P@^ zqV+Q)-C|djscI3eYd<+dy|SU-X3mOSgfqQ%G%E_a>r`N(llqAsopI;MBxqOs8KTXa zTbSN1_&OGW;2Zd@Lt&-kuW+GVzT6+VD0=iPd(P8|inNXmECXBZ+4$@?tL*4w_M8n69W08k=T|qv{(IoP z+WPIneo$617RKKVDOwL>chzr)>`-ky2ZHeJ4jA~it9{@z$h50~#BL~y9){TPJyu80 zTLy){xjNRFUnX)ge=fe(!B;%-n2GPCKu{>%F=jT&r>bljZqCqr2OV7pPS98@!=2=_ zA%)OpeBIEr>Uxq`sw>*!_rb=kAflZcn?mhDZOT>%z^bC#2VFFN+yd}PfYtkwqq}{z z4yQ`{2cD+EI;N|{`m#|8zW&v)r;>+Mtr~O{2 zR0-%#RpUmT@J9baEO&`jlux{N10AB8@9=fvA+Yvn?QQT3KXJcK53HjFqu;{&qWRDu zEl(=Fe0i2#u^e8u3cBlq(OoIO*xldViO=~qN9 zB^4V&r}$twb5nNaIy-8EhTt20A=S7btj6^z*=w*M!ZFiv-$`U{Q1ScJ8e-x#m6M4P z_G%wIJhv;NaA)*bT4Y8}Y&4i!>m;jJ;XrrEIGi8AsshwcNIEQ}!K3|#UJJ(x*_m%g zUVx`}y`AXcW6s947^PzmSX+624%FCKvCn-4PoPzH%kOUuXTj*vzNHmqnSECF0fnm0 zMc|$scZa>gryq|wu{(TRi@DkT*pB`MW>)r!Y~NhfT|{dG{cf=5bO4pOhlbv)=SmOi z63^>g#i{9dxCMUa&Vt`KUT{#*4sFnRqiadV2I@yQzXKJc4@}#Sm(;7#@H&XfliH;y znTF43)O9m^PIAL-(yZEtKL_D|;lomW^EPZ@K7ecWj641&oaxg4b^HxHS4j=TU&M2D zhh((|1-_J`}a{GZZqc8lH7&1^856RWO)i z?2LD8P+U>f=sa@CM(xDf*xQh*qla08DXG|$&0h2cv48o2AY#stKzcsC=YVQ@j7QUYm4gpF=# zY>e-I3-l+@r`nb8gV4v?t!$@pTX8+yS^Es$^D5q>a=xM-B#!BUQ|%L&%10XV2zRTD zR1Z+F?}UXoXzW044rssL&YA|?w zdhW&>=Qjv6HS9JFyrUt|xLX^3Ifh>c;kt>1`W0#rt~dxTKd3us)p?KupF*FU{cpuC z{R+em!lOfNxT#GmqBrywybm&cRVLdDHo&=xtG4b-xcybQv{$PzomteRs8M2V($^re z=)V!eBqN60h8VuYwBLZYtL~vmJ=MNe5yyu0u6KW^ZSxsOcQmB!^2!w5u09UGalANQ z(V=ayO!(uQaO-z4(?32OHk^@HS8W2JjUaTw^kS!8dn$T#8Hmsee%v_?gyqHg^ML2* z$t}%s6TR|hb-)5`QN+~LtJKmtbZ@cYJ{M->!OSo0`B#AwC;WM^a@eErdPp~WPG^W1 zUJMC`Dxklut>2!n+hkv2J)I>bUZXRA;zc@3N&J=0(h`r-Ss?LeI?GD9`PdU#R+$yQ z8!BqPZu5VQPi(w65+B`oaY*gaAhCUFNJ*MX=3P+JJqu
=$`9!D;O_PbP3TBL~jM^wH8tP(R)xD`htWu9=3->u8r0;w<{W3{7y}ecFb4J!{l$P}O=!$U8ss>j>}S@(A6 zm91yd#?-m<((o1e#M$nirg@<(NHm8Cdq?cXF>5>t41&#pG|Yw7w)I-9$4~O zGY}kFI|}9^urj9C(x!a_%c6ZR!i<>yO33BG|IBw1yWzDdDooG7W`O9X02eKFl|@(c z;Yy9@=j{Y(@AGVbW;ii4FzFcK=fNFk<*~}BOkA=0d42P zy=v@at}!qD7(!Y=h|Z;BpTH&7B=)D)NYjz{R}ICKn*KVBg>!NQ#_}47G{#c<3o6w6 z2+u~haJiHdnRpcLs~rhllFAPCwYm&$&}9p6jgJBmRf@H(isdvgyi~Wvdjr$AU5yrH z;H4^qeev@5aJf9qEy(xHxx1(pBO1)cVWfuVOSleFlmcm{S;@*NO4|VBH z%5%joxSzck)@iT)m!B6|liO|4lT}}Y)*gIz#p`g3rb&^uy6S2F_m8!{AhX(@_YMeX z&o{ga0Xyq^k|w+SV+hwt?FISzo3ZPDSVuzj0TvVPgK2=CnZpbRwhb=^g(1Dd7}Dk1 zo`=))GS%?=;$OjQ?%L_6KpD!Pb&cQhX#-w{vFL9a5I+^}$k-CfsKup6ctDUHKI&BO zhDR1(!>$>nG=EmuUw<^-3IszL`?Qy955f)}RhCt3N!md=9nel@Znb0AC{ylkVQ5NN`lYDk={RAS z>iz)n-i<3A^S}SM@hZ>9{AW60HMrsVd1b!?6frFxLd5%Z#K#(5-_cLLsJN=}1I&vu zU~B^eqa(Pek_z$bS+*6e&Fa_7o^vm>f+v`ossuE7*m2y;6%_|(6lUXlt3Sbe^J-l# zsES77F6hX$d+_xOCwwHwx39MOW+-{<;mOO?rccuBibo*_)U$MROG0#i7CiX#uel8Z zYd=fCu)K|mB2gV1atNM6-PtT!cXH{cux{(GeGP(r2^bj7Sf*=AmR&IwN&@V73fe0| z%`DUua*x8R`jK~Gxyv7|Yk%j;Xx+@nOR*uiWHxyvy!X)<-FVQq<`#^2G)DZ0^2Jcf zk5yIx>U{=mEK~k+oYz7H~mwaFe8FoLbMhX75f>xjSrs3}e%=#`3$~I&W>?kvqRN;*bz}>2XujBHu z6I+sA28P29%+k~2hv1Bijn@0^id2+vw;NA39Q|M&-#2$Mx0UX9V&(e&*rIf$&kSE% zx?i_KvEUW3fg-!Qx~{qEI-C!7g6S>WtaDl}T2}^XkawGO?=i=p~m zofAFh&dJ;bOP{cr@S_~qMDZT!-vF-`z@y{L+LFgWp!mX^jGqVjevaS37BoCM_ISh& z7AD?Ox*8Vb;h7n1nf=NAz{t}OZdij^295w}a^u3b5q=Zr^GHiwFVafS&?hO80L?+* zm50*O#M#P?@Vo|JENcEM6#7qK0E8ERhwiUwg)JQktM*h?Yaq?5vB7G1A<3<|Iu_~x z<>_;Hg1-$i(8+)|lJ?c+p&qE^8MWCN>mq-Lr%Uh>z{#a+oY<{C^}a_A2xWm#;!~Ag z^*);89%+)w-rcHT_k8(B7$I!Pfc=ic(o=B?aI(6GCY?ADe*i@66~oePsQ>Ayu(2&C z{bXD%Ps8UA*Iz$mNbtHKSVN;py)3sn05=&U?dZC$BmnJ&J^Ni1>*??fkyF#GDxYx+ zG%mf367&z0jjnU>!FqzMb3gUEJ5dEY0GcKXe1h>obF$|D-PFwKj%6M?5cG-4d=-(J zrm3?gP5-zixiGw2mF^6o#SCyW2y=dPa|lL;1xJn$=;9zc{CKBupUW^ zw1T(95}P0(u`B3)pE$JrHOJb}OYF#iCY zoY)9h%~u^>{86*@u*jc)%H-0eTOHW{k-TBo`;2})3wkHVoHD(edx_Q0*sbkQc39H^je zbKFCeh4UcC+Rc@4OAi(uK&`pBp# zeBI*KR@eEX+mnOUyOKgJYlCzB>Cq$gkt^J7)phW9jGzG+mfjpjpDnipAr4>JFZB@z zw!bA~!_cC7d-Il?kgGPXEtay1K~OUieh`5-BI&K%6llgH?fI2kT~p44_p3lCDe)=3 z!JCrczc;c99!wp-bQ|9Txu|k{9GuX)cywdBmRII4dAdf z0c*GMWq7mNR_3pq<_|RXkCBTTZ-YPFZ1ZJ?$0`d2{TFl7}KfcLSd*JEJM z;s|YehH@ceIt4V|9rxclOw&ON6w1e;C_aEpsr($HYS$w8a-4KozYl2;oM5N#|80v z76!-hf$nh<*zc*(Y$FsK#p9O$s~$LO2J&<7K?yz0x&t@z4x)!^yxDIt|1G-Y)*B86oB3f6(;lBzLbE}=IoIzb z`#-i{&GP4Wu>AS(Bp?|5s9w(-Y2_FCjQLMMY*0D%?4^&Y&+*$K>8eO2D%@>N_9paO z3om522b70Y0$~#tyrZ3n+{P;lG5_LdZ!5Cf{YsCub;>h8oAHXf?SHieW!l=diF+xx zBUjRU9Mo&8-dWi}%MzJ~N?X$Y^TYtOkQ!IC_gZ1bn)m3d6B&0l0c^pxf%HMSRMMlK7lc# za|6X=#{|Mfg+;|6QrcPlYY;T`kIkPF7#)ce2Rh^iN+*t=STuR!ar%e{CKVUlIXaRT zD9MXl3>M}^0uzdI^WaXpgX3p;FS*I13nB#*#|HAjx=97Ofezzx1Noy13iERN1Ui(o zvclsE3UdRHz6k{rA->!|ZfRa1QWPjD7&~!vVPkwHk;v3WX9NoKCXS7a1Hqy|VbR2~ zt*i(bS#Vcgp8yyJQK>787gTk~ozh^oMgGXm%O71@7y+kyI0Z5Vd^B$K#9S~n5FR(W z7*g0LFmULAK&L>5u&3Wj^6n_jn;6bhl3k~C=-PdFpks${N4|mmrhS0s<>y7he` zg=DHq2D&IP89bDS`7u#B5(p%2QqjbcJk)vCtsP1__7X=GAqB#;kgS>TUb ztWF~)X24f5e&xXz#-CxevL=i!EG!D^d@jy2E=nTBxuuiL0+2VQ05gAb0c2`PWOSso zL}h(JLyc&f|6uNbqSC_Li5(+>Ferw5B2%r4$kw7sc@r`3JCyXngyChNuwY^yWJF2F zCZ!L9CPBe6OC*%k@l8NMQ8-c<7?yqQfT0714ZEpH*x0H35q?CPe2%N#4XG+0R<9Zk_DF|3+-O_a;e03=3+o9lk zE6kpP8z5_oizWn0#^n_jYNaK4h1lYl9>BcL3#bwpD4G}m*J{y|!IvfBp7;gzt#o2| zbff^ni^AbjXtr`Kt7l)U)5Oxk!VC+Xm^Ze#sB~hkHD+{pJe`7ENl|fw&0H48j4sK$ zq-QJZisM4KR_OS-gmPM;7zMBdb_nD5h*s9l*?)r1pW$;Kd=^?eAD9cDhpnB9qgKG$ z`QU80f{=wSeCEL?2A_MawJ%s}Uxc$|@Ts(RE?Nv9xOWjqELsGg*R7rNSHb5sI4^@= zynX}Dm%s<^S@be|o`cUl)=n3$-KVVgK+Iigt$os3`zp29|M~fk2ma%M|9Id(9{7(3 z{^NoFc;G)C_`mM~+<^K&I4%d-D|+_2!=_Z~X@|MGWz zeVR2BY{36d0bg;(>k}Pi2vhLOXH}JL-(Oc|Rc+so*Z(>Gf8~Lz1`OyE=ycWK8!`gj zdUomFrCXqT*X}*LW_IhU+< zcUJ2bDY)|lOJO?|Vp${T7nzO)mPZX1qH|nf#slSst24`D{m2T5Wza9OGCB_%Y!RKS zCrogTa?6P=q+euer5k?78f*)lFQH!te!rpf?bzV-Pfc5p)IYWD{N(wK23~UUD!sFxwB&MVp0EyI$8SwG)7#8E+>L zUrzUqr+eomfyivUH|kFcr?v%Cz)Dz1hVTzbwm1I%yYyxyxA&bW!Eh_4Cjbv?@HiE9 z4Z-v#`+N{lSGep)VZWdN#ADhNO6`>NRx6bdZ5lW*0AiEqo+#d<{1-}X3x69ZH7%&T zh13_cw{UT@c=c|tGRiGR}xk97RH8toho`f60!`G&&UV;CG*cIt>NRz$Pb)FE9= z4E-J;R*p=hF=<+(--keO4#|Fkvf!)VEN4TK9`z__*Qch`YZWAbocD^4ZW0rW{vlFz}LAP;9_ zS&Sx!QUirrR%fM>9YwMiq3$NK$!C&gC5>sCN3vrvZU3&^4oM!I{2S$V8|gZU;)QbC z63Z?6^d}1YJDgirrEW(NEJLl;!wkz(BLk?rgQ;SpZJj9Wdn`Bq&bCp>o0B{;7vqVL zt_$H@*MS18y2^%y9yXxgpQEq^bYG+2lWsR1k8y1C(1T$=QJ8*)ni@!YStk_JnbsVY z!yZ;D3%^l@uS(q#NczenoxMTF2+}nW{S7`lL3=kU>51bTJhX8!-FqLLLpvHs8mVo> z{Ck-5{iOYt5!0`S>RO!X0sOx;G1YBiQ?xdSNq(B|!&lc8?<^JF0&r)ALf)_GH8+qx(mk24H)wZ4=mMvxBxyr zh_~u|b!p+BNWcTf8YsV8UBNqJ^o!*T`6M!l}9b3q7>li?bVQusxAC!j9jOdofX{IV|k zTJ@K3I*WLwqj?z>?MkJGDhUMf*+RuzSW~E|P#0!BKzc6kul1<@6HXsh@_s8TpgG&~ zG;@tDi^87+j_EouKnJM45l-<>i6H;ym715qH6CxluWI+W=n}`UWTQOeH6EX<@MhL1 zb=CN_op>YBXS;}VyTjpo6hFQl*hjoA3)1gT#MS#?M%XXJvkiu)$B2gnPgeE2xz$JT z6yjG1elqbPf~)=$YVBOX&s6fw^lRltSbNfQy}|Gl|4@Vl?cr_sV;mO}=k|+(x{-d! zv?j-;#J4x0@E^XCp2>m_AihZOY|_K+F9%;s^3OA%-y4Xp75ojWQ7{8Pcl68}l? z3B*%GdP|67J7FGEiQg#rOyVO2uOOZ$cqMUeA32Uc5yy7IJRT%|m*Ds^H|Fn5!Jj0K z?Xh|Mjd(A?pC>**@K=cQ_UWJ|X0*m3%YR?y@ZYZX`WsKaKnylIL*?GCV#Y z`7J{Kr^K;cF^{iF&tk!M5w8+FL3%zF{0HKP1V2Q)mHKUr`6%)81W#5Ca&xMGjq)vt z>-y2iZN-~eSwhe0B;Q5wvq-+J;OCP31%h`Z`TZhY7m<8_A>V`eAi*<<^Eif6a0T(O zkRM3=cEPV9evjbS5ib|~M&efreyifmEPM;zJi;W;<4+DNApV4qFCzY`;HALR_-5m` z+=Ewo@av#sJ&~UO@{qsJgFocKAM@aU_u%+<;ZJ1G%OHO$H2#mN#Rqutp3=O=L(dkH zucL7z4YRCm#Lu8e7L%SG#GfaAG4Vabzam~v{72$rPSHTEmBQ&!;3u-bxrd+Idhm`O zyqgE_>%sebaNG!k{ych?wqLCw!s!qX`Q;w`CergvJFTaO{;_WMkRR>Ai#_<=r2k9O zuhuOgj(a@had*&({6C-c9HfH4b}sOce~{!?2AZa8v4{L)9{jH!{O=z8RS%ATF5pDz zS`Qraam9JsPPIk}r*C`6f8fD!o%uxizx3d{JUDLuI+30_4~~1tP9)z9CWa^CxVC*F ze!2&5=fThM;2k`87Z2XdqrK|oA>Ri$=GT!w=={1*|5&hjTk%*&4bCJ!*h9}yl7E`y zd98Q^@v}N<1!GB10r7i?XAv(YzE<#A#FH|#AkR-{0zZ-eapMD~>mrg*A^i^#??s%N zZ|f=I0|fss;@1&ZYsa8#1@IHayPD*C)BN-%inoUNpNP|Pfc3729(>MlBK_Mv__rQ> zFL3n3n*+5W`^g^Mj(j5hM?H9Rm?EA?{uB@1)`Oo19PPP!fHq_~+0(&8{sIr)-GgU( z@BtotkO#lTgWvAKi#_->555*S`r)60wFC4#*0S#PkiXx9Kjy)o_2Br7=S2Bf1sv^p zdkEP>`C^qsx`eILNPcg%zXG>4JY9)J=8rAUQ}3U;RcMz=rI<&yk9bL^d$V9SX2!A zEnu&J70J!ZSKBv040ny>6C}zGk1B7aj?_7Qz%xV3qhUwDSlAr^niMRZ zWJM77rYLG-%7ljlJBOJbW^u= zQ}=aK_jFS?b<=k#Ro&IS-E~yzUU*pyv~^eac31ayS9kSLl0B4U4<*?{N%qiIE6E;O zQt9umzg4{5Ra`yPc@K5oQ)%m|wDr_!RC;yPhVGF2q`Z6&tE1?mNpL%V%T8S`+dnz-<=P=aNaI!+9lEZb6=P zXTGYt`PLM@iwZ1+^h_*5`_;A^RVQ$3mIbvLOu=hxUh*LxYYJ_*0?X7^D+{;b!S*|A zByO|<(a6-1ql?FuVBFzJQ>~JzC6PR6l_FE2j-sY8Gz_>o%7T4b-PIXvlfqp+YTsZfQ-LQ^rm02?{ntEfB!U)V(AwKd*oJm?(T7HAwM=ISj`k)p9<3-h?? zQ@`YWeU6O_#R$pAmR2=Q7O=cXq#y#@+AtsW+2ru#g51bBYswhdF$Jw*K`u7W)PSI; zB1Pc(iJVz*A8m3%CqiMIQdl%P7aEunozBs@)+Ak|lxl35kgxaPybj5FMo_%Pw0^~$O@Vj|Q;3qS`z7g^f(xabaH0I+J;zxu$`>hQs zhJ*FrP4edo&h~c|d?CpX799TMk2>%V*qi!uNj^{TNyPQ~dZRt8=K&$ldUzcVgV8^% zr$)$gdbbPC>H1c1&X?1YmH7?+VLg8koc-TbaDIN@SMX(HwBBODS-wng)<0ix*7LdG z<>zbt{D2XYhyLMu-3l+@V9xdWQo%XBc?K_s`#4{2CyqZA1}`_{@s#TquHWFn@iKqi zgYOfZ{d35Jr@=hW)X(rKGs|}noaOobJeKEl^%nBXFBhEkXA91LxK3~`Z#N6h@?!*N z|BMry{TUIQ^Xo3b*?xY1kkiZgK3mAMJ%1LQ{kBAK_QP_)S^f>dS$?bFY|kfxv;AKR z>DHIO|CW&hmAFvwmO8rsbCX&_Zzb|H*=Le*Io>_QUytvmY)NoaIA;vwXS1F9(yk z{j4Ig^3YRh$R~q6e5^F&=K^HEZ8hZk8~kHK-Zl6ahP39nWqNJmC~ubkwjS~s2EWqK-^I`~&)}CD z@}`}R!LKsp2YKkZ$&feojQ5bA>>)qPkT?DF#>rp=9OxhP#gZ|21>;k}dHk@$;JAg9 z^D8-3-PWLo$2sQ;&i!3?!C5{eIL~vh7o6quJ@|YNe#GDxfXOdV{b^0l>(LL$Um>1l zaP$wyd#&J{uBpUPc0PRAKMxu5j={GW@(T?9u_2GTUZeW8PjJqc!-7vCdH6G*>frn> zBc3Wa_ao;BemBW?6#PNr-2~_P?`487C;5Sb&m=xraPIGJ6`buX6`bX#3(oQtf^+{K z6P)|^hXrT(WrDN(i-NO%Rte7evQBWe^IZ@Aq2Qd}J;bq$;4@t=Z~KKj$9q`tY2^QA zv_Qt?g!Azf!8sq>3SLfn&Jmo)SLuTDcj^gb}9QFUnXb*1?@;t6sAvovnTY_`C zwhGScEx&m1)YEnOV*A<7^9ASioGcH1t>Bz5xq`F(#U8vyaJJ_Q558A$*8hv(H&TAJ zqkSu!-YLY-6P)$*51y1E<2m4c_ybCGR=^SI(LajakW z!-sim+CU=tIUf9C;%q-Z-|6kahkEd^;QSn_$b;WYT-y1N!5=WvwcOxldSCJ2>kMw{ z`M}_&p6wodpTSK%#|&=jIf-7}lj-6={R?+~2pS2FE`!+5jd!{xS>!Oi(~8{!zJxjv9-aMS-4h910! z%i(+vzQlt+<-uR_;IDh|Hw}KZk=`u^H`DtWahcx3hCGJxb4DM%zs>cR`{fn}Uu?vC zvcXYL;TZUW<1~Xm1lOD|XBr&kS${xq&fl(r^K-yn#8Jn?hW@^W{38Yr8XWIo{Z|Xl z<*nG@rk?2rM?K|~-Z_G^o`r&Q`~QFkUn=+_(*KO$i;2H4ILG_B;GEtE>Am+Pu-z;t zONe8d@SO+Fucr&Q#p5Uy1hv2L~^&Chf9PA&~zf5q}^AEvU&)0&po`m4M-clzxueZQ|P1D349{-&0 z!FveK`uhvc`fn1P^*=-$^W9wEd&l5ULKv5aFAcuT;QI~!l);Y}{I3RY6@UvkFkZ91 zoDx8)xmjP%3Mj1dD+f;5o({xOk6B*^6X*OLLDx46o=evw=@<1p4IkD&l{o8R`7*)B z(e=H8bG!=$|MM729d8iFc>e|;j`wYYoBsL0;HH1RB#w3tf)DH2ZOEJcIq6&wf`ikQ z6;PK}8gaDe8ThcC-+RbkX7Is={8fe?Gu|A7KW@kmHMp6s5yYjPVS`_5=$T;XG2@+V z$PY2(XL-n18vI#9{waemF!%?C{^tz-xgo#I;D-$UcY~jC9$dhI{x{|O7~GT}OdS1l z9eg;yh8yyxA4VGT*BkN$9`bh@{J#wOrwu(r4gRblZ$1b7hrvz1{mamUY36Ze!r;RU z{XZIdUNHDkLq6Hy?Wq4j-7gwEop=&33=0L|3yw<+`G3GQ`!nPrKh2Og_1|O2Co9eR zYk?vExS{_6gFj*LCk;I}82lN7o8y_64L#;Kf3?BQc-I@;jQ4#*{~wKbzcA#@a&^Su zFB$Uwbhv;6ef%&Yg&zEVgRcN3?9V3+ zZkF>GJ@^_A{)xd~HT3^raMM5a2488&H}9ZR=!c(w8vIP+SWa#-_&J9BDuZ8c$lq-6 z0fzi*2EW>nzs2C!ddUCLkRM^l-{K*EyCHw8Azx(3zi#juhWu>?k9x@8XULoWdC)`t zuZH|cL;rIg@+%GbHw^hT1|Mbcbsl;?Ft}MycY5$2Jh=4-hzt%aC#D|TgP-HUGYq~O zbaB1tVQ{nG?`?3iJYQjOv%Y5&$8tN`&_C3WH|zUwgPZlbz~H9-5<~wOL;rL`-qc@i z$cGL2`5y958}e%m`F|L^%HUsm@I!`vv)@0ZBisxJ`Umrp=S^n`&hxw8f`(*1ueEmf!5b zzYv`D>=B&xoSe}#y-^Y4OB z!AcCrYl5?%*Ad4!pMnpUledKY+cXaQ&_jNQkmq>o1!w#13(%^@ddl{+B`)o0FXY*t zP9E~TggnPPSa6PasG;X+u#5e0vxj`H;A~HUhn`6u@-qeJ=dI-)dMZ8SpAwwcb)WIj z^P-3R>wu|2=V(e-}RN|8s>r`}rad z`Kt|X=HncpCztBQdcoPAtsZ*57V>OQ!bARo&Y0Tc)7zamruQ-UaC)2%=1DI z%hwqE5x9rT)i)mefWa{i)|1@@F5tj=YCfMDVsP_0)M$gF9xhk;#HIZcggpB>A~^eb zx}oPC(9h|5#Nb;EzEkMo{`3b!e!d}p(#3EA2c{QoW%&#beu?0VsGN`W;H82uB>5!< z$0l=|55C}dkvQ67+F4`p_aTh^@T;K*?}-H93yxM@^)IKZFrcrm@!;1Bo=fsK5=Y%; zyLy|4{OumR)X?)T=wkb)33;~v&yus>1n2tooCn`3IIoj$Cywd*z_2GSq$+5U?K=k^5tc0v>V4eglVZ0D_lb9!?<_#J{TCp%+;vptIh z=XPV6!9N6xIe(ucj(%Qd@YfCgk-^_H^x!@0&(piZ1sv#StS`ec5RMK8N7RnSEnPkM zrIMek)L1tN&h>Pp;JKv#cEQ>I@YfX7!R6sB(tnrWEdPSw=ac?p#4$}D!-xHOV~?i# z3rT*A;H+zK;2kMl=L*j8b}~5n=bPqQZ_wcAACC7H!MT4K>%mI|XM1KD{6o;s z<-sM6aV|6XLk2hN*D^zonUAYI_&UL#rS{=N!P!5b3H}_(?-HElzxUurJ$TDrkVrVV zez6`~aL(T|1m}F|C^+ls;lVQnXZ=CJS^sr{v;JE>cvx`ObC=+(XSN5QCphbQQgGJu zlEKY++&Y7g1%GpSdy_bpop}cT%#g=0_RkK%xxe^HaGt;TFM*rk;QVFzmc&uFIUa5! z%pHAob7*BaQ5d4!8u>51!p}Q z1?TbnHo;l{kAkzFqaM83r7C+H@|W#7TX5EYso-o+mf$RZtKjVCQo-5Iy9H-Gvjt~6 z9}t}N{6%n z=W`FfLvW6Fx8Pjfjtb8D+h(3P-_t#KZx0^w;DZEbdu|h)^D9?y&ad%;v;DIKXZeQ& zXZfWD$8p-PG*0`Q!LcvNr*ie8!55=Ey?6bp!BL*qE8Z~pLxy~f!BL*qF^&j6mf~&J z2ZZ3@{*Jlr!O!&I=X>yrJou#^JSaH(=UTzp&JiBGz=PlE!J{60p$C6daJKU$!MQwa z5S;UItHI5D|HR;Cz9$4{{l^67d~eyeF@Mc+VjJ8nC+7*ycJ>mS^`XQR3)_ZSdjzdP2za zyz*HO{+hv)4Lwzc{!b15wjqykFQxYC1B07-zBD+tw~?0c1;=iKqaOCdF9shEoYQ4p zhIi?FG0R~y;;6$cho>3x7`Bk?{Da`UZq`}wH8f7RMsT+CkAm|!ZM5M09K1;IMP$!( z4_@iPpB0?f58n`+^JRnJ9Pd`axjud(_&l<6r{G*qe-)g^IqfdT+-j^xEPuY>Jdf)o zINQ@#aMte#&iW@9{6mPJ%TFnBEDOsFUSV*v-B@JsEr$F<2LH_9%ME_N!C&{_TReEH zE8u20(9TNuu>GBhCjl!ocn^b{_2M!^k6AAqLmuN`KMxk1{W;Xo^Cu(TF+!g86bR0G zB7*aC)fs|wdo@RJ{(F*(1ZVk21?PC56rAhnD;|8c;H+np;2iIE!PyVH1!p}61ZO|| zDmd#&$^xguf%%U4#d=z1!37-5xgGmmmckAEIjX-M1!p~71ZV&B5uE)$kT}|MAAGoc zju!H4|2V-p-V(vt4-XSZ{pRza{}S@7f1Tj0f3x76u9JeG7!LLu>p4eoo{wB8IP2*q zILF)1gAWv(?KC@&yl({CGqE7a+^_%rf|23_jc7j~hH@@FxuZAaS&Fg25j* zK|kq;KP1yMI7zHFz!!J^WbM2 ze3GH3kT~l2%HXdU+_W=p@UIQ|{f7QK41VraZ~+I}SqvYxzmvgB41Otbw8xyE_BZ5B z{nr~jV(7Wa;H3s1W$@VsznwV7JICPj4f#6_{-D7p8~iT@H}x+kF7>Z9xarS*hMp;g z{(}ZL{npF@AvmPp(ukw~P5Uo2~H%ZU6$|_?zH$0fnuX1&&=^AJ7#|&O( z=(zy+w3hG%$B=9EFY5jmd|1y72LHz36NzKG%=$jl;L{BGazl^#ocAF^9^+>JJZbRh zhMs2)Jueu1r@?m_yx!0=!{E(x-~tY5e;RSLWe$AU4;LHq7{>n35}fTHXy`G^|1d+| zOxFlQ-b~kcgPZA^Yv`G2*!hsb%M8BM;AVb3W9T>2`kC^z1O?V@AAtJ>-A# zkgqr7(a+p2wH^c)aBw}!4X8`&OyVe82_Md{kRflTcd#LEruRk<`2s_Jo}s_kLq2M7 z?6TONxgL5J8SR?7dU2}3?}2bm*BQiB zoiO-0hP z4GyR3K>y?Cvft}#ydMwdE!yhq6#dh{2at@`mj!>B_)5W75`SIr9O6}ibNjPS z@XaK@N$}pp-xmCR;#&mgzkB$h;QV(6w+a3g>G?wNoy4~b{w?uu1m8ovR`BnMe<%0> z;`;?(Py8pr`R^gt34V;^e-%9GECN3L%k`o;alhcLh^GjiO1!n;rxNGC+sgWXC41Tk z`PFT;9c={o^-(n5$`1Ub)>(u;A2U?tKjWOzNg>;;=Kh=C*DtR z?su{T?@aO`!MhT71n)^aM{uqeLj<2n^1}qrB0gMj?srBA?vVT_!MR@N3O?m(LFcXFqQf{8G~Mh2Uel>2_wj;3J8DBY2p2t>9yce<%2O z;`;@^llV`9mk_TLJkeF#`K#bB5?2Ev5aIUuY2tna2H#CQMR3;NTJU`&pCo2p2GzHfaHe@{t59Bf`3kYl;B?z&lUV%#K#G~n|Pt% z3F4Ck-$y(m_>aV=2!4q8G{KJ$FB80;c)8%ov@dk7;4O&H6Z|CN3kA1{FB1GT;)?}8 zgZL7`&mz85@b<))34T8D<$`x4{+!?!5`RJPi;2H1cn{($1?PRguM6In{RDrFc$VO6h=&BP zA?^sik$8^aZxJ6N_W4&yKFQj;+kH?AqZ*6|S_S-L+-i*|LsR?C3@}Vu%8Td2ZMC zLQg}LR$SPI8>`r$K}BVTHmsp5S!i=rx?shXuINs^WtcL@B1Vjuum%^5)cO7Ld3{*> zl>huD*YEfH_`W}%?}yL#bKhV0{d^0*C@+DpS3afijdJ^b7w=f-eKyO>5np$&ss9T2 z;`@wO!w)My0>4@DQTVO$7<^Fq#Nk8oI(SlE4^PP(;JI3FBYcg#3BFF=4BsGcf!lr~ zt?aT(nS#Hl z_-Xi2`3(FexpSTQzS{5m3Hbu}C9T&7Kc)CI_!+q$Zu^y`!+)vx4EV3*neYqp0Q@)d zEcox_+3+{zIq*Nq^WbmG^WpExL-1|#0{C{-XBd7-@rCeu#TUUFkVIsCBlsemt5d^P+=c?5p5JPN;69)sT|kHc5U>)@Y~*TZ{NKMn9)#W%v& z$eZB5RX)w|-^*Lz`wN`ep%vb{&UhOB_rved`D8kL zi#!7!lV`%8Rs9Fxr{r1iKg+Y>wmx&ViL{@^r(`s{B3hZz%s>_w}Ld|9<$7w7mx4uV}r4@Btl9hu{;+ zKM9|dr{GiaVfcf(P8@;1C?AD8s?RZaLhEqPQ$;V_!;;C zxwFu;7rXyIrutt1pOO3Ei?m(R;2Cm1{7!i~JYSvx56Ls(ww(vyrHapjSIM*C;Z5f6 z&w&@p^Wa7De0Z@u1TT>nz)R&}c$vHqUM??!SICRu)$$T}L|zJy%FE!Ls<(3ZDR~9l zzVE3TZr|$^fj4NqQTT-NkHN3V+q7fG6ag@IHALykFi8ACULJ2j#u+A$bCxl=s0?@_x9j&jI*F#Sg;m zecd7WIoX}Y9bd-b_PwPO@b4&o5`I!X1%Fn@ zooRTv&c|lp=j4v>+Wo)1o>~C6*Hb?DCLI^j;P!gT54YD->G0cBo(%Xdc_!RmPX*vU z)lU{YO`Z+URrzz^_IfH0en|28aC)~s4 z9BF_T>U^>h9##HL@R+w-Tc{coC@;tbGjxYrOK=EPt z$MoDu5qzP%1b)4|48BBO0l!HefiIKC;LGK8@Z04L@H^y9@Vn$K@XyHG;H%{w@Vn(* z@O$Jv@J;dr{62Xa-z5*IoqNqgO=MQ=?I-KyiYr3= zUo~%++jzTOV~Dr?b{gR)RK7O2Uxi}-$6R?o;?K%c@GM&oaQl2)zSeKcZ?D@+;g4#6 zXa7DMe`t}(nEiC#liTfO1rLSCKoX=gS~5te=$IdbR#1c?sgHZZzfTgl|}CoX;OFy2-c?&qW+fHy(m7^$s%b zP!0d0oX`0@zs$t*xe?p1lh0{fS#IL}_?_-}rtuv3+wwa2#oJ9he_wuI&fjxa1x!4D z-%QB)d*a{a>A0W#(h8GL1^o0%N-*+14?*%X1Wt{izkI8voeYprzXJHgt0-i#N%#{ExFu9;oq&U$G~h-PM^U3N7X-M70k z>I8T1+q0);ubb`Oees&$13Px*?vGdQep2&a-uu;Htae|lrZ#>+dDKL{^muLMo*I?; z{}=__wBD{>Uyr$*!kT)=){Ew?Yu53058keao_yX!v^`IHd>@;H=Z(X}NJL}}QQ(g?yhm}52H5WQN5x92N@w!!c>(}G;b4zXd=e&k<)nLox zrSXQa`yLO#-S=UlU^bl{m%1_DG*;t;AM;W>&Z}ytX3lW}c0%Ka-0^(%A9>#d zBtmBF)xY=Ex8=9>U+J2+eiYMjRBw~s!mEbBRny+2cm6Zq`U9&?Li=35w|?&{%Js)x z^CI)y&(*`^ZZoID$=o7a96LVfF0s>dLGDCa_0@A9PBZoecac{wtbf1Kvs||PHpipx zgqJ7Nhn2ns+mGox+_dx6-{4wP(hPkuz52Vs{n+$&`^~p*H_S=y_5O97kj?|V(~w5@ n!}Q)Z`JZj?#Xar*;|}MsV_^Mx`OcSqG-M)A&gSyrKTQ8$`F!Z^ literal 78600 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 K=knhlrvDcMP(GRf diff --git a/x.o b/x.o index d424c33d02c9634c414f120694bdd52d1b928372..fed3f234eb9f75bcd8f9560a9e19bfbd01ce3992 100644 GIT binary patch delta 9005 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 a{@S0-{Y1kXN@Dzj*~b8Eokm><8T$VeGy!h_ delta 8762 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 DfLHDO