diff --git a/docs/internal/MCCS.TEDIT b/docs/internal/MCCS.TEDIT new file mode 100644 index 000000000..01c8f2dff Binary files /dev/null and b/docs/internal/MCCS.TEDIT differ diff --git a/docs/internal/MEDLEYFONTFORMAT.TEDIT b/docs/internal/MEDLEYFONTFORMAT.TEDIT new file mode 100644 index 000000000..09be184aa Binary files /dev/null and b/docs/internal/MEDLEYFONTFORMAT.TEDIT differ diff --git a/internal/loadups/LOADUP-FULL b/internal/loadups/LOADUP-FULL index 155ab7077..15762f0be 100644 --- a/internal/loadups/LOADUP-FULL +++ b/internal/loadups/LOADUP-FULL @@ -1,13 +1,12 @@ (DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) -(FILECREATED "23-Apr-2025 05:14:27" {DSK}larry>il>medley>internal>loadups>LOADUP-FULL.;2 4662 +(FILECREATED "24-May-2025 10:18:08" {WMEDLEY}loadups>LOADUP-FULL.;11 5247 - :EDIT-BY "lmm" + :EDIT-BY rmk - :CHANGES-TO (FNS LOADFULLFONTS) + :CHANGES-TO (FNS LOADUP-FULL) - :PREVIOUS-DATE "31-Jul-2023 18:28:53" {DSK}larry>il>medley>internal>loadups>LOADUP-FULL.;1 -) + :PREVIOUS-DATE "22-May-2025 00:10:07" {WMEDLEY}loadups>LOADUP-FULL.;10) (PRETTYCOMPRINT LOADUP-FULLCOMS) @@ -17,16 +16,18 @@ (DEFINEQ (LOADFULLFONTS - [LAMBDA NIL (* ; "Edited 23-Apr-2025 05:13 by lmm") + [LAMBDA NIL (* ; "Edited 22-May-2025 00:10 by rmk") + (* ; "Edited 16-May-2025 09:32 by rmk") + (* ; "Edited 2-May-2025 14:32 by rmk") + (* ; "Edited 23-Apr-2025 05:13 by lmm") (* ; "Edited 13-Feb-2021 22:51 by larry") (* ;; " Don't do Interpress. Do character set 0 and the symbol character sets 41Q, 42Q, 356Q, 357Q and extended and accented Latin 43Q and 361Q") - (PRINTOUT T "Loading FULL fonts..." T) - (SETQ DISPLAYFONTEXTENSIONS '(DISPLAYFONT STRIKE)) + (SETQ DISPLAYFONTEXTENSIONS '(MEDLEYDISPLAYFONT DISPLAYFONT STRIKE)) (SETQ *POSTSCRIPT-FILE-TYPE* 'TEXT) - (RESETVARS ((MISSINGDISPLAYFONTCOERCIONS NIL) - (MISSINGCHARSETDISPLAYFONTCOERCIONS NIL)) (* ; + (RESETVARS ((DISPLAYFONTCOERCIONS NIL) + (DISPLAYCHARSETCOERCIONS NIL)) (* ;  "Don't let the font loader substitute just because a server went catatonic on us") (for FAMILY in '(CLASSIC MODERN TERMINAL) do (PRINTOUT T " Loading " FAMILY " ") @@ -42,7 +43,10 @@ (PRINTOUT T "FULL fonts loaded" T]) (LOADUP-FULL - [LAMBDA (DRIBBLEFILE) (* ; "Edited 18-Jan-2023 16:22 by FGH") + [LAMBDA (DRIBBLEFILE) (* ; "Edited 24-May-2025 10:18 by rmk") + (* ; "Edited 5-May-2025 21:26 by rmk") + (* ; "Edited 2-May-2025 22:12 by rmk") + (* ; "Edited 18-Jan-2023 16:22 by FGH") (* ; "Edited 12-Aug-2022 11:17 by lmm") (* ; "Edited 14-Jul-2022 12:32 by rmk") (* ; "Edited 12-Jul-2022 21:57 by rmk") @@ -89,5 +93,5 @@ (FIXMETA) (DECLARE%: DONTCOPY - (FILEMAP (NIL (493 4624 (LOADFULLFONTS 503 . 2059) (LOADUP-FULL 2061 . 4374) (FIXMETA 4376 . 4622))))) + (FILEMAP (NIL (456 5209 (LOADFULLFONTS 466 . 2317) (LOADUP-FULL 2319 . 4959) (FIXMETA 4961 . 5207))))) STOP diff --git a/internal/loadups/LOADUP-FULL.LCOM b/internal/loadups/LOADUP-FULL.LCOM index 1332ec1f6..73c1385df 100644 Binary files a/internal/loadups/LOADUP-FULL.LCOM and b/internal/loadups/LOADUP-FULL.LCOM differ diff --git a/internal/loadups/LOADUP-LISP b/internal/loadups/LOADUP-LISP index 5000cbff0..c926a92c3 100644 --- a/internal/loadups/LOADUP-LISP +++ b/internal/loadups/LOADUP-LISP @@ -1,13 +1,12 @@ (DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "XCL" BASE 10) -(FILECREATED "21-Mar-2024 10:56:13" |{DSK}larry>il>medley>internal>loadups>LOADUP-LISP.;4| 5586 +(FILECREATED "24-May-2025 10:20:14" |{WMEDLEY}loadups>LOADUP-LISP.;14| 6330 - :EDIT-BY "lmm" + :EDIT-BY |rmk| :CHANGES-TO (FNS LOADUP-LISP) - :PREVIOUS-DATE "14-Mar-2024 12:16:33" -|{DSK}larry>il>medley>internal>loadups>LOADUP-LISP.;3|) + :PREVIOUS-DATE "21-May-2025 09:25:09" |{WMEDLEY}loadups>LOADUP-LISP.;13|) (PRETTYCOMPRINT LOADUP-LISPCOMS) @@ -20,7 +19,11 @@ (DEFINEQ (LOADUP-LISP - (LAMBDA (DRIBBLEFILE) (* \; "Edited 21-Mar-2024 10:55 by lmm") + (LAMBDA (DRIBBLEFILE) (* \; "Edited 24-May-2025 10:20 by rmk") + (* \; "Edited 21-May-2025 09:25 by rmk") + (* \; "Edited 5-May-2025 21:25 by rmk") + (* \; "Edited 2-May-2025 22:12 by rmk") + (* \; "Edited 21-Mar-2024 10:55 by lmm") (* \; "Edited 14-Mar-2024 12:16 by lmm") (* \; "Edited 26-Feb-2023 12:17 by lmm") (* \; "Edited 13-Jul-2022 14:09 by rmk") @@ -61,8 +64,8 @@ (LOADUP '(STACKFNS CMLMVS MACROS MACROAUX UNWINDMACROS)) (LOADUP '(COMMON XCLC-RUNTIME CMLTYPES CL-ERROR)) - (LOADUP '(AFONT EDIT WEDIT PRETTY DSPRINTDEF NEWPRINTDEF FONTPROFILE SPELLFILE PRINTFN LOADFNS - DMISC DIRECTORY SPELLFILE FILEPKG RESOURCE)) + (LOADUP '(AFONT EDIT WEDIT PRETTY DSPRINTDEF NEWPRINTDEF SPELLFILE PRINTFN LOADFNS DMISC + DIRECTORY SPELLFILE FILEPKG RESOURCE)) (* |;;| "needed for makesys") @@ -79,9 +82,12 @@ CMLENVIRONMENT CMLLOAD CMLFLOAT CMLTIME CMLRAND CMLMODULES)) (LOADUP '(PROFILE CMLEXEC EXEC-COMMANDS DEBUGGER IL-ERROR-STUFF DEBUGEDIT)) (LOADUP '(ADDARITH)) + + (* |;;| "Before the MEDLEYFONT implementation, FONTPROFILE came after NEWPRINTDEF above, but the loadup failed for undiagnosed reasons. Loadup also fails if FONTPROFILE comes at the beginning of the following list, succeeds if its at the end. Needs a binary search to figure out the dependencies, but this sequence does work.") + (LOADUP '(UNICODE CMLPATHNAME HPRINT AARITH ADISPLAY HLDISPLAY MENU WINDOWOBJ WINDOWSCROLL WINDOW WINDOWICON PAINTW ATTACHEDWINDOW XXGEOM XXFILL DEXEC INSPECT DESCRIBE - CMLARRAYINSPECTOR EDITINTERFACE TTYIN)) + CMLARRAYINSPECTOR EDITINTERFACE TTYIN FONTPROFILE)) (LOADUP '(BREAK-AND-TRACE)) (LOADUP '(FASDUMP XCL-COMPILER ADVISE)) @@ -131,5 +137,5 @@ (GLOBALVARS MAKESYSFILENAME MEDLEY-INIT-VARS MEDLEYDIR SYSTEMINITVARS USERRECLST) ) (DECLARE\: DONTCOPY - (FILEMAP (NIL (673 5380 (LOADUP-LISP 683 . 5378))))) + (FILEMAP (NIL (640 6124 (LOADUP-LISP 650 . 6122))))) STOP diff --git a/internal/loadups/LOADUP-LISP.LCOM b/internal/loadups/LOADUP-LISP.LCOM index d83abfd5d..1c1e4543d 100644 Binary files a/internal/loadups/LOADUP-LISP.LCOM and b/internal/loadups/LOADUP-LISP.LCOM differ diff --git a/library/IMAGEOBJ b/library/IMAGEOBJ index 2348610cf..457956e1d 100644 --- a/library/IMAGEOBJ +++ b/library/IMAGEOBJ @@ -1,12 +1,12 @@ (DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) -(FILECREATED " 7-Dec-2024 19:44:25" {WMEDLEY}IMAGEOBJ.;4 34381 +(FILECREATED " 9-Jun-2025 20:33:49" {WMEDLEY}IMAGEOBJ.;5 32874 :EDIT-BY rmk - :CHANGES-TO (FNS GET.OBJ.FROM.USER) + :CHANGES-TO (VARS IMAGEOBJCOMS) - :PREVIOUS-DATE " 7-Jul-2024 21:04:16" {WMEDLEY}IMAGEOBJ.;3) + :PREVIOUS-DATE " 7-Dec-2024 19:44:25" {WMEDLEY}IMAGEOBJ.;4) (PRETTYCOMPRINT IMAGEOBJCOMS) @@ -15,8 +15,7 @@ ((COMS (* ;; "Bit-map image objects") - (FNS BITMAPTEDITOBJ COERCETOBITMAP WINDOWTITLEFONT \PRINTBINARYBITMAP \READBINARYBITMAP - ) + (FNS BITMAPTEDITOBJ COERCETOBITMAP WINDOWTITLEFONT) (* ;; "fns for the bitmap tedit object.") @@ -117,42 +116,6 @@ (* reset type of function that changes  the title font) (DSPFONT FONT WindowTitleDisplayStream))) - -(\PRINTBINARYBITMAP - (LAMBDA (BITMAP STREAM) (* rrb "23-Jul-84 15:16") - - (* * prints the representation of a bitmap onto STREAM in a form that can be - read back by \READBINARYBITMAP.) - - (PROG ((STREAM (GETSTREAM STREAM 'OUTPUT)) - BMH) - (OR (BITMAPP BITMAP) - (\ILLEGAL.ARG BITMAP)) - (\WOUT STREAM (BITMAPWIDTH BITMAP)) - (\WOUT STREAM (SETQ BMH (BITMAPHEIGHT BITMAP))) - (\WOUT STREAM (BITSPERPIXEL BITMAP)) - (\BOUTS STREAM (fetch (BITMAP BITMAPBASE) of BITMAP) - 0 - (ITIMES (fetch (BITMAP BITMAPRASTERWIDTH) of BITMAP) - BMH BYTESPERWORD)) - (RETURN BITMAP)))) - -(\READBINARYBITMAP - (LAMBDA (STREAM) (* rrb "23-Jul-84 15:17") - - (* * reads a bitmap printed on STREAM by \PRINTBINARYBITMAP.) - - (SETQ STREAM (GETSTREAM STREAM 'INPUT)) - (PROG ((BMW (\WIN STREAM)) - (BMH (\WIN STREAM)) - (BPP (\WIN STREAM)) - BITMAP) - (SETQ BITMAP (BITMAPCREATE BMW BMH BPP)) - (\BINS STREAM (fetch (BITMAP BITMAPBASE) of BITMAP) - 0 - (ITIMES (fetch (BITMAP BITMAPRASTERWIDTH) of BITMAP) - BMH BYTESPERWORD)) - (RETURN BITMAP)))) ) @@ -770,12 +733,11 @@ (FILESLOAD EDITBITMAP) (DECLARE%: DONTCOPY - (FILEMAP (NIL (2975 7471 (BITMAPTEDITOBJ 2985 . 3628) (COERCETOBITMAP 3630 . 5674) (WINDOWTITLEFONT -5676 . 6023) (\PRINTBINARYBITMAP 6025 . 6816) (\READBINARYBITMAP 6818 . 7469)) (7522 23640 ( -BMOBJ.BUTTONEVENTINFN 7532 . 12078) (BMOBJ.COPYFN 12080 . 12706) (BMOBJ.DISPLAYFN 12708 . 16437) ( -BMOBJ.IMAGEBOXFN 16439 . 18854) (BMOBJ.PUTFN 18856 . 19788) (BMOBJ.INIT 19790 . 20829) (BMOBJ.GETFN5 -20831 . 21421) (BMOBJ.CREATE.MENU 21423 . 23638)) (23730 27014 (SCALED.BITMAP.GETFN 23740 . 24166) ( -BMOBJ.GETFN 24168 . 24703) (BMOBJ.GETFN2 24705 . 25190) (BMOBJ.GETFN3 25192 . 25980) (BMOBJ.GETFN4 -25982 . 27012)) (28949 34281 (GET.OBJ.FROM.USER 28959 . 30925) (BITMAPOBJ.SNAPW 30927 . 32053) ( -PROMPTFOREVALED 32055 . 34279))))) + (FILEMAP (NIL (2914 5964 (BITMAPTEDITOBJ 2924 . 3567) (COERCETOBITMAP 3569 . 5613) (WINDOWTITLEFONT +5615 . 5962)) (6015 22133 (BMOBJ.BUTTONEVENTINFN 6025 . 10571) (BMOBJ.COPYFN 10573 . 11199) ( +BMOBJ.DISPLAYFN 11201 . 14930) (BMOBJ.IMAGEBOXFN 14932 . 17347) (BMOBJ.PUTFN 17349 . 18281) ( +BMOBJ.INIT 18283 . 19322) (BMOBJ.GETFN5 19324 . 19914) (BMOBJ.CREATE.MENU 19916 . 22131)) (22223 25507 + (SCALED.BITMAP.GETFN 22233 . 22659) (BMOBJ.GETFN 22661 . 23196) (BMOBJ.GETFN2 23198 . 23683) ( +BMOBJ.GETFN3 23685 . 24473) (BMOBJ.GETFN4 24475 . 25505)) (27442 32774 (GET.OBJ.FROM.USER 27452 . +29418) (BITMAPOBJ.SNAPW 29420 . 30546) (PROMPTFOREVALED 30548 . 32772))))) STOP diff --git a/library/IMAGEOBJ.LCOM b/library/IMAGEOBJ.LCOM index 3ab45fd98..7d00568cb 100644 Binary files a/library/IMAGEOBJ.LCOM and b/library/IMAGEOBJ.LCOM differ diff --git a/library/UNICODE b/library/UNICODE index 3c917000f..ec837b2a1 100644 --- a/library/UNICODE +++ b/library/UNICODE @@ -1,13 +1,12 @@ (DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) -(FILECREATED "31-Jan-2025 17:47:03" {WMEDLEY}UNICODE.;128 98991 +(FILECREATED " 8-Jun-2025 20:05:50" {WMEDLEY}UNICODE.;149 107124 :EDIT-BY rmk - :CHANGES-TO (FNS READ-UNICODE-MAPPING MERGE-UNICODE-TRANSLATION-TABLES - MAKE-UNICODE-TRANSLATION-TABLES ALL-UNICODE-MAPPINGS) + :CHANGES-TO (FNS SHOWCHARS) - :PREVIOUS-DATE "27-Jan-2025 16:46:36" {WMEDLEY}UNICODE.;127) + :PREVIOUS-DATE "24-May-2025 23:19:32" {WMEDLEY}UNICODE.;148) (PRETTYCOMPRINT UNICODECOMS) @@ -27,7 +26,8 @@ (FNS UTF8.VALIDATE UTF8-SIZE-FROM-BYTE1 NUTF8-BYTE1-BYTES NUTF8-CODE-BYTES NUTF8-STRING-BYTES) (DECLARE%: EVAL@COMPILE DONTCOPY (MACROS UNICODE.TRANSLATE \UTF8.GETBASEBYTE)) - (FNS XTOUCODE UTOXCODE XTOUCODE? UTOXCODE?)) + (FNS XTOUCODE UTOXCODE XTOUCODE? UTOXCODE? XTOMSTRING XTOUBYTES) + (FNS MTOUCODE UTOMCODE MTOUCODE? UTOMCODE? MTOUSTRING UTOMSTRING MTOUBYTES)) (* ;; "") @@ -40,20 +40,20 @@ (FNS MAKE-UNICODE-TRANSLATION-TABLES MERGE-UNICODE-TRANSLATION-TABLES UNICODE.UNMAPPED UNICODE-EXTEND-TRANSLATION?) (FNS ALL-UNICODE-MAPPINGS) - (INITVARS (*XCCSTOUNICODE*) - (*UNICODETOXCCS*) - (*XCCS-LOADED-CHARSETS*) + (INITVARS (*MCCSTOUNICODE*) + (*UNICODETOMCCS*) + (*MCCS-LOADED-CHARSETS*) (*UNICODE-LOADED-CHARSETS*)) - (GLOBALVARS *XCCSTOUNICODE* *UNICODETOXCCS* *NEXT-PRIVATE-UNICODE* - *NEXT-PRIVATE-XCCSCODE* *XCCS-LOADED-CHARSETS* *UNICODE-LOADED-CHARSETS*) + (GLOBALVARS *MCCSTOUNICODE* *UNICODETOMCCS* *NEXT-PRIVATE-UNICODE* + *NEXT-PRIVATE-MCCSCODE* *MCCS-LOADED-CHARSETS* *UNICODE-LOADED-CHARSETS*) (DECLARE%: EVAL@COMPILE DONTCOPY (* ;; "There are 6400 private Unicodes in 25 256-code charsets. For XCCS we map to a contiguous region of unused/reserved--private isn't big enough.") (CONSTANTS (FIRST-PRIVATE-UNICODE (HEXNUM? "E000")) (LAST-PRIVATE-UNICODE (HEXNUM? "F8FF")) - (FIRST-PRIVATE-XCCSCODE (CHARCODE "200,0")) - (LAST-PRIVATE-XCCSCODE (CHARCODE "230,377"))) + (FIRST-PRIVATE-MCCSCODE (CHARCODE "200,0")) + (LAST-PRIVATE-MCCSCODE (CHARCODE "230,377"))) (MACROS TRUECODEP)) (DECLARE%: DONTEVAL@LOAD DOCOPY (P (MAKE-UNICODE-TRANSLATION-TABLES 'ALL] @@ -71,7 +71,7 @@ (UNDEFINEDCODE (CL:PARSE-INTEGER "FFFF" :RADIX 16] (VARS UNICODE-MAPPING-HEADER)) - (FNS UTF8HEXSTRING XTOUSTRING XCCSSTRING) + (FNS UTF8HEXSTRING) (COMS (* ; "debugging") (FNS SHOWCHARS) (DECLARE%: DOEVAL@LOAD DONTCOPY (MACROS HEXCHAR OCTALCHAR))) @@ -87,7 +87,8 @@ (DEFINEQ (UTF8.OUTCHARFN - [LAMBDA (STREAM CHARCODE RAW) (* ; "Edited 20-Jan-2025 20:45 by rmk") + [LAMBDA (STREAM CHARCODE RAW) (* ; "Edited 24-Apr-2025 15:43 by rmk") + (* ; "Edited 20-Jan-2025 20:45 by rmk") (* ; "Edited 31-Jan-2024 00:32 by rmk") (* ; "Edited 8-Aug-2021 13:02 by rmk:") (* ; "Edited 17-Aug-2020 08:45 by rmk:") @@ -95,7 +96,7 @@ (* ;; "Perhaps the translation table should already do the mapping for EOL to LF, but that seems to be a separate property of the stream. Also, CRLF=2 bytes.") - (* ;; "Print UTF8 sequence for CHARCODE. Do not do XCCS to Unicode translation if RAW.") + (* ;; "Print UTF8 sequence for CHARCODE. Do not do MCCS to Unicode translation if RAW.") (IF (EQ CHARCODE (CHARCODE EOL)) THEN (FREPLACE (STREAM CHARPOSITION) OF STREAM WITH 0) @@ -104,7 +105,7 @@ (IPLUS16 1 DATUM)) (FOR C INSIDE (CL:IF RAW CHARCODE - (UNICODE.TRANSLATE CHARCODE *XCCSTOUNICODE*)) + (UNICODE.TRANSLATE CHARCODE *MCCSTOUNICODE*)) DO (IF (ILESSP C 128) THEN (\BOUT STREAM C) ELSEIF (ILESSP C 2048) @@ -134,10 +135,11 @@ ELSE (ERROR "CHARCODE too big for UTF8" C]) (UTF8.SLUG.OUTCHARFN - [LAMBDA (STREAM CODE RAW) (* ; "Edited 21-Jan-2025 18:37 by rmk") + [LAMBDA (STREAM CODE RAW) (* ; "Edited 24-Apr-2025 15:43 by rmk") + (* ; "Edited 21-Jan-2025 18:37 by rmk") (* ; "Edited 14-Jan-2025 12:39 by rmk") - (* ;; "Produces Unicode Representative FFFD as a slug for XCCS unmapped characters") + (* ;; "Produces Unicode Representative FFFD as a slug for MCCS unmapped characters") (UTF8.OUTCHARFN STREAM (OR (CL:IF RAW CODE @@ -146,12 +148,13 @@ T]) (UTF8.INCCODEFN - [LAMBDA (STREAM COUNTP RAW) (* ; "Edited 2-Feb-2024 11:44 by rmk") + [LAMBDA (STREAM COUNTP RAW) (* ; "Edited 24-Apr-2025 15:44 by rmk") + (* ; "Edited 2-Feb-2024 11:44 by rmk") (* ; "Edited 30-Jan-2024 22:56 by rmk") (* ; "Edited 6-Aug-2021 16:02 by rmk:") (* ; "Edited 6-Aug-2020 17:13 by rmk:") - (* ;; "Do not do UNICODE to XCSS translation if RAW.") + (* ;; "Do not do UNICODE to MCSS translation if RAW.") (* ;; "Test for smallp because the stream's End-of-file operation may suppress the error") @@ -231,19 +234,20 @@ 6) (LOADBYTE BYTE4 0 6]) (CL:UNLESS (OR RAW (NOT (SMALLP CODE))) - (SETQ CODE (UNICODE.TRANSLATE CODE *UNICODETOXCCS*))) + (SETQ CODE (UNICODE.TRANSLATE CODE *UNICODETOMCCS*))) (CL:WHEN COUNTP (SETQ *BYTECOUNTER* COUNT)) CODE]) (UTF8.PEEKCCODEFN - [LAMBDA (STREAM NOERROR RAW) (* ; "Edited 2-Feb-2024 11:48 by rmk") + [LAMBDA (STREAM NOERROR RAW) (* ; "Edited 24-Apr-2025 15:44 by rmk") + (* ; "Edited 2-Feb-2024 11:48 by rmk") (* ; "Edited 14-Jun-2021 22:53 by rmk:") (* ;; "Modeled this after \EUCPEEK on LLREAD. In the multi-byte (non-ASCII) case, backs the file pointer to the beginning by the proper number of \BACKFILEPTRs, and returns a count of 0. Returns NIL if NOERROR and either invalid UTF8 or end of file.") (* ;; "Could be that the caller takes care of backing up the file position if the number of binned-bytes is returned.") - (* ;; "Do not do UNICODE to XCCS translation if RAW") + (* ;; "Do not do UNICODE to MCCS translation if RAW") (PROG (BYTE1 BYTE2 BYTE3 BYTE4 CODE) (SETQ BYTE1 (\PEEKBIN STREAM NOERROR)) @@ -318,7 +322,7 @@ elseif NOERROR else (ERROR "INVALID UTF8 SEQUENCE" (LIST BYTE1 BYTE2 BYTE3 BYTE4] (CL:WHEN (AND CODE (NOT RAW)) - (SETQ CODE (UNICODE.TRANSLATE CODE *UNICODETOXCCS*))) + (SETQ CODE (UNICODE.TRANSLATE CODE *UNICODETOMCCS*))) (RETURN CODE]) (\UTF8.BACKCCODEFN @@ -340,11 +344,12 @@ (DEFINEQ (UTF16BE.OUTCHARFN - [LAMBDA (STREAM CHARCODE RAW) (* ; "Edited 31-Jan-2024 00:32 by rmk") + [LAMBDA (STREAM CHARCODE RAW) (* ; "Edited 24-Apr-2025 15:44 by rmk") + (* ; "Edited 31-Jan-2024 00:32 by rmk") (* ; "Edited 8-Aug-2021 13:09 by rmk:") (* ; "Edited 30-Jan-2020 23:08 by rmk:") - (* ;; "PRINT UTF16 sequence for CHARCODE. Do not do XCCS to UNICODE translation if RAW.") + (* ;; "PRINT UTF16 sequence for CHARCODE. Do not do MCCS to UNICODE translation if RAW.") (* ;; "Not sure about EOL conversion if truly %"raw%"") @@ -354,14 +359,15 @@ (IPLUS16 1 DATUM))) (FOR C INSIDE (CL:IF RAW CHARCODE - (UNICODE.TRANSLATE CHARCODE *XCCSTOUNICODE*)) DO (\WOUT STREAM C]) + (UNICODE.TRANSLATE CHARCODE *MCCSTOUNICODE*)) DO (\WOUT STREAM C]) (UTF16BE.INCCODEFN - [LAMBDA (STREAM COUNTP RAW) (* ; "Edited 10-Mar-2024 12:00 by rmk") + [LAMBDA (STREAM COUNTP RAW) (* ; "Edited 24-Apr-2025 15:45 by rmk") + (* ; "Edited 10-Mar-2024 12:00 by rmk") (* ; "Edited 6-Aug-2021 16:05 by rmk:") (* ;; - "Do not do UNICODE to XCCS translation if RAW. Test for SMALLPin case of funky EOF behavior") + "Do not do UNICODE to MCCS translation if RAW. Test for SMALLPin case of funky EOF behavior") (DECLARE (USEDFREE *BYTECOUNTER*)) (LET (CODE BYTE1 BYTE2 COUNT) @@ -372,18 +378,19 @@ HIBYTE _ (\BIN STREAM) LOBYTE _ (\BIN STREAM))) (CL:UNLESS RAW - (SETQ CODE (UNICODE.TRANSLATE CODE *UNICODETOXCCS*))) + (SETQ CODE (UNICODE.TRANSLATE CODE *UNICODETOMCCS*))) (CL:WHEN COUNTP (SETQ *BYTECOUNTER* COUNT)) CODE ELSE (ERROR "ODD NUMBER OF BYTES IN UTF16 FILE" STREAM]) (UTF16BE.PEEKCCODEFN - [LAMBDA (STREAM NOERROR RAW) (* ; "Edited 10-Mar-2024 12:01 by rmk") + [LAMBDA (STREAM NOERROR RAW) (* ; "Edited 24-Apr-2025 15:45 by rmk") + (* ; "Edited 10-Mar-2024 12:01 by rmk") (* ; "Edited 14-Jun-2021 22:58 by rmk:") (* ;; "Could be that the caller takes care of backing up the file position if the number of binned-bytes is returned.") - (* ;; "Do not do UNICODE to XCCS translation if RAW") + (* ;; "Do not do UNICODE to MCCS translation if RAW") (LET (BYTE1 BYTE2 CODE) (SETQ BYTE1 (\PEEKBIN STREAM NOERROR)) @@ -397,7 +404,7 @@ LOBYTE _ BYTE2)) (CL:IF RAW CODE - (UNICODE.TRANSLATE CODE *UNICODETOXCCS*)) + (UNICODE.TRANSLATE CODE *UNICODETOMCCS*)) ELSEIF NOERROR THEN NIL) ELSEIF NOERROR @@ -405,7 +412,8 @@ ELSE (ERROR "INVALID UTF16 CHARACTER" (LIST BYTE1 BYTE2]) (\UTF16BE.BACKCCODEFN - [LAMBDA (STREAM COUNTP RAW) (* ; "Edited 10-Mar-2024 12:02 by rmk") + [LAMBDA (STREAM COUNTP RAW) (* ; "Edited 24-Apr-2025 15:28 by rmk") + (* ; "Edited 10-Mar-2024 12:02 by rmk") (* ; "Edited 19-Jul-2022 15:14 by rmk") (* ; "Edited 6-Aug-2021 16:07 by rmk:") @@ -421,7 +429,7 @@ LOBYTE _ BYTE2)) (CL:IF RAW CODE - (UNICODE.TRANSLATE CODE *UNICODETOXCCS*)) + (UNICODE.TRANSLATE CODE *UNICODETOMCCS*)) ELSEIF COUNTP THEN (SETQ *BYTECOUNTER* -1) NIL)))]) @@ -429,11 +437,12 @@ (DEFINEQ (UTF16LE.OUTCHARFN - [LAMBDA (STREAM CHARCODE RAW) (* ; "Edited 10-Mar-2024 11:58 by rmk") + [LAMBDA (STREAM CHARCODE RAW) (* ; "Edited 24-Apr-2025 15:45 by rmk") + (* ; "Edited 10-Mar-2024 11:58 by rmk") (* ; "Edited 8-Aug-2021 13:09 by rmk:") (* ; "Edited 30-Jan-2020 23:08 by rmk:") - (* ;; "PRINT UTF16 sequence for CHARCODE. Do not do XCCS to UNICODE translation if RAW.") + (* ;; "PRINT UTF16 sequence for CHARCODE. Do not do MCCS to UNICODE translation if RAW.") (* ;; "Not sure about EOL conversion if truly %"raw%"") @@ -443,16 +452,17 @@ (IPLUS16 1 DATUM))) (FOR C INSIDE (CL:IF RAW CHARCODE - (UNICODE.TRANSLATE CHARCODE *XCCSTOUNICODE*)) + (UNICODE.TRANSLATE CHARCODE *MCCSTOUNICODE*)) DO (BOUT STREAM (fetch LOBYTE of CHARCODE)) (BOUT STREAM (fetch HIBYTE of CHARCODE]) (UTF16LE.INCCODEFN - [LAMBDA (STREAM COUNTP RAW) (* ; "Edited 10-Mar-2024 12:03 by rmk") + [LAMBDA (STREAM COUNTP RAW) (* ; "Edited 24-Apr-2025 15:45 by rmk") + (* ; "Edited 10-Mar-2024 12:03 by rmk") (* ; "Edited 6-Aug-2021 16:05 by rmk:") (* ;; - "Do not do UNICODE to XCCS translation if RAW. Test for SMALLPin case of funky EOF behavior") + "Do not do UNICODE to MCCS translation if RAW. Test for SMALLPin case of funky EOF behavior") (DECLARE (USEDFREE *BYTECOUNTER*)) (LET (CODE BYTE1 BYTE2 COUNT) @@ -463,18 +473,19 @@ LOBYTE _ (\BIN STREAM) HIBYTE _ (\BIN STREAM))) (CL:UNLESS RAW - (SETQ CODE (UNICODE.TRANSLATE CODE *UNICODETOXCCS*))) + (SETQ CODE (UNICODE.TRANSLATE CODE *UNICODETOMCCS*))) (CL:WHEN COUNTP (SETQ *BYTECOUNTER* COUNT)) CODE ELSE (ERROR "ODD NUMBER OF BYTES IN UTF16 FILE" STREAM]) (UTF16LE.PEEKCCODEFN - [LAMBDA (STREAM NOERROR RAW) (* ; "Edited 10-Mar-2024 11:43 by rmk") + [LAMBDA (STREAM NOERROR RAW) (* ; "Edited 24-Apr-2025 15:46 by rmk") + (* ; "Edited 10-Mar-2024 11:43 by rmk") (* ; "Edited 14-Jun-2021 22:58 by rmk:") (* ;; "Could be that the caller takes care of backing up the file position if the number of binned-bytes is returned.") - (* ;; "Do not do UNICODE to XCCS translation if RAW") + (* ;; "Do not do UNICODE to MCCS translation if RAW") (LET (BYTE1 BYTE2 CODE) (SETQ BYTE1 (\PEEKBIN STREAM NOERROR)) @@ -487,7 +498,7 @@ BYTE1)) (CL:IF RAW CODE - (UNICODE.TRANSLATE CODE *UNICODETOXCCS*)) + (UNICODE.TRANSLATE CODE *UNICODETOMCCS*)) ELSEIF NOERROR THEN NIL) ELSEIF NOERROR @@ -495,7 +506,8 @@ ELSE (ERROR "INVALID UTF16 CHARACTER" (LIST BYTE1 BYTE2]) (\UTF16LE.BACKCCODEFN - [LAMBDA (STREAM COUNTP RAW) (* ; "Edited 10-Mar-2024 12:04 by rmk") + [LAMBDA (STREAM COUNTP RAW) (* ; "Edited 24-Apr-2025 15:28 by rmk") + (* ; "Edited 10-Mar-2024 12:04 by rmk") (* ; "Edited 19-Jul-2022 15:14 by rmk") (* ; "Edited 6-Aug-2021 16:07 by rmk:") @@ -511,7 +523,7 @@ LOBYTE _ (\PEEKBIN STREAM))) (CL:IF RAW CODE - (UNICODE.TRANSLATE CODE *UNICODETOXCCS*)) + (UNICODE.TRANSLATE CODE *UNICODETOMCCS*)) ELSEIF COUNTP THEN (SETQ *BYTECOUNTER* -1) NIL)))]) @@ -647,7 +659,8 @@ (DEFINEQ (UTF8.BINCODE - [LAMBDA (STREAM RAW) (* ; "Edited 4-Feb-2024 01:06 by rmk") + [LAMBDA (STREAM RAW) (* ; "Edited 24-Apr-2025 15:28 by rmk") + (* ; "Edited 4-Feb-2024 01:06 by rmk") (* ; "Edited 1-Feb-2024 11:21 by rmk") (* ; "Edited 28-Dec-2023 13:32 by rmk") (* ; "Edited 6-Aug-2021 16:02 by rmk:") @@ -691,7 +704,7 @@ 0 6] (CL:IF RAW CODE - (UNICODE.TRANSLATE CODE *UNICODETOXCCS*))]) + (UNICODE.TRANSLATE CODE *UNICODETOMCCS*))]) (\UTF8.FETCHCODE [LAMBDA (CODESIZE BUFFER BYTEOFFSET) (* ; "Edited 28-Dec-2023 13:32 by rmk") @@ -826,10 +839,11 @@ ELSE (ERROR "INVALID UTF-8 CODE"]) (NUTF8-STRING-BYTES - [LAMBDA (STRING RAW) (* ; "Edited 3-Feb-2024 21:32 by rmk") + [LAMBDA (STRING RAW) (* ; "Edited 24-Apr-2025 15:37 by rmk") + (* ; "Edited 3-Feb-2024 21:32 by rmk") (* ; "Edited 10-Aug-2020 09:06 by rmk:") - (* ;; "Returns the number of bytes it would take to represent STRING in UTF8, assuming it is an XCCS string unless RAWFLG. ") + (* ;; "Returns the number of bytes it would take to represent STRING in UTF8, assuming it is an MCCS string unless RAWFLG. ") (FOR I C FROM 1 WHILE (SETQ C (NTHCHARCODE STRING I)) SUM (NUTF8-CODE-BYTES (CL:IF RAW C @@ -866,16 +880,23 @@ (DEFINEQ (XTOUCODE - [LAMBDA (XCCSCODE) (* ; "Edited 9-Aug-2020 09:04 by rmk:") - (UNICODE.TRANSLATE XCCSCODE *XCCSTOUNICODE*]) + [LAMBDA (XCCSCODE) (* ; "Edited 24-May-2025 23:16 by rmk") + (* ; "Edited 24-Apr-2025 15:27 by rmk") + (* ; "Edited 9-Aug-2020 09:04 by rmk:") + (UNICODE.TRANSLATE (XTOMCODE XCCSCODE) + *MCCSTOUNICODE*]) (UTOXCODE - [LAMBDA (UNNICODE) (* ; "Edited 16-Jan-2025 23:46 by rmk") + [LAMBDA (UNICODE) (* ; "Edited 24-May-2025 23:17 by rmk") + (* ; "Edited 24-Apr-2025 15:28 by rmk") + (* ; "Edited 16-Jan-2025 23:46 by rmk") (* ; "Edited 9-Aug-2020 09:04 by rmk:") - (UNICODE.TRANSLATE UNNICODE *UNICODETOXCCS*]) + (MTOXCODE (UNICODE.TRANSLATE UNICODE *UNICODETOMCCS*]) (XTOUCODE? - [LAMBDA (XCCSCODE) (* ; "Edited 20-Jan-2025 20:38 by rmk") + [LAMBDA (XCCSCODE) (* ; "Edited 24-May-2025 23:18 by rmk") + (* ; "Edited 24-Apr-2025 15:27 by rmk") + (* ; "Edited 20-Jan-2025 20:38 by rmk") (* ; "Edited 18-Jan-2025 11:44 by rmk") (* ; "Edited 15-Jan-2025 19:51 by rmk") (* ; "Edited 14-Jan-2025 13:14 by rmk") @@ -883,10 +904,13 @@ (* ;; "Returns the Unix range-code(s) corresponding to XCCSCODE if there are true mapppings, otherwise NIL. Alternative codes are returned in a list, the code itself is returned for a singleton.") - (UNICODE.TRANSLATE XCCSCODE *XCCSTOUNICODE* T T]) + (UNICODE.TRANSLATE (XTOMCODE XCCSCODE) + *MCCSTOUNICODE* T T]) (UTOXCODE? - [LAMBDA (UNICODE) (* ; "Edited 19-Jan-2025 21:14 by rmk") + [LAMBDA (UNICODE) (* ; "Edited 24-May-2025 23:19 by rmk") + (* ; "Edited 24-Apr-2025 15:28 by rmk") + (* ; "Edited 19-Jan-2025 21:14 by rmk") (* ; "Edited 18-Jan-2025 11:46 by rmk") (* ; "Edited 15-Jan-2025 19:51 by rmk") (* ; "Edited 14-Jan-2025 13:14 by rmk") @@ -897,7 +921,148 @@ (* ;;  " NOTE: Alternative codes are returned in a list, the code itself is returned for a singleton.") - (UNICODE.TRANSLATE UNICODE *UNICODETOXCCS* T T]) + (MTOXCODE (UNICODE.TRANSLATE UNICODE *UNICODETOMCCS* T T]) + +(XTOMSTRING + [LAMBDA (XSTRING DESTRUCTIVE) (* ; "Edited 29-Apr-2025 13:08 by rmk") + + (* ;; "Converts Unicodes to MCCS codes in XSTRING.") + + (for I MCODE XCODE (MSTRING _ (CL:IF DESTRUCTIVE + XSTRING + (CONCAT XSTRING))) from 1 while (SETQ XCODE (NTHCHARCODE + XSTRING I)) + unless (EQ XCODE (SETQ MCODE (XTOMCODE XCODE))) do (RPLCHARCODE MSTRING I MCODE) + finally (RETURN MSTRING]) + +(XTOUBYTES + [LAMBDA (XCCSSTRING RAWFLG) (* ; "Edited 29-Apr-2025 12:53 by rmk") + (* ; "Edited 24-Apr-2025 15:42 by rmk") + (* ; "Edited 3-Feb-2024 14:55 by rmk") + (* ; "Edited 10-Aug-2020 21:42 by rmk:") + + (* ;; "Produces a string that contains the UTF8 bytes that represent the characters in XCCSSTRING. Applies the XCCSTOUNICODE translation unless RAWFLG. ") + + (* ;; "The resulting string will not be readable inside Medley.") + + (MTOUBYTES (XTOMSTRING XCCSSTRING) + T]) +) +(DEFINEQ + +(MTOUCODE + [LAMBDA (MCCSCODE) (* ; "Edited 24-Apr-2025 10:19 by rmk") + (* ; "Edited 9-Aug-2020 09:04 by rmk:") + (UNICODE.TRANSLATE MCCSCODE *MCCSTOUNICODE*]) + +(UTOMCODE + [LAMBDA (UNNICODE) (* ; "Edited 24-Apr-2025 10:17 by rmk") + (* ; "Edited 16-Jan-2025 23:46 by rmk") + (* ; "Edited 9-Aug-2020 09:04 by rmk:") + (UNICODE.TRANSLATE UNNICODE *UNICODETOMCCS*]) + +(MTOUCODE? + [LAMBDA (MCCSCODE) (* ; "Edited 24-Apr-2025 10:18 by rmk") + (* ; "Edited 20-Jan-2025 20:38 by rmk") + (* ; "Edited 18-Jan-2025 11:44 by rmk") + (* ; "Edited 15-Jan-2025 19:51 by rmk") + (* ; "Edited 14-Jan-2025 13:14 by rmk") + (* ; "Edited 9-Aug-2020 09:04 by rmk:") + + (* ;; "Returns the Unix range-code(s) corresponding to MCCSCODE if there are true mapppings, otherwise NIL. Alternative codes are returned in a list, the code itself is returned for a singleton.") + + (UNICODE.TRANSLATE MCCSCODE *MCCSTOUNICODE* T T]) + +(UTOMCODE? + [LAMBDA (UNICODE) (* ; "Edited 24-Apr-2025 10:18 by rmk") + (* ; "Edited 19-Jan-2025 21:14 by rmk") + (* ; "Edited 18-Jan-2025 11:46 by rmk") + (* ; "Edited 15-Jan-2025 19:51 by rmk") + (* ; "Edited 14-Jan-2025 13:14 by rmk") + (* ; "Edited 9-Aug-2020 09:04 by rmk:") + + (* ;; "Returns the MCCS range-code(s) corresponding to UNICODE if there are true mapppings, otherwise NIL. ") + + (* ;; + " NOTE: Alternative codes are returned in a list, the code itself is returned for a singleton.") + + (UNICODE.TRANSLATE UNICODE *UNICODETOMCCS* T T]) + +(MTOUSTRING + [LAMBDA (MSTRING DESTRUCTIVE) (* ; "Edited 29-Apr-2025 12:01 by rmk") + + (* ;; "Converts MCCS codes in MSTRING to Unicodes.") + + (for I MCODE UCODE (USTRING _ (CL:IF DESTRUCTIVE + MSTRING + (CONCAT MSTRING))) from 1 while (SETQ MCODE (NTHCHARCODE + MSTRING I)) + unless (EQ MCODE (SETQ UCODE (MTOUCODE MCODE))) do (RPLCHARCODE USTRING I UCODE) + finally (RETURN USTRING]) + +(UTOMSTRING + [LAMBDA (USTRING DESTRUCTIVE) (* ; "Edited 29-Apr-2025 12:00 by rmk") + + (* ;; "Converts Unicodes to MCCS codes in USTRING.") + + (for I MCODE UCODE (MSTRING _ (CL:IF DESTRUCTIVE + USTRING + (CONCAT USTRING))) from 1 while (SETQ UCODE (NTHCHARCODE + USTRING I)) + unless (EQ UCODE (SETQ MCODE (UTOMCODE UCODE))) do (RPLCHARCODE MSTRING I MCODE) + finally (RETURN MSTRING]) + +(MTOUBYTES + [LAMBDA (MCCSSTRING RAWFLG) (* ; "Edited 24-Apr-2025 15:37 by rmk") + (* ; "Edited 3-Feb-2024 14:55 by rmk") + (* ; "Edited 10-Aug-2020 21:42 by rmk:") + + (* ;; "Produces a string that contains the UTF8 bytes that represent the characters in MCCSSTRING. Applies the MCCSTOUNICODE translation unless RAWFLG. ") + + (* ;; "The resulting string will not be readable inside Medley.") + + (LET [(USTR (ALLOCSTRING (NUTF8-STRING-BYTES MCCSSTRING RAWFLG] + (FOR I CHARCODE (SINDEX _ 0) FROM 1 WHILE (SETQ CHARCODE (NTHCHARCODE MCCSSTRING I)) + DO (CL:UNLESS RAWFLG + (SETQ CHARCODE (XTOUCODE CHARCODE))) + (IF (ILESSP CHARCODE 128) + THEN (RPLCHARCODE USTR (ADD SINDEX 1) + CHARCODE) + ELSEIF (ILESSP CHARCODE 2048) + THEN (* ; "x800") + (RPLCHARCODE USTR (ADD SINDEX 1) + (LOGOR (LLSH 3 6) + (LRSH CHARCODE 6))) + (RPLCHARCODE USTR (ADD SINDEX 1) + (LOGOR (LLSH 2 6) + (LOADBYTE CHARCODE 0 6))) + ELSEIF (ILESSP CHARCODE 65536) + THEN (* ; "x10000") + (RPLCHARCODE USTR (ADD SINDEX 1) + (LOGOR (LLSH 7 5) + (LRSH CHARCODE 12))) + (RPLCHARCODE USTR (ADD SINDEX 1) + (LOGOR (LLSH 2 6) + (LOADBYTE CHARCODE 6 6))) + (RPLCHARCODE USTR (ADD SINDEX 1) + (LOGOR (LLSH 2 6) + (LOADBYTE CHARCODE 0 6))) + ELSEIF (ILESSP CHARCODE 2097152) + THEN (* ; "x200000") + (RPLCHARCODE USTR (ADD SINDEX 1) + (LOGOR (LLSH 15 4) + (LRSH CHARCODE 18))) + (RPLCHARCODE USTR (ADD SINDEX 1) + (LOGOR (LLSH 2 6) + (LOADBYTE CHARCODE 12 6))) + (RPLCHARCODE USTR (ADD SINDEX 1) + (LOGOR (LLSH 2 6) + (LOADBYTE CHARCODE 6 6))) + (RPLCHARCODE USTR (ADD SINDEX 1) + (LOGOR (LLSH 2 6) + (LOADBYTE CHARCODE 0 6))) + ELSE (SHOULDNT))) + USTR]) ) @@ -1005,7 +1170,8 @@ (FUNCTION STRING.EQUAL]) (READ-UNICODE-MAPPING - [LAMBDA (FILESPEC PRINT NOERROR) (* ; "Edited 31-Jan-2025 17:43 by rmk") + [LAMBDA (FILESPEC PRINT NOERROR) (* ; "Edited 24-Apr-2025 15:32 by rmk") + (* ; "Edited 31-Jan-2025 17:43 by rmk") (* ; "Edited 17-Jan-2025 16:41 by rmk") (* ; "Edited 3-Feb-2024 00:21 by rmk") (* ; "Edited 5-Jan-2024 12:26 by rmk") @@ -1013,7 +1179,7 @@ (* ;; "Combines the char-mapping tables from FILES coded in the Uncode-CDROM format. Comments prefixed by # and") - (* ;; " Column 1: Input hex code in the format 0xXXXX") + (* ;; " Column 1: XCCS input hex code in the format 0xXXXX") (* ;; " Column 2: Corresponding Unicode code-sequence in the format") @@ -1025,15 +1191,15 @@ (* ;; "") - (* ;; "Result is a list of (fromcode tocode1 ... tocoden) integer lists (almost always with only a single tocode") + (* ;; "Result is a list of (fromcode tocode1 ... tocoden) integer lists (almost always with only a single tocode, where fromcode is an MCCS code and the tocodes are corresponding Unicodes.") - (FOR FILE [SEPBITTABLE _ (MAKEBITTABLE (CHARCODE (TAB SPACE] IN (READ-UNICODE-MAPPING-FILENAMES + (for FILE [SEPBITTABLE _ (MAKEBITTABLE (CHARCODE (TAB SPACE] in (READ-UNICODE-MAPPING-FILENAMES FILESPEC) - JOIN + join (* ;; "External format :THROUGH means read as bytes, so the Unicode UTF-8 comments cannot cause reading problems.") (CL:WITH-OPEN-FILE (STREAM FILE :DIRECTION :INPUT :EXTERNAL-FORMAT `(:THROUGH LF)) - (bind LINE NAME CHARSET START + (bind LINE NAME CHARSET START MAP first (CL:UNLESS (FILEPOS "Name:" STREAM NIL NIL NIL T) (ERROR "NOT A UNICODE MAPPING FILE" (FULLNAME STREAM))) (SETQ NAME (CL:STRING-TRIM " " (CL:READ-LINE STREAM NIL NIL))) @@ -1047,16 +1213,22 @@ when (SETQ START (STRPOSL SEPBITTABLE LINE 1 T)) unless (EQ (CHARCODE %#) (NTHCHARCODE LINE START)) - collect (bind END CODES while [SETQ END (OR (STRPOSL SEPBITTABLE LINE START) - (ADD1 (NCHARS LINE] - collect [CHARCODE.DECODE (SUBSTRING LINE START (SUB1 END) - (CONSTANT (CONCAT] - repeatwhile (AND (SETQ START (STRPOSL SEPBITTABLE LINE END T)) - (NEQ (CHARCODE %#) - (NTHCHARCODE LINE START))) - finally (CL:WHEN (CDDR $$VAL) + collect [SETQ MAP (bind END CODES while [SETQ END (OR (STRPOSL SEPBITTABLE LINE + START) + (ADD1 (NCHARS LINE] + collect [CHARCODE.DECODE (SUBSTRING LINE START + (SUB1 END) + (CONSTANT (CONCAT] + repeatwhile (AND (SETQ START (STRPOSL SEPBITTABLE LINE END + T)) + (NEQ (CHARCODE %#) + (NTHCHARCODE LINE START))) + finally (CL:WHEN (CDDR $$VAL) (* ; "Combiners go into a CADR list") - (RPLACD $$VAL (CONS (CDR $$VAL))))]) + (RPLACD $$VAL (CONS (CDR $$VAL))))] + (change (CAR MAP) + (XTOMCODE DATUM)) + MAP]) ) @@ -1066,7 +1238,8 @@ (DEFINEQ (MAKE-UNICODE-TRANSLATION-TABLES - [LAMBDA (MAPPING REINSTALL) (* ; "Edited 31-Jan-2025 17:46 by rmk") + [LAMBDA (MAPPING REINSTALL) (* ; "Edited 24-Apr-2025 15:47 by rmk") + (* ; "Edited 31-Jan-2025 17:46 by rmk") (* ; "Edited 26-Jan-2025 19:36 by rmk") (* ; "Edited 22-Jan-2025 14:22 by rmk") (* ; "Edited 19-Jan-2025 15:08 by rmk") @@ -1097,22 +1270,23 @@ (* ;; "") (if REINSTALL - then (SETQ *XCCS-LOADED-CHARSETS* (SETQ *UNICODE-LOADED-CHARSETS* NIL)) - (SETQ *NEXT-PRIVATE-XCCSCODE* FIRST-PRIVATE-XCCSCODE) + then (SETQ *MCCS-LOADED-CHARSETS* (SETQ *UNICODE-LOADED-CHARSETS* NIL)) + (SETQ *NEXT-PRIVATE-MCCSCODE* FIRST-PRIVATE-MCCSCODE) (SETQ *NEXT-PRIVATE-UNICODE* FIRST-PRIVATE-UNICODE) (LET [(TABLE (HASHARRAY (LENGTH MAPPING))) (INVERSETABLE (HASHARRAY (LENGTH MAPPING] (MERGE-UNICODE-TRANSLATION-TABLES NIL MAPPING TABLE INVERSETABLE) - (SETQ *XCCSTOUNICODE* TABLE) - (SETQ *UNICODETOXCCS* INVERSETABLE) - (LIST *XCCSTOUNICODE* *UNICODETOXCCS*)) - else (CL:UNLESS (BOUNDP '*NEXT-PRIVATE-XCCSCODE*) - (SETQ *NEXT-PRIVATE-XCCSCODE* FIRST-PRIVATE-XCCSCODE) + (SETQ *MCCSTOUNICODE* TABLE) + (SETQ *UNICODETOMCCS* INVERSETABLE) + (LIST *MCCSTOUNICODE* *UNICODETOMCCS*)) + else (CL:UNLESS (BOUNDP '*NEXT-PRIVATE-MCCSCODE*) + (SETQ *NEXT-PRIVATE-MCCSCODE* FIRST-PRIVATE-MCCSCODE) (SETQ *NEXT-PRIVATE-UNICODE* FIRST-PRIVATE-UNICODE)) (MERGE-UNICODE-TRANSLATION-TABLES NIL MAPPING]) (MERGE-UNICODE-TRANSLATION-TABLES - [LAMBDA (INVERSE MAPPING TABLE INVERSETABLE) (* ; "Edited 31-Jan-2025 17:45 by rmk") + [LAMBDA (INVERSE MAPPING TABLE INVERSETABLE) (* ; "Edited 24-Apr-2025 15:28 by rmk") + (* ; "Edited 1-Feb-2025 21:42 by rmk") (* ; "Edited 26-Jan-2025 12:58 by rmk") (* ; "Edited 22-Jan-2025 08:20 by rmk") (* ; "Edited 19-Jan-2025 15:58 by rmk") @@ -1124,33 +1298,32 @@ (* ;; "MAPPINGS is a list of pairs that map domain codes to range codes. TABLE and INVERSETABLE default to *XCCSTOUNICODE* *UNICODETOXCCS* respectively. ") (CL:UNLESS TABLE - [SETQ TABLE (OR *XCCSTOUNICODE* (SETQ *XCCSTOUNICODE* (HASHARRAY (LENGTH MAPPING]) + [SETQ TABLE (OR *MCCSTOUNICODE* (SETQ *MCCSTOUNICODE* (HASHARRAY (LENGTH MAPPING]) (CL:UNLESS INVERSETABLE - [SETQ INVERSETABLE (OR *UNICODETOXCCS* (SETQ *UNICODETOXCCS* (HASHARRAY (LENGTH MAPPING]) + [SETQ INVERSETABLE (OR *UNICODETOMCCS* (SETQ *UNICODETOMCCS* (HASHARRAY (LENGTH MAPPING]) (for M D R OLDR in MAPPING first (CL:IF INVERSE (swap TABLE INVERSETABLE)) eachtime (SETQ D (CAR M)) (SETQ R (CADR M)) - (* ;; "We don't do combiners and we don't go outside of SMALLP's") + (* ;; "We don't do combiners, but we are allowing non-SMALLP's") unless (OR (LISTP D) - (LISTP R)) when (AND (SMALLP D) - (SMALLP R)) do - - (* ;; "The (CONS R OLDR) deals with alternatives: (U X1) (U X2) => (U (X1 X2)), lowest code first. Those are only possible in the U-to-X direction when the tables contain (X1 U) and (X2 U). There are no duplicates/alternative table entries in the X-to-U direction.") - - (SETQ OLDR (GETHASH D TABLE)) - (CL:UNLESS (MEMB R OLDR) - (PUTHASH D (SORT (CONS R OLDR)) - TABLE)) - (swap D R) - (SETQ OLDR (GETHASH D INVERSETABLE)) - (CL:UNLESS (MEMB R OLDR) - (PUTHASH D (SORT (CONS R OLDR)) - INVERSETABLE))) + (LISTP R)) do + (* ;; "The (CONS R OLDR) deals with alternatives: (U X1) (U X2) => (U (X1 X2)), lowest code first. Those are only possible in the U-to-X direction when the tables contain (X1 U) and (X2 U). There are no duplicates/alternative table entries in the X-to-U direction.") + + (SETQ OLDR (GETHASH D TABLE)) + (CL:UNLESS (MEMB R OLDR) + (PUTHASH D (SORT (CONS R OLDR)) + TABLE)) + (swap D R) + (SETQ OLDR (GETHASH D INVERSETABLE)) + (CL:UNLESS (MEMB R OLDR) + (PUTHASH D (SORT (CONS R OLDR)) + INVERSETABLE))) (LIST TABLE INVERSETABLE]) (UNICODE.UNMAPPED - [LAMBDA (CODE TABLE DONTFAKE) (* ; "Edited 22-Jan-2025 08:19 by rmk") + [LAMBDA (CODE TABLE DONTFAKE) (* ; "Edited 24-Apr-2025 15:48 by rmk") + (* ; "Edited 22-Jan-2025 08:19 by rmk") (* ; "Edited 19-Jan-2025 22:02 by rmk") (* ; "Edited 18-Jan-2025 12:02 by rmk") (* ; "Edited 2-Feb-2024 23:52 by rmk") @@ -1165,7 +1338,7 @@ (* ;; "") - (PROG ((INVERSE (EQ TABLE *UNICODETOXCCS*)) + (PROG ((INVERSE (EQ TABLE *UNICODETOMCCS*)) RANGE HASH) (* ;; "If we already looked up CODE's character set in a file, then we have already filled in its information in the translation table. If it didn't have a code for a particular character, then we fake it here. Faked codes are negative, so we can detect them easily, and interpret them with IABS.") @@ -1183,15 +1356,15 @@ (* ;; "Our attempt at extending the known tables did not provide a mapping for CODE. So we fake it up with the next unused private code in the code space. ") - (* ;; "The number of possible faked mappings is determined by the number of private-use Unicodes, since the XCCS character space is pretty sparse. The codes don't have to come from the same part of the code space, and the NEXTCODEs are saved in global variables. The last available codes are constants.") + (* ;; "The number of possible faked mappings is determined by the number of private-use Unicodes, since the MCCS character space is pretty sparse. The codes don't have to come from the same part of the code space, and the NEXTCODEs are saved in global variables. The last available codes are constants.") - (CL:WHEN (IEQP *NEXT-PRIVATE-XCCSCODE* LAST-PRIVATE-XCCSCODE) + (CL:WHEN (IEQP *NEXT-PRIVATE-MCCSCODE* LAST-PRIVATE-MCCSCODE) (* ;  "Same number of available codes both ways") (ERROR "EXHAUSTED RANGE FOR UNMAPPED CODES")) (if INVERSE - then (SETQ RANGE *NEXT-PRIVATE-XCCSCODE*) - (add *NEXT-PRIVATE-XCCSCODE* 1) + then (SETQ RANGE *NEXT-PRIVATE-MCCSCODE*) + (add *NEXT-PRIVATE-MCCSCODE* 1) else (SETQ RANGE *NEXT-PRIVATE-UNICODE*) (add *NEXT-PRIVATE-UNICODE* 1)) (MERGE-UNICODE-TRANSLATION-TABLES INVERSE (CONS (LIST CODE RANGE))) @@ -1201,7 +1374,8 @@ (RETURN (CONS RANGE)))]) (UNICODE-EXTEND-TRANSLATION? - [LAMBDA (CODE TABLE) (* ; "Edited 26-Jan-2025 11:26 by rmk") + [LAMBDA (CODE TABLE) (* ; "Edited 24-Apr-2025 15:49 by rmk") + (* ; "Edited 26-Jan-2025 11:26 by rmk") (* ; "Edited 21-Jan-2025 22:31 by rmk") (* ; "Edited 18-Jan-2025 12:40 by rmk") (* ; "Edited 13-Jan-2025 23:50 by rmk") @@ -1210,25 +1384,25 @@ (* ; "Edited 5-Feb-2024 13:48 by rmk") (* ; "Edited 3-Feb-2024 12:40 by rmk") - (* ;; "There is currently no mapping for CODE in TABLE, hopefully just because the relevant character-set mapping has not been installed. We infer from TABLE whether CODE is an XCCS or UNICODE code and look for the proper mapping table (forward or inverted) for its character set. ") + (* ;; "There is currently no mapping for CODE in TABLE, hopefully just because the relevant character-set mapping has not been installed. We infer from TABLE whether CODE is an MCCS or UNICODE code and look for the proper mapping table (forward or inverted) for its character set. ") (* ;; "We record which character sets we have already expanded so we don't do them again.") (LET ((CHARSET (\CHARSET CODE)) - (INVERSE (EQ TABLE *UNICODETOXCCS*)) + (INVERSE (EQ TABLE *UNICODETOMCCS*)) MAPPING FILE) (* ;; "If we already looked for CHARSET in the file and found anything, it has already been merged. Otherwise, it would just fail again") (CL:UNLESS (MEMB CHARSET (CL:IF INVERSE *UNICODE-LOADED-CHARSETS* - *XCCS-LOADED-CHARSETS*)) + *MCCS-LOADED-CHARSETS*)) (* ;; "Don't try this charset again.") (CL:IF INVERSE (push *UNICODE-LOADED-CHARSETS* CHARSET) - (push *XCCS-LOADED-CHARSETS* CHARSET)) + (push *MCCS-LOADED-CHARSETS* CHARSET)) (SETQ FILE (FINDFILE (CL:IF INVERSE 'INVERTED-UNICODE-MAPPINGS.TXT 'UNICODE-MAPPINGS.TXT) @@ -1250,7 +1424,8 @@ (DEFINEQ (ALL-UNICODE-MAPPINGS - [LAMBDA (INVERTED FILE) (* ; "Edited 31-Jan-2025 17:46 by rmk") + [LAMBDA (INVERTED FILE) (* ; "Edited 24-Apr-2025 15:51 by rmk") + (* ; "Edited 31-Jan-2025 17:46 by rmk") (* ; "Edited 26-Jan-2025 13:40 by rmk") (* ; "Edited 22-Jan-2025 14:07 by rmk") (* ; "Edited 19-Jan-2025 12:20 by rmk") @@ -1260,16 +1435,16 @@ (* ; "Edited 5-Feb-2024 13:14 by rmk") (* ; "Edited 3-Feb-2024 09:16 by rmk") - (* ;; "Reads all the XCCS-to-UNICODE mapping files that we know about, and produces a 2-level index that maps between XCCS codes and UNICODE codes, depending on INVERTED.") + (* ;; "Reads all the XCCS-to-UNICODE mapping files that we know about, and produces a 2-level index that maps between MCCS codes and UNICODE codes, depending on INVERTED.") (* ;; "The first index level segments all the domain codes according to their character sets. The segments are sorted by character set, the pairs within each segment are sorted by their domain codes. ") (* ;;  "E.g. if INVERTED=NIL and given a XCCS code, the lookup for the corresponding Unicode(s) is") - (* ;; " (CADR (ASSOC XCCSCODE (\CHARSET XCCSCODE) INDEX)))).") + (* ;; " (CADR (ASSOC MCCSCODE (\CHARSET MCCSCODE) INDEX)))).") - (* ;; "If FILE is not NIL, the result is written to a file. If FILE is T, the file is either UNICODE-MAPPINGS.TXT or INVERTED-UNICODED-MAPPINGS.TXT, depending on INVERTED.") + (* ;; "If FILE is not NIL, the result is written to a file. If FILE is T, the file is either MCCS-TO-UNICODE-MAPPINGS.TXT or UNICODE-TO-MCCS-MAPPINGS.TXT, depending on INVERTED.") (LET (INDEX) (for PAIR DOMAIN RANGE CHARSET in (READ-UNICODE-MAPPING 'ALL) eachtime (SETQ DOMAIN @@ -1287,7 +1462,7 @@ INDEX) (CAR (push INDEX (CONS (\CHARSET DOMAIN] - (* ;; "For alternative mappings (in the U-to-X direction) we end up with (D R1 R2 ...). (CADR is the first (and almost always) the only one.") + (* ;; "For alternative mappings (in the U-to-M direction) we end up with (D R1 R2 ...). (CADR is the first (and almost always) the only one.") (pushnew [CDR (OR (ASSOC DOMAIN (CDR CHARSET)) (CAR (push (CDR CHARSET) @@ -1312,8 +1487,8 @@ then (SETQ FILE (PACKFILENAME 'BODY (if (NEQ FILE T) then FILE elseif INVERTED - then 'INVERTED-UNICODE-MAPPINGS - else 'UNICODE-MAPPINGS) + then 'UNICODE-TO-MCCS-MAPPINGS + else 'MCCS-TO-UNICODE-MAPPINGS) 'DIRECTORY (CAR (MKLIST UNICODEDIRECTORIES)) 'EXTENSION @@ -1332,17 +1507,17 @@ else INDEX]) ) -(RPAQ? *XCCSTOUNICODE* ) +(RPAQ? *MCCSTOUNICODE* ) -(RPAQ? *UNICODETOXCCS* ) +(RPAQ? *UNICODETOMCCS* ) -(RPAQ? *XCCS-LOADED-CHARSETS* ) +(RPAQ? *MCCS-LOADED-CHARSETS* ) (RPAQ? *UNICODE-LOADED-CHARSETS* ) (DECLARE%: DOEVAL@COMPILE DONTCOPY -(GLOBALVARS *XCCSTOUNICODE* *UNICODETOXCCS* *NEXT-PRIVATE-UNICODE* *NEXT-PRIVATE-XCCSCODE* - *XCCS-LOADED-CHARSETS* *UNICODE-LOADED-CHARSETS*) +(GLOBALVARS *MCCSTOUNICODE* *UNICODETOMCCS* *NEXT-PRIVATE-UNICODE* *NEXT-PRIVATE-MCCSCODE* + *MCCS-LOADED-CHARSETS* *UNICODE-LOADED-CHARSETS*) ) (DECLARE%: EVAL@COMPILE DONTCOPY (DECLARE%: EVAL@COMPILE @@ -1351,15 +1526,15 @@ (RPAQ LAST-PRIVATE-UNICODE (HEXNUM? "F8FF")) -(RPAQ FIRST-PRIVATE-XCCSCODE (CHARCODE "200,0")) +(RPAQ FIRST-PRIVATE-MCCSCODE (CHARCODE "200,0")) -(RPAQ LAST-PRIVATE-XCCSCODE (CHARCODE "230,377")) +(RPAQ LAST-PRIVATE-MCCSCODE (CHARCODE "230,377")) (CONSTANTS (FIRST-PRIVATE-UNICODE (HEXNUM? "E000")) (LAST-PRIVATE-UNICODE (HEXNUM? "F8FF")) - (FIRST-PRIVATE-XCCSCODE (CHARCODE "200,0")) - (LAST-PRIVATE-XCCSCODE (CHARCODE "230,377"))) + (FIRST-PRIVATE-MCCSCODE (CHARCODE "200,0")) + (LAST-PRIVATE-MCCSCODE (CHARCODE "230,377"))) ) (DECLARE%: EVAL@COMPILE @@ -1368,11 +1543,11 @@ (* ;; "Return NIL if RANGE is a fake range in TABLE, otherwise RANGE.") - (CL:UNLESS (CL:IF (EQ TABLE *XCCSTOUNICODE*) + (CL:UNLESS (CL:IF (EQ TABLE *MCCSTOUNICODE*) (AND (IGEQ RANGE FIRST-PRIVATE-UNICODE) (ILEQ RANGE LAST-PRIVATE-UNICODE)) - (AND (IGEQ RANGE FIRST-PRIVATE-XCCSCODE) - (ILEQ RANGE LAST-PRIVATE-XCCSCODE))) + (AND (IGEQ RANGE FIRST-PRIVATE-MCCSCODE) + (ILEQ RANGE LAST-PRIVATE-MCCSCODE))) RANGE))) ) ) @@ -1705,68 +1880,6 @@ (LOGOR (LLSH 2 6) (LOADBYTE CHARCODE 0 6))) ELSE (ERROR "CHARCODE too big for UTF8" CHARCODE]) - -(XTOUSTRING - [LAMBDA (XCCSSTRING RAWFLG) (* ; "Edited 3-Feb-2024 14:55 by rmk") - (* ; "Edited 10-Aug-2020 21:42 by rmk:") - - (* ;; "Produces a string that contains the UTF8 bytes that represent the characters in XCCSSTRING. Applies the XCCSTOUNICODE translation unless RAWFLG. ") - - (* ;; "The resulting string will not be readable inside Medley.") - - (LET [(USTR (ALLOCSTRING (NUTF8-STRING-BYTES XCCSSTRING RAWFLG] - (FOR I CHARCODE (SINDEX _ 0) FROM 1 WHILE (SETQ CHARCODE (NTHCHARCODE XCCSSTRING I)) - DO (CL:UNLESS RAWFLG - (SETQ CHARCODE (XTOUCODE CHARCODE))) - (IF (ILESSP CHARCODE 128) - THEN (RPLCHARCODE USTR (ADD SINDEX 1) - CHARCODE) - ELSEIF (ILESSP CHARCODE 2048) - THEN (* ; "x800") - (RPLCHARCODE USTR (ADD SINDEX 1) - (LOGOR (LLSH 3 6) - (LRSH CHARCODE 6))) - (RPLCHARCODE USTR (ADD SINDEX 1) - (LOGOR (LLSH 2 6) - (LOADBYTE CHARCODE 0 6))) - ELSEIF (ILESSP CHARCODE 65536) - THEN (* ; "x10000") - (RPLCHARCODE USTR (ADD SINDEX 1) - (LOGOR (LLSH 7 5) - (LRSH CHARCODE 12))) - (RPLCHARCODE USTR (ADD SINDEX 1) - (LOGOR (LLSH 2 6) - (LOADBYTE CHARCODE 6 6))) - (RPLCHARCODE USTR (ADD SINDEX 1) - (LOGOR (LLSH 2 6) - (LOADBYTE CHARCODE 0 6))) - ELSEIF (ILESSP CHARCODE 2097152) - THEN (* ; "x200000") - (RPLCHARCODE USTR (ADD SINDEX 1) - (LOGOR (LLSH 15 4) - (LRSH CHARCODE 18))) - (RPLCHARCODE USTR (ADD SINDEX 1) - (LOGOR (LLSH 2 6) - (LOADBYTE CHARCODE 12 6))) - (RPLCHARCODE USTR (ADD SINDEX 1) - (LOGOR (LLSH 2 6) - (LOADBYTE CHARCODE 6 6))) - (RPLCHARCODE USTR (ADD SINDEX 1) - (LOGOR (LLSH 2 6) - (LOADBYTE CHARCODE 0 6))) - ELSE (SHOULDNT))) - USTR]) - -(XCCSSTRING - [LAMBDA (CODE) (* ; "Edited 13-Aug-2020 12:16 by rmk:") - - (* ;; "Returns XCCS character representation of string %"cset,char%"") - - (CL:UNLESS (FIXP CODE) - (SETQ CODE (CHCON1 CODE))) - (CONCAT (OCTALSTRING (LRSH CODE 8)) - "," - (OCTALSTRING (LOGAND CODE 255]) ) @@ -1776,24 +1889,17 @@ (DEFINEQ (SHOWCHARS - [LAMBDA (FROMCHAR TOCHAR FONT) (* ; "Edited 26-Jan-2024 14:18 by mth") + [LAMBDA (FONT FROMCHAR TOCHAR) (* ; "Edited 8-Jun-2025 20:05 by rmk") + (* ; "Edited 26-Jan-2024 14:18 by mth") (* ; "Edited 1-Aug-2020 09:27 by rmk:") (RESETFORM (DSPFONT (OR FONT '(CLASSIC 12)) T) - (CL:WHEN (AND (SMALLP FROMCHAR) - (NOT TOCHAR)) - - (* ;; - "If a small number, assume it's an octal (in decimal) character set, no need for string quotes") - - (SETQ TOCHAR (CONCAT FROMCHAR "," 376)) - (SETQ FROMCHAR (CONCAT FROMCHAR "," 41))) - (CL:UNLESS (SMALLP FROMCHAR) + (CL:UNLESS (CHARCODEP FROMCHAR) (SETQ FROMCHAR (CHARCODE.DECODE FROMCHAR))) - (CL:UNLESS (SMALLP TOCHAR) - (SETQ TOCHAR (CL:IF TOCHAR - (CHARCODE.DECODE TOCHAR) - FROMCHAR))) + (if TOCHAR + then (CL:UNLESS (CHARCODEP TOCHAR) + (SETQ TOCHAR (CHARCODE.DECODE TOCHAR))) + else (SETQ TOCHAR FROMCHAR)) (for C from FROMCHAR to TOCHAR unless (AND (IGEQ (LOGAND C 255) 127) (ILEQ (LOGAND C 255) @@ -1825,23 +1931,25 @@ (PUTPROPS UNICODE FILETYPE :TCOMPL) (DECLARE%: DONTCOPY - (FILEMAP (NIL (4369 19181 (UTF8.OUTCHARFN 4379 . 7286) (UTF8.SLUG.OUTCHARFN 7288 . 7843) ( -UTF8.INCCODEFN 7845 . 13457) (UTF8.PEEKCCODEFN 13459 . 18199) (\UTF8.BACKCCODEFN 18201 . 19179)) ( -19182 23436 (UTF16BE.OUTCHARFN 19192 . 20102) (UTF16BE.INCCODEFN 20104 . 21120) (UTF16BE.PEEKCCODEFN -21122 . 22353) (\UTF16BE.BACKCCODEFN 22355 . 23434)) (23437 27724 (UTF16LE.OUTCHARFN 23447 . 24454) ( -UTF16LE.INCCODEFN 24456 . 25472) (UTF16LE.PEEKCCODEFN 25474 . 26641) (\UTF16LE.BACKCCODEFN 26643 . -27722)) (27725 30772 (READBOM 27735 . 29804) (WRITEBOM 29806 . 30770)) (30802 34367 ( -MAKE-UNICODE-FORMATS 30812 . 34365)) (34464 38849 (UTF8.BINCODE 34474 . 37053) (\UTF8.FETCHCODE 37055 - . 38847)) (38850 44371 (UTF8.VALIDATE 38860 . 41457) (UTF8-SIZE-FROM-BYTE1 41459 . 41891) ( -NUTF8-BYTE1-BYTES 41893 . 42630) (NUTF8-CODE-BYTES 42632 . 43689) (NUTF8-STRING-BYTES 43691 . 44369)) -(46099 48246 (XTOUCODE 46109 . 46281) (UTOXCODE 46283 . 46564) (XTOUCODE? 46566 . 47387) (UTOXCODE? -47389 . 48244)) (49483 56904 (READ-UNICODE-MAPPING-FILENAMES 49493 . 53181) (READ-UNICODE-MAPPING -53183 . 56902)) (56971 68830 (MAKE-UNICODE-TRANSLATION-TABLES 56981 . 60073) ( -MERGE-UNICODE-TRANSLATION-TABLES 60075 . 62788) (UNICODE.UNMAPPED 62790 . 66005) ( -UNICODE-EXTEND-TRANSLATION? 66007 . 68828)) (68831 74210 (ALL-UNICODE-MAPPINGS 68841 . 74208)) (75801 -88232 (WRITE-UNICODE-MAPPING 75811 . 79561) (WRITE-UNICODE-INCLUDED 79563 . 84285) ( -WRITE-UNICODE-MAPPING-HEADER 84287 . 85535) (WRITE-UNICODE-MAPPING-FILENAME 85537 . 87067) (HEXSTRING -87069 . 88230)) (88233 88909 (XCCS-UTF8-AFTER-OPEN 88243 . 88907)) (91434 96936 (UTF8HEXSTRING 91444 - . 93649) (XTOUSTRING 93651 . 96571) (XCCSSTRING 96573 . 96934)) (96963 98473 (SHOWCHARS 96973 . 98471 -))))) + (FILEMAP (NIL (4337 19585 (UTF8.OUTCHARFN 4347 . 7363) (UTF8.SLUG.OUTCHARFN 7365 . 8029) ( +UTF8.INCCODEFN 8031 . 13752) (UTF8.PEEKCCODEFN 13754 . 18603) (\UTF8.BACKCCODEFN 18605 . 19583)) ( +19586 24276 (UTF16BE.OUTCHARFN 19596 . 20615) (UTF16BE.INCCODEFN 20617 . 21742) (UTF16BE.PEEKCCODEFN +21744 . 23084) (\UTF16BE.BACKCCODEFN 23086 . 24274)) (24277 29000 (UTF16LE.OUTCHARFN 24287 . 25403) ( +UTF16LE.INCCODEFN 25405 . 26530) (UTF16LE.PEEKCCODEFN 26532 . 27808) (\UTF16LE.BACKCCODEFN 27810 . +28998)) (29001 32048 (READBOM 29011 . 31080) (WRITEBOM 31082 . 32046)) (32078 35643 ( +MAKE-UNICODE-FORMATS 32088 . 35641)) (35740 40234 (UTF8.BINCODE 35750 . 38438) (\UTF8.FETCHCODE 38440 + . 40232)) (40235 45865 (UTF8.VALIDATE 40245 . 42842) (UTF8-SIZE-FROM-BYTE1 42844 . 43276) ( +NUTF8-BYTE1-BYTES 43278 . 44015) (NUTF8-CODE-BYTES 44017 . 45074) (NUTF8-STRING-BYTES 45076 . 45863)) +(47593 52057 (XTOUCODE 47603 . 48015) (UTOXCODE 48017 . 48525) (XTOUCODE? 48527 . 49588) (UTOXCODE? +49590 . 50673) (XTOMSTRING 50675 . 51303) (XTOUBYTES 51305 . 52055)) (52058 58935 (MTOUCODE 52068 . +52349) (UTOMCODE 52351 . 52741) (MTOUCODE? 52743 . 53673) (UTOMCODE? 53675 . 54639) (MTOUSTRING 54641 + . 55273) (UTOMSTRING 55275 . 55907) (MTOUBYTES 55909 . 58933)) (60172 68250 ( +READ-UNICODE-MAPPING-FILENAMES 60182 . 63870) (READ-UNICODE-MAPPING 63872 . 68248)) (68317 80334 ( +MAKE-UNICODE-TRANSLATION-TABLES 68327 . 71528) (MERGE-UNICODE-TRANSLATION-TABLES 71530 . 74074) ( +UNICODE.UNMAPPED 74076 . 77400) (UNICODE-EXTEND-TRANSLATION? 77402 . 80332)) (80335 85836 ( +ALL-UNICODE-MAPPINGS 80345 . 85834)) (87427 99858 (WRITE-UNICODE-MAPPING 87437 . 91187) ( +WRITE-UNICODE-INCLUDED 91189 . 95911) (WRITE-UNICODE-MAPPING-HEADER 95913 . 97161) ( +WRITE-UNICODE-MAPPING-FILENAME 97163 . 98693) (HEXSTRING 98695 . 99856)) (99859 100535 ( +XCCS-UTF8-AFTER-OPEN 99869 . 100533)) (103060 105277 (UTF8HEXSTRING 103070 . 105275)) (105304 106606 ( +SHOWCHARS 105314 . 106604))))) STOP diff --git a/library/UNICODE.LCOM b/library/UNICODE.LCOM index b081f6240..c66f5432b 100644 Binary files a/library/UNICODE.LCOM and b/library/UNICODE.LCOM differ diff --git a/library/UNIXCOMM b/library/UNIXCOMM index a21d84584..7fbf953db 100644 --- a/library/UNIXCOMM +++ b/library/UNIXCOMM @@ -1,16 +1,13 @@ (DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) -(FILECREATED "18-Dec-2022 11:55:01" {WMEDLEY}UNIXCOMM.;11 14599 +(FILECREATED "29-Apr-2025 22:45:47" {WMEDLEY}UNIXCOMM.;13 14630 - :CHANGES-TO (FNS INITIALIZE-SHELL-DEVICE UNIX-BACKFILEPTR UNIX-STREAM-EOFP) - (VARS UNIXCOMMCOMS) + :EDIT-BY rmk - :PREVIOUS-DATE "25-Oct-2022 21:56:00" {WMEDLEY}UNIXCOMM.;9) + :CHANGES-TO (FNS FORK-UNIX) + :PREVIOUS-DATE "18-Dec-2022 11:55:01" {WMEDLEY}UNIXCOMM.;11) -(* ; " -Copyright (c) 1988-1990, 2018, 2022 by Venue & Xerox Corporation. -") (PRETTYCOMPRINT UNIXCOMMCOMS) @@ -75,8 +72,12 @@ Copyright (c) 1988-1990, 2018, 2022 by Venue & Xerox Corporation. else (SUBRCALL UNIX-HANDLECOMM 4]) (FORK-UNIX - [LAMBDA (STR) (* ; "Edited 25-May-88 15:47 by drc:") - (SUBRCALL UNIX-HANDLECOMM 0 (\DTEST STR 'ONED-ARRAY]) + [LAMBDA (STR) (* ; "Edited 29-Apr-2025 22:45 by rmk") + (* ; "Edited 25-May-88 15:47 by drc:") + + (* ;; "MTOUBYTES converts MCCS codes to Unicodes, and then lays out the bytes of the UTF-8 encoding of those characters. ") + + (SUBRCALL UNIX-HANDLECOMM 0 (MTOUBYTES (\DTEST STR 'ONED-ARRAY]) (UNIX-KILL [LAMBDA (CONN) (* ; "Edited 25-May-88 16:04 by drc:") @@ -316,12 +317,11 @@ Copyright (c) 1988-1990, 2018, 2022 by Venue & Xerox Corporation. ) (PUTPROPS UNIXCOMM FILETYPE COMPILE-FILE) -(PUTPROPS UNIXCOMM COPYRIGHT ("Venue & Xerox Corporation" 1988 1989 1990 2018 2022)) (DECLARE%: DONTCOPY - (FILEMAP (NIL (1963 7028 (FORK-SHELL 1973 . 3170) (FORK-UNIX 3172 . 3348) (UNIX-KILL 3350 . 3539) ( -UNIX-WRITE 3541 . 4252) (CREATE-SHELL-STREAM 4254 . 5138) (CREATE-PROCESS-STREAM 5140 . 5979) ( -UNIXCOMM-AROUNDEXITFN 5981 . 7026)) (7076 12267 (INITIALIZE-SHELL-DEVICE 7086 . 8514) ( -UNIX-GET-NEXT-BUFFER 8516 . 10716) (UNIX-BACKFILEPTR 10718 . 11130) (UNIX-STREAM-EOFP 11132 . 11613) ( -UNIX-STREAM-OUT 11615 . 11871) (UNIX-STREAM-CLOSE 11873 . 12265)) (12515 14221 ( -CREATE-UNIX-SOCKET-STREAM 12525 . 13331) (ACCEPT-UNIX-SOCKET-STREAM 13333 . 14219))))) + (FILEMAP (NIL (1821 7144 (FORK-SHELL 1831 . 3028) (FORK-UNIX 3030 . 3464) (UNIX-KILL 3466 . 3655) ( +UNIX-WRITE 3657 . 4368) (CREATE-SHELL-STREAM 4370 . 5254) (CREATE-PROCESS-STREAM 5256 . 6095) ( +UNIXCOMM-AROUNDEXITFN 6097 . 7142)) (7192 12383 (INITIALIZE-SHELL-DEVICE 7202 . 8630) ( +UNIX-GET-NEXT-BUFFER 8632 . 10832) (UNIX-BACKFILEPTR 10834 . 11246) (UNIX-STREAM-EOFP 11248 . 11729) ( +UNIX-STREAM-OUT 11731 . 11987) (UNIX-STREAM-CLOSE 11989 . 12381)) (12631 14337 ( +CREATE-UNIX-SOCKET-STREAM 12641 . 13447) (ACCEPT-UNIX-SOCKET-STREAM 13449 . 14335))))) STOP diff --git a/library/UNIXCOMM.LCOM b/library/UNIXCOMM.LCOM index 0e9e8dfa6..1570d1d55 100644 Binary files a/library/UNIXCOMM.LCOM and b/library/UNIXCOMM.LCOM differ diff --git a/library/tedit/TEDIT-STRESS b/library/tedit/TEDIT-STRESS index b7dffcbcf..97b2c8a9b 100644 --- a/library/tedit/TEDIT-STRESS +++ b/library/tedit/TEDIT-STRESS @@ -1,20 +1,26 @@ (DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) -(FILECREATED "21-Oct-2024 00:27:47" {WMEDLEY}tedit>TEDIT-STRESS.;71 15583 +(FILECREATED " 2-Jun-2025 21:30:43" {WMEDLEY}tedit>TEDIT-STRESS.;113 27000 :EDIT-BY rmk - :CHANGES-TO (FNS STRESSHC STRESSPUT EQTEXTSTREAM) + :CHANGES-TO (FNS STRESSHC STRESSRAND STRESSPUT STRESSOPEN STRESSREAD STRESSFORMAT STRESSDISPLAY + STRESSSCROLL STRESSDELETE STRESSINSERT STRESSGREP STRESSPEEK COPYTOCORE + CHECKARRAYS) - :PREVIOUS-DATE "19-Mar-2024 21:34:32" {WMEDLEY}tedit>TEDIT-STRESS.;70) + :PREVIOUS-DATE " 2-Jun-2025 09:23:43" {WMEDLEY}tedit>TEDIT-STRESS.;111) (PRETTYCOMPRINT TEDIT-STRESSCOMS) -(RPAQQ TEDIT-STRESSCOMS ( (* ; "Preload typical image objects") - (FNS STRESSHC STRESSRAND STRESSPUT STRESSOPEN STRESSREAD STRESSGREP - STRESSPEEK) - (FNS EQTEXTSTREAM SYSOUTRING COPYTOCORE))) +(RPAQQ TEDIT-STRESSCOMS + ( (* ; "Preload typical image objects") + (FNS STRESSHC STRESSRAND STRESSPUT STRESSOPEN STRESSREAD STRESSFORMAT STRESSDISPLAY + STRESSSCROLL STRESSDELETE STRESSINSERT STRESSGREP STRESSPEEK) + (FNS EQTEXTSTREAM SYSOUTRING COPYTOCORE CHECKARRAYS) + (INITVARS (CHECKARRAYS T)) + (FILES TEDIT-DEBUG) + (DECLARE%: EVAL@COMPILE DONTCOPY (MACROS STRESS)))) @@ -24,6 +30,7 @@ (STRESSHC [LAMBDA (FILES NSYSOUTS REPS ERROR SEPARATEOUT PDF SYSOUTNAME SINGLESTEP) + (* ; "Edited 2-Jun-2025 21:27 by rmk") (* ; "Edited 21-Oct-2024 00:26 by rmk") (* ; "Edited 19-Mar-2024 21:33 by rmk") (* ; "Edited 14-Mar-2024 15:15 by rmk") @@ -32,8 +39,8 @@ (* ;; "If all arguments are defaulted, runs through all TEDIT files in the current directory until it fails, doing SAVEVM before each file. The HC files are made as {CORE}FOO.PS.") - (CL:UNLESS FILES - (SETQ FILES (FILDIR '*.TEDIT;))) + [SETQ FILES (OR (MKLIST FILES) + (FILDIR '*.TEDIT;] (CL:UNLESS REPS (SETQ REPS MAX.SMALLP)) (CL:UNLESS NSYSOUTS (SETQ NSYSOUTS 'SAVEVM)) @@ -56,189 +63,329 @@ (for R SYSOUTS (ITYPE _ (CL:IF PDF 'pdf 'ps)) - (N _ 0) from 1 to REPS - do (PRINTOUT T "Rep " R T) - (if (EQ NSYSOUTS 'SAVEVM) - then (SAVEVM) - else (SETQ SYSOUTS (SYSOUTRING NSYSOUTS SYSOUTNAME SYSOUTS))) - [for F TSTRM HCFILE inside FILES - do (PROMPTPRINT F) - (SETQ HCFILE (CL:IF SEPARATEOUT - (OUTFILEP (PACKFILENAME 'EXTENSION ITYPE 'VERSION 1 'BODY F)) - (CL:IF PDF - "{CORE}FOO.PDF;1" - "{CORE}FOO.PS;1"))) - (if [if ERROR - then (SETQ TSTRM (OPENTEXTSTREAM F)) - (TEDIT.FORMAT.HARDCOPY TSTRM HCFILE T NIL NIL NIL (CL:IF PDF - 'PDF - 'POSTSCRIPT)) - else (NLSETQ (SETQ TSTRM (OPENTEXTSTREAM F)) - (TEDIT.FORMAT.HARDCOPY TSTRM HCFILE T NIL NIL NIL - (CL:IF PDF - 'PDF - 'POSTSCRIPT)] - then (add N 1) - else (PRINTOUT T " Error for " (PACKFILENAME 'HOST NIL 'DIRECTORY NIL 'BODY F) - T)) - (CLOSEF? TSTRM) - (CL:WHEN SINGLESTEP - (\TEDIT.THELP (CONCAT "Just hardcopied " F " to " HCFILE)))] - (PRINTOUT T " Hardcopied " N " files without failure" T) + (N _ 0) from 1 to REPS do (PRINTOUT T "Rep " R T) + (if (EQ NSYSOUTS 'SAVEVM) + then (SAVEVM) + else (SETQ SYSOUTS (SYSOUTRING NSYSOUTS SYSOUTNAME SYSOUTS))) + [for F TSTREAM HCFILE in FILES unless (DIRECTORYNAMEP F) + do (PROMPTPRINT F) + (SETQ HCFILE (CL:IF SEPARATEOUT + (OUTFILEP (PACKFILENAME 'EXTENSION ITYPE + 'VERSION 1 'BODY F)) + (CL:IF PDF + "{CORE}FOO.PDF;1" + "{CORE}FOO.PS;1"))) + [STRESS (NOT ERROR) + (SETQ TSTREAM (OPENTEXTSTREAM F)) + (CHECKARRAYS 'AFTEROPEN) + (TEDIT.FORMAT.HARDCOPY TSTREAM HCFILE T NIL NIL NIL + (CL:IF PDF + 'PDF + 'POSTSCRIPT)] + (CL:WHEN SINGLESTEP + (\TEDIT.THELP (CONCAT "Just hardcopied " F " to " HCFILE + )))] + (PRINTOUT T " Hardcopied " N " files without failure" T) finally (RETURN (LIST R N]) (STRESSRAND - [LAMBDA (FILES REPS ERROR PROBESPERFILE) (* ; "Edited 19-Mar-2024 21:33 by rmk") + [LAMBDA (FILES REPS ERROR PROBESPERFILE) (* ; "Edited 2-Jun-2025 21:27 by rmk") + (* ; "Edited 31-May-2025 09:10 by rmk") + (* ; "Edited 19-Mar-2024 21:33 by rmk") (* ; "Edited 12-Mar-2024 09:47 by rmk") (* ;; "Opens, fetches random characters") - (CL:UNLESS FILES - (SETQ FILES (FILDIR '*.TEDIT;))) - (SETQ REPS (SELECTQ REPS - (T MAX.SMALLP) - (NIL 1) - REPS)) + [SETQ FILES (OR (MKLIST FILES) + (FILDIR '*.TEDIT;] + (CL:UNLESS REPS (SETQ REPS MAX.SMALLP)) (CL:UNLESS PROBESPERFILE (SETQ PROBESPERFILE 100)) + (BKSYSBUF " ") (PRINTOUT T REPS " reps of " (LENGTH FILES) " files with " PROBESPERFILE " probes per file" T) (for R (N _ 0) from 1 to REPS do (PRINTOUT T R " ") - (for F TSTRM inside FILES - do (if (if ERROR - then (SETQ TSTRM (OPENTEXTSTREAM F)) - (for I (LEN _ (TEDIT.NCHARS TSTRM)) from 1 to PROBESPERFILE - do (TEDIT.NTHCHARCODE TSTRM (RAND 1 LEN))) - T - else (CAR (NLSETQ (SETQ TSTRM (OPENTEXTSTREAM F)) - (for I (LEN _ (TEDIT.NCHARS TSTRM)) from 1 to PROBESPERFILE - do (TEDIT.NTHCHARCODE TSTRM (RAND 1 LEN))) - T))) - then (CLOSEF TSTRM) - (add N 1) - else (PRINTOUT T " Error for " (PACKFILENAME 'HOST NIL 'DIRECTORY NIL 'BODY F) - T)) repeatwhile (PROGN (CLOSEF? TSTRM) - T)) finally (RETURN (LIST R N]) + [for F TSTREAM in FILES unless (DIRECTORYNAMEP F) + do (STRESS (NOT ERROR) + (SETQ TSTREAM (OPENTEXTSTREAM F)) + (CHECKARRAYS 'AFTEROPEN) + (for I (LEN _ (TEDIT.NCHARS TSTREAM)) from 1 to PROBESPERFILE + do (TEDIT.NTHCHARCODE TSTREAM (RAND 1 LEN] + finally (RETURN (LIST R N]) (STRESSPUT - [LAMBDA (FILES REPS NOERROR CHECKEQUIV STOP) (* ; "Edited 21-Oct-2024 00:26 by rmk") + [LAMBDA (FILES REPS NOERROR CHECKEQUIV STOP) (* ; "Edited 2-Jun-2025 21:28 by rmk") + (* ; "Edited 31-May-2025 09:10 by rmk") + (* ; "Edited 21-Oct-2024 00:26 by rmk") (* ; "Edited 19-Mar-2024 21:34 by rmk") (* ; "Edited 12-Mar-2024 09:48 by rmk") (* ;; "Opens, puts, reopens and tests for equivalence") - (CL:UNLESS FILES - (SETQ FILES (FILDIR '*.TEDIT;))) - (SETQ REPS (SELECTQ REPS - (T MAX.SMALLP) - (NIL 1) - REPS)) + [SETQ FILES (OR (MKLIST FILES) + (FILDIR '*.TEDIT;] + (CL:UNLESS REPS (SETQ REPS MAX.SMALLP)) + (BKSYSBUF " ") (PRINTOUT T REPS " reps of " (LENGTH FILES) " files" T) (for R (N _ 0) from 1 to REPS do (PRINTOUT T R " ") - (for F TSTRM TSP inside FILES - do (if (if NOERROR - then (NLSETQ (SETQ TSTRM (OPENTEXTSTREAM F)) - (TEDIT.PUT TSTRM "{CORE}FOO.TEDIT;1") - (SETQ TSP (OPENTEXTSTREAM "{CORE}FOO.TEDIT;1")) - (CL:WHEN (AND CHECKEQUIV (NOT (EQTEXTSTREAM TSTRM TSP STOP))) - (\TEDIT.THELP "Get of put not equivalent" F)) - (CLOSEF TSP)) - else (SETQ TSTRM (OPENTEXTSTREAM F)) - (TEDIT.PUT TSTRM "{CORE}FOO.TEDIT;1") - (SETQ TSP (OPENTEXTSTREAM "{CORE}FOO.TEDIT;1")) - (CL:WHEN (AND CHECKEQUIV (NOT (EQTEXTSTREAM TSTRM TSP STOP))) - (\TEDIT.THELP "Get of put not equivalent" F)) - (CLOSEF TSP)) - then (CLOSEF TSTRM) - (add N 1) - else (PRINTOUT T T "Error for " (PACKFILENAME 'HOST NIL 'DIRECTORY NIL 'BODY F) - T))) finally (RETURN (LIST R N]) + (for F TSTREAM TSP in FILES unless (DIRECTORYNAMEP F) + do (STRESS NOERROR (SETQ TSTREAM (OPENTEXTSTREAM F)) + (CHECKARRAYS 'AFTEROPEN) + (TEDIT.PUT TSTREAM "{CORE}FOO.TEDIT;1") + (SETQ TSP (OPENTEXTSTREAM "{CORE}FOO.TEDIT;1")) + (CL:WHEN (AND CHECKEQUIV (NOT (EQTEXTSTREAM TSTREAM TSP STOP))) + (\TEDIT.THELP "Get of put not equivalent" F)) + (CLOSEF TSP))) finally (RETURN (LIST R N]) (STRESSOPEN - [LAMBDA (FILES REPS NOERROR) (* ; "Edited 19-Mar-2024 21:34 by rmk") + [LAMBDA (FILES REPS NOERROR) (* ; "Edited 2-Jun-2025 21:28 by rmk") + (* ; "Edited 31-May-2025 09:12 by rmk") + (* ; "Edited 19-Mar-2024 21:34 by rmk") (* ; "Edited 12-Mar-2024 09:48 by rmk") (* ; "Edited 11-Mar-2024 09:15 by rmk") - (CL:UNLESS FILES - (SETQ FILES (FILDIR '*.TEDIT;))) - (SETQ REPS (SELECTQ REPS - (T MAX.SMALLP) - (NIL 1) - REPS)) + [SETQ FILES (OR (MKLIST FILES) + (FILDIR '*.TEDIT;] + (CL:UNLESS REPS (SETQ REPS MAX.SMALLP)) + (BKSYSBUF " ") (PRINTOUT T REPS " reps of " (LENGTH FILES) " files" T) - (for R (N _ 0) from 1 to REPS - do (PRINTOUT T R " ") - (for F TSTRM inside FILES do (if (if NOERROR - then (NLSETQ (SETQ TSTRM (OPENTEXTSTREAM F))) - else (SETQ TSTRM (OPENTEXTSTREAM F))) - then (CLOSEF TSTRM) - (add N 1) - else (PRINTOUT T T "Error for " (PACKFILENAME 'HOST NIL - 'DIRECTORY NIL - 'BODY F) - T))) finally (RETURN (LIST R N]) + (for R (N _ 0) from 1 to REPS do (PRINTOUT T R " ") + [for F TSTREAM in FILES unless (DIRECTORYNAMEP F) + do (STRESS NOERROR (SETQ TSTREAM (OPENTEXTSTREAM F] + finally (RETURN (LIST R N]) (STRESSREAD - [LAMBDA (FILES REPS NOERROR) (* ; "Edited 19-Mar-2024 21:34 by rmk") + [LAMBDA (FILES REPS NOERROR) (* ; "Edited 2-Jun-2025 21:28 by rmk") + (* ; "Edited 31-May-2025 09:13 by rmk") + (* ; "Edited 19-Mar-2024 21:34 by rmk") (* ; "Edited 15-Mar-2024 15:19 by rmk") (* ; "Edited 12-Mar-2024 09:48 by rmk") (* ; "Edited 11-Mar-2024 09:13 by rmk") - (CL:UNLESS FILES - (SETQ FILES (FILDIR '*.TEDIT;))) - (SETQ REPS (SELECTQ REPS - (T MAX.SMALLP) - (NIL 1) - REPS)) + [SETQ FILES (OR (MKLIST FILES) + (FILDIR '*.TEDIT;] + (CL:UNLESS REPS (SETQ REPS MAX.SMALLP)) + (BKSYSBUF " ") + (PRINTOUT T REPS " reps of " (LENGTH FILES) + " files" T) + (for R (N _ 0) from 1 to REPS do (PRINTOUT T R " ") + [for F TSTREAM in FILES unless (DIRECTORYNAMEP F) + do (STRESS NOERROR (SETQ TSTREAM (OPENTEXTSTREAM F)) + (CHECKARRAYS 'AFTEROPEN) + (for I from 1 while (TEDIT.NTHCHARCODE TSTREAM I] + finally (RETURN (LIST (SUB1 R) + N]) + +(STRESSFORMAT + [LAMBDA (FILES REPS NOERROR) (* ; "Edited 2-Jun-2025 21:28 by rmk") + (* ; "Edited 31-May-2025 09:19 by rmk") + (* ; "Edited 19-Mar-2024 21:34 by rmk") + (* ; "Edited 15-Mar-2024 15:19 by rmk") + (* ; "Edited 12-Mar-2024 09:48 by rmk") + (* ; "Edited 11-Mar-2024 09:13 by rmk") + + (* ;; "Calls FORMATLINE from beginning to end of each file") + + [SETQ FILES (OR (MKLIST FILES) + (FILDIR '*.TEDIT;] + (CL:UNLESS REPS (SETQ REPS MAX.SMALLP)) + (BKSYSBUF " ") (PRINTOUT T REPS " reps of " (LENGTH FILES) " files" T) (for R (N _ 0) from 1 to REPS do (PRINTOUT T R " ") - (for F TSTRM inside FILES - do (if (if NOERROR - then (NLSETQ (SETQ TSTRM (OPENTEXTSTREAM F)) - (for I from 1 while (TEDIT.NTHCHARCODE TSTRM I))) - else (SETQ TSTRM (OPENTEXTSTREAM F)) - (for I from 1 while (TEDIT.NTHCHARCODE TSTRM I)) - T) - then (CLOSEF TSTRM) - (add N 1) - else (PRINTOUT T T "Error for " (PACKFILENAME 'HOST NIL 'DIRECTORY NIL 'BODY F) - T))) finally (RETURN (LIST (SUB1 R) - N]) + [for F TSTREAM TEXTOBJ in FILES unless (DIRECTORYNAMEP F) + do (SETQ TSTREAM (OPENTEXTSTREAM F)) + (CHECKARRAYS 'AFTEROPEN) + (SETQ TEXTOBJ (TEXTOBJ TSTREAM)) + (STRESS NOERROR (bind LINE (NCHARS _ (TEDIT.NCHARS TSTREAM)) + (CHNO _ 1) while (ILESSP CHNO NCHARS) + do (CHECKARRAYS 'BEFORE) + (SETQ LINE (\TEDIT.FORMATLINE TSTREAM CHNO)) + (CHECKARRAYS 'AFTER) + (\TLVALIDATE (GETTOBJ TEXTOBJ THISLINE) + LINE) + (SETQ CHNO (GETLD LINE LCHARLIM] + finally (RETURN (LIST (SUB1 R) + N]) + +(STRESSDISPLAY + [LAMBDA (FILES REPS NOERROR) (* ; "Edited 2-Jun-2025 21:29 by rmk") + (* ; "Edited 19-Mar-2024 21:34 by rmk") + (* ; "Edited 15-Mar-2024 15:19 by rmk") + (* ; "Edited 12-Mar-2024 09:48 by rmk") + (* ; "Edited 11-Mar-2024 09:13 by rmk") + + (* ;; "Creates a single empty window, gets each file into that window without a process, and then displays every line there") + + [SETQ FILES (OR (MKLIST FILES) + (FILDIR '*.TEDIT;] + (CL:UNLESS REPS (SETQ REPS MAX.SMALLP)) + (BKSYSBUF " ") + (PRINTOUT T REPS " reps of " (LENGTH FILES) + " files" T) + (for R [WINDOW _ (CREATEW '(600 800 800 150] + (N _ 0) from 1 to REPS + do (PRINTOUT T R " ") + (for F TSTREAM TEXTOBJ in FILES unless (DIRECTORYNAMEP F) + do (* ; "No process") + (STRESS NOERROR (WINDOWPROP WINDOW 'TITLE (CONCAT "Fetching " F)) + [SETQ TSTREAM (OPENTEXTSTREAM F WINDOW '(READONLY T LEAVETTY T] + (CHECKARRAYS 'AFTEROPEN) + (SETQ TEXTOBJ (TEXTOBJ TSTREAM)) + (bind LINE (NCHARS _ (TEDIT.NCHARS TSTREAM)) + (CHNO _ 1) while (ILESSP CHNO NCHARS) + do (CHECKARRAYS 'BEFOREFORMAT) + (SETQ LINE (\TEDIT.FORMATLINE TSTREAM CHNO)) + (\TLVALIDATE (GETTOBJ TEXTOBJ THISLINE) + LINE) + (CHECKARRAYS 'BEFOREDISPLAY) + (\TEDIT.DISPLAYLINE TSTREAM LINE WINDOW) + (CHECKARRAYS 'AFTERDISPLAY) + (SETQ CHNO (GETLD LINE LCHARLIM))) + (CHECKARRAYS 'BEFOREDEACTIVATE) + (TEDIT.DEACTIVATE.WINDOW WINDOW) + (CHECKARRAYS 'AFTERDEACTIVATE) + (CLEARW WINDOW))) finally (RETURN (LIST (SUB1 R) + N]) + +(STRESSSCROLL + [LAMBDA (FILES NSCROLLS REPS NOERROR) (* ; "Edited 2-Jun-2025 21:29 by rmk") + (* ; "Edited 19-Mar-2024 21:34 by rmk") + (* ; "Edited 15-Mar-2024 15:19 by rmk") + (* ; "Edited 12-Mar-2024 09:48 by rmk") + (* ; "Edited 11-Mar-2024 09:13 by rmk") + + (* ;; "Creates a single empty window, gets each file into that window without a process, and then does NSCROLLS random scrolls before moving on to the next file.") + + [SETQ FILES (OR (MKLIST FILES) + (FILDIR '*.TEDIT;] + (CL:UNLESS NSCROLLS (SETQ NSCROLLS 10)) + (CL:UNLESS REPS (SETQ REPS MAX.SMALLP)) + (BKSYSBUF " ") + (PRINTOUT T "STRESS SCROLL: " REPS " reps randomly scrolling " NSCROLLS " times in " (LENGTH + FILES) + " files" T) + (for R [WINDOW _ (CREATEW '(600 500 750 400] + (N _ 0) from 1 to REPS + do (PRINTOUT T R " ") + (for F TSTREAM TEXTOBJ LEN in FILES unless (DIRECTORYNAMEP F) + do (* ; "No process") + (WINDOWPROP WINDOW 'TITLE (CONCAT "Fetching " F)) + [STRESS NOERROR [SETQ TSTREAM (OPENTEXTSTREAM F WINDOW '(READONLY T LEAVETTY T] + (CHECKARRAYS 'AFTEROPEN) + (SETQ TEXTOBJ (TEXTOBJ TSTREAM)) + (SETQ LEN (TEDIT.NCHARS TSTREAM)) + (for I from 1 to NSCROLLS do (CHECKARRAYS 'BEFORE) + (TEDIT.SETSEL TSTREAM (RAND 1 LEN) + 1) + (TEDIT.NORMALIZECARET TSTREAM NIL T) + (CHECKARRAYS 'AFTER] + (TEDIT.DEACTIVATE.WINDOW WINDOW) + (CLEARW WINDOW)) finally (RETURN (LIST (SUB1 R) + N]) + +(STRESSDELETE + [LAMBDA (FILES NTIMES REPS NOERROR) (* ; "Edited 2-Jun-2025 21:29 by rmk") + (* ; "Edited 19-Mar-2024 21:34 by rmk") + (* ; "Edited 15-Mar-2024 15:19 by rmk") + (* ; "Edited 12-Mar-2024 09:48 by rmk") + (* ; "Edited 11-Mar-2024 09:13 by rmk") + + (* ;; "Creates a single empty window, gets each file into that window without a process, and then does NDELETES random single-character deletes before moving on to the next file.") + + [SETQ FILES (OR (MKLIST FILES) + (FILDIR '*.TEDIT;] + (CL:UNLESS NTIMES (SETQ NTIMES 10)) + (CL:UNLESS REPS (SETQ REPS MAX.SMALLP)) + (BKSYSBUF " ") + (PRINTOUT T "STRESS DELETE: " REPS " reps randomly deleting 1 character " NTIMES " times in " + (LENGTH FILES) + " files" T) + (for R [WINDOW _ (CREATEW '(550 800 750 150] + (N _ 0) from 1 to REPS + do (PRINTOUT T R " ") + (for F TSTREAM TEXTOBJ LEN in FILES unless (DIRECTORYNAMEP F) + do (* ; "No process") + (WINDOWPROP WINDOW 'TITLE (CONCAT "Fetching " F)) + (STRESS NOERROR [SETQ TSTREAM (OPENTEXTSTREAM F WINDOW '(LEAVETTY T HISTORY OFF] + (CHECKARRAYS 'AFTEROPEN) + (SETQ TEXTOBJ (TEXTOBJ TSTREAM)) + (SETQ LEN (TEDIT.NCHARS TSTREAM)) + (for I from 1 to NTIMES do (CHECKARRAYS 'BEFORE) + (TEDIT.DELETE TSTREAM (RAND 1 LEN) + 1) + (CHECKARRAYS 'AFTER) + (add LEN -1))) + (PUTTEXTPROP TSTREAM 'DIRTY NIL) + (TEDIT.DEACTIVATE.WINDOW WINDOW) + (CLEARW WINDOW)) finally (RETURN (LIST (SUB1 R) + N]) + +(STRESSINSERT + [LAMBDA (FILES NTIMES REPS NOERROR) (* ; "Edited 2-Jun-2025 21:29 by rmk") + (* ; "Edited 19-Mar-2024 21:34 by rmk") + (* ; "Edited 15-Mar-2024 15:19 by rmk") + (* ; "Edited 12-Mar-2024 09:48 by rmk") + (* ; "Edited 11-Mar-2024 09:13 by rmk") + + (* ;; "Creates a single empty window, gets each file into that window without a process, and then does NDELETES random single-character deletes before moving on to the next file.") + + [SETQ FILES (OR (MKLIST FILES) + (FILDIR '*.TEDIT;] + (CL:UNLESS NTIMES (SETQ NTIMES 10)) + (CL:UNLESS REPS (SETQ REPS MAX.SMALLP)) + (BKSYSBUF " ") + (PRINTOUT T "STRESS INSERT: " REPS " reps randomly inserting 1 character " NTIMES " times in " + (LENGTH FILES) + " files" T) + (for R [WINDOW _ (CREATEW '(550 800 750 150] + (N _ 0) from 1 to REPS + do (PRINTOUT T R " ") + (for F TSTREAM TEXTOBJ LEN in FILES unless (DIRECTORYNAMEP F) + do (* ; "No process") + (WINDOWPROP WINDOW 'TITLE (CONCAT "Fetching " F)) + (STRESS NOERROR [SETQ TSTREAM (OPENTEXTSTREAM F WINDOW '(LEAVETTY T HISTORY OFF] + (CHECKARRAYS 'AFTEROPEN) + (SETQ TEXTOBJ (TEXTOBJ TSTREAM)) + (SETQ LEN (TEDIT.NCHARS TSTREAM)) + (for I from 1 to NTIMES do (CHECKARRAYS 'BEFORE) + (TEDIT.INSERT TSTREAM "aaa" (RAND 1 LEN)) + (CHECKARRAYS 'AFTER) + (add LEN 3))) + (PUTTEXTPROP TSTREAM 'DIRTY NIL) + (TEDIT.DEACTIVATE.WINDOW WINDOW) + (CLEARW WINDOW)) finally (RETURN (LIST (SUB1 R) + N]) (STRESSGREP - [LAMBDA (FILES NOERROR TARGET) (* ; "Edited 17-Mar-2024 19:46 by rmk") + [LAMBDA (FILES NOERROR TARGET) (* ; "Edited 2-Jun-2025 21:30 by rmk") + (* ; "Edited 17-Mar-2024 19:46 by rmk") (* ;; "GREP does forward bins and peekbins. If it hits on something, it also runs the backfileptr function. FOO appears in quite a few lispusers/ Tedit files.") - (CL:UNLESS FILES - (SETQ FILES (FILDIR '*.TEDIT;))) + [SETQ FILES (OR (MKLIST FILES) + (FILDIR '*.TEDIT;] (CL:UNLESS TARGET (SETQ TARGET "FOO")) (FILESLOAD GREP) - (for F inside FILES unless (if NOERROR - then (NLSETQ (GREP TARGET F)) - else (GREP TARGET F) - T) do (PRINTOUT T T "Error for " (PACKFILENAME 'HOST NIL - 'DIRECTORY NIL - 'BODY F) - T]) + (for F in FILES unless (DIRECTEORYNAMEP F) unless (if NOERROR + then (NLSETQ (GREP TARGET F)) + else (PROGN (GREP TARGET F)) + T) + do (PRINTOUT T T "Error for " (PACKFILENAME 'HOST NIL 'DIRECTORY NIL 'BODY F) + T]) (STRESSPEEK - [LAMBDA (FILES ERROR) (* ; "Edited 19-Mar-2024 21:33 by rmk") - (CL:UNLESS FILES - (SETQ FILES (FILDIR '*.TEDIT;))) - (for F TSTRM inside FILES eachtime (SETQ TSTRM (OPENTEXTSTREAM F)) - unless [if ERROR - then (bind P while (SETQ P (PEEKCCODE TSTRM T)) always (EQ P (BIN TSTRM))) - else (NLSETQ (bind P while (SETQ P (PEEKCCODE TSTRM T)) - always (EQ P (BIN TSTRM] do (PRINTOUT T "Error for " - (PACKFILENAME 'HOST NIL - 'DIRECTORY NIL 'BODY F) - T) - repeatwhile (PROGN (CLOSEF? TSTRM) - T]) + [LAMBDA (FILES ERROR) (* ; "Edited 2-Jun-2025 21:30 by rmk") + (* ; "Edited 19-Mar-2024 21:33 by rmk") + [SETQ FILES (OR (MKLIST FILES) + (FILDIR '*.TEDIT;] + (for F TSTREAM (N _ 0) in FILES unless (DIRECTORYNAMEP F) + do (STRESS (NOT ERROR) + (SETQ TSTREAM (OPENTEXTSTREAM F)) + (CHECKARRAYS 'AFTEROPEN) + (bind P while (SETQ P (PEEKCCODE TSTREAM T)) always (EQ P (BIN TSTREAM]) ) (DEFINEQ @@ -279,12 +426,13 @@ (NCONC1 SYSOUTS SYSOUTNAME))]) (COPYTOCORE - [LAMBDA (FILES NORECLAIM) (* ; "Edited 12-Mar-2024 22:45 by rmk") + [LAMBDA (FILES NORECLAIM) (* ; "Edited 2-Jun-2025 21:30 by rmk") + (* ; "Edited 12-Mar-2024 22:45 by rmk") (* ;; "Copy FILES to {CORE}, defaulting to TEDIT files in connected directory") - (CL:UNLESS (LISTP FILES) - (SETQ FILES (FILDIR (OR FILES "*.TEDIT;")))) + [SETQ FILES (OR (MKLIST FILES) + (FILDIR '*.TEDIT;] (PRINTOUT T "Copying " (LENGTH FILES) " files to {CORE} " (CL:IF NORECLAIM @@ -293,9 +441,43 @@ "reclaiming" T) (for F in FILES collect (COPYFILE F (PACKFILENAME 'HOST 'CORE 'DIRECTORY NIL 'BODY F)) finally (CL:UNLESS NORECLAIM (RECLAIM]) + +(CHECKARRAYS + [LAMBDA (TAG) + (DECLARE (SPECVARS TAG)) (* ; "Edited 2-Jun-2025 21:11 by rmk") + + (* ;; "TAG is visible as an argument in URAID") + + (CL:WHEN CHECKARRAYS + (CL:WHEN (EQ CHECKARRAYS 'RECLAIM) + (RECLAIM)) + (\PARSEARRAYSPACE))]) +) + +(RPAQ? CHECKARRAYS T) + +(FILESLOAD TEDIT-DEBUG) +(DECLARE%: EVAL@COMPILE DONTCOPY +(DECLARE%: EVAL@COMPILE + +(PUTPROPS STRESS MACRO ((NOERROR . FORMS) + (CHECKARRAYS 'BEFORESTRESS) + (if (if NOERROR + then (NLSETQ . FORMS) + else (PROGN . FORMS) + T) + then (CLOSEF TSTREAM) + (add N 1) + else (PRINTOUT T T "Error for " (PACKFILENAME 'HOST NIL 'DIRECTORY NIL + 'BODY F) + T)) + (CHECKARRAYS 'AFTERSTRESS))) +) ) (DECLARE%: DONTCOPY - (FILEMAP (NIL (722 12866 (STRESSHC 732 . 4315) (STRESSRAND 4317 . 6053) (STRESSPUT 6055 . 8023) ( -STRESSOPEN 8025 . 9458) (STRESSREAD 9460 . 10995) (STRESSGREP 10997 . 11940) (STRESSPEEK 11942 . 12864 -)) (12867 15560 (EQTEXTSTREAM 12877 . 14046) (SYSOUTRING 14048 . 14928) (COPYTOCORE 14930 . 15558))))) + (FILEMAP (NIL (1074 23057 (STRESSHC 1084 . 4894) (STRESSRAND 4896 . 6210) (STRESSPUT 6212 . 7693) ( +STRESSOPEN 7695 . 8769) (STRESSREAD 8771 . 10182) (STRESSFORMAT 10184 . 12091) (STRESSDISPLAY 12093 . +14537) (STRESSSCROLL 14539 . 16883) (STRESSDELETE 16885 . 19194) (STRESSINSERT 19196 . 21452) ( +STRESSGREP 21454 . 22439) (STRESSPEEK 22441 . 23055)) (23058 26181 (EQTEXTSTREAM 23068 . 24237) ( +SYSOUTRING 24239 . 25119) (COPYTOCORE 25121 . 25850) (CHECKARRAYS 25852 . 26179))))) STOP diff --git a/library/tedit/TEDIT-STRESS.LCOM b/library/tedit/TEDIT-STRESS.LCOM index 27f0a84ae..d75b7960b 100644 Binary files a/library/tedit/TEDIT-STRESS.LCOM and b/library/tedit/TEDIT-STRESS.LCOM differ diff --git a/lispusers/GITFNS b/lispusers/GITFNS index b6ef04295..ba121bb76 100644 --- a/lispusers/GITFNS +++ b/lispusers/GITFNS @@ -1,29 +1,28 @@ (DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) -(FILECREATED "29-Apr-2025 15:17:37" {WMEDLEY}GITFNS.;541 134267 +(FILECREATED " 9-May-2025 11:39:55" {WMEDLEY}GITFNS.;545 134412 :EDIT-BY rmk - :CHANGES-TO (VARS GITFNSCOMS) - (FNS GIT-WORKING-COMPARE-DIRECTORIES) + :CHANGES-TO (FNS GIT-PULL-REQUESTS) - :PREVIOUS-DATE "31-Mar-2025 21:25:00" {WMEDLEY}GITFNS.;539) + :PREVIOUS-DATE " 5-May-2025 22:04:15" {WMEDLEY}GITFNS.;544) (PRETTYCOMPRINT GITFNSCOMS) -(RPAQQ GITFNSCOMS +(RPAQQ GITFNSCOMS ( - (* ;; "Set up") + (* ;; "Set up") (FILES (SYSLOAD FROM LISPUSERS) COMPAREDIRECTORIES COMPARESOURCES COMPARETEXT PSEUDOHOSTS JSON UNIXUTILS REGIONMANAGER ) - (* ;; "") + (* ;; "") - (* ;; "GIT projects") + (* ;; "GIT projects") (COMS (FNS GIT-CLONEP GIT-INIT GIT-MAKE-PROJECT GIT-GET-PROJECT GIT-PUT-PROJECT-FIELD GIT-PROJECT-PATH FIND-ANCESTOR-DIRECTORY GIT-FIND-CLONE GIT-MAINBRANCH @@ -44,94 +43,94 @@ (P (GIT-INIT)) (ADDVARS (AROUNDEXITFNS GIT-INIT)) - (* ;; "") + (* ;; "") - (* ;; "Lisp exec commands") + (* ;; "Lisp exec commands") (INITVARS (GIT-MERGE-COMPARES T) (GIT-CDBROWSER-SEPARATE-DIRECTIONS T)) (COMMANDS gwc bbc prc cob b? cdg cdw) (FNS PRC-COMMAND) - (* ;; "") + (* ;; "") - (* ;; "File correspondents") + (* ;; "File correspondents") (FNS ALLSUBDIRS MEDLEYSUBDIRS GITSUBDIRS) (FNS TOGIT FROMGIT GIT-DELETE-FILE MYMEDLEY-DELETE-FILES) (FNS MYMEDLEYSUBDIR GITSUBDIR STRIPDIR STRIPHOST STRIPNAME STRIPWHERE) (FNS GFILE4MFILE MFILE4GFILE GIT-REPO-FILENAME) - (* ;; "") + (* ;; "") - (* ;; "Git commands") + (* ;; "Git commands") (FNS GIT-COMMIT GIT-PUSH GIT-PULL GIT-APPROVAL GIT-GET-FILE GIT-FILE-EXISTS? GIT-REMOTE-UPDATE GIT-REMOTE-ADD GIT-FILE-DATE GIT-FILE-HISTORY GIT-PRINT-FILE-HISTORY GIT-FETCH) - (* ;; "Differences") + (* ;; "Differences") (FNS GIT-BRANCH-DIFF GIT-COMMIT-DIFFS GIT-BRANCH-RELATIONS) - (* ;; "") + (* ;; "") - (* ;; "Branches") + (* ;; "Branches") (FNS GIT-BRANCH-NUM GIT-CHECKOUT GIT-WHICH-BRANCH GIT-MAKE-BRANCH GIT-BRANCHES GIT-BRANCH-EXISTS? GIT-PICK-BRANCH GIT-BRANCH-MENU GIT-BRANCH-WHENSELECTEDFN GIT-PULL-REQUESTS GIT-SHORT-BRANCH-NAME GIT-LONG-NAME GIT-PRC-BRANCHES) - (* ;; "My branches") + (* ;; "My branches") (FNS GIT-MY-CURRENT-BRANCH GIT-MY-BRANCHP GIT-MY-NEXT-BRANCH GIT-MY-BRANCHES) - (* ;; "") + (* ;; "") - (* ;; "Worktrees") + (* ;; "Worktrees") (FNS GIT-ADD-WORKTREE GIT-REMOVE-WORKTREE GIT-LIST-WORKTREES WORKTREEDIR) - (* ;; "") + (* ;; "") - (* ;; "Comparisons") + (* ;; "Comparisons") (FNS GIT-GET-DIFFERENT-FILES GIT-BRANCHES-COMPARE-DIRECTORIES GIT-WORKING-COMPARE-DIRECTORIES GIT-COMPARE-WORKTREE GITCDOBJBUTTONFN GIT-CD-LABELFN GIT-CD-MENUFN GIT-WORKING-COMPARE-FILES GIT-BRANCHES-COMPARE-FILES GIT-PR-COMPARE) (INITVARS (FROMGITN 0)) - (* ;; "") + (* ;; "") - (* ;; "Utilities") + (* ;; "Utilities") (FNS CDGITDIR GIT-COMMAND GITORIGIN GIT-INITIALS GIT-COMMAND-TO-FILE GIT-RESULT-TO-LINES STRIPLOCAL) - (PROPS (GITFNS FILETYPE)))) + (PROPS (GITFNS FILETYPE)))) -(* ;; "Set up") +(* ;; "Set up") -(FILESLOAD (SYSLOAD FROM LISPUSERS) +(FILESLOAD (SYSLOAD FROM LISPUSERS) COMPAREDIRECTORIES COMPARESOURCES COMPARETEXT PSEUDOHOSTS JSON UNIXUTILS REGIONMANAGER) -(* ;; "") +(* ;; "") -(* ;; "GIT projects") +(* ;; "GIT projects") (DEFINEQ @@ -402,15 +401,15 @@ (DECLARE%: EVAL@COMPILE DONTCOPY (DECLARE%: EVAL@COMPILE -(TYPERECORD GIT-PROJECT (PROJECTNAME GITHOST WHOST EXCLUSIONS DEFAULTSUBDIRS CLONEPATH MAINBRANCH)) +(TYPERECORD GIT-PROJECT (PROJECTNAME GITHOST WHOST EXCLUSIONS DEFAULTSUBDIRS CLONEPATH MAINBRANCH)) -(RECORD PULLREQUEST (PRNUMBER PRDESCRIPTION PRNAME PRSTATUS PRPROJECT PRURL PRLOGIN)) +(RECORD PULLREQUEST (PRNUMBER PRDESCRIPTION PRNAME PRSTATUS PRPROJECT PRURL PRLOGIN)) ) ) -(RPAQ? GIT-DEFAULT-PROJECT 'MEDLEY) +(RPAQ? GIT-DEFAULT-PROJECT 'MEDLEY) -(RPAQ? GIT-DEFAULT-PROJECTS +(RPAQ? GIT-DEFAULT-PROJECTS '((MEDLEY NIL NIL (EXPORTS.ALL RDSYS RDSYS.LCOM loadups/ patches/ tmp/ fontsold/ clos/ cltl2/) (greetfiles scripts sources library lispusers internal doctools rooms)) (NOTECARDS) @@ -418,120 +417,120 @@ (TEST) (MAIKO))) -(RPAQ? GIT-PROJECTS NIL) +(RPAQ? GIT-PROJECTS NIL) -(RPAQ? GIT-PRC-MENUS NIL) +(RPAQ? GIT-PRC-MENUS NIL) -(GIT-INIT) +(GIT-INIT) -(ADDTOVAR AROUNDEXITFNS GIT-INIT) +(ADDTOVAR AROUNDEXITFNS GIT-INIT) -(* ;; "") +(* ;; "") -(* ;; "Lisp exec commands") +(* ;; "Lisp exec commands") -(RPAQ? GIT-MERGE-COMPARES T) +(RPAQ? GIT-MERGE-COMPARES T) -(RPAQ? GIT-CDBROWSER-SEPARATE-DIRECTIONS T) +(RPAQ? GIT-CDBROWSER-SEPARATE-DIRECTIONS T) (DEFCOMMAND gwc (SUBDIR . OTHERS) - (* ;; "Compares the specified local git-medley subdirectories against my working Medley. The SUBDIRS are the arguments up to one that looks like a project") + (* ;; "Compares the specified local git-medley subdirectories against my working Medley. The SUBDIRS are the arguments up to one that looks like a project") - (LET ((SUBDIRS (AND SUBDIR (CONS SUBDIR OTHERS))) + (LET ((SUBDIRS (AND SUBDIR (CONS SUBDIR OTHERS))) PROJECT) - (SETQ SUBDIRS (FOR STAIL ON SUBDIRS COLLECT (IF (GIT-GET-PROJECT (CAR STAIL) + (SETQ SUBDIRS (FOR STAIL ON SUBDIRS COLLECT (IF (GIT-GET-PROJECT (CAR STAIL) NIL T) - THEN (SETQ PROJECT (CAR STAIL)) - (GO $$OUT)) - (CAR STAIL))) - (GIT-WORKING-COMPARE-DIRECTORIES SUBDIRS NIL NIL NIL T PROJECT))) + THEN (SETQ PROJECT (CAR STAIL)) + (GO $$OUT)) + (CAR STAIL))) + (GIT-WORKING-COMPARE-DIRECTORIES SUBDIRS NIL NIL NIL T PROJECT))) (DEFCOMMAND bbc (BRANCH1 BRANCH2 LOCAL PROJECT) - (* ;; "Compares 2 git branches. Defaults to local/ if LOCAL, otherwise defaults to origin/. BRANCH2 defaults to the main branch (origin/ or local/ depending on LOCAL)") + (* ;; "Compares 2 git branches. Defaults to local/ if LOCAL, otherwise defaults to origin/. BRANCH2 defaults to the main branch (origin/ or local/ depending on LOCAL)") - (SETQ PROJECT (GIT-GET-PROJECT PROJECT)) - (GIT-FETCH PROJECT) - (SETQ BRANCH1 (SELECTQ (U-CASE BRANCH1) + (SETQ PROJECT (GIT-GET-PROJECT PROJECT)) + (GIT-FETCH PROJECT) + (SETQ BRANCH1 (SELECTQ (U-CASE BRANCH1) ((NIL T) - (GIT-MY-CURRENT-BRANCH PROJECT)) + (GIT-MY-CURRENT-BRANCH PROJECT)) ((LOCAL REMOTE ORIGIN) - (GIT-PICK-BRANCH (GIT-BRANCHES BRANCH1 PROJECT T))) - (OR (GIT-LONG-NAME BRANCH1 NIL PROJECT) + (GIT-PICK-BRANCH (GIT-BRANCHES BRANCH1 PROJECT T))) + (OR (GIT-LONG-NAME BRANCH1 NIL PROJECT) BRANCH1))) - (SETQ BRANCH2 (SELECTQ (U-CASE BRANCH2) + (SETQ BRANCH2 (SELECTQ (U-CASE BRANCH2) ((NIL T) - (GIT-MAINBRANCH PROJECT LOCAL)) + (GIT-MAINBRANCH PROJECT LOCAL)) ((LOCAL REMOTE ORIGIN) - (GIT-PICK-BRANCH (GIT-BRANCHES BRANCH2 PROJECT T))) - (OR (GIT-LONG-NAME BRANCH2 NIL PROJECT) + (GIT-PICK-BRANCH (GIT-BRANCHES BRANCH2 PROJECT T))) + (OR (GIT-LONG-NAME BRANCH2 NIL PROJECT) BRANCH2))) - (GIT-BRANCHES-COMPARE-DIRECTORIES BRANCH1 (OR BRANCH2 (GIT-MAINBRANCH PROJECT LOCAL)) + (GIT-BRANCHES-COMPARE-DIRECTORIES BRANCH1 (OR BRANCH2 (GIT-MAINBRANCH PROJECT LOCAL)) LOCAL PROJECT)) (DEFCOMMAND prc (REMOTEBRANCH DRAFTS PROJECT) - (* ;; "Compares REMOTEBRANCH against the main orign branch, for pull-request assessment") + (* ;; "Compares REMOTEBRANCH against the main orign branch, for pull-request assessment") - (PRC-COMMAND REMOTEBRANCH DRAFTS PROJECT)) + (PRC-COMMAND REMOTEBRANCH DRAFTS PROJECT)) (DEFCOMMAND cob (BRANCH NEXTTITLESTRING PROJECT) - (* ;; "Switches to BRANCH. T means my current branch, NEW/NEXT means my next branch (under wherever we are now), and NEXTTITLESTRING if given will be attached to the branch-name. Default is to bring up a menu of locally available branches.") + (* ;; "Switches to BRANCH. T means my current branch, NEW/NEXT means my next branch (under wherever we are now), and NEXTTITLESTRING if given will be attached to the branch-name. Default is to bring up a menu of locally available branches.") - (CL:UNLESS (STRINGP NEXTTITLESTRING) - (SETQ PROJECT NEXTTITLESTRING)) + (CL:UNLESS (STRINGP NEXTTITLESTRING) + (SETQ PROJECT NEXTTITLESTRING)) (CL:UNLESS PROJECT - (CL:WHEN (GIT-GET-PROJECT BRANCH NIL T) - (SETQ PROJECT BRANCH) - (SETQ BRANCH NIL))) - (SETQ PROJECT (GIT-GET-PROJECT PROJECT)) - (GIT-FETCH PROJECT) - (SELECTQ (U-CASE BRANCH) - (T (GIT-CHECKOUT (GIT-MY-CURRENT-BRANCH PROJECT) + (CL:WHEN (GIT-GET-PROJECT BRANCH NIL T) + (SETQ PROJECT BRANCH) + (SETQ BRANCH NIL))) + (SETQ PROJECT (GIT-GET-PROJECT PROJECT)) + (GIT-FETCH PROJECT) + (SELECTQ (U-CASE BRANCH) + (T (GIT-CHECKOUT (GIT-MY-CURRENT-BRANCH PROJECT) PROJECT)) ((NEW NEXT) - (GIT-MAKE-BRANCH NIL NEXTTITLESTRING PROJECT)) - (CL:WHEN [SETQ BRANCH (IF BRANCH - THEN (GIT-LONG-NAME BRANCH NIL PROJECT) - ELSE (GIT-PICK-BRANCH (GIT-BRANCHES 'LOCAL PROJECT T) - (CONCAT (L-CASE (GIT-GET-PROJECT PROJECT 'PROJECTNAME) + (GIT-MAKE-BRANCH NIL NEXTTITLESTRING PROJECT)) + (CL:WHEN [SETQ BRANCH (IF BRANCH + THEN (GIT-LONG-NAME BRANCH NIL PROJECT) + ELSE (GIT-PICK-BRANCH (GIT-BRANCHES 'LOCAL PROJECT T) + (CONCAT (L-CASE (GIT-GET-PROJECT PROJECT 'PROJECTNAME) T) " branches"] - (GIT-CHECKOUT BRANCH PROJECT)))) + (GIT-CHECKOUT BRANCH PROJECT)))) -(DEFCOMMAND b? (PROJECT) (SETQ PROJECT (GIT-GET-PROJECT PROJECT)) - (GIT-FETCH PROJECT) - (CONCAT (L-CASE (GIT-GET-PROJECT PROJECT 'PROJECTNAME) +(DEFCOMMAND b? (PROJECT) (SETQ PROJECT (GIT-GET-PROJECT PROJECT)) + (GIT-FETCH PROJECT) + (CONCAT (L-CASE (GIT-GET-PROJECT PROJECT 'PROJECTNAME) T) " " - (GIT-WHICH-BRANCH PROJECT))) - -(DEFCOMMAND cdg (PROJECT SUBDIR) (CL:UNLESS (GIT-GET-PROJECT PROJECT NIL T) - (SETQ SUBDIR PROJECT) - (SETQ PROJECT GIT-DEFAULT-PROJECT)) - (CL:WHEN [AND SUBDIR (NOT (MEMB (CHCON1 SUBDIR)) - (CHARCODE (> /] - (SETQ SUBDIR (CONCAT SUBDIR "/"))) - (SLASHIT (/CNDIR (CONCAT (GIT-GET-PROJECT PROJECT 'GITHOST) - (OR SUBDIR ""))) + (GIT-WHICH-BRANCH PROJECT))) + +(DEFCOMMAND cdg (PROJECT SUBDIR) (CL:UNLESS (GIT-GET-PROJECT PROJECT NIL T) + (SETQ SUBDIR PROJECT) + (SETQ PROJECT GIT-DEFAULT-PROJECT)) + (CL:WHEN [AND SUBDIR (NOT (MEMB (CHCON1 SUBDIR)) + (CHARCODE (> /] + (SETQ SUBDIR (CONCAT SUBDIR "/"))) + (SLASHIT (/CNDIR (CONCAT (GIT-GET-PROJECT PROJECT 'GITHOST) + (OR SUBDIR ""))) T)) -(DEFCOMMAND cdw (PROJECT SUBDIR) (CL:UNLESS (GIT-GET-PROJECT PROJECT NIL T) - (SETQ SUBDIR PROJECT) - (SETQ PROJECT GIT-DEFAULT-PROJECT)) - (CL:WHEN [AND SUBDIR (NOT (MEMB (CHCON1 SUBDIR)) - (CHARCODE (> /] - (SETQ SUBDIR (CONCAT SUBDIR "/"))) - (SLASHIT (/CNDIR (CONCAT (GIT-GET-PROJECT PROJECT 'WHOST) - (OR SUBDIR ""))) +(DEFCOMMAND cdw (PROJECT SUBDIR) (CL:UNLESS (GIT-GET-PROJECT PROJECT NIL T) + (SETQ SUBDIR PROJECT) + (SETQ PROJECT GIT-DEFAULT-PROJECT)) + (CL:WHEN [AND SUBDIR (NOT (MEMB (CHCON1 SUBDIR)) + (CHARCODE (> /] + (SETQ SUBDIR (CONCAT SUBDIR "/"))) + (SLASHIT (/CNDIR (CONCAT (GIT-GET-PROJECT PROJECT 'WHOST) + (OR SUBDIR ""))) T)) (DEFINEQ @@ -617,12 +616,12 @@ -(* ;; "") +(* ;; "") -(* ;; "File correspondents") +(* ;; "File correspondents") (DEFINEQ @@ -865,12 +864,12 @@ -(* ;; "") +(* ;; "") -(* ;; "Git commands") +(* ;; "Git commands") (DEFINEQ @@ -1074,7 +1073,7 @@ -(* ;; "Differences") +(* ;; "Differences") (DEFINEQ @@ -1187,14 +1186,16 @@ T]) (GIT-COMMIT-DIFFS - [LAMBDA (BRANCH1 BUTNOTBRANCH2 PROJECT) (* ; "Edited 2-May-2024 11:24 by mth") + [LAMBDA (BRANCH1 BUTNOTBRANCH2 PROJECT) (* ; "Edited 5-May-2025 21:59 by rmk") + (* ; "Edited 29-Apr-2025 22:08 by rmk") + (* ; "Edited 2-May-2024 11:24 by mth") (* ; "Edited 26-Jun-2022 13:32 by rmk") (* ; "Edited 7-May-2022 23:48 by rmk") (* ; "Edited 2-May-2022 13:45 by rmk") (* ;; "Returns the identifiers for commits in BRANCH1 but not in BUTNOTBRANCH2") - (GIT-COMMAND (CONCAT "git log --format=%"%%h%" %"" BRANCH1 "%" %"^" BUTNOTBRANCH2 "%"") + (GIT-COMMAND (CONCAT "git log --format=%"%%h%" %"" BRANCH1 "%" %"­" BUTNOTBRANCH2 "%"") NIL NIL PROJECT]) (GIT-BRANCH-RELATIONS @@ -1262,12 +1263,12 @@ -(* ;; "") +(* ;; "") -(* ;; "Branches") +(* ;; "Branches") (DEFINEQ @@ -1466,7 +1467,8 @@ '(PROGN (DSPFONT OLDVALUE T])]) (GIT-PULL-REQUESTS - [LAMBDA (INCLUDEDRAFTS PROJECT) (* ; "Edited 20-May-2024 22:12 by rmk") + [LAMBDA (INCLUDEDRAFTS PROJECT) (* ; "Edited 9-May-2025 11:39 by rmk") + (* ; "Edited 20-May-2024 22:12 by rmk") (* ; "Edited 13-May-2024 18:59 by rmk") (* ; "Edited 11-May-2024 10:51 by rmk") (* ; "Edited 1-May-2024 09:23 by rmk") @@ -1493,7 +1495,7 @@ PRDESCRIPTION _ (JSON-GET JSOBJ 'title) PRSTATUS _ (CL:IF DRAFT 'D - (CL:IF (STREQUAL "REVIEW_REQUIRED" + (CL:IF (STREQUAL "REVIEW¬REQUIRED" (JSON-GET JSOBJ 'reviewDecision)) " " 'A)) @@ -1575,7 +1577,7 @@ -(* ;; "My branches") +(* ;; "My branches") (DEFINEQ @@ -1642,12 +1644,12 @@ -(* ;; "") +(* ;; "") -(* ;; "Worktrees") +(* ;; "Worktrees") (DEFINEQ @@ -1718,12 +1720,12 @@ -(* ;; "") +(* ;; "") -(* ;; "Comparisons") +(* ;; "Comparisons") (DEFINEQ @@ -2273,16 +2275,16 @@ RB NIL PROJECT]) ) -(RPAQ? FROMGITN 0) +(RPAQ? FROMGITN 0) -(* ;; "") +(* ;; "") -(* ;; "Utilities") +(* ;; "Utilities") (DEFINEQ @@ -2430,35 +2432,35 @@ STRING]) ) -(PUTPROPS GITFNS FILETYPE :TCOMPL) +(PUTPROPS GITFNS FILETYPE :TCOMPL) (DECLARE%: DONTCOPY - (FILEMAP (NIL (4225 20804 (GIT-CLONEP 4235 . 5563) (GIT-INIT 5565 . 6195) (GIT-MAKE-PROJECT 6197 . -13862) (GIT-GET-PROJECT 13864 . 15789) (GIT-PUT-PROJECT-FIELD 15791 . 17432) (GIT-PROJECT-PATH 17434 - . 18478) (FIND-ANCESTOR-DIRECTORY 18480 . 18829) (GIT-FIND-CLONE 18831 . 19912) (GIT-MAINBRANCH 19914 - . 20309) (GIT-MAINBRANCH? 20311 . 20802)) (26471 31400 (PRC-COMMAND 26481 . 31398)) (31448 34236 ( -ALLSUBDIRS 31458 . 32744) (MEDLEYSUBDIRS 32746 . 33439) (GITSUBDIRS 33441 . 34234)) (34237 39027 ( -TOGIT 34247 . 35653) (FROMGIT 35655 . 36636) (GIT-DELETE-FILE 36638 . 37484) (MYMEDLEY-DELETE-FILES -37486 . 39025)) (39028 42031 (MYMEDLEYSUBDIR 39038 . 39494) (GITSUBDIR 39496 . 39939) (STRIPDIR 39941 - . 40312) (STRIPHOST 40314 . 40554) (STRIPNAME 40556 . 41309) (STRIPWHERE 41311 . 42029)) (42032 43934 - (GFILE4MFILE 42042 . 42405) (MFILE4GFILE 42407 . 42976) (GIT-REPO-FILENAME 42978 . 43932)) (43975 -54230 (GIT-COMMIT 43985 . 44811) (GIT-PUSH 44813 . 45573) (GIT-PULL 45575 . 46327) (GIT-APPROVAL 46329 - . 46678) (GIT-GET-FILE 46680 . 48595) (GIT-FILE-EXISTS? 48597 . 48871) (GIT-REMOTE-UPDATE 48873 . -49708) (GIT-REMOTE-ADD 49710 . 50017) (GIT-FILE-DATE 50019 . 51066) (GIT-FILE-HISTORY 51068 . 53002) ( -GIT-PRINT-FILE-HISTORY 53004 . 54054) (GIT-FETCH 54056 . 54228)) (54256 65376 (GIT-BRANCH-DIFF 54266 - . 61013) (GIT-COMMIT-DIFFS 61015 . 61688) (GIT-BRANCH-RELATIONS 61690 . 65374)) (65413 84799 ( -GIT-BRANCH-NUM 65423 . 65996) (GIT-CHECKOUT 65998 . 67284) (GIT-WHICH-BRANCH 67286 . 67693) ( -GIT-MAKE-BRANCH 67695 . 70274) (GIT-BRANCHES 70276 . 72871) (GIT-BRANCH-EXISTS? 72873 . 73744) ( -GIT-PICK-BRANCH 73746 . 74236) (GIT-BRANCH-MENU 74238 . 75119) (GIT-BRANCH-WHENSELECTEDFN 75121 . -77660) (GIT-PULL-REQUESTS 77662 . 81180) (GIT-SHORT-BRANCH-NAME 81182 . 81473) (GIT-LONG-NAME 81475 . -81792) (GIT-PRC-BRANCHES 81794 . 84797)) (84825 88273 (GIT-MY-CURRENT-BRANCH 84835 . 85205) ( -GIT-MY-BRANCHP 85207 . 85825) (GIT-MY-NEXT-BRANCH 85827 . 86321) (GIT-MY-BRANCHES 86323 . 88271)) ( -88311 92386 (GIT-ADD-WORKTREE 88321 . 89928) (GIT-REMOVE-WORKTREE 89930 . 90860) (GIT-LIST-WORKTREES -90862 . 91666) (WORKTREEDIR 91668 . 92384)) (92426 125819 (GIT-GET-DIFFERENT-FILES 92436 . 98860) ( -GIT-BRANCHES-COMPARE-DIRECTORIES 98862 . 106093) (GIT-WORKING-COMPARE-DIRECTORIES 106095 . 111802) ( -GIT-COMPARE-WORKTREE 111804 . 115782) (GITCDOBJBUTTONFN 115784 . 120274) (GIT-CD-LABELFN 120276 . -121358) (GIT-CD-MENUFN 121360 . 123800) (GIT-WORKING-COMPARE-FILES 123802 . 124422) ( -GIT-BRANCHES-COMPARE-FILES 124424 . 125588) (GIT-PR-COMPARE 125590 . 125817)) (125881 134204 (CDGITDIR - 125891 . 126578) (GIT-COMMAND 126580 . 128138) (GITORIGIN 128140 . 128837) (GIT-INITIALS 128839 . -129143) (GIT-COMMAND-TO-FILE 129145 . 132630) (GIT-RESULT-TO-LINES 132632 . 133537) (STRIPLOCAL 133539 - . 134202))))) + (FILEMAP (NIL (4187 20766 (GIT-CLONEP 4197 . 5525) (GIT-INIT 5527 . 6157) (GIT-MAKE-PROJECT 6159 . +13824) (GIT-GET-PROJECT 13826 . 15751) (GIT-PUT-PROJECT-FIELD 15753 . 17394) (GIT-PROJECT-PATH 17396 + . 18440) (FIND-ANCESTOR-DIRECTORY 18442 . 18791) (GIT-FIND-CLONE 18793 . 19874) (GIT-MAINBRANCH 19876 + . 20271) (GIT-MAINBRANCH? 20273 . 20764)) (26229 31158 (PRC-COMMAND 26239 . 31156)) (31214 34002 ( +ALLSUBDIRS 31224 . 32510) (MEDLEYSUBDIRS 32512 . 33205) (GITSUBDIRS 33207 . 34000)) (34003 38793 ( +TOGIT 34013 . 35419) (FROMGIT 35421 . 36402) (GIT-DELETE-FILE 36404 . 37250) (MYMEDLEY-DELETE-FILES +37252 . 38791)) (38794 41797 (MYMEDLEYSUBDIR 38804 . 39260) (GITSUBDIR 39262 . 39705) (STRIPDIR 39707 + . 40078) (STRIPHOST 40080 . 40320) (STRIPNAME 40322 . 41075) (STRIPWHERE 41077 . 41795)) (41798 43700 + (GFILE4MFILE 41808 . 42171) (MFILE4GFILE 42173 . 42742) (GIT-REPO-FILENAME 42744 . 43698)) (43749 +54004 (GIT-COMMIT 43759 . 44585) (GIT-PUSH 44587 . 45347) (GIT-PULL 45349 . 46101) (GIT-APPROVAL 46103 + . 46452) (GIT-GET-FILE 46454 . 48369) (GIT-FILE-EXISTS? 48371 . 48645) (GIT-REMOTE-UPDATE 48647 . +49482) (GIT-REMOTE-ADD 49484 . 49791) (GIT-FILE-DATE 49793 . 50840) (GIT-FILE-HISTORY 50842 . 52776) ( +GIT-PRINT-FILE-HISTORY 52778 . 53828) (GIT-FETCH 53830 . 54002)) (54034 65372 (GIT-BRANCH-DIFF 54044 + . 60791) (GIT-COMMIT-DIFFS 60793 . 61684) (GIT-BRANCH-RELATIONS 61686 . 65370)) (65417 84912 ( +GIT-BRANCH-NUM 65427 . 66000) (GIT-CHECKOUT 66002 . 67288) (GIT-WHICH-BRANCH 67290 . 67697) ( +GIT-MAKE-BRANCH 67699 . 70278) (GIT-BRANCHES 70280 . 72875) (GIT-BRANCH-EXISTS? 72877 . 73748) ( +GIT-PICK-BRANCH 73750 . 74240) (GIT-BRANCH-MENU 74242 . 75123) (GIT-BRANCH-WHENSELECTEDFN 75125 . +77664) (GIT-PULL-REQUESTS 77666 . 81293) (GIT-SHORT-BRANCH-NAME 81295 . 81586) (GIT-LONG-NAME 81588 . +81905) (GIT-PRC-BRANCHES 81907 . 84910)) (84942 88390 (GIT-MY-CURRENT-BRANCH 84952 . 85322) ( +GIT-MY-BRANCHP 85324 . 85942) (GIT-MY-NEXT-BRANCH 85944 . 86438) (GIT-MY-BRANCHES 86440 . 88388)) ( +88436 92511 (GIT-ADD-WORKTREE 88446 . 90053) (GIT-REMOVE-WORKTREE 90055 . 90985) (GIT-LIST-WORKTREES +90987 . 91791) (WORKTREEDIR 91793 . 92509)) (92559 125952 (GIT-GET-DIFFERENT-FILES 92569 . 98993) ( +GIT-BRANCHES-COMPARE-DIRECTORIES 98995 . 106226) (GIT-WORKING-COMPARE-DIRECTORIES 106228 . 111935) ( +GIT-COMPARE-WORKTREE 111937 . 115915) (GITCDOBJBUTTONFN 115917 . 120407) (GIT-CD-LABELFN 120409 . +121491) (GIT-CD-MENUFN 121493 . 123933) (GIT-WORKING-COMPARE-FILES 123935 . 124555) ( +GIT-BRANCHES-COMPARE-FILES 124557 . 125721) (GIT-PR-COMPARE 125723 . 125950)) (126022 134345 (CDGITDIR + 126032 . 126719) (GIT-COMMAND 126721 . 128279) (GITORIGIN 128281 . 128978) (GIT-INITIALS 128980 . +129284) (GIT-COMMAND-TO-FILE 129286 . 132771) (GIT-RESULT-TO-LINES 132773 . 133678) (STRIPLOCAL 133680 + . 134343))))) STOP diff --git a/lispusers/GITFNS.LCOM b/lispusers/GITFNS.LCOM index 41362e266..def8564d2 100644 Binary files a/lispusers/GITFNS.LCOM and b/lispusers/GITFNS.LCOM differ diff --git a/lispusers/HELPSYS b/lispusers/HELPSYS index f51a86fe8..4ff064d9e 100644 --- a/lispusers/HELPSYS +++ b/lispusers/HELPSYS @@ -1,13 +1,12 @@ (DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) -(FILECREATED "11-Nov-2023 09:31:38" {DSK}larry>il>medley>lispusers>HELPSYS.;2 87772 +(FILECREATED " 5-May-2025 22:04:32" {WMEDLEY}HELPSYS.;15 87966 - :EDIT-BY "lmm" + :EDIT-BY rmk - :CHANGES-TO (VARS HELPSYSCOMS) - (FNS CLHS.LOOKUP) + :CHANGES-TO (FNS CLHS.INDEX) - :PREVIOUS-DATE "16-Jun-2023 14:38:33" {DSK}larry>il>medley>lispusers>HELPSYS.;1) + :PREVIOUS-DATE " 4-May-2025 13:30:47" {WMEDLEY}HELPSYS.;12) (PRETTYCOMPRINT HELPSYSCOMS) @@ -230,7 +229,9 @@ (DEFINEQ (CLHS.INDEX - [LAMBDA (ENTRY) (* ; "Edited 9-Oct-2022 16:34 by lmm") + [LAMBDA (ENTRY) (* ; "Edited 5-May-2025 22:04 by rmk") + (* ; "Edited 4-May-2025 13:30 by rmk") + (* ; "Edited 9-Oct-2022 16:34 by lmm") (* ; "Edited 16-Aug-2022 09:34 by lmm") (* ; "Edited 14-Aug-2022 15:54 by lmm") (OR CLHS.INDEX @@ -240,8 +241,9 @@ (PROGN (PRINTOUT PROMPTWINDOW "Fetching Hyperspec Index from web" T) (ShellCommand (CONCAT "cd $MEDLEYDIR && " " mkdir -p tmp/clhs && " "curl --output tmp/clhs/clindex.html -s " - CLHS.ROOT.URL "Front/X_AllSym.htm"))) - (MEDLEYDIR "tmp/clhs" "clindex.html"))) + CLHS.ROOT.URL "Front/X¬AllSym.htm")) + (MEDLEYDIR "tmp/clhs" "clindex.html"))) + :EXTERNAL-FORMAT :UTF-8) (LET (LINE POSLINK POSFRAG POSENDLINK POSENDTERM POSTERM LINK) (while (SETQ LINE (CL:READ-LINE STREAM NIL)) when [AND (SETQ POSLINK (STRPOS "
  • local>lde>lispcore>sources>AFONT.;2 41645 +(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) - changes to%: (VARS AFONTCOMS) +(FILECREATED " 9-Jun-2025 14:18:10" {WMEDLEY}AFONT.;10 41870 - previous date%: "14-Sep-87 11:59:36" {DSK}local>lde>lispcore>sources>AFONT.;1) + :EDIT-BY rmk + :CHANGES-TO (FNS \READACFONTFILE) + + :PREVIOUS-DATE "22-May-2025 09:59:37" {WMEDLEY}AFONT.;9) -(* ; " -Copyright (c) 1984, 1985, 1986, 1987, 1990 by Venue & Xerox Corporation. All rights reserved. -") (PRETTYCOMPRINT AFONTCOMS) (RPAQQ AFONTCOMS - ((XCL:FILE-ENVIRONMENTS "AFONT") + ( + (* ;; "AC and Interpress font file support. ACFILEP is on FONT") + + (XCL:FILE-ENVIRONMENTS "AFONT") (DECLARE%: EVAL@COMPILE DONTCOPY (RECORDS BOUNDINGBOX FONTBOUNDINGBOX) (CONSTANTS noInfoCode)) - (FNS \CREATESTARFONT \READACFONTBOXES \READACFONTFILE \ACCHARIMAGELIST \ACCHARWIDTHLIST - \GETFBB \ACCHARPOSLIST \ACROTATECHAR \READFONTWDFILE \FACECODE \FAMILYCODE \FINDFONT) - [INITVARS (INTERPRESSFONTDIRECTORIES '("{Erinyes}Fonts>"] + (FNS ACFONT.GETCHARSET \CREATESTARFONT \READACFONTBOXES \READACFONTFILE \ACCHARIMAGELIST + \ACCHARWIDTHLIST \GETFBB \ACCHARPOSLIST \ACROTATECHAR \READFONTWDFILE \FACECODE + \FAMILYCODE \FINDFONT) + (INITVARS (INTERPRESSFONTDIRECTORIES)) (MACROS \POSITIONFONTFILE))) + + +(* ;; "AC and Interpress font file support. ACFILEP is on FONT") + + (XCL:DEFINE-FILE-ENVIRONMENT "AFONT" :PACKAGE "IL" :READTABLE "INTERLISP" :COMPILER :COMPILE-FILE) @@ -31,23 +39,21 @@ Copyright (c) 1984, 1985, 1986, 1987, 1990 by Venue & Xerox Corporation. All ri (* * The bounding box for a character in an AC file) - BBOX (* Offset from the left edge of the - bounding box to the character's - origin) - BBOY (* Offset from the bottom of the - bounding box to the character's - origin) - BBDX (* Width of the character's bounding - box in pixels) - BBDY (* Height of the bounding box in - bits; -1 if this character doesn't - really exist) - RASTERWIDTHX (* Width of the character's image - (i.e., the escapement for this - character) in raster bits) - RASTERWIDTHY (* Amount this char moves in Y, in - raster units.) - )) + BBOX (* Offset from the left edge of the + bounding box to the character's origin) + BBOY (* Offset from the bottom of the + bounding box to the character's origin) + BBDX (* Width of the character's bounding + box in pixels) + BBDY (* Height of the bounding box in bits; + -1 if this character doesn't really + exist) + RASTERWIDTHX (* Width of the character's image + (i.e., the escapement for this + character) in raster bits) + RASTERWIDTHY (* Amount this char moves in Y, in + raster units.) + )) (RECORD FONTBOUNDINGBOX (FBBBDX FBBBDY FBBBOX FBBBOY)) ) @@ -62,35 +68,41 @@ Copyright (c) 1984, 1985, 1986, 1987, 1990 by Venue & Xerox Corporation. All ri ) (DEFINEQ +(ACFONT.GETCHARSET + [LAMBDA (STRM FAMILY SIZE FACE) (* ; "Edited 17-May-2025 10:15 by rmk") + + (* ;; "This defaults the padding arguments of \READACFONTFILE") + + (\READACFONTFILE STRM FAMILY SIZE FACE]) + (\CREATESTARFONT - [LAMBDA (FAMILY PSIZE FACE ROTATION DEVICE CHARSET) (* gbn " 1-Oct-85 18:29") - - (* ;; "the Build font descriptor for an Interpress NS font. If we can't find widths info for that font, return NIL") - - (* ;; "Widths array is fully allocated, with zeroes for characters with no information. An array is not allocated for fixed WidthsY. DEVICE is PRESS or INTERPRESS") + [LAMBDA (FAMILY PSIZE FACE ROTATION DEVICE CHARSET) (* ; "Edited 22-May-2025 09:59 by rmk") + (* ; "Edited 18-May-2025 21:37 by rmk") + (* gbn " 1-Oct-85 18:29") + + (* ;; "the Build font descriptor for an Interpress NS font. If we can't find widths info for that font, return NIL") + + (* ;; "Widths array is fully allocated, with zeroes for characters with no information. An array is not allocated for fixed WidthsY. DEVICE is PRESS or INTERPRESS") (DECLARE (GLOBALVARS INTERPRESSFONTDIRECTORIES \ASCIITONS)) (RESETLST (* ;  "RESETLST to make sure the fontfiles get closed") - - (PROG [(CS (OR CHARSET \DEFAULTCHARSET)) - (NSMICASIZE (FIXR (FQUOTIENT (ITIMES PSIZE 2540) - 72))) - (FD (create FONTDESCRIPTOR - FONTDEVICE _ DEVICE - FONTFAMILY _ FAMILY - FONTSIZE _ PSIZE - FONTFACE _ FACE - \SFFACECODE _ (\FACECODE FACE) - ROTATION _ ROTATION - OTHERDEVICEFONTPROPS _ \ASCIITONS - FONTSCALE _ (CONSTANT (FQUOTIENT 2540 72] - (RETURN (if (NOT (\GETCHARSETINFO CS FD T)) - then (* ; - "return NIL and let FONTCREATE decide whether or not to cause an error") - - NIL - else FD]) + (LET [(FD (create FONTDESCRIPTOR + FONTDEVICE _ DEVICE + FONTFAMILY _ FAMILY + FONTSIZE _ PSIZE + FONTFACE _ FACE + \SFFACECODE _ (\FACECODE FACE) + ROTATION _ ROTATION + OTHERDEVICEFONTPROPS _ \ASCIITONS + FONTSCALE _ (CONSTANT (FQUOTIENT 2540 72] + (CL:UNLESS (fetch (CHARSETINFO CSSLUGP) of (\INSURECHARSETINFO (OR CHARSET + \DEFAULTCHARSET) + FD)) + + (* ;; "return NIL for slug, let FONTCREATE decide whether or not to cause an error") + + FD)))]) (\READACFONTBOXES [LAMBDA (FILE STARTCHAR ENDCHAR) (* jds "15-Jun-85 11:48") @@ -126,188 +138,179 @@ Copyright (c) 1984, 1985, 1986, 1987, 1990 by Venue & Xerox Corporation. All ri BITSPERWORD]) (\READACFONTFILE - [LAMBDA (STRM FAMILY SIZE FACE PAD.LEFT DONT.PAD.RIGHT) (* ; "Edited 1-Sep-87 10:04 by Snow") - - (* ;; "Read an AC-format font file. Assumes that the file is open and has already been determined to be of type AC.") - - [COND - ((RANDACCESSP STRM) - (RESETSAVE NIL (LIST (FUNCTION CLOSEF?) - STRM))) - (T (* ;; "This is necessary unless we figure out how to read the AC file sequentially. When we figure this out, we can factor the RESETSAVE back in \READDISPLAYFONTFILE") - - (SETQ STRM (OPENSTREAM (CLOSEF? STRM) - 'INPUT)) - (RESETSAVE NIL (LIST (FUNCTION CLOSEF?) - STRM)) - (COPYBYTES STRM (SETQ STRM (OPENSTREAM '{NODIRCORE} 'BOTH] - (SETFILEPTR STRM 28) (* ; + [LAMBDA (STRM FAMILY SIZE FACE PAD.LEFT DONT.PAD.RIGHT) (* ; "Edited 9-Jun-2025 14:17 by rmk") + (* ; "Edited 16-May-2025 17:44 by rmk") + (* ; "Edited 1-Sep-87 10:04 by Snow") + (RESETLST + (PROG [FBBLIST STARTCHAR ENDCHAR CHARWIDTHLIST CHARIMAGEWIDTHLIST LEFTKERNS OFFSETS WIDTHS + IMAGEWIDTHS FONTDESC FBBBITMAP CHARBITMAP STARTWORDLIST BBOXLIST DUMMYCHAROFFSET + DUMMYWIDTH (CSINFO (create CHARSETINFO + IMAGEWIDTHS _ (\CREATECSINFOELEMENT) + LEFTKERN _ (\CREATEKERNELEMENT] + (CL:UNLESS (GETSTREAM STRM 'INPUT T) + [RESETSAVE (SETQ STRM (OPENSTREAM STRM 'INPUT 'OLD)) + `(PROGN (CLOSEF? OLDVALUE]) + [COND + ((AND (GETSTREAM STRM 'INPUT T) + (RANDACCESSP STRM)) (* ; + "Presumably open from \READDISPLAYFONTFILE") + (RESETSAVE NIL (LIST (FUNCTION CLOSEF?) + STRM))) + (T + (* ;; "This is necessary unless we figure out how to read the AC file sequentially. When we figure this out, we can factor the RESETSAVE back in \READDISPLAYFONTFILE") + + (SETQ STRM (OPENSTREAM (CLOSEF? STRM) + 'INPUT)) + (RESETSAVE NIL (LIST (FUNCTION CLOSEF?) + STRM)) + (COPYBYTES STRM (SETQ STRM (OPENSTREAM '{NODIRCORE} 'BOTH] + (SETFILEPTR STRM 0) + (CL:UNLESS (ACFONT.FILEP STRM) + (ERROR "Not an AC font file" STRM)) + (SETFILEPTR STRM 28) (* ;  "Starting at 28 skips the family and face bytes.") - - (PROG [FBBLIST STARTCHAR ENDCHAR CHARWIDTHLIST CHARIMAGEWIDTHLIST LEFTKERNS OFFSETS WIDTHS - IMAGEWIDTHS FONTDESC FBBBITMAP CHARBITMAP STARTWORDLIST BBOXLIST DUMMYCHAROFFSET - DUMMYWIDTH (CSINFO (create CHARSETINFO - IMAGEWIDTHS _ (\CREATECSINFOELEMENT) - LEFTKERN _ (\CREATEKERNELEMENT] - (SETQ STARTCHAR (BIN STRM)) (* ; + (SETQ STARTCHAR (BIN STRM)) (* ;  "Get the first and last characters in this font") - - (SETQ ENDCHAR (BIN STRM)) - (SETQ BBOXLIST (\READACFONTBOXES STRM STARTCHAR ENDCHAR)) + (SETQ ENDCHAR (BIN STRM)) + (SETQ BBOXLIST (\READACFONTBOXES STRM STARTCHAR ENDCHAR)) (* ;  "Read the list of bounding boxes for all the chars in the font") - - (SETQ FBBLIST (\GETFBB BBOXLIST)) - (SETQ CHARWIDTHLIST (\ACCHARIMAGELIST BBOXLIST)) (* ; + (SETQ FBBLIST (\GETFBB BBOXLIST)) + (SETQ CHARWIDTHLIST (\ACCHARIMAGELIST BBOXLIST)) + (* ;  "And the escapement for each character.") - - (SETQ CHARIMAGEWIDTHLIST (\ACCHARWIDTHLIST BBOXLIST FBBLIST)) + (SETQ CHARIMAGEWIDTHLIST (\ACCHARWIDTHLIST BBOXLIST FBBLIST)) (* ;  "Create the list of character widths for the characters in the font.") - - (COND - ([EVERY (CDR CHARWIDTHLIST) - (FUNCTION (LAMBDA (WID) - (OR (ZEROP WID) - (EQP WID (CAR CHARWIDTHLIST] + (COND + ([EVERY (CDR CHARWIDTHLIST) + (FUNCTION (LAMBDA (WID) + (OR (ZEROP WID) + (EQP WID (CAR CHARWIDTHLIST] (* ;  "Fixed-pitch font. Make the dummy character (for non-existent chars) the same width.") - - (SETQ DUMMYWIDTH (CAR CHARWIDTHLIST))) - (T (* ; "Otherwise, make the dummy 6 wide.") - - (SETQ DUMMYWIDTH 6))) - (COND - ((NULL (REMOVE 0 CHARIMAGEWIDTHLIST)) - (ERROR "No raster images" NIL) - (RETURN))) - (SETQ LEFTKERNS (FETCH (CHARSETINFO LEFTKERN) OF CSINFO)) - (FOR I FROM STARTCHAR TO ENDCHAR AS BOX IN BBOXLIST DO - (* ; "set the left kerning values. the default value is ZERO which is set when the element is created. Currently it is an array because kerning values can be negative values.") - - (\FSETLEFTKERN LEFTKERNS I - (FFETCH (BOUNDINGBOX BBOX) - OF BOX))) - (SETQ IMAGEWIDTHS (fetch (CHARSETINFO IMAGEWIDTHS) of CSINFO)) - (for I from 0 to (ADD1 \MAXTHINCHAR) do (\FSETIMAGEWIDTH IMAGEWIDTHS I DUMMYWIDTH)) - (SETQ WIDTHS (fetch (CHARSETINFO WIDTHS) of CSINFO)) - (for I from 0 to (ADD1 \MAXTHINCHAR) do (\FSETWIDTH WIDTHS I DUMMYWIDTH)) - (* SETQ IMAGEWIDTHS (ARRAY 258 - (QUOTE (BITS 16)) DUMMYWIDTH 0)) - - (* ;; "Create the array of character widths, assuming the dummy width for all characters--we'll write over it later") - - [for X from STARTCHAR to ENDCHAR as Y in CHARIMAGEWIDTHLIST - do - - (* ;; "Fill in the image widths (the width of the image, as against how far to space over after printing the character)") - - (\FSETIMAGEWIDTH IMAGEWIDTHS X (COND - ((ZEROP Y) - 0) - (T (IPLUS Y (COND - (PAD.LEFT 1) - (T 0)) - (COND - (DONT.PAD.RIGHT 0) - (T 1] + (SETQ DUMMYWIDTH (CAR CHARWIDTHLIST))) + (T (* ; "Otherwise, make the dummy 6 wide.") + (SETQ DUMMYWIDTH 6))) + (COND + ((NULL (REMOVE 0 CHARIMAGEWIDTHLIST)) + (ERROR "No raster mages" NIL) + (RETURN))) + (SETQ LEFTKERNS (FETCH (CHARSETINFO LEFTKERN) OF CSINFO)) + (FOR I FROM STARTCHAR TO ENDCHAR AS BOX IN BBOXLIST + DO (* ; "set the left kerning values. the default value is ZERO which is set when the element is created. Currently it is an array because kerning values can be negative values.") + (\FSETLEFTKERN LEFTKERNS I (FFETCH (BOUNDINGBOX BBOX) OF BOX))) + (SETQ IMAGEWIDTHS (fetch (CHARSETINFO IMAGEWIDTHS) of CSINFO)) + (for I from 0 to (ADD1 \MAXTHINCHAR) do (\FSETIMAGEWIDTH IMAGEWIDTHS I DUMMYWIDTH)) + (SETQ WIDTHS (fetch (CHARSETINFO WIDTHS) of CSINFO)) + (for I from 0 to (ADD1 \MAXTHINCHAR) do (\FSETWIDTH WIDTHS I DUMMYWIDTH)) + + (* ;; "Create the array of character widths, assuming the dummy width for all characters--we'll write over it later") + + [for X from STARTCHAR to ENDCHAR as Y in CHARIMAGEWIDTHLIST + do + (* ;; "Fill in the image widths (the width of the image, as against how far to space over after printing the character)") + + (\FSETIMAGEWIDTH IMAGEWIDTHS X (COND + ((ZEROP Y) + 0) + (T (IPLUS Y (COND + (PAD.LEFT 1) + (T 0)) + (COND + (DONT.PAD.RIGHT 0) + (T 1] (* ;  "And the array of image escapements") - - (for X from STARTCHAR to ENDCHAR as Y in CHARWIDTHLIST do (\FSETWIDTH WIDTHS X Y)) - [replace CHARSETDESCENT of CSINFO with (IMAX 0 (IMINUS (fetch (FONTBOUNDINGBOX FBBBOY) - of FBBLIST] - [replace CHARSETASCENT of CSINFO with (IMAX 0 (IPLUS (fetch (FONTBOUNDINGBOX FBBBDY) - of FBBLIST) - (fetch (FONTBOUNDINGBOX FBBBOY) - of FBBLIST] - [replace CHARSETBITMAP of CSINFO with (SETQ CHARBITMAP - (BITMAPCREATE (IPLUS (SETQ DUMMYCHAROFFSET - (for (X _ STARTCHAR) - to ENDCHAR - sum (\FGETWIDTH IMAGEWIDTHS - X))) - DUMMYWIDTH) - (fetch (FONTBOUNDINGBOX FBBBDY) of FBBLIST] - (SETQ OFFSETS (fetch (CHARSETINFO OFFSETS) of CSINFO)) - (for I from 0 to (ADD1 \MAXTHINCHAR) do (\FSETOFFSET OFFSETS I DUMMYCHAROFFSET)) - (SETQ STARTWORDLIST (\ACCHARPOSLIST STRM STARTCHAR ENDCHAR)) - (bind (DESTLEFT _ 0) for NTHCHAR from STARTCHAR to ENDCHAR as BBLIST in BBOXLIST - as STARTWORD in STARTWORDLIST as CHARWIDTH in CHARWIDTHLIST - do (PROG (RASTERINFO BBOX BBBITMAP BBBMBASE) (* ; + (for X from STARTCHAR to ENDCHAR as Y in CHARWIDTHLIST + do (\FSETWIDTH WIDTHS X Y)) + [replace CHARSETDESCENT of CSINFO with (IMAX 0 (IMINUS (fetch (FONTBOUNDINGBOX FBBBOY) + of FBBLIST] + [replace CHARSETASCENT of CSINFO with (IMAX 0 (IPLUS (fetch (FONTBOUNDINGBOX FBBBDY) + of FBBLIST) + (fetch (FONTBOUNDINGBOX FBBBOY) + of FBBLIST] + [replace CHARSETBITMAP of CSINFO with (SETQ CHARBITMAP + (BITMAPCREATE (IPLUS (SETQ DUMMYCHAROFFSET + (for (X _ STARTCHAR) + to ENDCHAR + sum (\FGETWIDTH + IMAGEWIDTHS + X))) + DUMMYWIDTH) + (fetch (FONTBOUNDINGBOX FBBBDY) + of FBBLIST] + (SETQ OFFSETS (fetch (CHARSETINFO OFFSETS) of CSINFO)) + (for I from 0 to (ADD1 \MAXTHINCHAR) do (\FSETOFFSET OFFSETS I DUMMYCHAROFFSET)) + (SETQ STARTWORDLIST (\ACCHARPOSLIST STRM STARTCHAR ENDCHAR)) + (bind (DESTLEFT _ 0) for NTHCHAR from STARTCHAR to ENDCHAR as BBLIST in BBOXLIST + as STARTWORD in STARTWORDLIST as CHARWIDTH in CHARWIDTHLIST + do (PROG (RASTERINFO BBOX BBBITMAP BBBMBASE)(* ;  "\ACCHARPOSLIST returns NIL if no raster exists for the code") + (COND + ((NULL STARTWORD) - (COND - ((NULL STARTWORD) - - (* ;; "This character has no image; use the dummy char's offset (already in the offset and width arrays from earlier)") + (* ;; "This character has no image; use the dummy char's offset (already in the offset and width arrays from earlier)") - (add DESTLEFT (\FGETWIDTH IMAGEWIDTHS NTHCHAR)) - (\FSETWIDTH WIDTHS NTHCHAR DUMMYWIDTH) - (\FSETIMAGEWIDTH IMAGEWIDTHS NTHCHAR DUMMYWIDTH) - (GO L2))) - (SETFILEPTR STRM STARTWORD) (* ; + (add DESTLEFT (\FGETWIDTH IMAGEWIDTHS NTHCHAR)) + (\FSETWIDTH WIDTHS NTHCHAR DUMMYWIDTH) + (\FSETIMAGEWIDTH IMAGEWIDTHS NTHCHAR DUMMYWIDTH) + (GO L2))) + (SETFILEPTR STRM STARTWORD) (* ;  "If could flush this, would work on non-randaccessp devices") - - (SETQ RASTERINFO (\WIN STRM)) - (COND - ((EQ -1 (fetch BBDY of BBLIST)) - (\FSETWIDTH WIDTHS NTHCHAR DUMMYWIDTH) - (\FSETIMAGEWIDTH IMAGEWIDTHS NTHCHAR DUMMYWIDTH) - (GO L2))) (* ; + (SETQ RASTERINFO (\WIN STRM)) + (COND + ((EQ -1 (fetch BBDY of BBLIST)) + (\FSETWIDTH WIDTHS NTHCHAR DUMMYWIDTH) + (\FSETIMAGEWIDTH IMAGEWIDTHS NTHCHAR DUMMYWIDTH) + (GO L2))) (* ;  "\ACCHARPOSLIST returns NIL if no raster exists for the code") - - (SETQ BBOX (fetch BBOX of BBLIST)) - (COND - ((AND (ZEROP (fetch BBDX of BBLIST)) - (ZEROP (fetch BBDY of BBLIST))) + (SETQ BBOX (fetch BBOX of BBLIST)) + (COND + ((AND (ZEROP (fetch BBDX of BBLIST)) + (ZEROP (fetch BBDY of BBLIST))) (* ;  "The image is zero wide or zero high. Don't bother reading a bitmap image") + ) + ((SETQ BBBITMAP (BITMAPCREATE (TIMES 16 (FOLDLO RASTERINFO 1024)) + (IMOD RASTERINFO 1024))) + (SETQ BBBMBASE (fetch BITMAPBASE of BBBITMAP)) - ) - ((SETQ BBBITMAP (BITMAPCREATE (TIMES 16 (FOLDLO RASTERINFO 1024)) - (IMOD RASTERINFO 1024))) - (SETQ BBBMBASE (fetch BITMAPBASE of BBBITMAP)) - - (* ;; "STARTWORD is the characters raster information word. The high 6 bits record number of words per scan line and the lower 10 bits is the same as bbdx bbdx. The raster for the char follows STARTWORD") + (* ;; "STARTWORD is the characters raster information word. The high 6 bits record number of words per scan line and the lower 10 bits is the same as bbdx bbdx. The raster for the char follows STARTWORD") - (\BINS STRM BBBMBASE 0 (TIMES 2 (FOLDLO RASTERINFO 1024) - (IMOD RASTERINFO 1024))) - (SETQ BBBITMAP (\ACROTATECHAR BBBITMAP)) + (\BINS STRM BBBMBASE 0 (TIMES 2 (FOLDLO RASTERINFO 1024) + (IMOD RASTERINFO 1024))) + (SETQ BBBITMAP (\ACROTATECHAR BBBITMAP)) (* ;  "here is the place to add a rotation function to manipulate the character images coming off *.ac") - - (BITBLT BBBITMAP 0 0 CHARBITMAP [PLUS DESTLEFT (IMAX 0 - (COND - (PAD.LEFT - (ADD1 BBOX)) - (T BBOX] - (DIFFERENCE (fetch BBOY of BBLIST) - (fetch (FONTBOUNDINGBOX FBBBOY) of FBBLIST)) - (\FGETWIDTH IMAGEWIDTHS NTHCHAR) - (CADDDR BBLIST) - 'INPUT - 'REPLACE) (* ; + (BITBLT BBBITMAP 0 0 CHARBITMAP [PLUS DESTLEFT + (IMAX 0 (COND + (PAD.LEFT (ADD1 BBOX)) + (T BBOX] + (DIFFERENCE (fetch BBOY of BBLIST) + (fetch (FONTBOUNDINGBOX FBBBOY) of FBBLIST)) + (\FGETWIDTH IMAGEWIDTHS NTHCHAR) + (CADDDR BBLIST) + 'INPUT + 'REPLACE) (* ;  "ADD1 to BBOX because we add an empty column to each raster image to the left") + )) + (\FSETOFFSET OFFSETS NTHCHAR DESTLEFT) - )) - (\FSETOFFSET OFFSETS NTHCHAR DESTLEFT) - - (* ;; "on screen ac fonts, there are no spaces stored so that the width of the char is exactly that of the character image without any spacing columns") + (* ;; "on screen ac fonts, there are no spaces stored so that the width of the char is exactly that of the character image without any spacing columns") - (add DESTLEFT (\FGETWIDTH IMAGEWIDTHS NTHCHAR)) - L2 (* ; + (add DESTLEFT (\FGETWIDTH IMAGEWIDTHS NTHCHAR)) + L2 (* ;  "add 2 because of the two blank columns we add; one on either side of the ac raster image") -)) - (BITBLT NIL 0 0 CHARBITMAP (ADD1 DUMMYCHAROFFSET) - 0 - (IDIFFERENCE DUMMYWIDTH 2) - NIL - 'TEXTURE - 'REPLACE BLACKSHADE) (* ; + )) + (BITBLT NIL 0 0 CHARBITMAP (ADD1 DUMMYCHAROFFSET) + 0 + (IDIFFERENCE DUMMYWIDTH 2) + NIL + 'TEXTURE + 'REPLACE BLACKSHADE) (* ;  "Fill in the dummy-character black blot") - - (RETURN CSINFO]) + (RETURN CSINFO)))]) (\ACCHARIMAGELIST [LAMBDA (BOXLIST) (* jds "15-Jun-85 11:37") @@ -595,51 +598,46 @@ Copyright (c) 1984, 1985, 1986, 1987, 1990 by Venue & Xerox Corporation. All ri (HELP]) ) -(RPAQ? INTERPRESSFONTDIRECTORIES '("{Erinyes}Fonts>")) +(RPAQ? INTERPRESSFONTDIRECTORIES ) (DECLARE%: EVAL@COMPILE (PUTPROPS \POSITIONFONTFILE MACRO - ((WSTRM NSMICASIZE FIRSTCHAR LASTCHAR FAMILY FACECODE) + ((WSTRM NSMICASIZE FIRSTCHAR LASTCHAR FAMILY FACECODE) (* gbn "25-Jul-85 02:15") - (* ; - "sets FIRSTCHAR LASTCHAR, and positions the file correctly") - - (* ;; "Finds the widths information for the specified FAMILY, FACECODE, MSIZE, and ROTATION. FIRSTCHAR and LASTCHAR are passed in since we have to read past those to check the size. If successful, returns the size found in the widths file, with zero indicating that dimensions in the widths file are relative, leaving the file pointing just after the Rotation word of the font. --- --- Returns NIL if the font is not found") - (bind TYPE LENGTH SIZE FAMCODE FILEFAM FILEFACE (NEXT _ 0) first (OR (SETQ FAMCODE (\FAMILYCODE (OR FAMILY T) - WSTRM)) - (RETURN NIL)) + WSTRM)) + (RETURN NIL)) do (SETQ TYPE (\BIN WSTRM)) - (SETQ LENGTH (\BIN WSTRM)) - (add NEXT (LLSH (IPLUS LENGTH (LLSH (LOGAND TYPE 15) - 8)) - 1)) - (SELECTQ (LRSH TYPE 4) - (4 (SETQ FILEFAM (\BIN WSTRM)) - (SETQ FILEFACE (\BIN WSTRM)) (* ; "This is the right family/face") - [COND - ((OR (EQ FAMILY T) - (EQ FAMILY NIL) - (AND (IEQP FILEFAM FAMCODE) - (IEQP FILEFACE FACECODE))) - (SETQ FIRSTCHAR (\BIN WSTRM)) - (SETQ LASTCHAR (\BIN WSTRM)) - (COND - ((AND (OR (ZEROP (SETQ SIZE (\WIN WSTRM))) - (LESSP (ABS (FQUOTIENT (IDIFFERENCE NSMICASIZE SIZE) - NSMICASIZE)) - 0.02)) - (ZEROP (\WIN WSTRM))) - (RETURN SIZE]) - (0 (RETURN NIL)) - NIL) - (SETFILEPTR WSTRM NEXT)))) + (SETQ LENGTH (\BIN WSTRM)) + (add NEXT (LLSH (IPLUS LENGTH (LLSH (LOGAND TYPE 15) + 8)) + 1)) + (SELECTQ (LRSH TYPE 4) + (4 (SETQ FILEFAM (\BIN WSTRM)) + (SETQ FILEFACE (\BIN WSTRM)) + [COND + ((OR (EQ FAMILY T) + (EQ FAMILY NIL) + (AND (IEQP FILEFAM FAMCODE) + (IEQP FILEFACE FACECODE))) + (SETQ FIRSTCHAR (\BIN WSTRM)) + (SETQ LASTCHAR (\BIN WSTRM)) + (COND + ((AND (OR (ZEROP (SETQ SIZE (\WIN WSTRM))) + (LESSP (ABS (FQUOTIENT (IDIFFERENCE NSMICASIZE SIZE) + NSMICASIZE)) + 0.02)) + (ZEROP (\WIN WSTRM))) + (RETURN SIZE]) + (0 (RETURN NIL)) + NIL) + (SETFILEPTR WSTRM NEXT)))) ) -(PUTPROPS AFONT COPYRIGHT ("Venue & Xerox Corporation" 1984 1985 1986 1987 1990)) (DECLARE%: DONTCOPY - (FILEMAP (NIL (2792 38939 (\CREATESTARFONT 2802 . 4480) (\READACFONTBOXES 4482 . 6709) ( -\READACFONTFILE 6711 . 18604) (\ACCHARIMAGELIST 18606 . 18963) (\ACCHARWIDTHLIST 18965 . 20231) ( -\GETFBB 20233 . 23513) (\ACCHARPOSLIST 23515 . 24565) (\ACROTATECHAR 24567 . 25131) (\READFONTWDFILE -25133 . 33166) (\FACECODE 33168 . 33762) (\FAMILYCODE 33764 . 35068) (\FINDFONT 35070 . 38937))))) + (FILEMAP (NIL (2743 40033 (ACFONT.GETCHARSET 2753 . 3007) (\CREATESTARFONT 3009 . 4732) ( +\READACFONTBOXES 4734 . 6961) (\READACFONTFILE 6963 . 19698) (\ACCHARIMAGELIST 19700 . 20057) ( +\ACCHARWIDTHLIST 20059 . 21325) (\GETFBB 21327 . 24607) (\ACCHARPOSLIST 24609 . 25659) (\ACROTATECHAR +25661 . 26225) (\READFONTWDFILE 26227 . 34260) (\FACECODE 34262 . 34856) (\FAMILYCODE 34858 . 36162) ( +\FINDFONT 36164 . 40031))))) STOP diff --git a/sources/AFONT.DFASL b/sources/AFONT.DFASL index f54e1d02b..80c089add 100644 Binary files a/sources/AFONT.DFASL and b/sources/AFONT.DFASL differ diff --git a/sources/APUTDQ b/sources/APUTDQ index c9192b34e..6b28bb51a 100644 --- a/sources/APUTDQ +++ b/sources/APUTDQ @@ -1,18 +1,15 @@ (DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) -(FILECREATED "16-Jan-2025 13:35:20" {DSK}matt>Interlisp>medley>sources>APUTDQ.;2 10901 +(FILECREATED "23-May-2025 09:03:46" {WMEDLEY}APUTDQ.;4 10767 - :EDIT-BY "mth" + :EDIT-BY rmk - :CHANGES-TO (FNS LOADUP) + :CHANGES-TO (ALISTS (SYSTEMINITVARS DISPLAYFONTEXTENSIONS) + (SYSTEMINITVARS INTERPRESSFONTDIRECTORIES)) - :PREVIOUS-DATE "25-Oct-2022 11:44:17" {DSK}matt>Interlisp>medley>sources>APUTDQ.;1) + :PREVIOUS-DATE "16-Jan-2025 13:35:20" {WMEDLEY}APUTDQ.;3) -(* ; " -Copyright (c) 1981-1988, 1990, 2021-2022, 2025 by Venue & Xerox Corporation. -") - (PRETTYCOMPRINT APUTDQCOMS) (RPAQQ APUTDQCOMS @@ -191,7 +188,7 @@ Copyright (c) 1981-1988, 1990, 2021-2022, 2025 by Venue & Xerox Corporation. (ADVISEDFNS) (LISPUSERSDIRECTORIES {DSK}) (DISPLAYFONTDIRECTORIES {DSK}) - (DISPLAYFONTEXTENSIONS DISPLAYFONT) + (DISPLAYFONTEXTENSIONS MEDLEYDISPLAYFONT DISPLAYFONT) (INTERPRESSFONTDIRECTORIES {DSK})) (DECLARE%: DONTEVAL@LOAD DOCOPY @@ -261,10 +258,8 @@ Copyright (c) 1981-1988, 1990, 2021-2022, 2025 by Venue & Xerox Corporation. (ADDTOVAR LAMA ) ) -(PUTPROPS APUTDQ COPYRIGHT ("Venue & Xerox Corporation" 1981 1982 1983 1984 1985 1986 1987 1988 1990 -2021 2022 2025)) (DECLARE%: DONTCOPY - (FILEMAP (NIL (3999 6207 (GREETFILENAME 4009 . 5882) (FAULTEVAL 5884 . 5956) (FAULTAPPLY 5958 . 6044) -(ERRORX 6046 . 6112) (SET-DOCUMENTATION 6114 . 6205)) (6208 7228 (SMASHFILECOMS 6218 . 6560) ( -SMASHFILECOMSLST 6562 . 7226)) (7322 8926 (LOADUP 7332 . 7916) (ENDLOADUP 7918 . 8924))))) + (FILEMAP (NIL (3966 6174 (GREETFILENAME 3976 . 5849) (FAULTEVAL 5851 . 5923) (FAULTAPPLY 5925 . 6011) +(ERRORX 6013 . 6079) (SET-DOCUMENTATION 6081 . 6172)) (6175 7195 (SMASHFILECOMS 6185 . 6527) ( +SMASHFILECOMSLST 6529 . 7193)) (7289 8893 (LOADUP 7299 . 7883) (ENDLOADUP 7885 . 8891))))) STOP diff --git a/sources/APUTDQ.LCOM b/sources/APUTDQ.LCOM index cd668212f..6dfa6061a 100644 Binary files a/sources/APUTDQ.LCOM and b/sources/APUTDQ.LCOM differ diff --git a/sources/BOOTSTRAP b/sources/BOOTSTRAP index c81fa6554..6dc3543d1 100644 --- a/sources/BOOTSTRAP +++ b/sources/BOOTSTRAP @@ -1,16 +1,13 @@ (DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) -(FILECREATED "27-Sep-2021 10:25:31"  -{DSK}kaplan>Local>medley3.5>git-medley>sources>BOOTSTRAP.;60 47698 - changes to%: (FNS PRINT-READER-ENVIRONMENT READ-READER-ENVIRONMENT) +(FILECREATED "23-Apr-2025 23:39:10" {WMEDLEY}BOOTSTRAP.;61 47417 - previous date%: "17-Aug-2021 00:08:39" -{DSK}kaplan>Local>medley3.5>git-medley>sources>BOOTSTRAP.;58) + :EDIT-BY rmk + :CHANGES-TO (FNS PRINT-READER-ENVIRONMENT \DO-DEFINE-FILE-INFO) + + :PREVIOUS-DATE "27-Sep-2021 10:25:31" {WMEDLEY}BOOTSTRAP.;59) -(* ; " -Copyright (c) 1983-1990, 1992, 2021 by Venue & Xerox Corporation. -") (PRETTYCOMPRINT BOOTSTRAPCOMS) @@ -19,7 +16,7 @@ Copyright (c) 1983-1990, 1992, 2021 by Venue & Xerox Corporation. (FNS GETPROP SETATOMVAL RPAQQ RPAQ RPAQ? MOVD MOVD? SELECTQ SELECTQ1 NCONC1 PUTPROP PROPNAMES ADDPROP REMPROP MEMB CLOSEF?)) (COMS (* ; - "Need these in order to load even compiled files SYSLOAD") + "Need these in order to load even compiled files SYSLOAD") (FNS LOAD \LOAD-STREAM FILECREATED FILECREATED1 PRETTYCOMPRINT BOOTSTRAP-NAMEFIELD PUTPROPS DECLARE%: DECLARE%:1 ROOTFILENAME)) [COMS (* ; "For DEFINE-FILE-INFO") @@ -714,66 +711,64 @@ Copyright (c) 1983-1990, 1992, 2021 by Venue & Xerox Corporation. (SET-READER-ENVIRONMENT (\DO-DEFINE-FILE-INFO NIL ARGS]) (\DO-DEFINE-FILE-INFO - [LAMBDA (STREAM ARGS) (* ; "Edited 17-Aug-2021 00:05 by rmk:") + [LAMBDA (STREAM ARGS) (* ; "Edited 23-Apr-2025 23:12 by rmk") + (* ; "Edited 17-Aug-2021 00:05 by rmk:") -(* ;;; "Processes the (DEFINE-FILE-INFO . ARGS) at the front of STREAM. This converts the ARGS list to a READER-ENVIRONMENT, and also imposes the external format on STREAM, if non-NIL.") +(* ;;; "Processes the (DEFINE-FILE-INFO . ARGS) at the front of STREAM. This converts the ARGS list to a READER-ENVIRONMENT, and also imposes the external format on STREAM, if non-NIL.") - (* ;; "Include the :PACKAGE... for bootstrapping before in sysouts without an updated version of \LOAD-STREAM") + (* ;; "Include the :PACKAGE... for bootstrapping before in sysouts without an updated version of \LOAD-STREAM") -(* ;;; "") +(* ;;; "") -(* ;;; "The LISTP forms for package and readtable are to allow for those to be created if they don't already exist. If they do exist, the forms should not make any incompatiblel changes--those should be in a file command somewhere.") +(* ;;; "The LISTP forms for package and readtable are to allow for those to be created if they don't already exist. If they do exist, the forms should not make any incompatiblel changes--those should be in a file command somewhere.") -(* ;;; "It doesn't make sense to produce an a new number base by evaluation in a particular runtime environment. I'm leaving this in for reading, for backward compatibility. Presumably future writing will instantiate to the particular number.") +(* ;;; "It doesn't make sense to produce an a new number base by evaluation in a particular runtime environment. I'm leaving this in for reading, for backward compatibility. Presumably future writing will instantiate to the particular number.") (LET (PACKAGE READTABLE BASE FORMAT VALUE PACKAGEFORM READTABLEFORM) [for TAIL on ARGS by (CDDR TAIL) do (SETQ VALUE (CADR TAIL)) - (SELECTQ (CAR TAIL) - ((:PACKAGE %:PACKAGE) - (SETQ PACKAGE (if (LISTP VALUE) - then (SETQ PACKAGEFORM VALUE) - (EVAL VALUE) - ELSE VALUE)) - (IF (TYPEP PACKAGE 'PACKAGE) - ELSEIF (SETQ PACKAGE (CL:FIND-PACKAGE PACKAGE)) - ELSE - - (* ;; "Better message than just \DTEST") - - (ERROR - "Can't find package for DEFINE-FILE-INFO reader environment" - VALUE))) - ((:READTABLE %:READTABLE) - (SETQ READTABLE (if (LISTP VALUE) - then (SETQ READTABLEFORM VALUE) - (EVAL VALUE) - ELSE VALUE)) - (IF (TYPEP READTABLE 'READTABLEP) - ELSEIF (SETQ READTABLE (FIND-READTABLE READTABLE)) - ELSE - - (* ;; "Better message than just \DTEST") - - (ERROR - "Can't find read table for DEFINE-FILE-INFO reader environment" - VALUE))) - ((:BASE %:BASE) (* ; - "RMK: An EVAL form here makes no sense. ") - (SETQ BASE (OR (\CHECKRADIX (if (LISTP VALUE) - then (EVAL VALUE) - else VALUE)) - (ERROR - "Bad read base for DEFINE-FILE-INFO reader environment" - VALUE)))) - ((:FORMAT FORMAT %:FORMAT) - (SETQ FORMAT (FETCH (EXTERNALFORMAT NAME) OF (FIND-FORMAT - VALUE)))) - (ERROR "Unrecognized file info key" (CAR TAIL] - - (* ;; "Set the defaults. Is this essentially ignoring the *DEFAULT-MAKEFILE-ENVIRONMENT*? Maybe the defaults should be take from there?") - - (CL:UNLESS FORMAT (SETQ FORMAT :XCCS)) + (SELECTQ (CAR TAIL) + ((:PACKAGE %:PACKAGE) + (SETQ PACKAGE (if (LISTP VALUE) + then (SETQ PACKAGEFORM VALUE) + (EVAL VALUE) + ELSE VALUE)) + (IF (TYPEP PACKAGE 'PACKAGE) + ELSEIF (SETQ PACKAGE (CL:FIND-PACKAGE PACKAGE)) + ELSE + (* ;; "Better message than just \DTEST") + + (ERROR "Can't find package for DEFINE-FILE-INFO reader environment" + VALUE))) + ((:READTABLE %:READTABLE) + (SETQ READTABLE (if (LISTP VALUE) + then (SETQ READTABLEFORM VALUE) + (EVAL VALUE) + ELSE VALUE)) + (IF (TYPEP READTABLE 'READTABLEP) + ELSEIF (SETQ READTABLE (FIND-READTABLE READTABLE)) + ELSE + (* ;; "Better message than just \DTEST") + + (ERROR "Can't find read table for DEFINE-FILE-INFO reader environment" + VALUE))) + ((:BASE %:BASE) (* ; + "RMK: An EVAL form here makes no sense. ") + (SETQ BASE (OR (\CHECKRADIX (if (LISTP VALUE) + then (EVAL VALUE) + else VALUE)) + (ERROR "Bad read base for DEFINE-FILE-INFO reader environment" + VALUE)))) + ((:FORMAT FORMAT %:FORMAT) + (SETQ FORMAT (FETCH (EXTERNALFORMAT NAME) OF (FIND-FORMAT VALUE)))) + (ERROR "Unrecognized file info key" (CAR TAIL] + + (* ;; "Set the defaults. Is this essentially ignoring the *DEFAULT-MAKEFILE-ENVIRONMENT*? Maybe the defaults should be take from there?") + + (CL:UNLESS FORMAT + (SETQ FORMAT (CL:IF (FIND-FORMAT :MCCS T) + :MCCS + :XCCS))) (CL:WHEN STREAM (\EXTERNALFORMAT STREAM FORMAT)) (create READER-ENVIRONMENT REPACKAGE _ (OR PACKAGE *INTERLISP-PACKAGE*) @@ -784,7 +779,8 @@ Copyright (c) 1983-1990, 1992, 2021 by Venue & Xerox Corporation. REREADTABLEFORM _ READTABLEFORM]) (PRINT-READER-ENVIRONMENT - [LAMBDA (ENV STREAM) (* ; "Edited 27-Sep-2021 10:24 by rmk:") + [LAMBDA (ENV STREAM) (* ; "Edited 23-Apr-2025 23:38 by rmk") + (* ; "Edited 27-Sep-2021 10:24 by rmk:") (* ;;; "If ENV is not the old default interlisp reader environment, writes a DEFINE-FILE-INFO expression on STREAM that will produce this environment when the file is loaded.") @@ -798,13 +794,14 @@ Copyright (c) 1983-1990, 1992, 2021 by Venue & Xerox Corporation. [SETQ RDTBL (IF (FETCH REREADTABLEFORM OF ENV) ELSEIF (fetch REREADTABLE of ENV) THEN (READTABLEPROP (fetch REREADTABLE of ENV) - 'NAME] + 'NAME] (PRINT [CONS 'DEFINE-FILE-INFO `(,@[AND PKG `(:PACKAGE ,PKG] ,@[AND RDTBL `(:READTABLE ,RDTBL] :BASE ,(fetch REBASE of ENV) - ,@(CL:UNLESS (EQ :XCCS (FETCH REFORMAT OF ENV)) + ,@(CL:UNLESS (EQMEMB (FETCH REFORMAT OF ENV) + '(:MCCS :XCCS)) `(:FORMAT ,(FETCH REFORMAT OF ENV)))] STREAM (FETCH (READER-ENVIRONMENT REREADTABLE) OF *DEFINE-FILE-INFO-ENV*)) @@ -953,8 +950,8 @@ Copyright (c) 1983-1990, 1992, 2021 by Venue & Xerox Corporation. (FUNCTION (LAMBDA (X) (OR (CCODEP (CDR X)) (MOVD (CAR X) - (CDR X) - NIL T] + (CDR X) + NIL T] (AND (CCODEP 'BOOTSTRAP-NAMEFIELD) (PUTD 'BOOTSTRAP-NAMEFIELD)) @@ -979,16 +976,14 @@ Copyright (c) 1983-1990, 1992, 2021 by Venue & Xerox Corporation. (ADDTOVAR LAMA ) ) -(PUTPROPS BOOTSTRAP COPYRIGHT ("Venue & Xerox Corporation" 1983 1984 1985 1986 1987 1988 1989 1990 -1992 2021)) (DECLARE%: DONTCOPY - (FILEMAP (NIL (4751 14423 (GETPROP 4761 . 5333) (SETATOMVAL 5335 . 5464) (RPAQQ 5466 . 5519) (RPAQ -5521 . 5833) (RPAQ? 5835 . 6205) (MOVD 6207 . 8071) (MOVD? 8073 . 8503) (SELECTQ 8505 . 8692) ( -SELECTQ1 8694 . 9036) (NCONC1 9038 . 9234) (PUTPROP 9236 . 10720) (PROPNAMES 10722 . 10913) (ADDPROP -10915 . 12978) (REMPROP 12980 . 13834) (MEMB 13836 . 14095) (CLOSEF? 14097 . 14421)) (14496 35060 ( -LOAD 14506 . 15675) (\LOAD-STREAM 15677 . 28751) (FILECREATED 28753 . 30171) (FILECREATED1 30173 . -31281) (PRETTYCOMPRINT 31283 . 31768) (BOOTSTRAP-NAMEFIELD 31770 . 32730) (PUTPROPS 32732 . 33100) ( -DECLARE%: 33102 . 33234) (DECLARE%:1 33236 . 34108) (ROOTFILENAME 34110 . 35058)) (35098 45530 ( -DEFINE-FILE-INFO 35108 . 35543) (\DO-DEFINE-FILE-INFO 35545 . 39891) (PRINT-READER-ENVIRONMENT 39893 - . 41475) (READ-READER-ENVIRONMENT 41477 . 44252) (MAKE-DEFINE-FILE-INFO-ENV 44254 . 45528))))) + (FILEMAP (NIL (4617 14289 (GETPROP 4627 . 5199) (SETATOMVAL 5201 . 5330) (RPAQQ 5332 . 5385) (RPAQ +5387 . 5699) (RPAQ? 5701 . 6071) (MOVD 6073 . 7937) (MOVD? 7939 . 8369) (SELECTQ 8371 . 8558) ( +SELECTQ1 8560 . 8902) (NCONC1 8904 . 9100) (PUTPROP 9102 . 10586) (PROPNAMES 10588 . 10779) (ADDPROP +10781 . 12844) (REMPROP 12846 . 13700) (MEMB 13702 . 13961) (CLOSEF? 13963 . 14287)) (14362 34926 ( +LOAD 14372 . 15541) (\LOAD-STREAM 15543 . 28617) (FILECREATED 28619 . 30037) (FILECREATED1 30039 . +31147) (PRETTYCOMPRINT 31149 . 31634) (BOOTSTRAP-NAMEFIELD 31636 . 32596) (PUTPROPS 32598 . 32966) ( +DECLARE%: 32968 . 33100) (DECLARE%:1 33102 . 33974) (ROOTFILENAME 33976 . 34924)) (34964 45363 ( +DEFINE-FILE-INFO 34974 . 35409) (\DO-DEFINE-FILE-INFO 35411 . 39554) (PRINT-READER-ENVIRONMENT 39556 + . 41308) (READ-READER-ENVIRONMENT 41310 . 44085) (MAKE-DEFINE-FILE-INFO-ENV 44087 . 45361))))) STOP diff --git a/sources/BOOTSTRAP.LCOM b/sources/BOOTSTRAP.LCOM index a431b0c73..ea5f87950 100644 Binary files a/sources/BOOTSTRAP.LCOM and b/sources/BOOTSTRAP.LCOM differ diff --git a/sources/EXTERNALFORMAT b/sources/EXTERNALFORMAT index 4efd98db8..1b1889194 100644 --- a/sources/EXTERNALFORMAT +++ b/sources/EXTERNALFORMAT @@ -1,12 +1,12 @@ (DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) -(FILECREATED "19-Mar-2024 18:24:39" {WMEDLEY}EXTERNALFORMAT.;88 38921 +(FILECREATED "24-Apr-2025 08:43:01" {WMEDLEY}EXTERNALFORMAT.;91 38905 :EDIT-BY rmk - :CHANGES-TO (FNS \FORMATBYTESTRING \FORMATBYTESTREAM) + :CHANGES-TO (VARS EXTERNALFORMATCOMS) - :PREVIOUS-DATE "12-Jan-2024 10:59:18" {WMEDLEY}EXTERNALFORMAT.;86) + :PREVIOUS-DATE "19-Mar-2024 18:24:39" {WMEDLEY}EXTERNALFORMAT.;90) (PRETTYCOMPRINT EXTERNALFORMATCOMS) @@ -22,7 +22,7 @@ (FNS SYSTEM-EXTERNALFORMAT) (GLOBALVARS *EXTERNALFORMATS* *DEFAULT-EXTERNALFORMAT*) (INITVARS (*EXTERNALFORMATS* NIL) - (*DEFAULT-EXTERNALFORMAT* :XCCS)) + (*DEFAULT-EXTERNALFORMAT* :MCCS)) (DECLARE%: DONTEVAL@LOAD DOCOPY (P (DEFPRINT 'EXTERNALFORMAT (FUNCTION \EXTERNALFORMAT.DEFPRINT ] @@ -311,7 +311,7 @@ (RPAQ? *EXTERNALFORMATS* NIL) -(RPAQ? *DEFAULT-EXTERNALFORMAT* :XCCS) +(RPAQ? *DEFAULT-EXTERNALFORMAT* :MCCS) (DECLARE%: DONTEVAL@LOAD DOCOPY (DEFPRINT 'EXTERNALFORMAT (FUNCTION \EXTERNALFORMAT.DEFPRINT)) @@ -737,13 +737,13 @@ (\CREATE.THROUGH.EXTERNALFORMAT) ) (DECLARE%: DONTCOPY - (FILEMAP (NIL (6726 13559 (\EXTERNALFORMAT 6736 . 10514) (MAKE-EXTERNALFORMAT 10516 . 13086) ( -\EXTERNALFORMAT.DEFPRINT 13088 . 13557)) (13560 16601 (\INSTALL.EXTERNALFORMAT 13570 . 15019) ( -\REMOVE.EXTERNALFORMAT 15021 . 15852) (FIND-FORMAT 15854 . 16599)) (16602 17014 (SYSTEM-EXTERNALFORMAT - 16612 . 17012)) (17363 33340 (\OUTCHAR 17373 . 18590) (\INCCODE 18592 . 19745) (\BACKCCODE 19747 . -21426) (\BACKCCODE.EOLC 21428 . 23618) (\PEEKCCODE 23620 . 23945) (\PEEKCCODE.EOLC 23947 . 24326) ( -\INCCODE.EOLC 24328 . 26127) (\FORMATBYTESTREAM 26129 . 28573) (\FORMATBYTESTRING 28575 . 30275) ( -\CHECKEOLC.CRLF 30277 . 33338)) (34622 36858 (\NULLDEVICE 34632 . 36534) (\NULL.OPENFILE 36536 . 36856 -)) (36998 38825 (\CREATE.THROUGH.EXTERNALFORMAT 37008 . 37794) (\THROUGHIN 37796 . 38216) ( -\THROUGHBACKCCODE 38218 . 38485) (\THROUGHOUTCHARFN 38487 . 38823))))) + (FILEMAP (NIL (6710 13543 (\EXTERNALFORMAT 6720 . 10498) (MAKE-EXTERNALFORMAT 10500 . 13070) ( +\EXTERNALFORMAT.DEFPRINT 13072 . 13541)) (13544 16585 (\INSTALL.EXTERNALFORMAT 13554 . 15003) ( +\REMOVE.EXTERNALFORMAT 15005 . 15836) (FIND-FORMAT 15838 . 16583)) (16586 16998 (SYSTEM-EXTERNALFORMAT + 16596 . 16996)) (17347 33324 (\OUTCHAR 17357 . 18574) (\INCCODE 18576 . 19729) (\BACKCCODE 19731 . +21410) (\BACKCCODE.EOLC 21412 . 23602) (\PEEKCCODE 23604 . 23929) (\PEEKCCODE.EOLC 23931 . 24310) ( +\INCCODE.EOLC 24312 . 26111) (\FORMATBYTESTREAM 26113 . 28557) (\FORMATBYTESTRING 28559 . 30259) ( +\CHECKEOLC.CRLF 30261 . 33322)) (34606 36842 (\NULLDEVICE 34616 . 36518) (\NULL.OPENFILE 36520 . 36840 +)) (36982 38809 (\CREATE.THROUGH.EXTERNALFORMAT 36992 . 37778) (\THROUGHIN 37780 . 38200) ( +\THROUGHBACKCCODE 38202 . 38469) (\THROUGHOUTCHARFN 38471 . 38807))))) STOP diff --git a/sources/EXTERNALFORMAT.LCOM b/sources/EXTERNALFORMAT.LCOM index 4e3d2dc4b..3b4777b2c 100644 Binary files a/sources/EXTERNALFORMAT.LCOM and b/sources/EXTERNALFORMAT.LCOM differ diff --git a/sources/FILESETS b/sources/FILESETS index 0aea357f3..af83cc7e3 100644 --- a/sources/FILESETS +++ b/sources/FILESETS @@ -1,9 +1,13 @@ (DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) -(FILECREATED "23-May-2023 08:11:56" {DSK}larry>il>medley>sources>FILESETS.;24 - :EDIT-BY "lmm" +(FILECREATED "16-May-2025 19:21:06" {WMEDLEY}FILESETS.;22 6210 + + :EDIT-BY rmk + + :CHANGES-TO (VARS 1LISPSET) + + :PREVIOUS-DATE "23-Apr-2025 23:38:45" {WMEDLEY}FILESETS.;21) - :PREVIOUS-DATE " 1-Mar-2023 07:49:03" {DSK}larry>il>medley>sources>FILESETS.;23) (PRETTYCOMPRINT FILESETSCOMS) @@ -46,15 +50,15 @@ (RPAQQ 0LISPSET (PACKAGE-CONVERSION-TABLE LLFAULT LLSUBRS LLBFS LLNEW FILEIO EXTERNALFORMAT IMAGEIO LLBASIC LLGC LLARRAYELT LLINTERP LLMVS DEFSTRUCT-RUN-TIME SETF-RUNTIME - CMLSEQBASICS LLARITH LLFLOAT LLBIGNUM LLREAD XCCS LLCHAR LLSTK LLDATATYPE + CMLSEQBASICS LLARITH LLFLOAT LLBIGNUM LLREAD MCCS LLCHAR LLSTK LLDATATYPE IOCHAR LLKEY LLTIMER)) (RPAQQ 1LISPSET (ASTACK DTDECLARE ATBL LLCODE ACODE COREIO AOFD ADIR PMAP VANILLADISK ATERM APRINT ABASIC AERROR AINTERRUPT MISC BOOTSTRAP CMLMACROS CMLEVAL CMLPROGV CMLSPECIALFORMS LLRESTART LLERROR LLSYMBOL LLPACKAGE PACKAGE-STARTUP CONDITION-PACKAGE XCL-PACKAGE PROC CMLARRAY - DSK UFS UFSCALLC PASSWORDS FONT LLDISPLAY APUTDQ COMPATIBILITY DMISC CMLMACROS CMLLIST - CMLCHARACTER CMLREADTABLE MAIKOLOADUPFNS MAIKOBITBLT MAIKOINIT)) + DSK UFS UFSCALLC PASSWORDS FONT MEDLEYFONTFORMAT LLDISPLAY APUTDQ COMPATIBILITY DMISC + CMLMACROS CMLLIST CMLCHARACTER CMLREADTABLE MAIKOLOADUPFNS MAIKOBITBLT MAIKOINIT)) (RPAQQ 2LISPSET (MACHINEINDEPENDENT)) @@ -64,8 +68,8 @@ (IOCHAR MODARITH LLPARAMS LLCODE AERROR AOFD APRINT ATERM LLARRAYELT LLDATATYPE LLNEW LLBASIC LLCHAR LLSTK PMAP LLGC ATBL FILEIO EXTERNALFORMAT LLARITH LLFLOAT FONT LLKEY LLDISPLAY ADISPLAY AINTERRUPT RENAMEMACROS HLDISPLAY WINDOW MACROAUX ADDARITH LLFAULT LLTIMER - IMAGEIO PROC XCCS PASSWORDS INTERPRESS HARDCOPY CMLARRAY LLSUBRS LLETHER PUP UFS - DTDECLARE BIGBITMAPS)) + IMAGEIO PROC MCCS PASSWORDS INTERPRESS HARDCOPY CMLARRAY LLSUBRS LLETHER PUP UFS + DTDECLARE)) (RPAQQ MAKEINITFILES (MAKEINIT MEM I-NEW)) diff --git a/sources/FONT b/sources/FONT index ebef461de..4be016482 100644 --- a/sources/FONT +++ b/sources/FONT @@ -1,13 +1,14 @@ (DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) -(FILECREATED " 1-Feb-2025 12:28:10" {DSK}matt>Interlisp>medley>sources>FONT.;4 191871 +(FILECREATED " 9-Jun-2025 20:20:32" {WMEDLEY}FONT.;170 218882 - :EDIT-BY "mth" + :EDIT-BY rmk - :CHANGES-TO (VARS FONTCOMS) - (FNS WRITESTRIKEFONTFILE) + :CHANGES-TO (RECORDS FONTDESCRIPTOR) + (MACROS \FSETCHARWIDTH) + (VARS NSFONTFAMILIES) - :PREVIOUS-DATE "19-Dec-2024 15:25:17" {DSK}matt>Interlisp>medley>sources>FONT.;1) + :PREVIOUS-DATE " 9-Jun-2025 20:06:18" {WMEDLEY}FONT.;167) (PRETTYCOMPRINT FONTCOMS) @@ -41,10 +42,12 @@ (MATH . MA) (OLDENGLISH . OE) (SYMBOL . SY] + (VARS NSFONTFAMILIES ALTOFONTFAMILIES) (COMS (* ;; "Creation: ") - (FNS FONTCREATE \FONT.SYMBOLMEMB \FONT.SYMBOLASSOC \FONT.COMPARESYMBOL)) + (FNS FONTCREATE COMPLETEFONT COMPLETEFONTP COMPLETECHARSET \COMPLETECHARSET.CSINFO + PRUNEFONTSLUGS \FONT.SYMBOLMEMB \FONT.SYMBOLASSOC \FONT.COMPARESYMBOL)) (COMS (* ;; "Property extraction:") @@ -52,28 +55,28 @@ (COMS (* ;; "Bitmap editing/manipulation:") - (FNS GETCHARBITMAP PUTCHARBITMAP MOVECHARBITMAP)) - (FNS FONTCOPY FONTSAVAILABLE FONTFILEFORMAT FONTP FONTUNPARSE SETFONTDESCRIPTOR CHARCODEP - EDITCHAR \STREAMCHARWIDTH \UNITWIDTHSVECTOR \CREATEDISPLAYFONT \CREATECHARSET.DISPLAY - \CREATE-REAL-CHARSET.DISPLAY \BUILDSLUGCSINFO \SEARCHDISPLAYFONTFILES \SEARCHFONTFILES - \FINDFONTFILE \FONTSYMBOL \DEVICESYMBOL \FONTFACE \FONTFACE.COLOR \FONTFILENAME - \FONTFILENAME.OLD \FONTFILENAME.NEW \FONTINFOFROMFILENAME \FONTINFOFROMFILENAME.OLD - \GETFONTDESC \COERCEFONTDESC \LOOKUPFONT \LOOKUPFONTSINCORE \READDISPLAYFONTFILE) + (FNS EDITCHAR) + (* ; "Should this be on EDITFONT ?") + (FNS GETCHARBITMAP PUTCHARBITMAP \GETCHARBITMAP.CSINFO \PUTCHARBITMAP.CSINFO) + (FNS MOVECHARBITMAP MOVEFONTCHARS \MOVEFONTCHAR SLUGCHARP.DISPLAY \GETFONTCHARINFO)) (COMS (* ;; "\FINDFONTFILE \FONTFILENAME \SEARCHFONTFILES \FONTINFOFROMFILENAME are redefined to deal with character-set directories. That behavior is conditioned on the setting of the global variable *USEOLDFONTDIRECTORIES*, T at PARC, maybe NIL most other places. ") - (ADDVARS (*OLD-FONT-EXTENSIONS* STRIKE)) + (FNS FONTFILES \FINDFONTFILE \FONTFILENAMES \FONTFILENAME \FONTFILENAME.OLD + \FONTFILENAME.NEW \FONTINFOFROMFILENAME \FONTINFOFROMFILENAME.OLD) + (* (* ; "Do we still want old fonts?") + (ADDVARS (*OLD-FONT-EXTENSIONS* STRIKE))) + (INITVARS (*OLD-FONT-EXTENSIONS* NIL)) (INITVARS (*USEOLDFONTDIRECTORIES* NIL)) - (GLOBALVARS *OLD-FONT-EXTENSIONS* *USEOLDFONTDIRECTORIES*) - - (* ;; "Establishes DISPLAYFONTFILECACHE to avoid rereading charsets when size coercions are done (e.g. for nsdisplaysizes or smallscreen)") -) - (COMS - (* ;; "Establishes DISPLAYFONTFILECACHE to avoid rereading charsets when size coercions are done (e.g. for nsdisplaysizes or smallscreen)") - - (INITVARS (CACHEDISPLAYFONTS)) - (GLOBALVARS CACHEDISPLAYFONTS) - (* ; "STRIKE format file support") + (GLOBALVARS *OLD-FONT-EXTENSIONS* *USEOLDFONTDIRECTORIES*)) + (FNS FONTCOPY FONTSAVAILABLE FONTFILEFORMAT FONTP FONTUNPARSE SETFONTDESCRIPTOR CHARCODEP + \STREAMCHARWIDTH \UNITWIDTHSVECTOR \CREATEDISPLAYFONT \CREATECHARSET.DISPLAY + \COERCECHARSET \CREATE-REAL-CHARSET.DISPLAY \BUILDSLUGCSINFO \SEARCHDISPLAYFONTFILES + \SEARCHFONTFILES \FONTSYMBOL \DEVICESYMBOL \FONTFACE \FONTFACE.COLOR \GETFONTDESC + \COERCEFONTDESC \LOOKUPFONT \LOOKUPFONTSINCORE \READDISPLAYFONTFILE SETFONTCHARENCODING) + (FNS ACFONT.FILEP STRIKEFONT.FILEP) + (* ; "Legacy font-fille predicates") + (COMS (* ; "STRIKE format file support") (FNS \READSTRIKEFONTFILE \SFMAKEBOLD \SFMAKEITALIC \SFMAKEROTATEDFONT \SFROTATECSINFO \SFROTATEFONTCHARACTERS \SFFIXOFFSETSAFTERROTATION \SFROTATECSINFOOFFSETS \SFMAKECOLOR) @@ -86,56 +89,37 @@ (\UNITWIDTHSVECTOR)) (GLOBALVARS DISPLAYFONTDIRECTORIES \DEFAULTDEVICEFONTS \UNITWIDTHSVECTOR) (DECLARE%: DONTEVAL@LOAD DOCOPY (P (\UNITWIDTHSVECTOR))) - (CONSTANTS (NORUNCODE 255)) (EXPORT (OPTIMIZERS FONTPROP)) - [DECLARE%: DONTCOPY - (EXPORT (RECORDS FONTCLASS FONTDESCRIPTOR FONTFACE CHARSETINFO) - (MACROS FONTASCENT FONTDESCENT FONTHEIGHT \FGETOFFSET \FSETOFFSET \FGETWIDTH - \FSETWIDTH \FGETCHARWIDTH \FSETCHARWIDTH \FGETIMAGEWIDTH \FSETIMAGEWIDTH - \GETCHARSETINFO \CREATECSINFOELEMENT \CREATEFONTCHARSETVECTOR) - (FUNCTIONS \CREATEKERNELEMENT \FSETLEFTKERN) - (CONSTANTS (\MAXNSCHAR 65535] - (FNS \FGETLEFTKERN) - (COMS (* ; "NS Character specific code") - (FNS \CREATECHARSET \INSTALLCHARSETINFO) - (GLOBALVARS DISPLAYFONTCOERCIONS MISSINGDISPLAYFONTCOERCIONS - MISSINGCHARSETDISPLAYFONTCOERCIONS CHARSETERRORFLG) + [DECLARE%: DONTCOPY (EXPORT (RECORDS FONTCLASS FONTDESCRIPTOR FONTFACE CHARSETINFO) + (MACROS FONTASCENT FONTDESCENT FONTHEIGHT \FGETOFFSET \FSETOFFSET + \FGETWIDTH \FSETWIDTH \FGETCHARWIDTH \FSETCHARWIDTH + \FGETIMAGEWIDTH \FSETIMAGEWIDTH) + (MACROS \XGETCHARSETINFO \GETCHARSETINFO \INSURECHARSETINFO + \CREATECSINFOELEMENT \CREATEFONTCHARSETVECTOR) + (CONSTANTS (\MAXNSCHAR 65535] + (FNS \CREATEKERNELEMENT \FSETLEFTKERN \FGETLEFTKERN) + (COMS (FNS \CREATEFONT \CREATECHARSET \INSTALLCHARSETINFO \INSTALLCHARSETINFO.CHARENCODING) + (GLOBALVARS DISPLAYFONTCOERCIONS DISPLAYCHARSETCOERCIONS) (INITVARS (DISPLAYFONTCOERCIONS NIL) - [MISSINGCHARSETDISPLAYFONTCOERCIONS '(((GACHA) - (TERMINAL)) - ((MODERN) - (CLASSIC)) - ((TIMESROMAN) - (CLASSIC)) - ((HELVETICA) - (MODERN)) - ((TERMINAL 6) - (MODERN 6)) - ((TERMINAL 8) - (MODERN 8)) - ((TERMINAL 10) - (MODERN 10)) - ((TERMINAL 12) - (MODERN 12] - [MISSINGDISPLAYFONTCOERCIONS '(((GACHA) - (TERMINAL)) - ((MODERN) - (CLASSIC)) - ((TIMESROMAN) - (CLASSIC)) - ((HELVETICA) - (MODERN)) - ((TERMINAL) - (MODERN] - (CHARSETERRORFLG NIL) + [DISPLAYCHARSETCOERCIONS '(((GACHA) + (TERMINAL)) + ((MODERN) + (CLASSIC)) + ((TIMESROMAN) + (CLASSIC)) + ((HELVETICA) + (MODERN)) + ((TERMINAL) + (MODERN] (\DEFAULTCHARSET 0))) (FNS \FONTRESETCHARWIDTHS) - [DECLARE%: DONTEVAL@LOAD (INITVARS (DISPLAYFONTEXTENSIONS 'DISPLAYFONT) - (DISPLAYFONTDIRECTORIES '( - {DSK}/USR/LOCAL/LDE/FONTS/DISPLAY/PRESENTATION/ - - {dsk}/usr/local/lde/fonts/display/publishing/ - ] + (GLOBALVARS DISPLAYCHARSETFNS) + [DECLARE%: DONTEVAL@LOAD DOCOPY (INITVARS (DISPLAYFONTDIRECTORIES NIL)) + (VARS (DISPLAYCHARSETFNS '((MEDLEYFONT MEDLEYFONT.FILEP MEDLEYFONT.GETCHARSET) + (AC ACFONT.FILEP ACFONT.GETCHARSET) + (STRIKE STRIKEFONT.FILEP \READSTRIKEFONTFILE] + (DECLARE%: DONTEVAL@LOAD DOCOPY (* ; "The loadup might have fewer") + (ADDVARS (DISPLAYFONTEXTENSIONS MEDLEYDISPLAYFONT DISPLAYFONT STRIKE))) (DECLARE%: EVAL@COMPILE DONTCOPY (CONSTANTS (MAXCODE 255) (DUMMYINDEX 256))) (MACROS \FGETCHARIMAGEWIDTH \GETFONTDESC \SETCHARSETINFO) @@ -168,26 +152,27 @@ CHARCODE]) (CHARWIDTHY - [LAMBDA (CHARCODE FONT) (* edited%: "18-Mar-86 19:30") + [LAMBDA (CHARCODE FONT) (* ; "Edited 22-May-2025 09:47 by rmk") + (* edited%: "18-Mar-86 19:30") (* ; - "Gets the Y-component of the width of a character code in a font.") + "Gets the Y-component of the width of a character code in a font.") (OR (\CHARCODEP CHARCODE) (\ILLEGAL.ARG CHARCODE)) (LET (TEMP WY) (COND ((type? FONTDESCRIPTOR FONT) - (SETQ WY (ffetch (CHARSETINFO YWIDTHS) of (\GETCHARSETINFO (\CHARSET CHARCODE) - FONT))) + (SETQ WY (ffetch (CHARSETINFO YWIDTHS) of (\INSURECHARSETINFO (\CHARSET CHARCODE) + FONT))) (COND ((FIXP WY)) (WY (\FGETWIDTH WY (\CHAR8CODE CHARCODE))) (T 0))) ((type? STREAM (SETQ TEMP (\OUTSTREAMARG FONT T))) (* ; - "NIL font goes thru here--primary output file") + "NIL font goes thru here--primary output file") (IMAGEOP 'IMCHARWIDTHY TEMP TEMP CHARCODE)) - (T [SETQ WY (ffetch (CHARSETINFO YWIDTHS) of (\GETCHARSETINFO (\CHARSET CHARCODE) - (FONTCREATE FONT] + (T [SETQ WY (ffetch (CHARSETINFO YWIDTHS) of (\INSURECHARSETINFO (\CHARSET CHARCODE) + (FONTCREATE FONT] (COND ((FIXP WY)) (WY (\FGETWIDTH WY (\CHAR8CODE CHARCODE))) @@ -232,7 +217,8 @@ (ffetch DDSPACEWIDTH of DD]) (\STRINGWIDTH.GENERIC - [LAMBDA (STR FONT RDTBL SPACEWIDTH) (* ; "Edited 3-Apr-87 13:47 by jop") + [LAMBDA (STR FONT RDTBL SPACEWIDTH) (* ; "Edited 22-May-2025 09:51 by rmk") + (* ; "Edited 3-Apr-87 13:47 by jop") (* ;; "Returns the width of STR with SPACEWIDTH for the width of spaces. RDTBL has already been coerced, so no FLG is needed ") @@ -246,45 +232,44 @@ (if RDTBL then (GO SLOW) else (RETURN (for C WIDTHSBASE CSET inatom STR - sum [COND - ((NEQ CSET (\CHARSET C)) - (SETQ CSET (\CHARSET C)) - (SETQ WIDTHSBASE (ffetch (CHARSETINFO WIDTHS) - of (\GETCHARSETINFO CSET FONT - ] - (COND - ((EQ C (CHARCODE SPACE)) - SPACEWIDTH) - (T (\FGETWIDTH WIDTHSBASE (\CHAR8CODE C] + sum [COND + ((NEQ CSET (\CHARSET C)) + (SETQ CSET (\CHARSET C)) + (SETQ WIDTHSBASE (ffetch (CHARSETINFO WIDTHS) + of (\INSURECHARSETINFO CSET FONT] + (COND + ((EQ C (CHARCODE SPACE)) + SPACEWIDTH) + (T (\FGETWIDTH WIDTHSBASE (\CHAR8CODE C] ((STRINGP STR) (RETURN (LET ((TOTAL 0) ESC ESCWIDTH WIDTHSBASE CSET) [COND (RDTBL (* ; - "Count delimiting quotes and internal escapes") + "Count delimiting quotes and internal escapes") (SETQ TOTAL (UNFOLD (\FGETCHARWIDTH FONT (CHARCODE %")) 2)) (SETQ ESC (fetch (READTABLEP ESCAPECHAR) of RDTBL)) (SETQ ESCWIDTH (\FGETCHARWIDTH FONT ESC] [for C instring STR do [COND - ((NEQ (\CHARSET C) - CSET) (* ; - "Get the widths vector for this character set") - (SETQ CSET (\CHARSET C)) - (SETQ WIDTHSBASE (ffetch (CHARSETINFO WIDTHS) - of (\GETCHARSETINFO CSET FONT] - (add TOTAL (COND - ((EQ C (CHARCODE SPACE)) - SPACEWIDTH) - (T (IPLUS (\FGETWIDTH WIDTHSBASE (\CHAR8CODE C)) - (COND - ((AND RDTBL (OR (EQ C (CHARCODE %")) - (EQ C ESC))) + ((NEQ (\CHARSET C) + CSET) (* ; + "Get the widths vector for this character set") + (SETQ CSET (\CHARSET C)) + (SETQ WIDTHSBASE (ffetch (CHARSETINFO WIDTHS) of (\INSURECHARSETINFO + CSET FONT] + (add TOTAL (COND + ((EQ C (CHARCODE SPACE)) + SPACEWIDTH) + (T (IPLUS (\FGETWIDTH WIDTHSBASE (\CHAR8CODE C)) + (COND + ((AND RDTBL (OR (EQ C (CHARCODE %")) + (EQ C ESC))) (* ; "String char must be escaped") - ESCWIDTH) - (T 0] + ESCWIDTH) + (T 0] TOTAL] SLOW (* ; "Do the general case here") @@ -294,19 +279,18 @@ (DECLARE (SPECVARS TOTALWIDTH WIDTHSBASE CSET FONT SPACEWIDTH)) (\MAPPNAME [FUNCTION (LAMBDA (DUMMY CC) (add TOTALWIDTH (COND - ((EQ CC (CHARCODE SPACE)) - SPACEWIDTH) - ((EQ CSET (\CHARSET CC)) - (\FGETWIDTH WIDTHSBASE - (\CHAR8CODE CC))) - (T (SETQ CSET (\CHARSET CC)) - (SETQ WIDTHSBASE - (ffetch (CHARSETINFO - WIDTHS) - of (\GETCHARSETINFO - CSET FONT))) - (\FGETWIDTH WIDTHSBASE - (\CHAR8CODE CC] + ((EQ CC (CHARCODE SPACE)) + SPACEWIDTH) + ((EQ CSET (\CHARSET CC)) + (\FGETWIDTH WIDTHSBASE (\CHAR8CODE + CC))) + (T (SETQ CSET (\CHARSET CC)) + (SETQ WIDTHSBASE + (ffetch (CHARSETINFO WIDTHS) + of (\INSURECHARSETINFO CSET + FONT))) + (\FGETWIDTH WIDTHSBASE + (\CHAR8CODE CC] STR RDTBL RDTBL *PRINT-LEVEL* *PRINT-LENGTH*) TOTALWIDTH]) ) @@ -445,6 +429,10 @@ (OLDENGLISH . OE) (SYMBOL . SY))) +(RPAQQ NSFONTFAMILIES (CLASSIC MODERN TERMINAL OPTIMA TITAN BOLDPS PCTERMINAL)) + +(RPAQQ ALTOFONTFAMILIES (GACHA TIMESROMAN TIMESROMAND HELVETICA OLDENGLISH SNAIL TONTO)) + (* ;; "Creation: ") @@ -453,6 +441,8 @@ (FONTCREATE [LAMBDA (FAMILY SIZE FACE ROTATION DEVICE NOERRORFLG CHARSET) + (* ; "Edited 7-Jun-2025 15:01 by rmk") + (* ; "Edited 20-May-2025 20:41 by rmk") (* ; "Edited 10-Oct-88 09:53 by rmk:") (* ; "Edited 28-Jul-88 14:43 by rmk:") (* ; "Edited 10-Nov-87 18:08 by FS") @@ -475,7 +465,7 @@ (CDDR FAMILY) DEVICE))) (T (* ; - "Allows for a font named CLASS--distinguished cause its size is not a litatom") + "Allows for a font named CLASS--distinguished cause its size is not a litatom") (SETQ FONTX FAMILY)))) (SETQ FONTX FAMILY)) (FONTCREATE (CAR FONTX) @@ -503,7 +493,7 @@ (DSPFONT NIL FAMILY] (* ;; - "FAMILY was a spec for a font descriptor, use it and extend it by the other args.") + "FAMILY was a spec for a font descriptor, use it and extend it by the other args.") (COND ((OR SIZE FACE ROTATION DEVICE) @@ -538,13 +528,13 @@ ((AND (LITATOM DEVICE) (NEQ DEVICE T)) (* ; -"Maybe wrong case or package, but we bet it's OK and defer expensive coercion until we've failed.") + "Maybe wrong case or package, but we bet it's OK and defer expensive coercion until we've failed.") DEV) ((SETQ DEV (\GETSTREAM DEVICE 'OUTPUT T)) - (* ; - "T coerces here to primary output") - (fetch (IMAGEOPS IMFONTCREATE) - of (fetch (STREAM IMAGEOPS) of DEV))) + (* ; "T coerces here to primary output") + (fetch (IMAGEOPS IMFONTCREATE) of (fetch (STREAM IMAGEOPS + ) + of DEV))) ((STRINGP DEVICE) (MKATOM (U-CASE DEVICE))) (NOERRORFLG (RETURN NIL)) @@ -552,12 +542,15 @@ (* ; "DEV is now guanteed litatom") NEWDEV (* ; - "Check after device since it is device-dependent") + "Check after device since it is device-dependent") (SETQ FONTFACE (OR (\FONTFACE FACE NOERRORFLG DEV) (RETURN NIL))) (* ; "Don't truly coerce to \FONTSYMBOL or \DEVICESYMBOL until we've had a shot at the font cache, since re-interning atoms is so expensive") [RETURN (COND - ((\LOOKUPFONT FAMILY SIZE FONTFACE ROTATION DEV)) + ((SETQ FONTX (\LOOKUPFONT FAMILY SIZE FONTFACE ROTATION DEV) + ) + (CL:WHEN CHARSET (\INSURECHARSETINFO CHARSET FONTX)) + (RETURN FONTX)) [(SETQ FONTX (CDR (ASSOC DEV IMAGESTREAMTYPES))) (* ;; "Device is valid, font just doesn't exist. FONTFACE, DEV already canonical. Make FAMILY so, so that each imagestream type doesn't have to.") @@ -572,17 +565,12 @@ (* ;; "default creation case. Use fontcreate method from device, build a fontdescriptor and use setfontdescriptor to install it.") - (* ;; "OBSOLETEd by the CHARSETINFO code (OR (ffetch FONTIMAGEWIDTHS of FONTX) (freplace FONTIMAGEWIDTHS of FONTX with (ffetch \SFWidths of FONTX)))") - - (* ;; - "the widths fields in the fontdescriptor are obsolete, and shoudln't be updated here.") - (* ;; "We should probably force all device implementations to obey these conventions, then remove these generic updates") - (replace (FONTDESCRIPTOR FONTAVGCHARWIDTH) - of FONTX with (\AVGCHARWIDTH FONTX)) - (SETFONTDESCRIPTOR FAMILY SIZE FONTFACE ROTATION - DEV FONTX)) + (replace (FONTDESCRIPTOR FONTAVGCHARWIDTH) of FONTX + with (\AVGCHARWIDTH FONTX)) + (SETFONTDESCRIPTOR FAMILY SIZE FONTFACE ROTATION DEV + FONTX)) (T (GO NOTFOUND] ((NEQ DEV (SETQ DEV (U-CASE DEV))) @@ -593,10 +581,81 @@ NOTFOUND (COND (NOERRORFLG (RETURN NIL)) - (T (ERROR "FONT NOT FOUND (coerced to)" - (LIST FAMILY SIZE FONTFACE ROTATION DEV)) + (T (ERROR "FONT NOT FOUND" (LIST FAMILY SIZE FONTFACE ROTATION DEV)) (GO RETRY]) +(COMPLETEFONT + [LAMBDA (FONT EVENIFCOMPLETE) (* ; "Edited 8-Jun-2025 15:57 by rmk") + (* ; "Edited 7-Jun-2025 15:18 by rmk") + (* ; "Edited 23-May-2025 22:57 by rmk") + (* ; "Edited 20-May-2025 19:57 by rmk") + (* ; "Edited 16-May-2025 21:26 by rmk") + + (* ;; "This fills in all uninstantiated charsetinfo's of f FONT. ") + + (* ;; "NOTE: We reset \FONTSINCORE so that we don't pick up any already modified or coerced fonts, just go directory to the sources.") + + (SETQ FONT (FONTCREATE FONT)) + (CL:WHEN (OR EVENIFCOMPLETE (NOT (fetch (FONTDESCRIPTOR FONTCOMPLETEP) of FONT))) + (for CS from 0 to \MAXCHARSET do + (* ;; + "Skips existing charsets--they already have as much information as they are ever going to get") + + (\INSURECHARSETINFO CS FONT)) + (replace (FONTDESCRIPTOR FONTCOMPLETEP) of FONT with T)) + FONT]) + +(COMPLETEFONTP + [LAMBDA (FONT) (* ; "Edited 24-May-2025 20:55 by rmk") + (* ; "Edited 20-May-2025 14:37 by rmk") + + (* ;; "A font is incomplete if there is a NIL in any charset slot. Completing will install a charset everywhere, even if it is a slug charset.") + + (SETQ FONT (FONTCREATE FONT)) + (for CS from 0 to \MAXCHARSET always (\XGETCHARSETINFO FONT CS]) + +(COMPLETECHARSET + [LAMBDA (DESTFONT SOURCEFONT CHARSET) (* ; "Edited 6-Jun-2025 10:46 by rmk") + (SETQ DESTFONT (FONTCREATE DESTFONT)) + (LET ((DESTCSINFO (\INSURECHARSETINFO CHARSET DESTFONT))) + (CL:UNLESS (fetch (CHARSETINFO CSCOMPLETEP) of DESTCSINFO) + (SETQ SOURCEFONT (FONTCREATE SOURCEFONT)) + (MOVEFONTCHARS (for C from (LLSH CHARSET 8) to (IPLUS \MAXTHINCHAR (LLSH CHARSET 8)) + when (SLUGCHARP.DISPLAY C DESTFONT) unless (SLUGCHARP.DISPLAY C + SOURCEFONT) + collect C) + NIL DESTFONT SOURCEFONT))]) + +(\COMPLETECHARSET.CSINFO + [LAMBDA (CSINFO FAMILY SIZE FACE ROTATION DEVICE CHARSET COERCIONS) + (* ; "Edited 8-Jun-2025 20:20 by rmk") + (* ; "Edited 7-Jun-2025 13:52 by rmk") + + (* ;; "Find/install all missing chars. We assume that CSINFO is or will be the charsetinfo for CHARSET in the font described by FAMILY SIZE... For each missing code we look through all the possible coercions to find the first one with real information about that character. ") + + (CL:UNLESS [OR (fetch (CHARSETINFO CSCOMPLETEP) of CSINFO) + (for C CFONT in COERCIONS never (AND (SETQ CFONT (CAR C)) + (EQ FAMILY (CAR CFONT)) + (OR (NOT (CADR CFONT)) + (EQ SIZE (CADR CFONT))) + (OR (NOT (CADDR CFONT)) + (EQ CHARSET (CADDR CFONT] + (for CODE RCSINFO from 0 to \MAXTHINCHAR + when (AND (SLUGCHARP.DISPLAY CODE CSINFO) + (SETQ RCSINFO (\COERCECHARSET FAMILY SIZE FACE ROTATION DEVICE CHARSET COERCIONS + CODE))) do (\MOVEFONTCHAR RCSINFO CSINFO CODE CODE))) + (replace (CHARSETINFO CSCOMPLETEP) of CSINFO with T]) + +(PRUNEFONTSLUGS + [LAMBDA (FONT) (* ; "Edited 9-Jun-2025 15:02 by rmk") + (* ; "Edited 24-May-2025 21:11 by rmk") + (SETQ FONT (FONTCREATE FONT)) + (for CS CSINFO from 0 to \MAXCHARSET when (AND (SETQ CSINFO (\XGETCHARSETINFO FONT CS)) + (fetch (CHARSETINFO CSSLUGP) of CSINFO)) + do (\SETCHARSETINFO (fetch (FONTDESCRIPTOR FONTCHARSETVECTOR) of FONT) + CS NIL)) + FONT]) + (\FONT.SYMBOLMEMB [LAMBDA (USERINPUT LIST) (* ; "Edited 7-Feb-89 15:47 by jds") (for X on LIST when (\FONT.COMPARESYMBOL USERINPUT (CAR X)) @@ -680,8 +739,14 @@ (fetch (FONTDESCRIPTOR \SFHeight) of (\GETFONTDESC FONTSPEC]) (FONTPROP - [LAMBDA (FONT PROP) (* kbr%: "13-May-85 22:36") - (SETQ FONT (\GETFONTDESC FONT)) + [LAMBDA (FONT PROP) (* ; "Edited 8-Jun-2025 20:42 by rmk") + (* ; "Edited 24-May-2025 07:40 by rmk") + (* ; "Edited 18-May-2025 10:01 by rmk") + (* ; "Edited 16-May-2025 14:27 by rmk") + (* ; "Edited 13-May-2025 09:32 by rmk") + (* ; "Edited 2-May-2025 19:59 by rmk") + (* kbr%: "13-May-85 22:36") + (SETQ FONT (FONTCREATE FONT)) (SELECTQ PROP (HEIGHT (ffetch \SFHeight of FONT)) (ASCENT (ffetch \SFAscent of FONT)) @@ -696,13 +761,14 @@ (BACKCOLOR (ffetch BACKCOLOR of (ffetch FONTFACE of FONT))) (ROTATION (ffetch ROTATION of FONT)) (DEVICE (ffetch FONTDEVICE of FONT)) + (CHARENCODING (ffetch FONTCHARENCODING of FONT)) (SPEC (LIST (ffetch FONTFAMILY of FONT) (ffetch FONTSIZE of FONT) (COPY (ffetch FONTFACE of FONT)) (ffetch ROTATION of FONT) (ffetch FONTDEVICE of FONT))) (DEVICESPEC (* ; - "DEVICE fields are for communicating coercions to the particular printing device") + "DEVICE fields are for communicating coercions to the particular printing device") [COND ((ffetch FONTDEVICESPEC of FONT) (COPY (ffetch FONTDEVICESPEC of FONT))) @@ -712,18 +778,18 @@ (CADDR (ffetch FONTDEVICESPEC of FONT))) (T (ffetch FONTFACE of FONT]) (DEVICESLOPE [fetch SLOPE of (COND - ((ffetch FONTDEVICESPEC of FONT) - (CADDR (ffetch FONTDEVICESPEC of FONT))) - (T (ffetch FONTFACE of FONT]) + ((ffetch FONTDEVICESPEC of FONT) + (CADDR (ffetch FONTDEVICESPEC of FONT))) + (T (ffetch FONTFACE of FONT]) (DEVICEWEIGHT [fetch WEIGHT of (COND - ((ffetch FONTDEVICESPEC of FONT) - (CADDR (ffetch FONTDEVICESPEC of FONT))) - (T (ffetch FONTFACE of FONT]) + ((ffetch FONTDEVICESPEC of FONT) + (CADDR (ffetch FONTDEVICESPEC of FONT))) + (T (ffetch FONTFACE of FONT]) (DEVICEEXPANSION [fetch EXPANSION of (COND - ((ffetch FONTDEVICESPEC of FONT) - (CADDR (ffetch FONTDEVICESPEC of FONT))) - (T (ffetch FONTFACE of FONT]) + ((ffetch FONTDEVICESPEC of FONT) + (CADDR (ffetch FONTDEVICESPEC of FONT))) + (T (ffetch FONTFACE of FONT]) (DEVICESIZE (COND ((ffetch FONTDEVICESPEC of FONT) (CADR (ffetch FONTDEVICESPEC of FONT))) @@ -733,21 +799,26 @@ (CAR (ffetch FONTDEVICESPEC of FONT))) (T (ffetch FONTFAMILY of FONT)))) (SCALE (ffetch FONTSCALE of FONT)) + (CHARSETS (for CS CSINFO (CSVECTOR _ (ffetch FONTCHARSETVECTOR of FONT)) from 0 to + \MAXCHARSET + eachtime (SETQ CSINFO (\GETBASEPTR CSVECTOR (UNFOLD CS 2))) when CSINFO + unless (fetch (CHARSETINFO CSSLUGP) of CSINFO) collect CS)) + (CHARENCODING (fetch (FONTDESCRIPTOR FONTCHARENCODING) of FONT)) (\ILLEGAL.ARG PROP]) (\AVGCHARWIDTH - [LAMBDA (FONT) (* rmk%: "27-Nov-84 18:40") + [LAMBDA (FONT) (* ; "Edited 20-May-2025 21:03 by rmk") + (* rmk%: "27-Nov-84 18:40") (* ;; "Returns the average width of a character, to be used in units-to-characters approximations, as in fixing the linelength") - (PROG ((W (CHARWIDTH (CHARCODE A) - FONT))) - (RETURN (COND - ((NEQ 0 W) - W) - ([NEQ 0 (SETQ W (FIXR (FTIMES 0.6 (FONTPROP FONT 'HEIGHT] - W) - (T 1]) + (LET ((W (CHARWIDTH (CHARCODE A) + FONT))) + (if (NEQ 0 W) + then W + elseif [NEQ 0 (SETQ W (FIXR (FTIMES 0.6 (FONTPROP FONT 'HEIGHT] + then W + else 1]) ) @@ -756,185 +827,197 @@ (DEFINEQ -(GETCHARBITMAP - [LAMBDA (CHARCODE FONT) (* ; "Edited 26-Apr-89 21:49 by atm") +(EDITCHAR + [LAMBDA (CHARCODE FONT) (* rrb "24-MAR-82 12:22") (* ; - "returns a bitmap of the character CHARCODE from the font descriptor FONTDESC.") - (COND - ((OR (CHARCODEP CHARCODE) - (EQ CHARCODE 256)) (* ; - "bitmap for char 256 is what gets printed if char not found") - ) - ((OR (STRINGP CHARCODE) - (LITATOM CHARCODE)) (* ; - "For strings & litatoms, take the first character") - (SETQ CHARCODE (CHCON1 CHARCODE))) - ((TYPEP CHARCODE 'CL:CHARACTER) (* ; - "For common-lisp CHARACTERs, convert it to the char code first.") - (SETQ CHARCODE (CL:CHAR-INT CHARCODE))) - (T (\ILLEGAL.ARG CHARCODE))) - (PROG (CBM (FONTDESC (\GETFONTDESC FONT)) - CSINFO CWDTH CHGHT) - - (* ;; "fetch the csinfo for the character set of this character. Bitmaps and widths must be fetched from it") - - (SETQ CSINFO (\GETCHARSETINFO (\CHARSET CHARCODE) - FONTDESC)) - - (* ;; "(\\fgetwidth (|fetch| (charsetinfo widths) |of| csinfo) (\\char8code charcode))") - - [SETQ CBM (BITMAPCREATE [SETQ CWDTH (if (fetch (CHARSETINFO IMAGEWIDTHS) - of CSINFO) - then (\FGETIMAGEWIDTH (fetch (CHARSETINFO - IMAGEWIDTHS) - of CSINFO) - (\CHAR8CODE CHARCODE)) - else (\FGETWIDTH (fetch (CHARSETINFO WIDTHS) - of CSINFO) - (\CHAR8CODE CHARCODE] - (SETQ CHGHT (FONTPROP FONTDESC 'HEIGHT)) - (fetch (BITMAP BITMAPBITSPERPIXEL) of (fetch (CHARSETINFO - CHARSETBITMAP) - of CSINFO] - (BITBLT (fetch (CHARSETINFO CHARSETBITMAP) of CSINFO) - (\FGETOFFSET (fetch (CHARSETINFO OFFSETS) of CSINFO) - (\CHAR8CODE CHARCODE)) - 0 CBM 0 0 CWDTH CHGHT) - (RETURN CBM]) + "calls the bitmap editor on a character of a font") + (PROG ((FONTDESC (\GETFONTDESC FONT))) + (RETURN (PUTCHARBITMAP CHARCODE FONTDESC (EDITBM (GETCHARBITMAP CHARCODE FONTDESC]) +) -(PUTCHARBITMAP - [LAMBDA (CHARCODE FONT NEWCHARBITMAP NEWCHARDESCENT) (* ; "Edited 27-Apr-89 11:19 by atm") - (* ;; "stores the bitmap NEWCHARBITMAP as the character CHARCODE from the font descriptor FONTDESC. If NEWCHARDESCENT is specified, it is the descent of the new bitmap, and things may be moved to accomodate it.") - (OR (TYPENAMEP NEWCHARBITMAP 'BITMAP) - (\ILLEGAL.ARG NEWCHARBITMAP)) - (COND - ((CHARCODEP CHARCODE)) - ((OR (STRINGP CHARCODE) - (LITATOM CHARCODE)) - (SETQ CHARCODE (CHCON1 CHARCODE))) - (T (\ILLEGAL.ARG CHARCODE))) - (PROG* ((FONTDESC (\GETFONTDESC FONT)) - (CSINFO (\GETCHARSETINFO (\CHARSET CHARCODE) - FONTDESC)) - (CDESCENT (fetch (CHARSETINFO CHARSETDESCENT) of CSINFO)) - (CASCENT (fetch (CHARSETINFO CHARSETASCENT) of CSINFO)) - (CHEIGHT (IPLUS CDESCENT CASCENT)) - (OFFSETS (fetch (CHARSETINFO OFFSETS) of CSINFO)) - (WIDTHS (fetch (CHARSETINFO WIDTHS) of CSINFO)) - (IMWIDTHS (fetch (CHARSETINFO IMAGEWIDTHS) of CSINFO)) - (CIMWIDTH (if IMWIDTHS - then (\FGETIMAGEWIDTH IMWIDTHS (\CHAR8CODE CHARCODE)) - else NIL)) - (CWIDTH (OR CIMWIDTH (CHARWIDTH CHARCODE FONTDESC))) - (FONTBITMAP (fetch (CHARSETINFO CHARSETBITMAP) of CSINFO)) - (OFWIDTH (fetch (BITMAP BITMAPWIDTH) of FONTBITMAP)) - TEMPBITMAP BWIDTH DW BHEIGHT BASCENT BDESCENT NDESCENT NASCENT NHEIGHT CHAROFFSET - (BITSPERPIXEL (fetch (BITMAP BITMAPBITSPERPIXEL) of FONTBITMAP))) - - (* ;; "fetch the ascents and descents of the bitmap and the new maximums.") - - (SETQ BWIDTH (fetch (BITMAP BITMAPWIDTH) of NEWCHARBITMAP)) - (SETQ BHEIGHT (fetch (BITMAP BITMAPHEIGHT) of NEWCHARBITMAP)) - (SETQ BDESCENT (OR NEWCHARDESCENT CDESCENT)) - (SETQ BASCENT (IDIFFERENCE BHEIGHT BDESCENT)) - (SETQ NDESCENT (IMAX BDESCENT CDESCENT)) - (SETQ NASCENT (IMAX BASCENT CASCENT)) - (SETQ NHEIGHT (IPLUS NDESCENT NASCENT)) - (SETQ CHAROFFSET (\FGETOFFSET OFFSETS (\CHAR8CODE CHARCODE))) - - (* ;; "set up a new target bitmap if any of the parameters have changed.") +(* ; "Should this be on EDITFONT ?") - (COND - ((EQ CHAROFFSET (\FGETOFFSET OFFSETS \MAXTHINCHAR)) - - (* ;; "changing the bitmap for a character which formerly pointed at the slug character. Allocate a new bitmap character bitmap for this.") - - (SETQ TEMPBITMAP (BITMAPCREATE (IPLUS OFWIDTH BWIDTH) - NHEIGHT BITSPERPIXEL)) - (BITBLT FONTBITMAP 0 0 TEMPBITMAP 0 (IMAX 0 (IDIFFERENCE NDESCENT CDESCENT)) - OFWIDTH CHEIGHT) (* ; "copy the old characters over.") - (SETQ CHAROFFSET OFWIDTH)) - ((NEQ CWIDTH BWIDTH) - - (* ;; "The bitmaps differ in width; create a new bitmap with things at the right places, then update widths and offsets.") - - (SETQ DW (IDIFFERENCE BWIDTH CWIDTH)) (* ; "Difference in character widths") - (SETQ TEMPBITMAP (BITMAPCREATE (IPLUS OFWIDTH DW) - NHEIGHT BITSPERPIXEL))(* ; - "this may also be a taller bitmap if NHEIGHT is larger than CHEIGHT.") - (BITBLT FONTBITMAP 0 0 TEMPBITMAP 0 (IMAX 0 (IDIFFERENCE NDESCENT CDESCENT)) - CHAROFFSET CHEIGHT) (* ; - "Copy that portion to the left of the character.") - (BITBLT FONTBITMAP (IPLUS CHAROFFSET CWIDTH) - 0 TEMPBITMAP (IPLUS CHAROFFSET BWIDTH) - (IMAX 0 (IDIFFERENCE NDESCENT CDESCENT)) - (ADD1 (IDIFFERENCE OFWIDTH (IPLUS CHAROFFSET CWIDTH))) - CHEIGHT) (* ; - "Copy that portion to the right of the new character.") - ) - ((OR (IGREATERP BASCENT CASCENT) - (IGREATERP BDESCENT CDESCENT)) - - (* ;; "The new character is TALLER than the existing bitmap. Make a larger bitmap.") - - (SETQ TEMPBITMAP (BITMAPCREATE OFWIDTH NHEIGHT BITSPERPIXEL)) - (BITBLT FONTBITMAP 0 0 TEMPBITMAP 0 (IMAX 0 (IDIFFERENCE NDESCENT CDESCENT)) - OFWIDTH CHEIGHT) - - (* ;; "Copy the existing bitmap into it, adjusting for a larger descent in the new character (if there is one)") - - )) - - (* ;; "copy the new bitmap in and update parameters.") - - (BITBLT NEWCHARBITMAP 0 0 (OR TEMPBITMAP FONTBITMAP) - CHAROFFSET - (IMAX 0 (IDIFFERENCE NDESCENT BDESCENT)) - BWIDTH BHEIGHT) - [COND - (TEMPBITMAP (UNINTERRUPTABLY - - (* ;; "update the parameters for this character set.") - - (\FSETWIDTH WIDTHS (\CHAR8CODE CHARCODE) - BWIDTH) (* ; - "The new character's correct width") +(DEFINEQ + +(GETCHARBITMAP + [LAMBDA (CHARCODE FONT) (* ; "Edited 7-Jun-2025 09:55 by rmk") + (* ; "Edited 22-May-2025 09:52 by rmk") + (* ; "Edited 25-Apr-2025 11:21 by rmk") + (* ; "Edited 26-Apr-89 21:49 by atm") (* ; - "Make sure that we update imagewidths also") - (if IMWIDTHS - then (\FSETIMAGEWIDTH IMWIDTHS (\CHAR8CODE CHARCODE) - BWIDTH)) - (\FSETOFFSET OFFSETS (\CHAR8CODE CHARCODE) - CHAROFFSET) - [COND - (DW (for I from 0 to \MAXCHAR - do (* ; - "Run thru the offsets of later characters, adjusting them for the changed width of this character") - (if (IGREATERP (\FGETOFFSET OFFSETS I) - CHAROFFSET) - then (\FSETOFFSET OFFSETS I - (IPLUS DW (\FGETOFFSET OFFSETS I] - (replace (CHARSETINFO CHARSETBITMAP) of CSINFO with - TEMPBITMAP - ) - (replace (CHARSETINFO CHARSETDESCENT) of CSINFO with - NDESCENT) - (replace (CHARSETINFO CHARSETASCENT) of CSINFO with NASCENT - ) - - (* ;; "update the properties for the font as a whole.") - - [SETQ NASCENT (IMAX NASCENT (FONTPROP FONTDESC 'ASCENT] - [SETQ NDESCENT (IMAX NDESCENT (FONTPROP FONTDESC 'DESCENT] - (replace (FONTDESCRIPTOR \SFAscent) of FONTDESC with - NASCENT) - (replace (FONTDESCRIPTOR \SFDescent) of FONTDESC with - NDESCENT) - (replace (FONTDESCRIPTOR \SFHeight) of FONTDESC - with (IPLUS NDESCENT NASCENT)))] - (RETURN NEWCHARBITMAP]) + "returns a bitmap of the character CHARCODE from the font descriptor FONTDESC.") + (SETQ CHARCODE (CHARCODE.DECODE CHARCODE)) + (\GETCHARBITMAP.CSINFO (\CHAR8CODE CHARCODE) + (\INSURECHARSETINFO (\CHARSET CHARCODE) + (FONTCREATE FONT]) + +(PUTCHARBITMAP + [LAMBDA (CHARCODE FONT NEWCHARBITMAP NEWCHARDESCENT) (* ; "Edited 7-Jun-2025 10:16 by rmk") + (* ; "Edited 25-May-2025 15:10 by rmk") + (* ; "Edited 22-May-2025 09:56 by rmk") + (* ; "Edited 1-May-2025 13:21 by rmk") + (* ; "Edited 25-Apr-2025 11:21 by rmk") + (* ; "Edited 27-Apr-89 11:19 by atm") + + (* ;; "Stores the bitmap NEWCHARBITMAP as the character CHARCODE in FONT. If NEWCHARDESCENT is specified, it is the descent of the new bitmap, and things may be moved to accomodate it.") + + (CL:UNLESS (type? BITMAP NEWCHARBITMAP) + (\ILLEGAL.ARG NEWCHARBITMAP)) + (SETQ CHARCODE (CHARCODE.DECODE CHARCODE)) + (SETQ FONT (FONTCREATE FONT)) + (LET ((CSINFO (\INSURECHARSETINFO (\CHARSET CHARCODE) + FONT))) + (UNINTERRUPTABLY + (CL:WHEN (\PUTCHARBITMAP.CSINFO (\CHAR8CODE CHARCODE) + CSINFO NEWCHARBITMAP NEWCHARDESCENT) + + (* ;; "update the ascent/descent properties for the font as a whole.") + + (LET [(ASCENT (IMAX (fetch (CHARSETINFO CHARSETASCENT) of CSINFO) + (fetch (FONTDESCRIPTOR \SFAscent) of FONT))) + (DESCENT (IMAX (fetch (CHARSETINFO CHARSETDESCENT) of CSINFO) + (fetch (FONTDESCRIPTOR \SFDescent) of FONT] + (replace (FONTDESCRIPTOR \SFAscent) of FONT with ASCENT) + (replace (FONTDESCRIPTOR \SFDescent) of FONT with DESCENT) + (replace (FONTDESCRIPTOR \SFHeight) of FONT with (IPLUS ASCENT DESCENT))))) + NIL NEWCHARBITMAP]) + +(\GETCHARBITMAP.CSINFO + [LAMBDA (CODE CSINFO) (* ; "Edited 7-Jun-2025 09:56 by rmk") + (* ; "Edited 22-May-2025 09:52 by rmk") + (* ; "Edited 25-Apr-2025 11:21 by rmk") + (* ; "Edited 26-Apr-89 21:49 by atm") + (* ; + "returns a bitmap of the character CHARCODE from the font descriptor FONTDESC.") + + (* ;; "CODE is a thincode") + + (LET (CSBITMAP CBM CWDTH CHGHT) + (CL:WHEN (SETQ CSBITMAP (fetch (CHARSETINFO CHARSETBITMAP) of CSINFO)) + (SETQ CHGHT (BITMAPHEIGHT CSBITMAP)) + (SETQ CBM (BITMAPCREATE (SETQ CWDTH (if (fetch (CHARSETINFO IMAGEWIDTHS) of CSINFO) + then (\FGETIMAGEWIDTH (fetch (CHARSETINFO + IMAGEWIDTHS) + of CSINFO) + CODE) + else (\FGETWIDTH (fetch (CHARSETINFO WIDTHS) + of CSINFO) + CODE))) + CHGHT + (fetch (BITMAP BITMAPBITSPERPIXEL) of CSBITMAP))) + (BITBLT CSBITMAP (\FGETOFFSET (fetch (CHARSETINFO OFFSETS) of CSINFO) + CODE) + 0 CBM 0 0 CWDTH CHGHT)) + CBM]) + +(\PUTCHARBITMAP.CSINFO + [LAMBDA (CODE CSINFO NEWCHARBITMAP NEWCHARDESCENT) (* ; "Edited 7-Jun-2025 10:15 by rmk") + (* ; "Edited 25-May-2025 15:10 by rmk") + (* ; "Edited 22-May-2025 09:56 by rmk") + (* ; "Edited 1-May-2025 13:21 by rmk") + (* ; "Edited 25-Apr-2025 11:21 by rmk") + (* ; "Edited 27-Apr-89 11:19 by atm") + + (* ;; "Stores the bitmap NEWCHARBITMAP as the thin character CODE in CSINFO. If NEWCHARDESCENT is specified, it is the descent of the new bitmap, and things may be moved to accomodate it.") + + (LET* ((CDESCENT (fetch (CHARSETINFO CHARSETDESCENT) of CSINFO)) + (CASCENT (fetch (CHARSETINFO CHARSETASCENT) of CSINFO)) + (CHEIGHT (IPLUS CDESCENT CASCENT)) + (OFFSETS (fetch (CHARSETINFO OFFSETS) of CSINFO)) + (WIDTHS (fetch (CHARSETINFO WIDTHS) of CSINFO)) + (IMWIDTHS (fetch (CHARSETINFO IMAGEWIDTHS) of CSINFO)) + (CIMWIDTH (AND IMWIDTHS (\FGETIMAGEWIDTH IMWIDTHS CODE))) + (CWIDTH (OR CIMWIDTH (\FGETWIDTH WIDTHS CODE))) + (FONTBITMAP (fetch (CHARSETINFO CHARSETBITMAP) of CSINFO)) + (OFWIDTH (fetch (BITMAP BITMAPWIDTH) of FONTBITMAP)) + TEMPBITMAP BWIDTH DW BHEIGHT BASCENT BDESCENT NDESCENT NASCENT NHEIGHT CHAROFFSET + (BITSPERPIXEL (fetch (BITMAP BITMAPBITSPERPIXEL) of FONTBITMAP))) + + (* ;; "fetch the ascents and descents of the bitmap and the new maximums.") + + (SETQ BWIDTH (fetch (BITMAP BITMAPWIDTH) of NEWCHARBITMAP)) + (SETQ BHEIGHT (fetch (BITMAP BITMAPHEIGHT) of NEWCHARBITMAP)) + (SETQ BDESCENT (OR NEWCHARDESCENT CDESCENT)) + (SETQ BASCENT (IDIFFERENCE BHEIGHT BDESCENT)) + (SETQ NDESCENT (IMAX BDESCENT CDESCENT)) + (SETQ NASCENT (IMAX BASCENT CASCENT)) + (SETQ NHEIGHT (IPLUS NDESCENT NASCENT)) + (SETQ CHAROFFSET (\FGETOFFSET OFFSETS CODE)) + + (* ;; "set up a new target bitmap if any of the parameters have changed.") + + (if (EQ CHAROFFSET (\FGETOFFSET OFFSETS \MAXTHINCHAR)) + then + (* ;; "changing the bitmap for a character which formerly pointed at the slug character. Allocate a new bitmap character bitmap for this.") + + (SETQ TEMPBITMAP (BITMAPCREATE (IPLUS OFWIDTH BWIDTH) + NHEIGHT BITSPERPIXEL)) + (BITBLT FONTBITMAP 0 0 TEMPBITMAP 0 (IMAX 0 (IDIFFERENCE NDESCENT CDESCENT)) + OFWIDTH CHEIGHT) (* ; "copy the old characters over.") + (SETQ CHAROFFSET OFWIDTH) + elseif (NEQ CWIDTH BWIDTH) + then + (* ;; "The bitmaps differ in width; create a new bitmap with things at the right places, then update widths and offsets.") + + (SETQ DW (IDIFFERENCE BWIDTH CWIDTH)) (* ; "Difference in character widths") + (SETQ TEMPBITMAP (BITMAPCREATE (IPLUS OFWIDTH DW) + NHEIGHT BITSPERPIXEL)) + (* ; + "this may also be a taller bitmap if NHEIGHT is larger than CHEIGHT.") + (BITBLT FONTBITMAP 0 0 TEMPBITMAP 0 (IMAX 0 (IDIFFERENCE NDESCENT CDESCENT)) + CHAROFFSET CHEIGHT) (* ; + "Copy that portion to the left of the character.") + (BITBLT FONTBITMAP (IPLUS CHAROFFSET CWIDTH) + 0 TEMPBITMAP (IPLUS CHAROFFSET BWIDTH) + (IMAX 0 (IDIFFERENCE NDESCENT CDESCENT)) + (ADD1 (IDIFFERENCE OFWIDTH (IPLUS CHAROFFSET CWIDTH))) + CHEIGHT) (* ; + "Copy that portion to the right of the new character.") + elseif (OR (IGREATERP BASCENT CASCENT) + (IGREATERP BDESCENT CDESCENT)) + then + (* ;; + "The new character is TALLER than the existing bitmap. Make a larger bitmap.") + + (SETQ TEMPBITMAP (BITMAPCREATE OFWIDTH NHEIGHT BITSPERPIXEL)) + + (* ;; "Copy the existing bitmap into it, adjusting for a larger descent in the new character (if there is one)") + + (BITBLT FONTBITMAP 0 0 TEMPBITMAP 0 (IMAX 0 (IDIFFERENCE NDESCENT CDESCENT)) + OFWIDTH CHEIGHT)) + + (* ;; "copy the new bitmap in and update parameters.") + + (BITBLT NEWCHARBITMAP 0 0 (OR TEMPBITMAP FONTBITMAP) + CHAROFFSET + (IMAX 0 (IDIFFERENCE NDESCENT BDESCENT)) + BWIDTH BHEIGHT) + (CL:WHEN TEMPBITMAP + (UNINTERRUPTABLY + (* ; + "update the parameters for this character set.") + (\FSETWIDTH WIDTHS CODE BWIDTH) (* ; "The new character's correct width") + (* ; + "Make sure that we update imagewidths also") + (CL:WHEN IMWIDTHS (\FSETIMAGEWIDTH IMWIDTHS CODE BWIDTH)) + (\FSETOFFSET OFFSETS CODE CHAROFFSET) + (CL:WHEN DW + (for I from 0 to \MAXTHINCHAR when (IGREATERP (\FGETOFFSET OFFSETS I) + CHAROFFSET) + do + (* ;; + "If the imagewidth has changed, offsets after the modified character have to be adjusted. ") + + (add (\FGETOFFSET OFFSETS I) + DW))) + (replace (CHARSETINFO CHARSETBITMAP) of CSINFO with TEMPBITMAP) + (replace (CHARSETINFO CHARSETDESCENT) of CSINFO with NDESCENT) + (replace (CHARSETINFO CHARSETASCENT) of CSINFO with NASCENT)) + NEWCHARBITMAP)]) +) +(DEFINEQ (MOVECHARBITMAP [LAMBDA (SRCECODE SRCEFONT DESTCODE DESTFONT CLIP) (* ; "Edited 14-Dec-86 18:04 by Shih") @@ -967,216 +1050,662 @@ (IPLUS NEWASCENT NEWDESCENT] (PUTCHARBITMAP DESTCODE DESTFONT (OR TEMPBITMAP CHARBITMAP) NEWDESCENT]) + +(MOVEFONTCHARS + [LAMBDA (PAIRS DEVICE DESTFONT DEFAULTSOURCEFONT) (* ; "Edited 7-Jun-2025 00:06 by rmk") + (* ; "Edited 23-May-2025 15:02 by rmk") + (* ; "Edited 22-May-2025 09:52 by rmk") + (* ; "Edited 13-May-2025 08:56 by rmk") + (* ; "Edited 1-May-2025 13:20 by rmk") + + (* ;; "The character information for schar in sfont replaces the information for the destination character in the destination font.") + + (* ;; "Pairs is a list of (SOURCE DEST) pairs where each SOURCE is a list of the form (schar/code sfont) or just a character, and each DEST is a destination character/code. If a pair is a character code C, it is treated as (C C).") + + (* ;; "If a pair does not contain its own source font, then information is extracted from the DEFAULTSOURCEFONT. If the DEFAULTSOURCEFONT is not provided, thenSFONT it is assumed that the source is the DESTFONT (which must always be provided).") + + (* ;; "This collects the source information for all the pairs before it starts, to make sure that it doesn't step on itself when source and destination are the same font.") + + (* ;; "For DISPLAY devices (the default), the bitmap is also moved.") + + (CL:UNLESS DEVICE + (SETQ DEVICE 'DISPLAY)) + (SETQ DESTFONT (FONTCREATE DESTFONT NIL NIL NIL DEVICE)) + (SETQ DEFAULTSOURCEFONT (CL:IF DEFAULTSOURCEFONT + (FONTCREATE DEFAULTSOURCEFONT NIL NIL NIL DEVICE) + DESTFONT)) + + (* ;; "Fix/check arguments, and expand out the information for all the source characters, so there is no toe-stepping if there are overlaps.") + + (SETQ PAIRS (for P S SCODE SFONT DCODE in PAIRS + collect (CL:WHEN (SMALLP P) + (SETQ P (LIST P P))) + (SETQ S (CAR P)) + (SETQ DCODE (CADR P)) + (CL:UNLESS (CHARCODEP DCODE) + (SETQ DCODE (CHARCODE.DECODE DCODE))) + (SETQ SCODE (CL:IF (LISTP S) + (CAR S) + S)) + (CL:UNLESS (CHARCODEP S) + (SETQ SCODE (CHARCODE.DECODE SCODE))) + (SETQ SFONT (CL:IF (LISTP S) + (FONTCREATE (CADR S) + NIL NIL NIL DEVICE) + DEFAULTSOURCEFONT)) + (LIST (LIST SCODE (\GETFONTCHARINFO (\INSURECHARSETINFO (\CHARSET SCODE) + SFONT) + (\CHAR8CODE SCODE))) + DCODE))) + + (* ;; "Install source character information into the destination font. ") + + (for P DCHARCODE DCSINFO ASCENT DESCENT in PAIRS + do (SETQ DCHARCODE (CADR P)) + (SETQ DCSINFO (\INSURECHARSETINFO (\CHARSET DCHARCODE) + DESTFONT)) + (CL:WHEN (fetch (CHARSETINFO CSSLUGP) of DCSINFO) (* ; "Break the slug-sharing") + (SETQ DCSINFO (create CHARSETINFO copying DCSINFO CSSLUGP _ NIL)) + (\SETCHARSETINFO (fetch (FONTDESCRIPTOR FONTCHARSETVECTOR)) + (\CHARSET DCHARCODE) + DCSINFO)) + (\MOVEFONTCHAR (CADAR P) + DCSINFO + (\CHAR8CODE (CAAR P)) + (\CHAR8CODE DCHARCODE)) + (SETQ DESCENT (IMAX (fetch (CHARSETINFO CHARSETDESCENT) of DCSINFO) + (fetch (FONTDESCRIPTOR \SFDescent) of DESTFONT))) + (SETQ ASCENT (IMAX (fetch (CHARSETINFO CHARSETASCENT) of DCSINFO) + (fetch (FONTDESCRIPTOR \SFAscent) of DESTFONT))) + (replace (FONTDESCRIPTOR \SFAscent) of DESTFONT with ASCENT) + (replace (FONTDESCRIPTOR \SFDescent) of DESTFONT with DESCENT) + (replace (FONTDESCRIPTOR \SFHeight) of DESTFONT with (IPLUS DESCENT ASCENT))) + DESTFONT]) + +(\MOVEFONTCHAR + [LAMBDA (SCHARINFO DCSINFO SCODE DCODE) (* ; "Edited 7-Jun-2025 14:43 by rmk") + + (* ;; "Internal CSINFO-level function to move the information for (thinchar) SCODE in the source CSINFO to (thinchar) DCODE) in the destination CSINFO.") + + (* ;; "The caller (MOVEFONTCHARS) may have provided the source character information as an alist structure to avoid clobbering stepping on toes. If SCHARINFO is a CSINFO, the alist is extracted here.") + + (CL:WHEN (type? CHARSETINFO SCHARINFO) + (SETQ SCHARINFO (\GETFONTCHARINFO SCHARINFO SCODE))) + (LET (DESCENT ASCENT) + + (* ;; "We have to split the width and imagewidth vectors in preparation, if the source values are different but the dest vectors are EQ. ") + + (CL:WHEN [AND (NEQ (CDR (ASSOC 'WIDTH SCHARINFO)) + (CDR (ASSOC 'IMAGEWIDTH SCHARINFO))) + (OR (EQ (ffetch (CHARSETINFO WIDTHS) of DCSINFO) + (ffetch (CHARSETINFO IMAGEWIDTHS) of DCSINFO)) + (NULL (ffetch (CHARSETINFO IMAGEWIDTHS) of DCSINFO] + (replace (CHARSETINFO IMAGEWIDTHS) of DCSINFO with (\COPYARRAYBLOCK (ffetch (CHARSETINFO + WIDTHS) + of DCSINFO)))) + (CL:WHEN (CDR (ASSOC 'BITMAP SCHARINFO)) + (\PUTCHARBITMAP.CSINFO DCODE DCSINFO (CDR (ASSOC 'BITMAP SCHARINFO)) + (CDR (ASSOC 'DESCENT SCHARINFO)))) + (\FSETWIDTH (ffetch (CHARSETINFO WIDTHS) of DCSINFO) + DCODE + (CDR (ASSOC 'WIDTH SCHARINFO))) + (\FSETWIDTH (ffetch (CHARSETINFO IMAGEWIDTHS) of DCSINFO) + DCODE + (CDR (ASSOC 'IMAGEWIDTH SCHARINFO))) + (CL:WHEN (AND (CDR (ASSOC 'YWIDTH SCHARINFO)) + (ffetch (CHARSETINFO YWIDTHS) of DCSINFO)) + (* ; "Is YWIDTHS real?") + (\FSETWIDTH (ffetch (CHARSETINFO YWIDTHS) of DCSINFO) + DCODE + (CDR (ASSOC 'YWIDTH SCHARINFO)))) + (CL:WHEN (CDR (ASSOC 'LEFTKERN SCHARINFO)) (* ; "Not sure what LEFTKERN really is") + (CL:UNLESS (CL:ARRAYP (ffetch (CHARSETINFO LEFTKERN) of DCSINFO)) + (replace (CHARSETINFO LEFTKERN) of DCSINFO with (\CREATEKERNELEMENT))) + (CL:SETF (CL:SVREF (ffetch (CHARSETINFO LEFTKERN) of DCSINFO) + DCODE) + (CDR (ASSOC 'LEFTKERN SCHARINFO)))) + (SETQ DESCENT (IMAX (CDR (ASSOC 'DESCENT SCHARINFO)) + (fetch (CHARSETINFO CHARSETDESCENT) of DCSINFO))) + (SETQ ASCENT (IMAX (CDR (ASSOC 'ASCENT SCHARINFO)) + (fetch (CHARSETINFO CHARSETASCENT) of DCSINFO))) + (replace (CHARSETINFO CHARSETDESCENT) of DCSINFO with DESCENT) + (replace (CHARSETINFO CHARSETASCENT) of DCSINFO with ASCENT) + (replace (CHARSETINFO CSSLUGP) of DCSINFO with NIL) + DCSINFO]) + +(SLUGCHARP.DISPLAY + [LAMBDA (CODE FONT/CHARSETINFO) (* ; "Edited 6-Jun-2025 10:24 by rmk") + (* ; "Edited 31-May-2025 23:44 by rmk") + + (* ;; "True if CODE is currently a slug in FONT or the particular CHARSETINFO. If we are given a CSINFO, CODE is alread charset-relative.") + + (LET [(CSINFO (CL:IF (type? CHARSETINFO FONT/CHARSETINFO) + FONT/CHARSETINFO + (\XGETCHARSETINFO FONT/CHARSETINFO (\CHARSET CODE)))] + (OR (NULL CSINFO) + (fetch (CHARSETINFO CSSLUGP) of CSINFO) + (EQ (\GETBASE (fetch (CHARSETINFO OFFSETS) of CSINFO) + (\CHAR8CODE CODE)) + (\GETBASE (fetch (CHARSETINFO OFFSETS) of CSINFO) + (ADD1 \MAXTHINCHAR]) + +(\GETFONTCHARINFO + [LAMBDA (CHARSETINFO CHAR8CODE) (* ; "Edited 7-Jun-2025 14:35 by rmk") + + (* ;; "Extracts the information about CHAR8CODE from its CHARSETINFO, holding it against the possibility that the CSINFO gets smashed.") + + `((ASCENT \, (fetch (CHARSETINFO CHARSETASCENT) of CHARSETINFO)) + (DESCENT \, (fetch (CHARSETINFO CHARSETDESCENT) of CHARSETINFO)) + (WIDTH \, (\FGETWIDTH (ffetch (CHARSETINFO WIDTHS) of CHARSETINFO) + CHAR8CODE)) + (YWIDTH \, (\FGETWIDTH (ffetch (CHARSETINFO YWIDTHS) of CHARSETINFO) + CHAR8CODE)) + (IMAGEWIDTH \, (\FGETWIDTH (ffetch (CHARSETINFO IMAGEWIDTHS) of CHARSETINFO) + CHAR8CODE)) + (LEFTKERN \, (CL:WHEN (CL:ARRAYP (fetch (CHARSETINFO LEFTKERN) of CHARSETINFO)) + (CL:SVREF (fetch (CHARSETINFO LEFTKERN) of CHARSETINFO) + CHAR8CODE))) + ,@(CL:WHEN (fetch (CHARSETINFO CHARSETBITMAP) of CHARSETINFO) + (LIST (CONS 'BITMAP (\GETCHARBITMAP.CSINFO CHAR8CODE CHARSETINFO))))]) ) -(DEFINEQ -(FONTCOPY - [LAMBDA FONTSPECS (* ; "Edited 10-Nov-87 17:12 by FS") - (* ; - "makes a copy of a font changing the specified fields.") - (PROG (NOERROR ERROR FAMILY FACE SIZE ROTATION DEVICE OLDFONT) - (* ;; "Set NOERROR if we find it as a prop, but set ERROR if we find a PROP which is illegal. Then just return NIL if NOERROR and ERROR, otherwise, call FONTCREATE.") - [SETQ OLDFONT (\GETFONTDESC (ARG FONTSPECS 1) - (AND (type? FONTCLASS (ARG FONTSPECS 1)) - (COND - ((AND (EQ FONTSPECS 2) - (LISTP (ARG FONTSPECS 2))) - (LISTGET (ARG FONTSPECS 2) - 'DEVICE)) - (T (for I from 2 by 2 to FONTSPECS - do (COND - ((AND (NEQ I FONTSPECS) - (EQ (ARG FONTSPECS I) - 'DEVICE)) - (RETURN (ARG FONTSPECS (ADD1 I] - (SETQ FAMILY (fetch (FONTDESCRIPTOR FONTFAMILY) of OLDFONT)) - (SETQ SIZE (fetch (FONTDESCRIPTOR FONTSIZE) of OLDFONT)) - (SETQ FACE (fetch (FONTDESCRIPTOR FONTFACE) of OLDFONT)) - (SETQ ROTATION (fetch (FONTDESCRIPTOR ROTATION) of OLDFONT)) - (SETQ DEVICE (fetch (FONTDESCRIPTOR FONTDEVICE) of OLDFONT)) - [for I VAL from 2 by 2 to FONTSPECS - do [SETQ VAL (COND - ((NOT (EQ I FONTSPECS)) - (ARG FONTSPECS (ADD1 I] - (SELECTQ (ARG FONTSPECS I) - (FAMILY (SETQ FAMILY VAL)) - (SIZE (SETQ SIZE VAL)) - (FACE (SETQ FACE (\FONTFACE VAL))) - (WEIGHT (SETQ FACE (create FONTFACE using FACE WEIGHT _ VAL))) - (SLOPE (SETQ FACE (create FONTFACE using FACE SLOPE _ VAL))) - (EXPANSION (SETQ FACE (create FONTFACE using FACE EXPANSION _ VAL))) - (BACKCOLOR (SETQ FACE (create FONTFACE using FACE BACKCOLOR _ VAL))) - (FORECOLOR (SETQ FACE (create FONTFACE using FACE FORECOLOR _ VAL))) - (ROTATION (SETQ ROTATION VAL)) - (DEVICE (SETQ DEVICE VAL)) - (NOERROR (SETQ NOERROR VAL)) - (COND - [(AND (EQ I 2) - (EQ FONTSPECS 2) - (LISTP (ARG FONTSPECS 2))) - (for J on (ARG FONTSPECS 2) by (CDDR J) - do (SETQ VAL (CADR J)) - (SELECTQ (CAR J) - (FAMILY (SETQ FAMILY VAL)) - (SIZE (SETQ SIZE VAL)) - (FACE (SETQ FACE (\FONTFACE VAL))) - (WEIGHT (SETQ FACE (create FONTFACE - using FACE WEIGHT _ VAL))) - (SLOPE (SETQ FACE (create FONTFACE - using FACE SLOPE _ VAL))) - (EXPANSION (SETQ FACE (create FONTFACE - using FACE EXPANSION _ VAL))) - (BACKCOLOR (SETQ FACE (create FONTFACE - using FACE BACKCOLOR _ VAL))) - (FORECOLOR (SETQ FACE (create FONTFACE - using FACE FORECOLOR _ VAL))) - (ROTATION (SETQ ROTATION VAL)) - (DEVICE (SETQ DEVICE VAL)) - (NOERROR (SETQ NOERROR VAL)) - (COND - (NOERROR +(* ;; +"\FINDFONTFILE \FONTFILENAME \SEARCHFONTFILES \FONTINFOFROMFILENAME are redefined to deal with character-set directories. That behavior is conditioned on the setting of the global variable *USEOLDFONTDIRECTORIES*, T at PARC, maybe NIL most other places. " +) - (* ;; - "Fell through the SELECTQ, so an illegal PROP. But, if NOERROR, just note the error, otherwise ") +(DEFINEQ - (SETQ ERROR T)) - (T (\ILLEGAL.ARG (CAR J] - (T (if NOERROR - then (SETQ ERROR T) - else (\ILLEGAL.ARG (ARG FONTSPECS I] - (RETURN (if (AND NOERROR ERROR) - then NIL - else (FONTCREATE FAMILY SIZE FACE ROTATION DEVICE NOERROR]) +(FONTFILES + [LAMBDA (FAMILY SIZE FACE ROTATION DEVICE CHARSET DIRLST EXTLST) + (* ; "Edited 9-Jun-2025 09:57 by rmk") + (* ; "Edited 17-May-2025 00:06 by rmk") + (* ; "Edited 15-May-2025 16:29 by rmk") -(FONTSAVAILABLE - [LAMBDA (FAMILY SIZE FACE ROTATION DEVICE CHECKFILESTOO?) - (* rrb " 7-Nov-84 15:41") + (* ;; "Considers all posible names for font files that respect the given characteristics, returns a list of the names of files that actually exist somewhere in DIRLST. Does not validate their contents.") -(* ;;; "returns a list of the fonts fitting a description that are available. FAMILY SIZE FACE or ROTATION can be * which means get them all. if LOADEDONLYFLG is non-NIL, only fonts in core will be considered.") + (APPEND (MKLIST (\FINDFONTFILE FAMILY SIZE FACE ROTATION DEVICE 'ALL DIRLST EXTLST)) + (MKLIST (\FINDFONTFILE FAMILY SIZE FACE ROTATION DEVICE CHARSET DIRLST EXTLST]) - (DECLARE (GLOBALVARS IMAGESTREAMTYPES)) - (PROG (FONTX DEV) - [SETQ DEV (COND - ((type? STREAM DEVICE) - (COND - ((LISTP (SETQ DEV (IMAGESTREAMTYPE DEVICE))) - (CAR DEV)) - (T DEV))) - (DEVICE) - (T 'DISPLAY] - (RETURN - (COND - ((LISTP FAMILY) - (COND - ((EQ (CAR FAMILY) - 'FONT) - (SETQ FONTX (CDR FAMILY))) - (T (SETQ FONTX FAMILY))) - (FONTSAVAILABLE (CAR FONTX) - (OR (CADR FONTX) - SIZE) - (OR (CADDR FONTX) - FACE) - (OR (CADDDR FONTX) - ROTATION) - DEV CHECKFILESTOO?)) - ([SETQ FONTX (COND - ((type? FONTDESCRIPTOR FAMILY) - FAMILY) - ((NULL FAMILY) - (DEFAULTFONT DEV)) - ((type? FONTCLASS FAMILY) +(\FINDFONTFILE + [LAMBDA (FAMILY SIZE FACE ROTATION DEVICE CHARSET DIRLST EXTLST) + (* ; "Edited 9-Jun-2025 09:40 by rmk") + (* ; "Edited 15-May-2025 22:41 by rmk") + (* ; "Edited 14-Sep-96 10:53 by rmk:") + (* ; "Edited 6-Oct-89 11:18 by bvm") + + (* ;; "Find any font file on any directory with any naming convention with any extension. Note that ROTATION and DEVICE are just place holders. DEVICE is irrelevant because DIRLST already incorporates the device information. The variable *OLD-FONT-EXTENSIONS* can be set to suppress using the old-style lookup. If set to a list of extensions, just those will be looked up with old-style conventions.") + + (for EXT FONTFILE inside EXTLST + when (SETQ FONTFILE (FINDFILE (if (FMEMB EXT *OLD-FONT-EXTENSIONS*) + then (\FONTFILENAME.OLD FAMILY SIZE FACE EXT CHARSET) + else (\FONTFILENAME FAMILY SIZE FACE EXT CHARSET)) + T DIRLST)) collect FONTFILE finally + + (* ;; + "Backward compatibility for devices that expect a single file") + + (CL:UNLESS (CDR $$VAL) + (RETURN (CAR $$VAL)))]) + +(\FONTFILENAMES + [LAMBDA (FAMILY SIZE FACE DEVICE EXTENSIONS) (* ; "Edited 17-May-2025 12:15 by rmk") + (APPEND [for EXT inside EXTENSIONS collect (IF (FMEMB EXT *OLD-FONT-EXTENSIONS*) + THEN (\FONTFILENAME.OLD FAMILY SIZE FACE EXT + 'ALL) + ELSE (\FONTFILENAME FAMILY SIZE FACE EXT + 'ALL] + (for EXT inside EXTENSIONS collect (IF (FMEMB EXT *OLD-FONT-EXTENSIONS*) + THEN (\FONTFILENAME.OLD FAMILY SIZE FACE EXT 0) + ELSE (\FONTFILENAME FAMILY SIZE FACE EXT 0]) - (* ;; "We know that this won't attempt a cyclic fontcreate in \COERCEFONTDESC, because we are passing a known class. Unless NOERROFLG, an error will be caused on the actual device font if it can't be found.") - (* ; - "I don't know what to do in this case- rrb.") - (\COERCEFONTDESC FAMILY DEV T)) - ((OR (IMAGESTREAMP FAMILY) - (type? WINDOW FAMILY)) - (DSPFONT NIL FAMILY] (* ; - "FAMILY was a spec for a font descriptor, use it and extend it by the other args.") - (FONTSAVAILABLE (FONTPROP FONTX 'FAMILY) - (OR SIZE (FONTPROP FONTX 'SIZE)) - (OR FACE (FONTPROP FONTX 'FACE)) - (OR ROTATION (FONTPROP FONTX 'ROTATION)) - (OR DEVICE (FONTPROP FONTX 'DEVICE)) - CHECKFILESTOO?)) - (T (PROG ((FONTFACE FACE)) - RETRY - (OR (LITATOM FAMILY) - (LISPERROR "ARG NOT LITATOM" FAMILY T)) - (OR (AND (FIXP SIZE) - (IGREATERP SIZE 0)) - (EQ SIZE '*) - (\ILLEGAL.ARG SIZE)) - [OR (EQ FONTFACE '*) - (SETQ FONTFACE (OR (\FONTFACE FACE T) - (RETURN NIL] - (OR (U-CASEP FAMILY) - (SETQ FAMILY (U-CASE FAMILY))) - (COND - ((NULL ROTATION) - (SETQ ROTATION 0)) - ((AND (FIXP ROTATION) - (IGEQ ROTATION 0))) - ((EQ ROTATION '*)) - (T (\ILLEGAL.ARG ROTATION))) - (RETURN (UNION (\LOOKUPFONTSINCORE FAMILY SIZE FONTFACE ROTATION DEV) - (COND - ((NOT CHECKFILESTOO?) - NIL) - [(EQ DEV '*) (* ; "map thru all the devices.") - (for EXTANTDEV in IMAGESTREAMTYPES - join (APPLY* (OR (CADR (ASSOC 'FONTSAVAILABLE - (CDR EXTANTDEV))) - (FUNCTION NILL)) - FAMILY SIZE FONTFACE ROTATION - (CAR EXTANTDEV] - (T (* ; - "apply the device font lookup function.") - (APPLY* (OR [CADR (ASSOC 'FONTSAVAILABLE - (CDR (ASSOC DEV IMAGESTREAMTYPES - ] - (FUNCTION NILL)) - FAMILY SIZE FONTFACE ROTATION DEV]) +(\FONTFILENAME + [LAMBDA (FAMILY SIZE FACE EXTENSION CHARSET) (* ; "Edited 15-May-2025 15:51 by rmk") + (* ; "Edited 5-Mar-93 16:10 by rmk:") -(FONTFILEFORMAT - [LAMBDA (STRM LEAVEOPEN) (* rmk%: "11-Sep-84 17:16") - (* ; "Returns the font format of STRM") - [OR (OPENP STRM 'INPUT) - (SETQ STRM (OPENSTREAM STRM 'INPUT 'OLD] - (PROG1 (SELECTC (\WIN STRM) - ((LIST (LLSH 1 15) - (LOGOR (LLSH 1 15) - (LLSH 1 13))) + (* ;; "Strike file naming convention (w/o dashes, no charset) no longer supported. New name is of the form %"familysize-face-Ccharset.ext%", e.g., MODERN12-MRR-C357.WD") - (* ;; "If high bit of type is on, then must be strike. If 2nd bit is on, must be strike-index, and we punt. We don't care about the 3rd bit") + (* ;; "**bvm 10/5/89 Slight change: partition fonts into subdirectories by charset, e.g., all Charset zero fonts are in subdirectory C0>. This significantly speeds up any font operation that requires any local directory work (e.g., NFS servers on both Sun and D machine), and FONTSAVAILABLE on any device (since it doesn't have to wade thru all those charsets). This behavior is conditioned on the value of *USEOLDFONTDIRECTORIES*") - - (* ;; "first word has high bits (onebit index fixed). Onebit means 'new-style font' , index is 0 for simple strike, 1 for index, and fixed is if all chars have max width. Lisp doesn't care about 'fixed'") + (SETQ FACE (\FONTFACE FACE)) (* ; "Validate face") + (LET* ([SIZEPATT (COND + ((EQ SIZE '*) + SIZE) + ((FIXP SIZE) + (if (< SIZE 10) + then (CONCAT 0 SIZE) + else SIZE)) + (T (\ILLEGAL.ARG SIZE] + (CSETNAME (COND + ((OR (NULL CHARSET) + (EQ CHARSET 0)) (* ; "Charset defaults to zero.") + "0") + ((FIXP CHARSET) + (LET ((*PRINT-BASE* 8) + (*PRINT-RADIX* NIL)) (* ; "Longhand for (cl:write-to-string charset :radix nil :base 8), which is twice as slow, due to lousy keyword handling") + (\PRINDATUM.TO.STRING CHARSET))) + ((MEMB CHARSET '(T ALL)) (* ; "Don't want the charset indicatged") + NIL) + (T (* ; "Somebody made the string already?") + CHARSET))) + [FACESPEC (LIST (CHCON1 (fetch (FONTFACE WEIGHT) of FACE)) + (CHCON1 (fetch (FONTFACE SLOPE) of FACE)) + (CHCON1 (fetch (FONTFACE EXPANSION) of FACE] + (TAIL FACESPEC)) + [if (OR (EQ (CAR TAIL) + (CHARCODE *)) + (EQ (CAR (SETQ TAIL (CDR TAIL))) + (CHARCODE *))) + then (* ; + "Avoid adjacent wildcards because some devices (notably DSK) get exponentially slower.") + (while (EQ (CADR TAIL) + (CHARCODE *)) do (RPLACD TAIL (CDDR TAIL] + + (* ;; "Fortunately, CONCAT ignores packages.") + + (PACKFILENAME.STRING 'NAME (CONCAT (if *USEOLDFONTDIRECTORIES* + then "" + elseif CSETNAME + then (CONCAT (PROGN + (* ; + "Lowercase because it's in a directory name, so maybe Unix will find it sooner?") + "c") + CSETNAME ">") + else "") + FAMILY SIZEPATT "-" (CONCATCODES FACESPEC) + (CL:IF CSETNAME + (CONCAT "-C" CSETNAME) + "")) + 'EXTENSION EXTENSION]) - 'STRIKE) - ((LOGOR (LLSH 16 8) - 12) - (* ;; "This is the length of a standard index header. Other files could also have this value, but it's a pretty good discriminator") +(\FONTFILENAME.OLD + [LAMBDA (FAMILY SIZE FACE EXTENSION CHARSET) (* ; "Edited 23-Sep-92 18:22 by jds") - - (* ;; "Skip to byte 25; do it with BINS so works for non-randaccessp devices. This skips the standard name header, then look for type 3 in the following header") + (* ;; "Returns old style font file names. They were ambiguous because you could not ask for e.g. FACE (MEDIUM * REGULAR) because it maps to FamilySize-*-Charset, which also matches (BOLD * COMPRESSED), etc. Keep this function around though for user's who don't rename their files.") + (* ; + "Returns the name of the file that should contain the information for a font.") + (SETQ FACE (\FONTFACE FACE)) (* ; "Force legal canonical face") + (SETQ FACE (COND + ((AND (EQ (CAR FACE) + '*) + (EQ (CADR FACE) + '*)) - (FRPTQ 22 (\BIN STRM)) (* ; "(SETFILEPTR STRM 25)") - (AND (EQ 3 (LRSH (\BIN STRM) - 4)) - 'AC)) - NIL) - (OR LEAVEOPEN (CLOSEF STRM)))]) + (* ;; "Avoid adjacent wildcards because DSK gets slower exponentially (can take loooong tiiiiiime). No need to check compression.") -(FONTP - [LAMBDA (X) (* rmk%: "13-Sep-84 09:04") - (* ; "is X a FONTDESCRIPTOR?") - (COND - ((OR (type? FONTDESCRIPTOR X) + '*) + (T FACE))) + (PACKFILENAME.STRING 'NAME [PROGN + (* ;; "DISPLAYFONT AC WD and the default case") + + (CONCAT (CDR (SASSOC FAMILY *DISPLAY-FONT-NAME-MAP*)) + (COND + ((EQ SIZE '*) + SIZE) + ((FIXP SIZE) + (COND + ((< SIZE 10) + (CONCAT 0 SIZE)) + (T SIZE))) + (T (\ILLEGAL.ARG SIZE))) + [COND + ((EQ FACE '*) + '*) + (T (SELECTQ (fetch WEIGHT of FACE) + (BOLD (SELECTQ (fetch SLOPE of FACE) + (ITALIC "D") + "B")) + (SELECTQ (fetch SLOPE of FACE) + (ITALIC "I") + "R"] + (COND + ((FIXP CHARSET) + (LET ((*PRINT-BASE* 8)) + (CL:FORMAT NIL "~O" CHARSET))) + (T "000"] + 'EXTENSION EXTENSION]) + +(\FONTFILENAME.NEW + [LAMBDA (FAMILY SIZE FACE EXTENSION CHARSET) (* ; "Edited 30-Mar-87 20:00 by FS") + + (* ;; "Strike file naming convention (w/o dashes, no charset) no longer supported.") + + (LET (NAME SIZEPATT) + (SETQ FACE (\FONTFACE FACE)) (* ; "Validate face") + [SETQ SIZEPATT (COND + ((EQ SIZE '*) + SIZE) + ((FIXP SIZE) + (if (< SIZE 10) + then (CONCAT 0 SIZE) + else SIZE)) + (T (\ILLEGAL.ARG SIZE] + + (* ;; "Avoid adjacent wildcards because some devices (notably DSK) get exponentially slower. Nicely, PACK & CONCAT ignore packages.") + + (PACKFILENAME.STRING 'NAME (CONCAT FAMILY SIZEPATT "-" + [COND + ((EQUAL FACE ' + + (* * *) +) + '*) + (T (CONCAT (NTHCHAR (fetch (FONTFACE WEIGHT) + of FACE) + 1) + (NTHCHAR (fetch (FONTFACE SLOPE) + of FACE) + 1) + (NTHCHAR (fetch (FONTFACE EXPANSION) + of FACE) + 1] + (COND + [(FIXP CHARSET) + (LET ((*PRINT-BASE* 8)) + (CONCAT "-C" (\PRINDATUM.TO.STRING CHARSET] + (CHARSET (CONCAT "-C" CHARSET)) + (T "-C0"))) + 'EXTENSION EXTENSION]) + +(\FONTINFOFROMFILENAME + [LAMBDA (FONTFILE DEVICE) (* ; "Edited 14-Sep-96 10:23 by rmk:") + (* ; "Edited 5-Oct-89 18:28 by bvm") + + (* ;; "returns a list of the family size face rotation device of the font stored in the file name FONTFILE. Rotation is 0 always. Parses both new & old format files.") + + (LET ((FILENAMELIST (UNPACKFILENAME.STRING FONTFILE)) + CH SIZEBEG SIZEND NAME FAMILY SIZE FACE EXT) + (SETQ NAME (LISTGET FILENAMELIST 'NAME)) (* ; + "find where the name and size are. MUST check for ch nil below or possible infinite loop") + (SETQ SIZEBEG (for CH# from 1 when (OR (NUMBERP (SETQ CH (NTHCHAR NAME CH#))) + (NULL CH)) do (RETURN CH#))) + + (* ;; "Get Family") + + [SETQ FAMILY (MKATOM (U-CASE (SUBSTRING NAME 1 (SUB1 SIZEBEG] + + (* ;; "Get Size") + + [SETQ SIZEND (find CH# from SIZEBEG suchthat (NOT (NUMBERP (NTHCHAR NAME CH#] + [SETQ SIZE (MKATOM (SUBSTRING NAME SIZEBEG (SUB1 SIZEND] + (if (EQ (NTHCHAR NAME SIZEND) + '-) + then (SETQ SIZEND (ADD1 SIZEND))) + + (* ;; "Get Face") + + (SETQ NAME (U-CASE NAME)) (* ; + "don't need name, but checks for lowercase face") + [SETQ FACE (LIST (COND + ((STRPOS "B" NAME SIZEND NIL T NIL UPPERCASEARRAY) + 'BOLD) + ((STRPOS "L" NAME SIZEND NIL T NIL UPPERCASEARRAY) + 'LIGHT) + (T 'MEDIUM)) + (COND + ((STRPOS "I" NAME SIZEND NIL NIL NIL UPPERCASEARRAY) + 'ITALIC) + (T 'REGULAR)) + (COND + ((STRPOS "E" NAME SIZEND NIL NIL NIL UPPERCASEARRAY) + 'EXPANDED) + ((STRPOS "C-" NAME SIZEND NIL NIL NIL UPPERCASEARRAY) + 'COMPRESSED) + (T 'REGULAR] + (LIST FAMILY SIZE FACE 0 (COND + ((STREAMP DEVICE) + (IMAGESTREAMTYPE DEVICE)) + ((NULL DEVICE) + [SETQ EXT (MKATOM (U-CASE (LISTGET FILENAMELIST 'EXTENSION] + (SELECTQ EXT + (WD 'INTERPRESS) + ((STRIKE AC DISPLAYFONT) + 'DISPLAY) + EXT)) + ((LITATOM DEVICE) + (\FONTSYMBOL DEVICE)) + (T DEVICE]) + +(\FONTINFOFROMFILENAME.OLD + [LAMBDA (FONTFILE DEVICE) (* ; "Edited 1-Jan-87 01:29 by FS") + + (* ;; "returns a list of the family size face rotation device of the font stored in the file name FONTFILE.") + + (PROG ((FILENAMELIST (UNPACKFILENAME FONTFILE)) + SIZEBEG SIZEND NAME FAMILY SIZE) + (SETQ NAME (LISTGET FILENAMELIST 'NAME)) (* ; + "find where the name and size are.") + (SETQ SIZEBEG (for CH# from 1 when (NUMBERP (NTHCHAR NAME CH#)) + do (RETURN CH#))) + [SETQ FAMILY (MKATOM (SUBSTRING NAME 1 (SUB1 SIZEBEG] + (SETQ SIZEND (for CH# from SIZEBEG when (NOT (NUMBERP (NTHCHAR NAME CH#))) + do (RETURN CH#))) + [SETQ SIZE (MKATOM (SUBSTRING NAME SIZEBEG (SUB1 SIZEND] + (RETURN (LIST FAMILY SIZE (SELECTQ (LISTGET FILENAMELIST 'EXTENSION) + ((DISPLAYFONT AC WD) + (LIST (COND + ((STRPOS "-B" NAME SIZEND NIL T) + 'BOLD) + (T 'MEDIUM)) + (COND + ((STRPOS "-I" NAME SIZEND NIL) + 'ITALIC) + (T 'REGULAR)) + 'REGULAR)) + (LIST (COND + ((STRPOS "B" NAME SIZEND NIL T) + 'BOLD) + (T 'MEDIUM)) + (COND + ((STRPOS "I" NAME SIZEND NIL) + 'ITALIC) + (T 'REGULAR)) + 'REGULAR)) + 0 DEVICE]) +) + + + +(* (* ; "Do we still want old fonts?") (ADDVARS (*OLD-FONT-EXTENSIONS* STRIKE))) + + +(RPAQ? *OLD-FONT-EXTENSIONS* NIL) + +(RPAQ? *USEOLDFONTDIRECTORIES* NIL) +(DECLARE%: DOEVAL@COMPILE DONTCOPY + +(GLOBALVARS *OLD-FONT-EXTENSIONS* *USEOLDFONTDIRECTORIES*) +) +(DEFINEQ + +(FONTCOPY + [LAMBDA FONTSPECS (* ; "Edited 10-Nov-87 17:12 by FS") + (* ; + "makes a copy of a font changing the specified fields.") + (PROG (NOERROR ERROR FAMILY FACE SIZE ROTATION DEVICE OLDFONT) + + (* ;; "Set NOERROR if we find it as a prop, but set ERROR if we find a PROP which is illegal. Then just return NIL if NOERROR and ERROR, otherwise, call FONTCREATE.") + + [SETQ OLDFONT (\GETFONTDESC (ARG FONTSPECS 1) + (AND (type? FONTCLASS (ARG FONTSPECS 1)) + (COND + ((AND (EQ FONTSPECS 2) + (LISTP (ARG FONTSPECS 2))) + (LISTGET (ARG FONTSPECS 2) + 'DEVICE)) + (T (for I from 2 by 2 to FONTSPECS + do (COND + ((AND (NEQ I FONTSPECS) + (EQ (ARG FONTSPECS I) + 'DEVICE)) + (RETURN (ARG FONTSPECS (ADD1 I] + (SETQ FAMILY (fetch (FONTDESCRIPTOR FONTFAMILY) of OLDFONT)) + (SETQ SIZE (fetch (FONTDESCRIPTOR FONTSIZE) of OLDFONT)) + (SETQ FACE (fetch (FONTDESCRIPTOR FONTFACE) of OLDFONT)) + (SETQ ROTATION (fetch (FONTDESCRIPTOR ROTATION) of OLDFONT)) + (SETQ DEVICE (fetch (FONTDESCRIPTOR FONTDEVICE) of OLDFONT)) + [for I VAL from 2 by 2 to FONTSPECS + do [SETQ VAL (COND + ((NOT (EQ I FONTSPECS)) + (ARG FONTSPECS (ADD1 I] + (SELECTQ (ARG FONTSPECS I) + (FAMILY (SETQ FAMILY VAL)) + (SIZE (SETQ SIZE VAL)) + (FACE (SETQ FACE (\FONTFACE VAL))) + (WEIGHT (SETQ FACE (create FONTFACE using FACE WEIGHT _ VAL))) + (SLOPE (SETQ FACE (create FONTFACE using FACE SLOPE _ VAL))) + (EXPANSION (SETQ FACE (create FONTFACE using FACE EXPANSION _ VAL))) + (BACKCOLOR (SETQ FACE (create FONTFACE using FACE BACKCOLOR _ VAL))) + (FORECOLOR (SETQ FACE (create FONTFACE using FACE FORECOLOR _ VAL))) + (ROTATION (SETQ ROTATION VAL)) + (DEVICE (SETQ DEVICE VAL)) + (NOERROR (SETQ NOERROR VAL)) + (COND + [(AND (EQ I 2) + (EQ FONTSPECS 2) + (LISTP (ARG FONTSPECS 2))) + (for J on (ARG FONTSPECS 2) by (CDDR J) + do (SETQ VAL (CADR J)) + (SELECTQ (CAR J) + (FAMILY (SETQ FAMILY VAL)) + (SIZE (SETQ SIZE VAL)) + (FACE (SETQ FACE (\FONTFACE VAL))) + (WEIGHT (SETQ FACE (create FONTFACE + using FACE WEIGHT _ VAL))) + (SLOPE (SETQ FACE (create FONTFACE + using FACE SLOPE _ VAL))) + (EXPANSION (SETQ FACE (create FONTFACE + using FACE EXPANSION _ VAL))) + (BACKCOLOR (SETQ FACE (create FONTFACE + using FACE BACKCOLOR _ VAL))) + (FORECOLOR (SETQ FACE (create FONTFACE + using FACE FORECOLOR _ VAL))) + (ROTATION (SETQ ROTATION VAL)) + (DEVICE (SETQ DEVICE VAL)) + (NOERROR (SETQ NOERROR VAL)) + (COND + (NOERROR + + (* ;; + "Fell through the SELECTQ, so an illegal PROP. But, if NOERROR, just note the error, otherwise ") + + (SETQ ERROR T)) + (T (\ILLEGAL.ARG (CAR J] + (T (if NOERROR + then (SETQ ERROR T) + else (\ILLEGAL.ARG (ARG FONTSPECS I] + (RETURN (if (AND NOERROR ERROR) + then NIL + else (FONTCREATE FAMILY SIZE FACE ROTATION DEVICE NOERROR]) + +(FONTSAVAILABLE + [LAMBDA (FAMILY SIZE FACE ROTATION DEVICE CHECKFILESTOO?) + (* rrb " 7-Nov-84 15:41") + +(* ;;; "returns a list of the fonts fitting a description that are available. FAMILY SIZE FACE or ROTATION can be * which means get them all. if LOADEDONLYFLG is non-NIL, only fonts in core will be considered.") + + (DECLARE (GLOBALVARS IMAGESTREAMTYPES)) + (PROG (FONTX DEV) + [SETQ DEV (COND + ((type? STREAM DEVICE) + (COND + ((LISTP (SETQ DEV (IMAGESTREAMTYPE DEVICE))) + (CAR DEV)) + (T DEV))) + (DEVICE) + (T 'DISPLAY] + (RETURN + (COND + ((LISTP FAMILY) + (COND + ((EQ (CAR FAMILY) + 'FONT) + (SETQ FONTX (CDR FAMILY))) + (T (SETQ FONTX FAMILY))) + (FONTSAVAILABLE (CAR FONTX) + (OR (CADR FONTX) + SIZE) + (OR (CADDR FONTX) + FACE) + (OR (CADDDR FONTX) + ROTATION) + DEV CHECKFILESTOO?)) + ([SETQ FONTX (COND + ((type? FONTDESCRIPTOR FAMILY) + FAMILY) + ((NULL FAMILY) + (DEFAULTFONT DEV)) + ((type? FONTCLASS FAMILY) + + (* ;; "We know that this won't attempt a cyclic fontcreate in \COERCEFONTDESC, because we are passing a known class. Unless NOERROFLG, an error will be caused on the actual device font if it can't be found.") + (* ; + "I don't know what to do in this case- rrb.") + (\COERCEFONTDESC FAMILY DEV T)) + ((OR (IMAGESTREAMP FAMILY) + (type? WINDOW FAMILY)) + (DSPFONT NIL FAMILY] (* ; + "FAMILY was a spec for a font descriptor, use it and extend it by the other args.") + (FONTSAVAILABLE (FONTPROP FONTX 'FAMILY) + (OR SIZE (FONTPROP FONTX 'SIZE)) + (OR FACE (FONTPROP FONTX 'FACE)) + (OR ROTATION (FONTPROP FONTX 'ROTATION)) + (OR DEVICE (FONTPROP FONTX 'DEVICE)) + CHECKFILESTOO?)) + (T (PROG ((FONTFACE FACE)) + RETRY + (OR (LITATOM FAMILY) + (LISPERROR "ARG NOT LITATOM" FAMILY T)) + (OR (AND (FIXP SIZE) + (IGREATERP SIZE 0)) + (EQ SIZE '*) + (\ILLEGAL.ARG SIZE)) + [OR (EQ FONTFACE '*) + (SETQ FONTFACE (OR (\FONTFACE FACE T) + (RETURN NIL] + (OR (U-CASEP FAMILY) + (SETQ FAMILY (U-CASE FAMILY))) + (COND + ((NULL ROTATION) + (SETQ ROTATION 0)) + ((AND (FIXP ROTATION) + (IGEQ ROTATION 0))) + ((EQ ROTATION '*)) + (T (\ILLEGAL.ARG ROTATION))) + (RETURN (UNION (\LOOKUPFONTSINCORE FAMILY SIZE FONTFACE ROTATION DEV) + (COND + ((NOT CHECKFILESTOO?) + NIL) + [(EQ DEV '*) (* ; "map thru all the devices.") + (for EXTANTDEV in IMAGESTREAMTYPES + join (APPLY* (OR (CADR (ASSOC 'FONTSAVAILABLE + (CDR EXTANTDEV))) + (FUNCTION NILL)) + FAMILY SIZE FONTFACE ROTATION + (CAR EXTANTDEV] + (T (* ; + "apply the device font lookup function.") + (APPLY* (OR [CADR (ASSOC 'FONTSAVAILABLE + (CDR (ASSOC DEV IMAGESTREAMTYPES + ] + (FUNCTION NILL)) + FAMILY SIZE FONTFACE ROTATION DEV]) + +(FONTFILEFORMAT + [LAMBDA (STRM) (* ; "Edited 7-Jun-2025 10:39 by rmk") + (* rmk%: "11-Sep-84 17:16") + (* ; "Returns the font format of STRM") + (RESETLST + (CL:UNLESS (OPENP STRM 'INPUT) + [RESETSAVE NIL `(PROGN (CLOSEF? OLDVALUE]) + (CAR (find FNS in DISPLAYCHARSETFNS suchthat (APPLY* (CADR FNS) + STRM))))]) + +(FONTP + [LAMBDA (X) (* rmk%: "13-Sep-84 09:04") + (* ; "is X a FONTDESCRIPTOR?") + (COND + ((OR (type? FONTDESCRIPTOR X) (type? FONTCLASS X)) X]) @@ -1268,13 +1797,6 @@ (IGEQ CHCODE 0) (ILEQ CHCODE \MAXNSCHAR]) -(EDITCHAR - [LAMBDA (CHARCODE FONT) (* rrb "24-MAR-82 12:22") - (* ; - "calls the bitmap editor on a character of a font") - (PROG ((FONTDESC (\GETFONTDESC FONT))) - (RETURN (PUTCHARBITMAP CHARCODE FONTDESC (EDITBM (GETCHARBITMAP CHARCODE FONTDESC]) - (\STREAMCHARWIDTH [LAMBDA (CHARCODE STREAM TTBL) (* JonL " 8-NOV-83 03:31") @@ -1346,191 +1868,198 @@ \UNITWIDTHSVECTOR]) (\CREATEDISPLAYFONT - [LAMBDA (FAMILY SIZE FACE ROTATION DEVICE CHARSET) (* gbn%: "25-Jan-86 18:02") - (PROG [(FONTDESC (create FONTDESCRIPTOR - FONTDEVICE _ DEVICE - FONTFAMILY _ FAMILY - FONTSIZE _ SIZE - FONTFACE _ FACE - \SFAscent _ 0 - \SFDescent _ 0 - \SFHeight _ 0 - ROTATION _ ROTATION - FONTDEVICESPEC _ (LIST FAMILY SIZE FACE ROTATION DEVICE] - (RETURN (COND - ((\GETCHARSETINFO CHARSET FONTDESC T) - FONTDESC) - (T NIL]) + [LAMBDA (FAMILY SIZE FACE ROTATION DEVICE CHARSET) (* ; "Edited 9-Jun-2025 17:42 by rmk") + (* ; "Edited 7-Jun-2025 15:11 by rmk") + (* ; "Edited 23-May-2025 14:59 by rmk") + (* ; "Edited 22-May-2025 09:52 by rmk") + (* ; "Edited 20-May-2025 13:24 by rmk") + + (* ;; "This would be the right place to do DISPLAYFONTCOERCIONS, but that doesn't work if the target font is only partially instantiated. \GETCHARSETINFO has to know how to do the font coercion.") + (* gbn%: "25-Jan-86 18:02") + (LET [(FONTDESC (create FONTDESCRIPTOR + FONTDEVICE _ DEVICE + FONTFAMILY _ FAMILY + FONTSIZE _ SIZE + FONTFACE _ FACE + \SFAscent _ 0 + \SFDescent _ 0 + \SFHeight _ 0 + ROTATION _ ROTATION + FONTDEVICESPEC _ (LIST FAMILY SIZE FACE ROTATION DEVICE] + (CL:WHEN (\CREATECHARSET CHARSET FONTDESC) + FONTDESC]) (\CREATECHARSET.DISPLAY [LAMBDA (FAMILY SIZE FACE ROTATION DEVICE CHARSET FONTDESC NOSLUG?) + (* ; "Edited 8-Jun-2025 19:57 by rmk") + (* ; "Edited 7-Jun-2025 14:47 by rmk") + (* ; "Edited 20-May-2025 15:00 by rmk") + (* ; "Edited 18-May-2025 23:31 by rmk") (* ; "Edited 14-Jan-88 23:42 by FS") - (* ;; "Color Stuff removed -FS.") + (* ;; "This first tries to map the requested font to another existing font, essentially slapping the characteristics specified here on the target font information. The mapping takes precedence even if the nominal font exists (but then, how would you ever get to see the nominal font). This applies to all font charactersets; the charset coercions may pick one charset from one point in the probe sequence and another charset from a different point, depending on what exists.") - (* ;; "Replace Cond below with") +(* ;;;; "This first tries to find an exact match for the specified characteristics, by reading from a source file and possibly applying an exact rotation. When that fails, it finds at most one entry for the family in one or more mapping alist lists. The tail of that entry is a list of possible coerecions each of the form (Size Altfamily Altsize) where Size is either a sparticular size or *, Altfamily is the target family, and Altsize is optionally another size. The entries are considered in order. An entry applies if its Size is * or it matches SIZE, and it tries for a real charsetinfo for CHARSET in the (Altfamily FACE (OR Altsize SIZE)).") - (* ;; "(PROG (XCSINFO)") + (* ;; "When all coercions have been exhausted and FACE is bold and/or italic, the search process repeats with bold/italice changed to Regular, and algorithmic transformations are applied to the first result, if any.") - (* ;; "(SETQ XCSINFO &)") + (* ;; "") - (* ;; "(COND ((FMEMB DEVICE \\COLORDISPLAYSTREAMTYPES) (SETQ XCSINFO (\\SFMAKECOLOR XCSINFO (OR (|fetch| (FONTFACE BACKCOLOR) |of| FACE) 0) (OR (|fetch| (FONTFACE FORECOLOR) |of| FACE) (MAXIMUMCOLOR (\\DISPLAYSTREAMTYPEBPP DEVICE))) (\\DISPLAYSTREAMTYPEBPP DEVICE)))))") + (* ;; " Example entries:") - (* ;; "(RETURN XCSINFO)))") + (* ;; " (GACHA (* TERMINAL) (* MODERN)(* CLASSIC)") -(* ;;; "tries to build the csinfo required for CHARSET. Does the necessary coercions.") + (* ;; " (MODERN (* CLASSIC)") -(* ;;; -"NOSLUG? means don't create an empty (slug) csinfo if the charset is not found, just return NIL") + (* ;; " (TERMINAL (6 TERMINAL 8) (8 TERMINAL 10)(10 TERMINAL 12)") - (DECLARE (GLOBALVARS DISPLAYFONTCOERCIONS MISSINGDISPLAYFONTCOERCIONS)) + (* ;; "Note that this is all keyed off the original family: Gacha might end up at Classic because Terminal and Modern didn't work out, but that does not depend on the fact that there is a separate mapping for Modern to Classic. This set up is redundant, but we avoid having to recurse through the mappings and thereby possibly lose control.") - (* ;; "DISPLAYFONTCOERCIONS is a list of font coercions, in the form ((user-font real-font) (user-font real-font) ...). Each user-font is a list of FAMILY, and optionally SIZE and CHARSET, (e.g., (GACHA) or (GACHA 10) or (GACHA 10 143)), and each real-font is a similar list.") + (DECLARE (GLOBALVARS DISPLAYFONTCOERCIONS DISPLAYCHARSETCOERCIONS)) - (COND - ((PROG1 (for TRANSL in DISPLAYFONTCOERCIONS bind NEWCSINFO UFONT REALFONT - when (AND (SETQ UFONT (CAR TRANSL)) - (EQ FAMILY (CAR UFONT)) - (OR (NOT (CADR UFONT)) - (EQ SIZE (CADR UFONT))) - (OR (NOT (CADDR UFONT)) - (EQ CHARSET (CADDR UFONT))) - (SETQ REALFONT (CADR TRANSL)) - (SETQ NEWCSINFO (\CREATECHARSET.DISPLAY (OR (CAR REALFONT) - FAMILY) - (OR (CADR REALFONT) - SIZE) - FACE ROTATION DEVICE (OR (CADDR REALFONT) - CHARSET) - FONTDESC NOSLUG?))) do (RETURN NEWCSINFO)) - (* ; - "Just recursively call ourselves to handle entries in DISPLAYFONTCOERCIONS") - )) - (T - (* ;; "One weirdness is, if you have a coercion, and the real-font is missing, you can't get a missingfont coercion on the user-font because the real-font missingfont coercion shadows it out.") + (* ;; "DISPLAYFONTCOERCIONS is a list of font coercions, each of the form (userfont coercefont Each user-font is a list of FAMILY, and optionally SIZE and CHARSET, (e.g., (GACHA) or (GACHA 10) or (GACHA 10 143)), and each real-font is a similar list. ") + + (LET (CSINFO) + + (* ;; "If no DISPLAYFONTCOERCIONS, skip that first \COERCECHARSET call--easier debugging of the other case.") + + [SETQ CSINFO (OR (AND DISPLAYFONTCOERCIONS (\COERCECHARSET FAMILY SIZE FACE ROTATION DEVICE + CHARSET DISPLAYFONTCOERCIONS)) + (\CREATE-REAL-CHARSET.DISPLAY FAMILY SIZE FACE ROTATION DEVICE CHARSET + DISPLAYCHARSETCOERCIONS) + (\GETBASEPTR (ffetch FONTCHARSETVECTOR of FONTDESC) + (UNFOLD (ADD1 \MAXCHARSET) + 2)) + (\SETCHARSETINFO (ffetch FONTCHARSETVECTOR of FONTDESC) + (ADD1 \MAXCHARSET) + (\BUILDSLUGCSINFO (fetch (FONTDESCRIPTOR FONTAVGCHARWIDTH) + of FONTDESC) + (FONTPROP FONTDESC 'ASCENT) + (FONTPROP FONTDESC 'DESCENT) + (FONTPROP FONTDESC 'DEVICE] + (\COMPLETECHARSET.CSINFO CSINFO FAMILY SIZE FACE ROTATION DEVICE CHARSET + DISPLAYCHARSETCOERCIONS) + CSINFO]) - (\CREATE-REAL-CHARSET.DISPLAY FAMILY SIZE FACE ROTATION DEVICE CHARSET FONTDESC NOSLUG? - ]) +(\COERCECHARSET + [LAMBDA (FAMILY SIZE FACE ROTATION DEVICE CHARSET COERCIONS CODE) + (* ; "Edited 8-Jun-2025 19:36 by rmk") + (* ; "Edited 7-Jun-2025 13:39 by rmk") + (* ; "Edited 21-May-2025 10:50 by rmk") + (* ; "Edited 17-May-2025 21:32 by rmk") + + (* ;; "COERCIONS is a set of (oldspec newspec) pairs, where a spec is either just a font name or a font name with a size. If oldspec matches the current requested characteristics, then \CREATE-REAL-CHARSET.DISPLAY recurses. ") + + (* ;; "That may not be optimal. If a given newspec can't be found, maybe there is a specification later in the map that would be better than depending on the recursive coercion. For example, it might try to boldify something before it finds a better alternative to start with.") + + (* ;; "Suppose we are looking for Gacha Bold for the character set 41. If Gacha maps to Terminal and Terminal has 41 but not bold, we might want it to bolidify Terminal 41, but we might do better first to see whetherDFc") + + (* ;; " ") + + (* ;; "If CODE is given, this passes over candidates that don't instantiate CODE") + + (for C REALFONT CSINFO CFONT in COERCIONS when [AND (SETQ CFONT (CAR C)) + (EQ FAMILY (CAR CFONT)) + (OR (NOT (CADR CFONT)) + (EQ SIZE (CADR CFONT))) + (OR (NOT (CADDR CFONT)) + (EQ CHARSET (CADDR CFONT))) + (SETQ REALFONT (CADR C)) + [SETQ CSINFO + (\INSURECHARSETINFO + (OR (CADDR REALFONT) + CHARSET) + (FONTCREATE (OR (CAR REALFONT) + FAMILY) + (OR (CADR REALFONT) + SIZE) + FACE ROTATION DEVICE + (OR (CADDR REALFONT) + CHARSET] + (NOT (AND CODE (SLUGCHARP.DISPLAY CODE CSINFO + ] + do (RETURN CSINFO]) (\CREATE-REAL-CHARSET.DISPLAY - [LAMBDA (FAMILY SIZE FACE ROTATION DEVICE CHARSET FONTDESC NOSLUG?) + [LAMBDA (FAMILY SIZE FACE ROTATION DEVICE CHARSET COERCIONS) + (* ; "Edited 22-May-2025 09:52 by rmk") + (* ; "Edited 18-May-2025 21:08 by rmk") (* ; "Edited 26-Jun-2022 12:37 by rmk") (* ; "Edited 15-Jan-88 00:02 by FS") - (COND - [(AND (EQ ROTATION 0) - (PROG1 (\READDISPLAYFONTFILE FAMILY SIZE FACE ROTATION 'DISPLAY CHARSET) - (* ; - "If it is available, this will force the appropriate file to be read to fill in the charset entry") - ] - (T - (* ;; "if we get here, the font is not directly available, either it needs to be rotated, boldified, or italicised 'by hand'. Past that point, we do not allow DISPLAYFONTCOERCIONS, only MISSINGxxxxDISPLAYFONTCOERCIONS.") - - (PROG (NEWFONT XFONT XLATEDFAM CSINFO) - (RETURN (COND - [(NEQ ROTATION 0) - - (* ;; "to make a rotated font (even if it is bold or whatnot), recursively call fontcreate to get the unrotated font (maybe bold, etc), then call \SFMAKEROTATEDFONT on the csinfo. If its still missing, then search for missing display font coercions (e.g. no avail. charset, *but*, do not recurse (avoid getting into infinite loops). This allows partial permutations of fonts.") - - (OR (MEMB ROTATION '(90 270)) - (ERROR "only implemented rotations are 0, 90 and 270." ROTATION)) - (COND - ((SETQ XFONT (\CREATEDISPLAYFONT FAMILY SIZE FACE 0 'DISPLAY CHARSET)) - - (* ;; "Do not call FONTCREATE here. The user might have modified (via PUTCHARBITMAP, etc.) the in-memory version of the source. This also fixes a bug in which several font descriptors ended up sharing bitmaps or charsetvectors, causing havoc when the user modifies either fontdescriptor.") - - (if (SETQ CSINFO (\GETCHARSETINFO CHARSET XFONT T)) - then (\SFROTATECSINFO CSINFO ROTATION) - else NIL] - ((AND (EQ (fetch WEIGHT of FACE) - 'BOLD) - (SETQ XFONT (\CREATEDISPLAYFONT FAMILY SIZE - (create FONTFACE using FACE WEIGHT _ 'MEDIUM) - 0 - 'DISPLAY CHARSET))) - - (* ;; "if we want a bold font, and the medium weight font is available, build the medium weight version then call \SFMAKEBOLD on the csinfo") - - (if (SETQ CSINFO (\GETCHARSETINFO CHARSET XFONT T)) - then (\SFMAKEBOLD CSINFO) - else NIL)) - ((AND (EQ (fetch (FONTFACE SLOPE) of FACE) - 'ITALIC) - (SETQ XFONT (\CREATEDISPLAYFONT FAMILY SIZE - (create FONTFACE using FACE SLOPE _ 'REGULAR) - 0 - 'DISPLAY CHARSET))) - (if (SETQ CSINFO (\GETCHARSETINFO CHARSET XFONT T)) - then (\SFMAKEITALIC CSINFO) - else NIL)) - [(AND CHARSET (NOT (EQL CHARSET 0)) - (for TRANSL in MISSINGCHARSETDISPLAYFONTCOERCIONS - bind NEWCSINFO UFONT REALFONT - when (AND (SETQ UFONT (CAR TRANSL)) - (EQ FAMILY (CAR UFONT)) - (OR (NOT (CADR UFONT)) - (EQ SIZE (CADR UFONT))) - (OR (NOT (CADDR UFONT)) - (EQ CHARSET (CADDR UFONT))) - (SETQ REALFONT (CADR TRANSL)) - (SETQ NEWCSINFO (\CREATE-REAL-CHARSET.DISPLAY - (OR (CAR REALFONT) - FAMILY) - (OR (CADR REALFONT) - SIZE) - FACE ROTATION DEVICE - (OR (CADDR REALFONT) - CHARSET) - FONTDESC NOSLUG?))) - do (RETURN NEWCSINFO] - ((for TRANSL in MISSINGDISPLAYFONTCOERCIONS bind NEWCSINFO UFONT REALFONT - when (AND (SETQ UFONT (CAR TRANSL)) - (EQ FAMILY (CAR UFONT)) - (OR (NOT (CADR UFONT)) - (EQ SIZE (CADR UFONT))) - (OR (NOT (CADDR UFONT)) - (EQ CHARSET (CADDR UFONT))) - (SETQ REALFONT (CADR TRANSL)) - (SETQ NEWCSINFO (\CREATE-REAL-CHARSET.DISPLAY - (OR (CAR REALFONT) - FAMILY) - (OR (CADR REALFONT) - SIZE) - FACE ROTATION DEVICE (OR (CADDR REALFONT) - CHARSET) - FONTDESC NOSLUG?))) - do (RETURN NEWCSINFO))) - ((NOT NOSLUG?) - (\BUILDSLUGCSINFO (fetch (FONTDESCRIPTOR FONTAVGCHARWIDTH) of FONTDESC) - (FONTPROP FONTDESC 'ASCENT) - (FONTPROP FONTDESC 'DESCENT) - (FONTPROP FONTDESC 'DEVICE]) + + (* ;; "Called when \CREATECHARSET,DISPLAY needs a so-far uninstantiated charsetinfo. Best cases: it finds a real one with the specified characterists, or one that differs only in some 90 degree rotation. Code for such bitmap rotations is exact.") + + (* ;; "Each time, this looks at the original source file, it does not pick up a previously instantiated charsetinfo from the specified font. That keeps it pure--the coercion here won't be infected by changes made to a FONTCREATE-cached font. And presumably that lookup happens only once for this font, because \GETCHARSETINFO first checks to see if the (perhaps slug) info already exists. So at most 255 lookups at each level of the chain..") + + (* ;; "") + + (* ;; + " When a real/rotated character set can't be found, we pile on coercions in some priority order. ") + + (OR (\READDISPLAYFONTFILE FAMILY SIZE FACE ROTATION 'DISPLAY CHARSET) + (LET (XFONT CSINFO) + + (* ;; "The charset is not directly available. It can be rotated, coerced from somewhere else, or bolded/italicized algorithmically. ") + + (* ;; "") + + (* ;; "This maintains original strategy in that the algorithmic face transformations are applied before a coercion to another font. So for TIMESROMAN BOLD, it will transform when it sees TIMESROMAN REGULAR, even though there may be an actual CLASSIC BOLD of that face. ") + + (if (NEQ ROTATION 0) + then (CL:UNLESS (MEMB ROTATION '(90 270)) + (ERROR "only implemented rotations are 0, 90 and 270." ROTATION)) + (CL:WHEN (SETQ XFONT (\CREATEFONT FAMILY SIZE FACE 0 'DISPLAY CHARSET)) + + (* ;; "Do not call FONTCREATE here. The user might have modified (via PUTCHARBITMAP, etc.) the in-memory version of the source. .") + + (CL:WHEN (SETQ CSINFO (\INSURECHARSETINFO CHARSET XFONT T)) + (\SFROTATECSINFO CSINFO ROTATION))) + elseif (AND (EQ 'BOLD (fetch WEIGHT of FACE)) + (SETQ XFONT (\CREATEDISPLAYFONT FAMILY SIZE + (create FONTFACE using FACE WEIGHT _ 'MEDIUM) + 0 + 'DISPLAY CHARSET)) + (SETQ CSINFO (\INSURECHARSETINFO CHARSET XFONT)) + (\SFMAKEBOLD CSINFO)) + elseif (AND (EQ 'ITALIC (fetch (FONTFACE SLOPE) of FACE)) + (SETQ XFONT (\CREATEDISPLAYFONT FAMILY SIZE + (create FONTFACE using FACE SLOPE _ 'REGULAR) + 0 + 'DISPLAY CHARSET)) + (SETQ CSINFO (\INSURECHARSETINFO CHARSET XFONT T)) + (\SFMAKEITALIC CSINFO)) + else (\COERCECHARSET FAMILY SIZE FACE ROTATION DEVICE CHARSET COERCIONS]) (\BUILDSLUGCSINFO - [LAMBDA (WIDTH ASCENT DESCENT DEVICE SCALE) (* ; "Edited 9-May-93 23:12 by rmk:") + [LAMBDA (WIDTH ASCENT DESCENT DEVICE SCALE) (* ; "Edited 20-May-2025 14:50 by rmk") + (* ; "Edited 18-May-2025 21:52 by rmk") + (* ; "Edited 12-May-2025 21:09 by rmk") + (* ; "Edited 9-May-93 23:12 by rmk:") -(* ;;; "builds a csinfo which contains only the slug (black rectangle) character. Called only for display.") + (* ;; "builds a csinfo which contains only the slug (black rectangle) character. ") (SETQ SCALE (OR SCALE 1)) - (PROG ((CSINFO (create CHARSETINFO - CHARSETASCENT _ ASCENT - CHARSETDESCENT _ DESCENT)) - WIDTHS OFFSETS BITMAP IMAGEWIDTHS) - (SETQ WIDTHS (fetch (CHARSETINFO WIDTHS) of CSINFO)) - (for I from 0 to \MAXTHINCHAR do (\FSETWIDTH WIDTHS I WIDTH)) - (REPLACE IMAGEWIDTHS OF CSINFO WITH WIDTHS) - (replace (CHARSETINFO OFFSETS) of CSINFO with (SETQ OFFSETS ( - \CREATECSINFOELEMENT - ))) - (for I from 0 to \MAXTHINCHAR do (\FSETOFFSET OFFSETS I 0)) - [replace (CHARSETINFO CHARSETBITMAP) of CSINFO - with (SETQ BITMAP (BITMAPCREATE (ROUND (QUOTIENT WIDTH SCALE)) - (ROUND (QUOTIENT (IPLUS ASCENT DESCENT) - SCALE] - [BLTSHADE BLACKSHADE BITMAP 1 NIL (SUB1 (ROUND (QUOTIENT WIDTH SCALE] - (RETURN CSINFO]) + (LET ((CSINFO (create CHARSETINFO + CHARSETASCENT _ ASCENT + CHARSETDESCENT _ DESCENT + CSSLUGP _ T)) + WIDTHS OFFSETS BITMAP IMAGEWIDTHS) + (SETQ WIDTHS (fetch (CHARSETINFO WIDTHS) of CSINFO)) + (for I from 0 to \MAXTHINCHAR do (\FSETWIDTH WIDTHS I WIDTH)) + (REPLACE IMAGEWIDTHS OF CSINFO WITH WIDTHS) + (replace (CHARSETINFO OFFSETS) of CSINFO with (SETQ OFFSETS (\CREATECSINFOELEMENT))) + (for I from 0 to \MAXTHINCHAR do (\FSETOFFSET OFFSETS I 0)) + (CL:WHEN (MEMB DEVICE \DISPLAYSTREAMTYPES) + [replace (CHARSETINFO CHARSETBITMAP) of CSINFO + with (SETQ BITMAP (BITMAPCREATE (ROUND (QUOTIENT WIDTH SCALE)) + (ROUND (QUOTIENT (IPLUS ASCENT DESCENT) + SCALE] + [BLTSHADE BLACKSHADE BITMAP 1 NIL (SUB1 (ROUND (QUOTIENT WIDTH SCALE]) + CSINFO]) (\SEARCHDISPLAYFONTFILES - [LAMBDA (FAMILY SIZE FACE ROTATION DEVICE) (* ; "Edited 5-Mar-87 18:55 by FS") + [LAMBDA (FAMILY SIZE FACE ROTATION DEVICE) (* ; "Edited 16-May-2025 14:42 by rmk") + (* ; "Edited 5-Mar-87 18:55 by FS") (* ;; " This function called via APPLY in IMAGESTREAMTYPES.") @@ -1539,87 +2068,62 @@ (* ;; " Note we *allow* a device that is not 'DISPLAY for guys like 4DISPLAY, 8DISPLAY, 24DISPLAY, and also possibly for FX80, etc. (guys that want DISPLAYFONTS anyway). Should have some hook though for FONTEXTENSIONS, FONTDIRECTORIES??") (DECLARE (GLOBALVARS DISPLAYFONTEXTENSIONS DISPLAYFONTDIRECTORIES)) - (SELECTQ (SYSTEMTYPE) - (D (\SEARCHFONTFILES FAMILY SIZE FACE ROTATION DEVICE DISPLAYFONTDIRECTORIES - DISPLAYFONTEXTENSIONS)) - (J (* OLD J code from \READDISPLAYFONT - (PROG ((FONTFILE (\FONTFILENAME - FAMILY SIZE FACE)) FONTDESC STRM) - (COND ((SETQ STRM (AND - FONTDIRECTORIES (FINDFILE FONTFILE T - FONTDIRECTORIES))) - (SETQ STRM (OPENSTREAM FONTFILE - (QUOTE INPUT))) (SETQ FONTDESC - (\READJERICHOFONTFILE FAMILY SIZE - FACE STRM)) (CLOSEF STRM))) - (RETURN FONTDESC))) - NIL) - (SHOULDNT]) + (\SEARCHFONTFILES FAMILY SIZE FACE ROTATION DEVICE DISPLAYFONTDIRECTORIES DISPLAYFONTEXTENSIONS]) (\SEARCHFONTFILES - [LAMBDA (FAMILY SIZE FACE ROTATION DEVICE DIRLST EXTLST) (* ; "Edited 14-Sep-96 10:54 by rmk:") - (* ; "Edited 6-Oct-89 12:34 by bvm") + [LAMBDA (FAMILY SIZE FACE ROTATION DEVICE DIRLST EXTLST) (* ; "Edited 17-May-2025 14:09 by rmk") + (* ; "Edited 15-May-2025 23:12 by rmk") + (* ; "Edited 14-Sep-96 10:54 by rmk:") + (* ; "Edited 6-Oct-89 12:34 by bvm") - (* ;; "GENERIC FUNCTION") + (* ;; "GENERIC FUNCTION") - (* ;; "returns a list of the fonts that can be read in for a device. Rotation is ignored because it is assumed that all devices support 0 90 and 270.") + (* ;; "returns a list of the fonts that can be read in for a device. Rotation is ignored because it is assumed that all devices support 0 90 and 270.") (SETQ FAMILY (\FONTSYMBOL FAMILY)) (SETQ DEVICE (\FONTSYMBOL DEVICE)) (SETQ FACE (\FONTFACE FACE)) - (BIND (FILING.ENUEMRATION.DEPTH _ 1) - FONTSFOUND THISFONT THISFACE FOR E INSIDE EXTLST - DO [FOR DIR INSIDE DIRLST - BIND (FILEPATTERN _ (IF (FMEMB E *OLD-FONT-EXTENSIONS*) - THEN (\FONTFILENAME.OLD FAMILY SIZE FACE E) - ELSE (\FONTFILENAME FAMILY SIZE FACE E))) - DO - - (* ;; "Hack above to handle both old and new font file names. The variable *OLD-FONT-EXTENSIONS* can be set to suppress using the old-style lookup. If set to a list of extensions, just those will be looked up with old-style conventions") - - (FOR FONTFILE IN (DIRECTORY (PACKFILENAME.STRING 'DIRECTORY DIR - 'BODY FILEPATTERN)) - WHEN [PROGN (SETQ THISFONT (\FONTINFOFROMFILENAME FONTFILE DEVICE)) - (SETQ THISFACE (CADDR THISFONT)) - - (* ;; - "make sure the face, size, and family really match.") - - (AND (NOT (MEMBER THISFONT FONTSFOUND)) - (OR (EQ FAMILY '*) - (EQ FAMILY (CAR THISFONT))) - (OR (EQ SIZE '*) - (EQ SIZE (CADR THISFONT))) - (OR (EQ FACE '*) - (EQUAL FACE THISFACE) - (AND (OR (EQ (CAR FACE) - '*) - (EQ (CAR FACE) - (CAR THISFACE))) - (OR (EQ (CADR FACE) - '*) - (EQ (CADR FACE) - (CADR THISFACE))) - (OR (EQ (CADDR FACE) - '*) - (EQ (CADDR FACE) - (CADDR THISFACE] - DO (SETQ FONTSFOUND (CONS THISFONT FONTSFOUND] - FINALLY (RETURN FONTSFOUND]) - -(\FINDFONTFILE - [LAMBDA (FAMILY SIZE FACE ROTATION DEVICE CHARSET DIRLST EXTLST) - (* ; "Edited 14-Sep-96 10:53 by rmk:") - (* ; "Edited 6-Oct-89 11:18 by bvm") - - (* ;; "Find any font file on any directory with any naming convention with any extension. Note that ROTATION and DEVICE are just place holders. DEVICE is irrelevant because DIRLST already incorporates the device information. The variable *OLD-FONT-EXTENSIONS* can be set to suppress using the old-style lookup. If set to a list of extensions, just those will be looked up with old-style conventions.") - - (BIND FONTFILE FOR EXT INSIDE EXTLST - WHEN (SETQ FONTFILE (FINDFILE (IF (FMEMB EXT *OLD-FONT-EXTENSIONS*) - THEN (\FONTFILENAME.OLD FAMILY SIZE FACE EXT - CHARSET) - ELSE (\FONTFILENAME FAMILY SIZE FACE EXT CHARSET)) - T DIRLST)) DO (RETURN FONTFILE]) + (for FILEPATTERN FILEDIR FONTSFOUND (FILING.ENUEMRATION.DEPTH _ 1) + IN (\FONTFILENAMES FAMILY SIZE FACE DEVICE EXTLST) + do (SETQ FILEDIR (FILENAMEFIELD FILEPATTERN 'DIRECTORY)) + (SETQ FILEDIR (CL:IF FILEDIR + (CONCAT ">" FILEDIR ">") + "")) + (for DIR inside DIRLST eachtime + + (* ;; "The file pattern might have an extending subdirectory (C41>) that might not exist, but DIRECTORYNAMEP makes sure that it does.") + + (SETQ DIR (CONCAT DIR ">" (OR FILEDIR ""))) + when (DIRECTORYNAMEP DIR) + do (for FONTFILE THISFONT THISFACE in (DIRECTORY DIR) eachtime (SETQ THISFONT + (\FONTINFOFROMFILENAME + FONTFILE DEVICE)) + (SETQ THISFACE (CADDR + THISFONT + )) + + (* ;; + "make sure the face, size, and family really match.") + when [AND (NOT (MEMBER THISFONT FONTSFOUND)) + (OR (EQ FAMILY '*) + (EQ FAMILY (CAR THISFONT))) + (OR (EQ SIZE '*) + (EQ SIZE (CADR THISFONT))) + (OR (EQ FACE '*) + (EQUAL FACE THISFACE) + (AND (OR (EQ (CAR FACE) + '*) + (EQ (CAR FACE) + (CAR THISFACE))) + (OR (EQ (CADR FACE) + '*) + (EQ (CADR FACE) + (CADR THISFACE))) + (OR (EQ (CADDR FACE) + '*) + (EQ (CADDR FACE) + (CADDR THISFACE] do (push FONTSFOUND THISFONT))) + finally (RETURN (DREVERSE FONTSFOUND]) (\FONTSYMBOL [LAMBDA (X ElseReturnXFlg) (* ; "Edited 28-Jul-88 11:59 by rmk:") @@ -1781,364 +2285,126 @@ SLOPE _ 'ITALIC] [(AND (EQ WEIGHT 'BOLD) (EQ SLOPE 'ITALIC) - (EQ EXPANSION 'REGULAR)) (* ; "BIR") - (CONSTANT (create FONTFACE - WEIGHT _ 'BOLD - SLOPE _ 'ITALIC] - (T (* ; "Otherwise, cons up") - (create FONTFACE - WEIGHT _ WEIGHT - SLOPE _ SLOPE - EXPANSION _ EXPANSION]) - -(\FONTFACE.COLOR - [LAMBDA (FACE NOERRORFLG DEV) (* ; "Edited 28-Jul-88 14:51 by rmk:") - (* ; "Edited 28-Jul-88 13:09 by rmk:") - (* ; "Edited 24-Mar-87 17:03 by FS") - - (* ;; "This used to be \FONTFACE. Renamed \FONTFACE.COLOR, and \FONTFACE rewritten. The section below should also be redone") - - (* ;; "Takes a variety of user specifications and converts them to a standard FONTFACE record.") - - (* ;; "b/w fontfaces are extended by an optional '-backcolor-forecolor'") - - (* ;; "the atom NNN is interpreted the same as NIL or MRR to cover up a bug described in AR 3025, the FONTNNN bug") - - (DECLARE (GLOBALVARS \COLORDISPLAYSTREAMTYPES)) - (SETQ DEV (\DEVICESYMBOL DEV)) - (PROG (BWFACE POS OLDPOS BITSPERPIXEL BACKCOLOR FORECOLOR ANSWER) - - (* ;; "First get a FONTFACE ANSWER.") - - [SETQ ANSWER (COND - ((type? FONTFACE FACE) - FACE) - ((LITATOM FACE) - (OR (U-CASEP FACE) - (SETQ FACE (U-CASE FACE))) - (SETQ POS (STRPOS "-" FACE)) - (COND - [POS (SETQ BWFACE (SUBATOM FACE 1 (SUB1 POS] - (T (SETQ BWFACE FACE))) - [SETQ ANSWER (SELECTQ BWFACE - ((* ***) - (CONSTANT (create FONTFACE - WEIGHT _ '* - SLOPE _ '* - EXPANSION _ '*))) - ((NIL MRR STANDARD NNN) - (CONSTANT (create FONTFACE))) - ((ITALIC MIR) - (CONSTANT (create FONTFACE - SLOPE _ 'ITALIC))) - ((BOLD BRR) - (CONSTANT (create FONTFACE - WEIGHT _ 'BOLD))) - ((BOLDITALIC BIR) - (CONSTANT (create FONTFACE - WEIGHT _ 'BOLD - SLOPE _ 'ITALIC))) - (create FONTFACE - WEIGHT _ (SELCHARQ (NTHCHARCODE FACE 1) - (M 'MEDIUM) - (B 'BOLD) - (L 'LIGHT) - (GO ERROR)) - SLOPE _ (SELCHARQ (NTHCHARCODE FACE 2) - (R 'REGULAR) - (I 'ITALIC) - (GO ERROR)) - EXPANSION _ (SELCHARQ (NTHCHARCODE FACE 3) - (R 'REGULAR) - (C 'COMPRESSED) - (E 'EXPANDED) - (GO ERROR] - (COND - (POS (* ; "Color FONTFACE. *") - (SETQ OLDPOS POS) - (SETQ POS (STRPOS "-" FACE (ADD1 OLDPOS))) - (COND - ((NULL POS) - (GO ERROR))) - (SETQ BITSPERPIXEL (\DISPLAYSTREAMTYPEBPP DEV)) - (SETQ BACKCOLOR (COLORNUMBERP (SUBATOM FACE (ADD1 OLDPOS) - (SUB1 POS)) - BITSPERPIXEL)) - (SETQ OLDPOS POS) - (SETQ FORECOLOR (COLORNUMBERP (SUBATOM FACE (ADD1 OLDPOS) - -1) - BITSPERPIXEL)) - (* ; - "COPY ANSWER to avoid smashing constants.") - (SETQ ANSWER (COPY ANSWER)) - (replace (FONTFACE BACKCOLOR) of ANSWER with BACKCOLOR - ) - (replace (FONTFACE FORECOLOR) of ANSWER with FORECOLOR - ))) - ANSWER) - (T (GO ERROR] - - (* ;; "Coerce on or off COLOR.") - - (SETQ ANSWER (COND - ((AND (NOT (FMEMB DEV \COLORDISPLAYSTREAMTYPES)) - (fetch (FONTFACE COLOR) of ANSWER)) - (SETQ ANSWER (COPY ANSWER)) - (replace (FONTFACE COLOR) of ANSWER with NIL) - ANSWER) - ((AND (FMEMB DEV \COLORDISPLAYSTREAMTYPES) - (NULL (fetch (FONTFACE COLOR) of ANSWER))) - (SETQ FACE (COPY FACE)) - (replace (FONTFACE BACKCOLOR) of ANSWER with 0) - (replace (FONTFACE FORECOLOR) of ANSWER with - (MAXIMUMCOLOR ( - \DISPLAYSTREAMTYPEBPP - DEV))) - ANSWER) - (T ANSWER))) - (RETURN ANSWER) - ERROR - (COND - (NOERRORFLG (RETURN NIL)) - (T (\ILLEGAL.ARG FACE]) - -(\FONTFILENAME - [LAMBDA (FAMILY SIZE FACE EXTENSION CHARSET) (* ; "Edited 5-Mar-93 16:10 by rmk:") - - (* ;; "Strike file naming convention (w/o dashes, no charset) no longer supported. New name is of the form %"familysize-face-Ccharset.ext%", e.g., MODERN12-MRR-C357.WD") - - (* ;; "**bvm 10/5/89 Slight change: partition fonts into subdirectories by charset, e.g., all Charset zero fonts are in subdirectory C0>. This significantly speeds up any font operation that requires any local directory work (e.g., NFS servers on both Sun and D machine), and FONTSAVAILABLE on any device (since it doesn't have to wade thru all those charsets). This behavior is conditioned on the value of *USEOLDFONTDIRECTORIES*") - - (SETQ FACE (\FONTFACE FACE)) (* ; "Validate face") - (LET* ([SIZEPATT (COND - ((EQ SIZE '*) - SIZE) - ((FIXP SIZE) - (if (< SIZE 10) - then (CONCAT 0 SIZE) - else SIZE)) - (T (\ILLEGAL.ARG SIZE] - (CSETNAME (COND - ((OR (NULL CHARSET) - (EQ CHARSET 0)) (* ; "Charset defaults to zero.") - "0") - ((FIXP CHARSET) - (LET ((*PRINT-BASE* 8) - (*PRINT-RADIX* NIL)) (* ; "Longhand for (cl:write-to-string charset :radix nil :base 8), which is twice as slow, due to lousy keyword handling") - (\PRINDATUM.TO.STRING CHARSET))) - (T (* ; - "Somebody made the string already?") - CHARSET))) - [FACESPEC (LIST (CHCON1 (fetch (FONTFACE WEIGHT) of FACE)) - (CHCON1 (fetch (FONTFACE SLOPE) of FACE)) - (CHCON1 (fetch (FONTFACE EXPANSION) of FACE] - (TAIL FACESPEC)) - [if (OR (EQ (CAR TAIL) - (CHARCODE *)) - (EQ (CAR (SETQ TAIL (CDR TAIL))) - (CHARCODE *))) - then (* ; - "Avoid adjacent wildcards because some devices (notably DSK) get exponentially slower.") - (while (EQ (CADR TAIL) - (CHARCODE *)) do (RPLACD TAIL (CDDR TAIL] - - (* ;; "Fortunately, CONCAT ignores packages.") - - (PACKFILENAME.STRING 'NAME (CONCAT (CL:IF *USEOLDFONTDIRECTORIES* - "" - (CONCAT (PROGN - (* ; - "Lowercase because it's in a directory name, so maybe Unix will find it sooner?") - "c") - CSETNAME ">")) - FAMILY SIZEPATT "-" (CONCATCODES FACESPEC) - "-C" CSETNAME) - 'EXTENSION EXTENSION]) - -(\FONTFILENAME.OLD - [LAMBDA (FAMILY SIZE FACE EXTENSION CHARSET) (* ; "Edited 23-Sep-92 18:22 by jds") - - (* ;; "Returns old style font file names. They were ambiguous because you could not ask for e.g. FACE (MEDIUM * REGULAR) because it maps to FamilySize-*-Charset, which also matches (BOLD * COMPRESSED), etc. Keep this function around though for user's who don't rename their files.") - (* ; - "Returns the name of the file that should contain the information for a font.") - (SETQ FACE (\FONTFACE FACE)) (* ; "Force legal canonical face") - (SETQ FACE (COND - ((AND (EQ (CAR FACE) - '*) - (EQ (CADR FACE) - '*)) - - (* ;; "Avoid adjacent wildcards because DSK gets slower exponentially (can take loooong tiiiiiime). No need to check compression.") - - '*) - (T FACE))) - (PACKFILENAME.STRING 'NAME [PROGN - (* ;; "DISPLAYFONT AC WD and the default case") - - (CONCAT (CDR (SASSOC FAMILY *DISPLAY-FONT-NAME-MAP*)) - (COND - ((EQ SIZE '*) - SIZE) - ((FIXP SIZE) - (COND - ((< SIZE 10) - (CONCAT 0 SIZE)) - (T SIZE))) - (T (\ILLEGAL.ARG SIZE))) - [COND - ((EQ FACE '*) - '*) - (T (SELECTQ (fetch WEIGHT of FACE) - (BOLD (SELECTQ (fetch SLOPE of FACE) - (ITALIC "D") - "B")) - (SELECTQ (fetch SLOPE of FACE) - (ITALIC "I") - "R"] - (COND - ((FIXP CHARSET) - (LET ((*PRINT-BASE* 8)) - (CL:FORMAT NIL "~O" CHARSET))) - (T "000"] - 'EXTENSION EXTENSION]) - -(\FONTFILENAME.NEW - [LAMBDA (FAMILY SIZE FACE EXTENSION CHARSET) (* ; "Edited 30-Mar-87 20:00 by FS") - - (* ;; "Strike file naming convention (w/o dashes, no charset) no longer supported.") - - (LET (NAME SIZEPATT) - (SETQ FACE (\FONTFACE FACE)) (* ; "Validate face") - [SETQ SIZEPATT (COND - ((EQ SIZE '*) - SIZE) - ((FIXP SIZE) - (if (< SIZE 10) - then (CONCAT 0 SIZE) - else SIZE)) - (T (\ILLEGAL.ARG SIZE] - - (* ;; "Avoid adjacent wildcards because some devices (notably DSK) get exponentially slower. Nicely, PACK & CONCAT ignore packages.") - - (PACKFILENAME.STRING 'NAME (CONCAT FAMILY SIZEPATT "-" - [COND - ((EQUAL FACE ' - - (* * *) -) - '*) - (T (CONCAT (NTHCHAR (fetch (FONTFACE WEIGHT) - of FACE) - 1) - (NTHCHAR (fetch (FONTFACE SLOPE) - of FACE) - 1) - (NTHCHAR (fetch (FONTFACE EXPANSION) - of FACE) - 1] - (COND - [(FIXP CHARSET) - (LET ((*PRINT-BASE* 8)) - (CONCAT "-C" (\PRINDATUM.TO.STRING CHARSET] - (CHARSET (CONCAT "-C" CHARSET)) - (T "-C0"))) - 'EXTENSION EXTENSION]) - -(\FONTINFOFROMFILENAME - [LAMBDA (FONTFILE DEVICE) (* ; "Edited 14-Sep-96 10:23 by rmk:") - (* ; "Edited 5-Oct-89 18:28 by bvm") - - (* ;; "returns a list of the family size face rotation device of the font stored in the file name FONTFILE. Rotation is 0 always. Parses both new & old format files.") + (EQ EXPANSION 'REGULAR)) (* ; "BIR") + (CONSTANT (create FONTFACE + WEIGHT _ 'BOLD + SLOPE _ 'ITALIC] + (T (* ; "Otherwise, cons up") + (create FONTFACE + WEIGHT _ WEIGHT + SLOPE _ SLOPE + EXPANSION _ EXPANSION]) - (LET ((FILENAMELIST (UNPACKFILENAME.STRING FONTFILE)) - CH SIZEBEG SIZEND NAME FAMILY SIZE FACE EXT) - (SETQ NAME (LISTGET FILENAMELIST 'NAME)) (* ; - "find where the name and size are. MUST check for ch nil below or possible infinite loop") - (SETQ SIZEBEG (for CH# from 1 when (OR (NUMBERP (SETQ CH (NTHCHAR NAME CH#))) - (NULL CH)) do (RETURN CH#))) +(\FONTFACE.COLOR + [LAMBDA (FACE NOERRORFLG DEV) (* ; "Edited 28-Jul-88 14:51 by rmk:") + (* ; "Edited 28-Jul-88 13:09 by rmk:") + (* ; "Edited 24-Mar-87 17:03 by FS") - (* ;; "Get Family") + (* ;; "This used to be \FONTFACE. Renamed \FONTFACE.COLOR, and \FONTFACE rewritten. The section below should also be redone") - [SETQ FAMILY (MKATOM (U-CASE (SUBSTRING NAME 1 (SUB1 SIZEBEG] + (* ;; "Takes a variety of user specifications and converts them to a standard FONTFACE record.") - (* ;; "Get Size") + (* ;; "b/w fontfaces are extended by an optional '-backcolor-forecolor'") - [SETQ SIZEND (find CH# from SIZEBEG suchthat (NOT (NUMBERP (NTHCHAR NAME CH#] - [SETQ SIZE (MKATOM (SUBSTRING NAME SIZEBEG (SUB1 SIZEND] - (if (EQ (NTHCHAR NAME SIZEND) - '-) - then (SETQ SIZEND (ADD1 SIZEND))) + (* ;; "the atom NNN is interpreted the same as NIL or MRR to cover up a bug described in AR 3025, the FONTNNN bug") - (* ;; "Get Face") + (DECLARE (GLOBALVARS \COLORDISPLAYSTREAMTYPES)) + (SETQ DEV (\DEVICESYMBOL DEV)) + (PROG (BWFACE POS OLDPOS BITSPERPIXEL BACKCOLOR FORECOLOR ANSWER) - (SETQ NAME (U-CASE NAME)) (* ; - "don't need name, but checks for lowercase face") - [SETQ FACE (LIST (COND - ((STRPOS "B" NAME SIZEND NIL T NIL UPPERCASEARRAY) - 'BOLD) - ((STRPOS "L" NAME SIZEND NIL T NIL UPPERCASEARRAY) - 'LIGHT) - (T 'MEDIUM)) - (COND - ((STRPOS "I" NAME SIZEND NIL NIL NIL UPPERCASEARRAY) - 'ITALIC) - (T 'REGULAR)) - (COND - ((STRPOS "E" NAME SIZEND NIL NIL NIL UPPERCASEARRAY) - 'EXPANDED) - ((STRPOS "C-" NAME SIZEND NIL NIL NIL UPPERCASEARRAY) - 'COMPRESSED) - (T 'REGULAR] - (LIST FAMILY SIZE FACE 0 (COND - ((STREAMP DEVICE) - (IMAGESTREAMTYPE DEVICE)) - ((NULL DEVICE) - [SETQ EXT (MKATOM (U-CASE (LISTGET FILENAMELIST 'EXTENSION] - (SELECTQ EXT - (WD 'INTERPRESS) - ((STRIKE AC DISPLAYFONT) - 'DISPLAY) - EXT)) - ((LITATOM DEVICE) - (\FONTSYMBOL DEVICE)) - (T DEVICE]) + (* ;; "First get a FONTFACE ANSWER.") -(\FONTINFOFROMFILENAME.OLD - [LAMBDA (FONTFILE DEVICE) (* ; "Edited 1-Jan-87 01:29 by FS") + [SETQ ANSWER (COND + ((type? FONTFACE FACE) + FACE) + ((LITATOM FACE) + (OR (U-CASEP FACE) + (SETQ FACE (U-CASE FACE))) + (SETQ POS (STRPOS "-" FACE)) + (COND + [POS (SETQ BWFACE (SUBATOM FACE 1 (SUB1 POS] + (T (SETQ BWFACE FACE))) + [SETQ ANSWER (SELECTQ BWFACE + ((* ***) + (CONSTANT (create FONTFACE + WEIGHT _ '* + SLOPE _ '* + EXPANSION _ '*))) + ((NIL MRR STANDARD NNN) + (CONSTANT (create FONTFACE))) + ((ITALIC MIR) + (CONSTANT (create FONTFACE + SLOPE _ 'ITALIC))) + ((BOLD BRR) + (CONSTANT (create FONTFACE + WEIGHT _ 'BOLD))) + ((BOLDITALIC BIR) + (CONSTANT (create FONTFACE + WEIGHT _ 'BOLD + SLOPE _ 'ITALIC))) + (create FONTFACE + WEIGHT _ (SELCHARQ (NTHCHARCODE FACE 1) + (M 'MEDIUM) + (B 'BOLD) + (L 'LIGHT) + (GO ERROR)) + SLOPE _ (SELCHARQ (NTHCHARCODE FACE 2) + (R 'REGULAR) + (I 'ITALIC) + (GO ERROR)) + EXPANSION _ (SELCHARQ (NTHCHARCODE FACE 3) + (R 'REGULAR) + (C 'COMPRESSED) + (E 'EXPANDED) + (GO ERROR] + (COND + (POS (* ; "Color FONTFACE. *") + (SETQ OLDPOS POS) + (SETQ POS (STRPOS "-" FACE (ADD1 OLDPOS))) + (COND + ((NULL POS) + (GO ERROR))) + (SETQ BITSPERPIXEL (\DISPLAYSTREAMTYPEBPP DEV)) + (SETQ BACKCOLOR (COLORNUMBERP (SUBATOM FACE (ADD1 OLDPOS) + (SUB1 POS)) + BITSPERPIXEL)) + (SETQ OLDPOS POS) + (SETQ FORECOLOR (COLORNUMBERP (SUBATOM FACE (ADD1 OLDPOS) + -1) + BITSPERPIXEL)) + (* ; + "COPY ANSWER to avoid smashing constants.") + (SETQ ANSWER (COPY ANSWER)) + (replace (FONTFACE BACKCOLOR) of ANSWER with BACKCOLOR + ) + (replace (FONTFACE FORECOLOR) of ANSWER with FORECOLOR + ))) + ANSWER) + (T (GO ERROR] - (* ;; "returns a list of the family size face rotation device of the font stored in the file name FONTFILE.") + (* ;; "Coerce on or off COLOR.") - (PROG ((FILENAMELIST (UNPACKFILENAME FONTFILE)) - SIZEBEG SIZEND NAME FAMILY SIZE) - (SETQ NAME (LISTGET FILENAMELIST 'NAME)) (* ; - "find where the name and size are.") - (SETQ SIZEBEG (for CH# from 1 when (NUMBERP (NTHCHAR NAME CH#)) - do (RETURN CH#))) - [SETQ FAMILY (MKATOM (SUBSTRING NAME 1 (SUB1 SIZEBEG] - (SETQ SIZEND (for CH# from SIZEBEG when (NOT (NUMBERP (NTHCHAR NAME CH#))) - do (RETURN CH#))) - [SETQ SIZE (MKATOM (SUBSTRING NAME SIZEBEG (SUB1 SIZEND] - (RETURN (LIST FAMILY SIZE (SELECTQ (LISTGET FILENAMELIST 'EXTENSION) - ((DISPLAYFONT AC WD) - (LIST (COND - ((STRPOS "-B" NAME SIZEND NIL T) - 'BOLD) - (T 'MEDIUM)) - (COND - ((STRPOS "-I" NAME SIZEND NIL) - 'ITALIC) - (T 'REGULAR)) - 'REGULAR)) - (LIST (COND - ((STRPOS "B" NAME SIZEND NIL T) - 'BOLD) - (T 'MEDIUM)) - (COND - ((STRPOS "I" NAME SIZEND NIL) - 'ITALIC) - (T 'REGULAR)) - 'REGULAR)) - 0 DEVICE]) + (SETQ ANSWER (COND + ((AND (NOT (FMEMB DEV \COLORDISPLAYSTREAMTYPES)) + (fetch (FONTFACE COLOR) of ANSWER)) + (SETQ ANSWER (COPY ANSWER)) + (replace (FONTFACE COLOR) of ANSWER with NIL) + ANSWER) + ((AND (FMEMB DEV \COLORDISPLAYSTREAMTYPES) + (NULL (fetch (FONTFACE COLOR) of ANSWER))) + (SETQ FACE (COPY FACE)) + (replace (FONTFACE BACKCOLOR) of ANSWER with 0) + (replace (FONTFACE FORECOLOR) of ANSWER with + (MAXIMUMCOLOR ( + \DISPLAYSTREAMTYPEBPP + DEV))) + ANSWER) + (T ANSWER))) + (RETURN ANSWER) + ERROR + (COND + (NOERRORFLG (RETURN NIL)) + (T (\ILLEGAL.ARG FACE]) (\GETFONTDESC [LAMBDA (SPEC DEVICE NOERRORFLG) (* J.Gibbons " 5-Dec-82 16:53") @@ -2306,118 +2572,122 @@ (CAR DEVBUCKET]) (\READDISPLAYFONTFILE - [LAMBDA (FAMILY SIZE FACE ROTATION DEVICE CHARSET) (* ; "Edited 8-Oct-96 10:17 by rmk:") - (* ; - "Edited 30-Sep-96 12:03 by kaplan") - (* ; "Edited 2-Jan-87 17:55 by FS") - - (* ;; "Look for new filename convention, then old file name convention, with extensions. If CACHEDISPLAYFONTS, this keeps a cache of what was read, on the canonical filename's property list, so that NSDISPLAYSIZES and SMALLSCREEN size coercions can be done and undone without always going out to the directories.") - - (DECLARE (GLOBALVARS DISPLAYFONTEXTENSIONS DISPLAYFONTDIRECTORIES CACHEDISPLAYFONTS)) - (BIND FONTFILE CSINFO STRM - FIRST - - (* ;; "Cache is indexed by canonical font file name, without the extension fields.") - - (CL:WHEN - [AND CACHEDISPLAYFONTS - (FIND EXT INSIDE DISPLAYFONTEXTENSIONS - SUCHTHAT (SETQ CSINFO - (GETP (L-CASE (FILENAMEFIELD (IF (FMEMB EXT - *OLD-FONT-EXTENSIONS* - ) - THEN (\FONTFILENAME.OLD - FAMILY SIZE FACE - EXT CHARSET) - ELSE (\FONTFILENAME - FAMILY SIZE FACE EXT - CHARSET)) - 'NAME)) - 'CACHEDCHARSET] - (RETURN (AND (NEQ CSINFO T) - (COPYALL CSINFO)))) FOR EXT INSIDE DISPLAYFONTEXTENSIONS - WHEN (SETQ FONTFILE (\FINDFONTFILE FAMILY SIZE FACE ROTATION DEVICE CHARSET - DISPLAYFONTDIRECTORIES (LIST EXT))) - DO - - (* ;; - "Cache is indexed by canonical font file name, without the directory or extension fields") - - (SETQ STRM (OPENSTREAM FONTFILE 'INPUT)) - (RESETLST - [SETQ CSINFO (SELECTQ (FONTFILEFORMAT STRM T) - (STRIKE (RESETSAVE NIL (LIST (FUNCTION CLOSEF) - STRM)) - (\READSTRIKEFONTFILE STRM FAMILY SIZE FACE)) - (AC - (* ;; "CLOSEF is guaranteed inside \READACFONTFILE, against the possibility that we have to copy to make randaccessp") - - (\READACFONTFILE STRM FAMILY SIZE FACE)) - (PROG1 (CLOSEF STRM) (* ; -"This would get done by RESETSAVE if AC's were read sequentially and we could factor the RESETSAVE") - (SHOULDNT))]) - (CL:WHEN CACHEDISPLAYFONTS - (PUTPROP (L-CASE (FILENAMEFIELD FONTFILE 'NAME)) - 'CACHEDCHARSET CSINFO) - (SETQ CSINFO (COPYALL CSINFO))) - - (* ;; "If not a recognizable format, I guess we should keep looking for another possible extension, altho it would also be nice to tell the user that he has a bogus file.") - - (RETURN CSINFO) - FINALLY - - (* ;; "Didn't find the file, cache T to suppress future lookups") - - (CL:WHEN CACHEDISPLAYFONTS - (PUTPROP (L-CASE (FILENAMEFIELD (IF (FMEMB (CAR (MKLIST DISPLAYFONTEXTENSIONS)) - *OLD-FONT-EXTENSIONS*) - THEN (\FONTFILENAME.OLD - FAMILY SIZE FACE (CAR (MKLIST - DISPLAYFONTEXTENSIONS - )) - CHARSET) - ELSE (\FONTFILENAME FAMILY SIZE FACE - (CAR (MKLIST DISPLAYFONTEXTENSIONS - )) - CHARSET)) - 'NAME)) - 'CACHEDCHARSET T))]) -) - + [LAMBDA (FAMILY SIZE FACE ROTATION DEVICE CHARSET) (* ; "Edited 9-Jun-2025 20:06 by rmk") + (* ; "Edited 7-Jun-2025 10:32 by rmk") + (* ; "Edited 4-Jun-2025 23:41 by rmk") + (* ; "Edited 27-May-2025 23:00 by rmk") + (* ; "Edited 24-May-2025 20:38 by rmk") + (* ; "Edited 20-May-2025 18:04 by rmk") + (* ; "Edited 18-May-2025 11:27 by rmk") + (* ; "Edited 17-May-2025 00:32 by rmk") + (* ; "Edited 8-Oct-96 10:17 by rmk:") + (* ; "Edited 30-Sep-96 12:03 by kaplan") + (* ; "Edited 2-Jan-87 17:55 by FS") + + (* ;; "This enumerates all possible filenames for display fonts with the specified characteristics, determines the format for each such file, and applies the appropriate reading function for that format to produce and install the desired CHARSET. ") + + (* ;; "I stripped the CACHEDISPLAYFONTS machinery from this. It previously kept the retrieved fonts so that NSDISPLAYSIZES and SMALLSCREEN size coercions can be done and undone without always going out to the directories. We want to get rid of NSDISPLAYSIZES by better coordinating hardcopy and display font images, and switching screen sizes is a rare event--that mechanism should cache the fonts if it wants to eventually switch back.") + + (* ;; "CADR of each DISPLAYCHARSETFNS is a test-predicate on the open stream. If it returns true, the CADDR is applied to get the CSINFO. ") + + (CL:WHEN (EQ ROTATION 0) + (RESETLST + (for F STRM CSINFO in (FONTFILES FAMILY SIZE FACE ROTATION DEVICE CHARSET + DISPLAYFONTDIRECTORIES DISPLAYFONTEXTENSIONS) + do + + (* ;; "We know that F exists. Open it here and pass the stream to the charset functions, and ensure it is closed on exist.") + + (CL:WHEN (for FNS in DISPLAYCHARSETFNS + do [RESETSAVE (SETQ STRM (OPENSTREAM F 'INPUT)) + `(PROGN (CLOSEF? OLDVALUE] + (CL:WHEN (APPLY* (CADR FNS) + STRM) + (* ;; + "Assume that predicate leaves stream (open or closed) in proper state for retrieval function") + + (SETQ CSINFO (APPLY* (CADDR FNS) + STRM FAMILY SIZE FACE ROTATION DEVICE CHARSET)) + (CLOSEF? STRM) + (CL:WHEN (type? CHARSETINFO CSINFO) + (RETURN T))) + (CLOSEF? STRM)) + (CL:UNLESS (CDR (ASSOC 'CSCHARENCODING (fetch (CHARSETINFO CSINFOPROPS) + of CSINFO))) + (change (fetch (CHARSETINFO CSINFOPROPS) of CSINFO) + (CONS (CONS 'CSCHARENCODING + (if (MEMB FAMILY NSFONTFAMILIES) + then 'XCCS$ + elseif (MEMB FAMILY ALTOFONTFAMILIES) + then (CL:WHEN (AND (MEMB FAMILY '(GACHA HELVETICA)) + (EQ SIZE 10)) + (* ; "The default loadup and menu fonts") + (replace (CHARSETINFO CSCOMPLETEP) + of CSINFO with T)) + 'ALTOTEXT + else FAMILY)) + DATUM))) + (RETURN CSINFO)) + + (* ;; "Close on each file") + + (CLOSEF? STRM))))]) + +(SETFONTCHARENCODING + [LAMBDA (FONT CHARENCODING) (* ; "Edited 23-May-2025 14:54 by rmk") + (* ; "Edited 21-May-2025 22:27 by rmk") + (* ; "Edited 2-May-2025 16:03 by rmk") + (replace (FONTDESCRIPTOR FONTCHARENCODING) of (FONTCREATE FONT) with CHARENCODING) + (for CS CSI ECELL from 0 to \MAXCHARSET when (AND (SETQ CSI (\XGETCHARSETINFO FONT CS)) + (NOT (fetch (CHARSETINFO CSSLUGP) of CSI))) + do (RPLACD [OR (ASSOC 'CSCHARENCODING (fetch (CHARSETINFO CSINFOPROPS) of CSI)) + (CAR (push (fetch (CHARSETINFO CSINFOPROPS) of CSI) + (CONS 'CSCHARENCODING] + CHARENCODING]) +) +(DEFINEQ -(* ;; -"\FINDFONTFILE \FONTFILENAME \SEARCHFONTFILES \FONTINFOFROMFILENAME are redefined to deal with character-set directories. That behavior is conditioned on the setting of the global variable *USEOLDFONTDIRECTORIES*, T at PARC, maybe NIL most other places. " -) - - -(ADDTOVAR *OLD-FONT-EXTENSIONS* STRIKE) - -(RPAQ? *USEOLDFONTDIRECTORIES* NIL) -(DECLARE%: DOEVAL@COMPILE DONTCOPY +(ACFONT.FILEP + [LAMBDA (FILE) (* ; "Edited 15-May-2025 17:48 by rmk") + (RESETLST + (CL:UNLESS (OPENP FILE 'INPUT) + [RESETSAVE (SETQ FILE (OPENSTREAM FILE 'INPUT 'OLD)) + `(PROGN (CLOSEF? OLDVALUE]) -(GLOBALVARS *OLD-FONT-EXTENSIONS* *USEOLDFONTDIRECTORIES*) -) + (* ;; "This is the length of a standard index header. Other files could also have this value, but it's a pretty good discriminator") + (* ;; "Skip to byte 25; do it with BINS so works for non-randaccessp devices. This skips the standard name header, then look for type 3 in the following header") + (CL:WHEN (EQ (\WIN FILE) + (LOGOR (LLSH 16 8) + 12)) + (FRPTQ 22 (\BIN FILE)) (* ; "(SETFILEPTR STRM 25)") + (EQ 3 (LRSH (\BIN FILE) + 4))))]) -(* ;; -"Establishes DISPLAYFONTFILECACHE to avoid rereading charsets when size coercions are done (e.g. for nsdisplaysizes or smallscreen)" -) +(STRIKEFONT.FILEP + [LAMBDA (FILE) (* ; "Edited 15-May-2025 17:47 by rmk") + (* ;; "If high bit of type is on, then must be strike. If 2nd bit is on, must be strike-index, and we punt. We don't care about the 3rd bit") + (* ;; "first word has high bits (onebit index fixed). Onebit means 'new-style font' , index is 0 for simple strike, 1 for index, and fixed is if all chars have max width. Lisp doesn't care about 'fixed'") + (RESETLST + (CL:UNLESS (OPENP FILE 'INPUT) + [RESETSAVE (SETQ FILE (OPENSTREAM FILE 'INPUT 'OLD)) + `(PROGN (CLOSEF? OLDVALUE]) + (CL:WHEN [MEMB (\WIN FILE) + (CONSTANT (LIST (LLSH 1 15) + (LOGOR (LLSH 1 15) + (LLSH 1 13] + T))]) +) -(* ;; -"Establishes DISPLAYFONTFILECACHE to avoid rereading charsets when size coercions are done (e.g. for nsdisplaysizes or smallscreen)" -) -(RPAQ? CACHEDISPLAYFONTS ) -(DECLARE%: DOEVAL@COMPILE DONTCOPY +(* ; "Legacy font-fille predicates") -(GLOBALVARS CACHEDISPLAYFONTS) -) @@ -2426,61 +2696,69 @@ (DEFINEQ (\READSTRIKEFONTFILE - [LAMBDA (STRM FAMILY SIZE FACE) (* ; "Edited 12-Jul-2022 09:19 by rmk") + [LAMBDA (STRM FAMILY SIZE FACE) (* ; "Edited 9-Jun-2025 14:22 by rmk") + (* ; "Edited 12-Jul-2022 09:19 by rmk") (* ; "Edited 4-Dec-92 12:11 by jds") (* ;  "STRM has already been determined to be a vanilla strike-format file.") (* ; "returns a charsetinfo") - (COND - ((NEQ 2 (GETFILEPTR STRM)) - (SETFILEPTR STRM 2))) - (LET (CSINFO NUMBCODES RW BITMAP OFFSETS FIRSTCHAR LASTCHAR HEIGHT WIDTHS) - (SETQ CSINFO (create CHARSETINFO)) - (SETQ FIRSTCHAR (\WIN STRM)) (* ; "minimum ascii code") - (SETQ LASTCHAR (\WIN STRM)) (* ; "maximum ascii code") - (\WIN STRM) (* ; + (RESETLST + (CL:UNLESS (\GETSTREAM STRM 'INPUT T) + [RESETSAVE (SETQ STRM (OPENSTREAM STRM 'INPUT 'OLD)) + `(PROGN (CLOSEF? OLDVALUE]) + (SETFILEPTR STRM 0) + (CL:UNLESS (STRIKEFONT.FILEP STRM) + (ERROR "Not a STRIKE font file" STRM)) + (CL:UNLESS (EQ 2 (GETFILEPTR STRM)) + (SETFILEPTR STRM 2)) + (LET (CSINFO NUMBCODES RW BITMAP OFFSETS FIRSTCHAR LASTCHAR HEIGHT WIDTHS) + (SETQ CSINFO (create CHARSETINFO)) + (SETQ FIRSTCHAR (\WIN STRM)) (* ; "minimum ascii code") + (SETQ LASTCHAR (\WIN STRM)) (* ; "maximum ascii code") + (\WIN STRM) (* ;  "MaxWidth which isn't used by anyone.") - (\WIN STRM) (* ; + (\WIN STRM) (* ;  "number of words in this StrikeBody") - (replace (CHARSETINFO CHARSETASCENT) of CSINFO with (\WIN STRM)) + (replace (CHARSETINFO CHARSETASCENT) of CSINFO with (\WIN STRM)) (* ;  "ascent in scan lines (=FBBdy+FBBoy)") - (replace (CHARSETINFO CHARSETDESCENT) of CSINFO with (\WIN STRM)) + (replace (CHARSETINFO CHARSETDESCENT) of CSINFO with (\WIN STRM)) (* ; "descent in scan-lines (=FBBoy)") - (\WIN STRM) (* ; + (\WIN STRM) (* ;  "offset in bits (<0 for kerning, else 0, =FBBox)") - (SETQ RW (\WIN STRM)) (* ; "raster width of bitmap") + (SETQ RW (\WIN STRM)) (* ; "raster width of bitmap") (* ; "height of bitmap") - (* ;; "JDS 12/4/92: Apparently, these fields can be signed values, if all chars, e.g., ride above the base line.") - - (SETQ HEIGHT (IPLUS (SIGNED (fetch (CHARSETINFO CHARSETASCENT) of CSINFO) - 16) - (SIGNED (fetch (CHARSETINFO CHARSETDESCENT) of CSINFO) - 16))) - (SETQ BITMAP (BITMAPCREATE (UNFOLD RW BITSPERWORD) - HEIGHT)) - (\BINS STRM (fetch BITMAPBASE of BITMAP) - 0 - (UNFOLD (ITIMES RW HEIGHT) - BYTESPERWORD)) (* ; "read bits into bitmap") - (replace (CHARSETINFO CHARSETBITMAP) of CSINFO with BITMAP) - (SETQ NUMBCODES (IPLUS (IDIFFERENCE LASTCHAR FIRSTCHAR) - 3)) (* ; + (* ;; "JDS 12/4/92: Apparently, these fields can be signed values, if all chars, e.g., ride above the base line.") + + (SETQ HEIGHT (IPLUS (SIGNED (fetch (CHARSETINFO CHARSETASCENT) of CSINFO) + 16) + (SIGNED (fetch (CHARSETINFO CHARSETDESCENT) of CSINFO) + 16))) + (SETQ BITMAP (BITMAPCREATE (UNFOLD RW BITSPERWORD) + HEIGHT)) + (\BINS STRM (fetch BITMAPBASE of BITMAP) + 0 + (UNFOLD (ITIMES RW HEIGHT) + BYTESPERWORD)) (* ; "read bits into bitmap") + (replace (CHARSETINFO CHARSETBITMAP) of CSINFO with BITMAP) + (SETQ NUMBCODES (IPLUS (IDIFFERENCE LASTCHAR FIRSTCHAR) + 3)) (* ;  "(SETQ OFFSETS (ARRAY (IPLUS \MAXCHAR 3) (QUOTE SMALLPOSP) 0 0))") - (SETQ OFFSETS (fetch (CHARSETINFO OFFSETS) of CSINFO)) + (SETQ OFFSETS (fetch (CHARSETINFO OFFSETS) of CSINFO)) (* ; "initialise the offsets to 0") - (for I from 0 to (IPLUS \MAXTHINCHAR 2) do (\FSETOFFSET OFFSETS I 0)) + (for I from 0 to (IPLUS \MAXTHINCHAR 2) do (\FSETOFFSET OFFSETS I 0)) (* ;  "(AIN OFFSETS FIRSTCHAR NUMBCODES STRM)") - (for I from FIRSTCHAR as J from 1 to NUMBCODES do (\FSETOFFSET OFFSETS I (\WIN STRM))) - (SETQ WIDTHS (fetch (CHARSETINFO WIDTHS) of CSINFO)) - (for I from 0 to (IPLUS \MAXTHINCHAR 2) do (\FSETWIDTH WIDTHS I 0)) + (for I from FIRSTCHAR as J from 1 to NUMBCODES do (\FSETOFFSET OFFSETS I (\WIN STRM))) + (SETQ WIDTHS (fetch (CHARSETINFO WIDTHS) of CSINFO)) + (for I from 0 to (IPLUS \MAXTHINCHAR 2) do (\FSETWIDTH WIDTHS I 0)) (* ;  "(replace WIDTHS of (CHARSETINFO CSINFO) with (ARRAY (IPLUS \MAXCHAR 3) (QUOTE SMALLPOSP) 0 0))") - (\FONTRESETCHARWIDTHS CSINFO FIRSTCHAR LASTCHAR) - (replace (CHARSETINFO IMAGEWIDTHS) of CSINFO with (fetch (CHARSETINFO WIDTHS) of CSINFO)) - CSINFO]) + (\FONTRESETCHARWIDTHS CSINFO FIRSTCHAR LASTCHAR) + (replace (CHARSETINFO IMAGEWIDTHS) of CSINFO with (fetch (CHARSETINFO WIDTHS) + of CSINFO)) + CSINFO))]) (\SFMAKEBOLD [LAMBDA (CSINFO) (* gbn "25-Jul-85 04:52") @@ -2689,7 +2967,8 @@ (DEFINEQ (WRITESTRIKEFONTFILE - [LAMBDA (FONT CHARSET FILE) (* ; "Edited 1-Feb-2025 12:27 by mth") + [LAMBDA (FONT CHARSET FILE) (* ; "Edited 22-May-2025 09:53 by rmk") + (* ; "Edited 1-Feb-2025 12:27 by mth") (* ; "Edited 12-Jul-2022 14:36 by rmk") (* kbr%: "21-Oct-85 15:08") (* ; @@ -2702,7 +2981,7 @@ (LISPERROR "ILLEGAL ARG" CHARSET)) (LET (STREAM CSINFO FIRSTCHAR LASTCHAR WIDTHS MAXWIDTH LENGTH RASTERWIDTH DUMMYCHAR DUMMYOFFSET PREVIOUSOFFSET OFFSETS) - (SETQ CSINFO (\GETCHARSETINFO CHARSET FONT T)) + (SETQ CSINFO (\INSURECHARSETINFO CHARSET FONT T)) (CL:UNLESS CSINFO (ERROR "Couldn't find charset " CHARSET)) (SETQ WIDTHS (fetch (CHARSETINFO WIDTHS) of CSINFO)) (SETQ OFFSETS (fetch (CHARSETINFO OFFSETS) of CSINFO)) @@ -2871,10 +3150,11 @@ (DEFPRINT 'FONTCLASS (FUNCTION FONTCLASS.DEFPRINT)) (/DECLAREDATATYPE 'FONTDESCRIPTOR - '(POINTER POINTER POINTER POINTER WORD WORD WORD WORD SIGNEDWORD SIGNEDWORD SIGNEDWORD + '(POINTER FLAG POINTER POINTER POINTER WORD WORD WORD WORD SIGNEDWORD SIGNEDWORD SIGNEDWORD SIGNEDWORD POINTER POINTER POINTER POINTER POINTER (BITS 8) WORD POINTER POINTER FLAG POINTER) '((FONTDESCRIPTOR 0 POINTER) + (FONTDESCRIPTOR 0 (FLAGBITS . 0)) (FONTDESCRIPTOR 2 POINTER) (FONTDESCRIPTOR 4 POINTER) (FONTDESCRIPTOR 6 POINTER) @@ -2901,22 +3181,27 @@ (DEFPRINT 'FONTDESCRIPTOR (FUNCTION FONTDESCRIPTOR.DEFPRINT)) -(/DECLAREDATATYPE 'CHARSETINFO '(POINTER POINTER POINTER POINTER POINTER WORD WORD POINTER) +(/DECLAREDATATYPE 'CHARSETINFO '(POINTER FLAG FLAG POINTER POINTER POINTER POINTER WORD WORD POINTER + POINTER) '((CHARSETINFO 0 POINTER) + (CHARSETINFO 0 (FLAGBITS . 0)) + (CHARSETINFO 0 (FLAGBITS . 16)) (CHARSETINFO 2 POINTER) (CHARSETINFO 4 POINTER) (CHARSETINFO 6 POINTER) (CHARSETINFO 8 POINTER) (CHARSETINFO 10 (BITS . 15)) (CHARSETINFO 11 (BITS . 15)) - (CHARSETINFO 12 POINTER)) - '14) + (CHARSETINFO 12 POINTER) + (CHARSETINFO 14 POINTER)) + '16) (ADDTOVAR SYSTEMRECLST (DATATYPE FONTCLASS ((PRETTYFONT# BYTE) DISPLAYFD PRESSFD INTERPRESSFD OTHERFDS FONTCLASSNAME)) (DATATYPE FONTDESCRIPTOR ((FONTDEVICE POINTER) + (FONTCOMPLETEP FLAG) (FONTFAMILY POINTER) (FONTSIZE POINTER) (FONTFACE POINTER) @@ -2935,14 +3220,16 @@ (FONTSCALE POINTER) (\SFFACECODE BITS 8) (FONTAVGCHARWIDTH WORD) - (FONTIMAGEWIDTHS POINTER) + (FONTCHARENCODING POINTER) (FONTCHARSETVECTOR POINTER) (FONTHASLEFTKERNS FLAG) (FONTEXTRAFIELD2 POINTER))) -(DATATYPE CHARSETINFO (WIDTHS OFFSETS IMAGEWIDTHS CHARSETBITMAP YWIDTHS (CHARSETASCENT WORD) +(DATATYPE CHARSETINFO (WIDTHS (CSSLUGP FLAG) + (CSCOMPLETEP FLAG) + OFFSETS IMAGEWIDTHS CHARSETBITMAP YWIDTHS (CHARSETASCENT WORD) (CHARSETDESCENT WORD) - LEFTKERN)) + LEFTKERN CSINFOPROPS)) ) (RPAQ? \FONTSINCORE ) @@ -2958,13 +3245,6 @@ (\UNITWIDTHSVECTOR) ) -(DECLARE%: EVAL@COMPILE - -(RPAQQ NORUNCODE 255) - - -(CONSTANTS (NORUNCODE 255)) -) (* "FOLLOWING DEFINITIONS EXPORTED") (DEFOPTIMIZER FONTPROP (&REST ARGS) (SELECTQ (AND (EQ (CAADR ARGS) @@ -2985,6 +3265,7 @@ (INIT (DEFPRINT 'FONTCLASS (FUNCTION FONTCLASS.DEFPRINT)))) (DATATYPE FONTDESCRIPTOR ((FONTDEVICE POINTER) + (FONTCOMPLETEP FLAG) (FONTFAMILY POINTER) (FONTSIZE POINTER) (FONTFACE POINTER) @@ -3009,8 +3290,8 @@ (\SFFACECODE BITS 8) (FONTAVGCHARWIDTH WORD) (* ;  "Set in FONTCREATE, used to fix up the linelength when DSPFONT is called") - (FONTIMAGEWIDTHS POINTER) (* ; "This is the image width, as opposed to the advanced width; initial hack for accents, kerning. Fields is referenced by FONTCREATE.") - (FONTCHARSETVECTOR POINTER) (* ; "A 256-pointer block, with one pointer per 'character set' --each group of 256 character codes. Each pointer is either NIL if there's no info for that charset, or is a CHARSETINFO, containing widths, char bitmap, etc for the characters in that charset.") + (FONTCHARENCODING POINTER) (* ; "Was FONTIMAGEWIDTHS: This is the image width, as opposed to the advanced width; initial hack for accents, kerning. Fields is referenced by FONTCREATE.") + (FONTCHARSETVECTOR POINTER) (* ; "A 257-pointer block, with one pointer per 'character set' --each group of 256 character codes. Each pointer is either NIL if there's no info for that charset, or is a CHARSETINFO, containing widths, char bitmap, etc for the characters in that charset. The last cell if not NIL is the %"slug%" charsetinfo that can be shared as the dummy entry for otherwise NIL charsets") (FONTHASLEFTKERNS FLAG) (* ;  "T if at least one character set has an entry for left kerns") (FONTEXTRAFIELD2 POINTER)) @@ -3042,10 +3323,12 @@ WEIGHT _ 'MEDIUM SLOPE _ 'REGULAR EXPANSION _ 'REGULAR (TYPE? LISTP)) (DATATYPE CHARSETINFO (WIDTHS (* ; "The advance-width of each character, an array indexed by charcode. Usually the same as the imagewidth, but can differ for accents, kerns kerns. This is what should be used for stringwidth calculations.") + (CSSLUGP FLAG) (* ; "True if this is a slug charset") + (CSCOMPLETEP FLAG) (* ; + "True if there is no further data to fill in any remaining slug-characters in a non-slug charset") OFFSETS (* ;  "Offset of each character into the image bitmap; X value of left edge") - IMAGEWIDTHS (* ; - "imagewidths is not automagically allocated since it is not always needed") + IMAGEWIDTHS (* ; "imagewidths is not automagically allocated since it is not always needed. But at least some times the IMAGEWIDTHS and WIDTHS vectors are EQ in this case.") CHARSETBITMAP (* ;  "Bitmap containing the character images, indexed by OFFSETS") YWIDTHS @@ -3053,7 +3336,7 @@  "Max ascent for all characters in this CHARSET") (CHARSETDESCENT WORD) (* ;  "Max descent for all characters in this CHARSET") - LEFTKERN) + LEFTKERN CSINFOPROPS (* ; "Alist of extra properties")) WIDTHS _ (\CREATECSINFOELEMENT) OFFSETS _ (\CREATECSINFOELEMENT)) ) @@ -3070,10 +3353,11 @@ (DEFPRINT 'FONTCLASS (FUNCTION FONTCLASS.DEFPRINT)) (/DECLAREDATATYPE 'FONTDESCRIPTOR - '(POINTER POINTER POINTER POINTER WORD WORD WORD WORD SIGNEDWORD SIGNEDWORD SIGNEDWORD + '(POINTER FLAG POINTER POINTER POINTER WORD WORD WORD WORD SIGNEDWORD SIGNEDWORD SIGNEDWORD SIGNEDWORD POINTER POINTER POINTER POINTER POINTER (BITS 8) WORD POINTER POINTER FLAG POINTER) '((FONTDESCRIPTOR 0 POINTER) + (FONTDESCRIPTOR 0 (FLAGBITS . 0)) (FONTDESCRIPTOR 2 POINTER) (FONTDESCRIPTOR 4 POINTER) (FONTDESCRIPTOR 6 POINTER) @@ -3100,16 +3384,20 @@ (DEFPRINT 'FONTDESCRIPTOR (FUNCTION FONTDESCRIPTOR.DEFPRINT)) -(/DECLAREDATATYPE 'CHARSETINFO '(POINTER POINTER POINTER POINTER POINTER WORD WORD POINTER) +(/DECLAREDATATYPE 'CHARSETINFO '(POINTER FLAG FLAG POINTER POINTER POINTER POINTER WORD WORD POINTER + POINTER) '((CHARSETINFO 0 POINTER) + (CHARSETINFO 0 (FLAGBITS . 0)) + (CHARSETINFO 0 (FLAGBITS . 16)) (CHARSETINFO 2 POINTER) (CHARSETINFO 4 POINTER) (CHARSETINFO 6 POINTER) (CHARSETINFO 8 POINTER) (CHARSETINFO 10 (BITS . 15)) (CHARSETINFO 11 (BITS . 15)) - (CHARSETINFO 12 POINTER)) - '14) + (CHARSETINFO 12 POINTER) + (CHARSETINFO 14 POINTER)) + '16) (DECLARE%: EVAL@COMPILE (PUTPROPS FONTASCENT MACRO ((FONTSPEC) @@ -3130,17 +3418,17 @@ (PUTPROPS \FGETWIDTH DMACRO ((WIDTHSBLOCK CHAR8CODE) (\GETBASE WIDTHSBLOCK CHAR8CODE))) -(PUTPROPS \FSETWIDTH DMACRO ((WIDTHSBLOCK INDEX WIDTH) - (\PUTBASE WIDTHSBLOCK INDEX WIDTH))) +(PUTPROPS \FSETWIDTH DMACRO ((WIDTHSBLOCK CHAR8CODE VAL) + (\PUTBASE WIDTHSBLOCK CHAR8CODE VAL))) (PUTPROPS \FGETCHARWIDTH MACRO (OPENLAMBDA (FONTDESC CHARCODE) - (\FGETWIDTH (ffetch (CHARSETINFO WIDTHS) of (\GETCHARSETINFO + (\FGETWIDTH (ffetch (CHARSETINFO WIDTHS) of (\INSURECHARSETINFO (\CHARSET CHARCODE) FONTDESC)) (\CHAR8CODE CHARCODE)))) (PUTPROPS \FSETCHARWIDTH MACRO (OPENLAMBDA (FONTDESC CHARCODE WIDTH) - (\FSETWIDTH (ffetch (CHARSETINFO WIDTHS) of (\GETCHARSETINFO + (\FSETWIDTH (ffetch (CHARSETINFO WIDTHS) of (\INSURECHARSETINFO (\CHARSET CHARCODE) FONTDESC)) (\CHAR8CODE CHARCODE) @@ -3151,37 +3439,53 @@ (PUTPROPS \FSETIMAGEWIDTH DMACRO ((WIDTHSBLOCK INDEX WIDTH) (\PUTBASE WIDTHSBLOCK INDEX WIDTH))) +) +(DECLARE%: EVAL@COMPILE -(PUTPROPS \GETCHARSETINFO MACRO ((CHARSET FONTDESC NOSLUG?) +(PUTPROPS \XGETCHARSETINFO MACRO ((FONTDESC CHARSET) - (* ;; "fetches the charsetinfo for charset CHARSET in fontdescriptor FONTDESC. If NIL, then creates the required charset.") + (* ;; + "Temporary until other callers of \GETCHARSETINFO are changes to \INSURECHARSETINFO") - (* ;; - "NOSLUG? means don't create an empty (slug) csinfo if the charset is not found, just return NIL") + (* ;; + "Fetches the charsetinfo for charset CHARSET in fontdescriptor FONTDESC. ") + + (* ;; + "NOTE Current \GETCHARSETINFO takes the vector, not the font, as does current \SETCHARSETINFO") + + (\GETBASEPTR (ffetch FONTCHARSETVECTOR of FONTDESC) + (UNFOLD CHARSET 2)))) + +(PUTPROPS \GETCHARSETINFO MACRO [(CHARSET FONTDESC) + + (* ;; "fetches the charsetinfo for charset CHARSET in fontdescriptor FONTDESC. If NIL, then creates the required charset, maybe a slug (with CSSLUGP T).") (OR (\GETBASEPTR (ffetch FONTCHARSETVECTOR of FONTDESC) (UNFOLD CHARSET 2)) - (\CREATECHARSET CHARSET FONTDESC NOSLUG?)))) + (\SETCHARSETINFO (ffetch FONTCHARSETVECTOR of FONTDESC) + CHARSET + (\CREATECHARSET CHARSET FONTDESC]) + +(PUTPROPS \INSURECHARSETINFO MACRO [(CHARSET FONTDESC) + + (* ;; "fetches the charsetinfo for charset CHARSET in fontdescriptor FONTDESC. If NIL, then creates the required charset, maybe a slug (with CSSLUGP T).") + + (OR (\GETBASEPTR (ffetch FONTCHARSETVECTOR of FONTDESC) + (UNFOLD CHARSET 2)) + (\SETCHARSETINFO (ffetch FONTCHARSETVECTOR of FONTDESC) + CHARSET + (\CREATECHARSET CHARSET FONTDESC]) (PUTPROPS \CREATECSINFOELEMENT MACRO (NIL (\ALLOCBLOCK (FOLDHI (IPLUS \MAXTHINCHAR 3) WORDSPERCELL)))) -(PUTPROPS \CREATEFONTCHARSETVECTOR MACRO (NIL (* ; - "Allocates a block for the character set records") - (\ALLOCBLOCK (ADD1 \MAXCHARSET) - T))) -) +(PUTPROPS \CREATEFONTCHARSETVECTOR MACRO (NIL -(DEFMACRO \CREATEKERNELEMENT () (* ; "Edited 19-Dec-2024 12:20 by rmk") - `(PROGN (HELP "THIS IS BOGUS, SEE \FGETLEFTKERN") - (CL:MAKE-ARRAY (IPLUS \MAXTHINCHAR 3) - :ELEMENT-TYPE - '(SIGNED-BYTE 16) - :INITIAL-ELEMENT 0))) + (* ;; "Allocates a block for the character set records, including one extra slot to hold the common slug charsetinfo") -(DEFMACRO \FSETLEFTKERN (LEFTKERNBLOCK INDEX KERNVALUE) - `(CL:SETF (CL:AREF ,LEFTKERNBLOCK ,INDEX) - ,KERNVALUE)) + (\ALLOCBLOCK (IPLUS 2 \MAXCHARSET) + T))) +) (DECLARE%: EVAL@COMPILE (RPAQQ \MAXNSCHAR 65535) @@ -3195,30 +3499,69 @@ ) (DEFINEQ +(\CREATEKERNELEMENT + [LAMBDA NIL (* ; "Edited 17-May-2025 09:36 by rmk") + + (* ;; "This is bogus, see \FGETLEFTKERN. But whatever is here will be preserved if written out in a Medley format fontfile") + + (CL:MAKE-ARRAY (IPLUS \MAXTHINCHAR 3) + :ELEMENT-TYPE + '(SIGNED-BYTE 16) + :INITIAL-ELEMENT 0]) + +(\FSETLEFTKERN + [LAMBDA (LEFTKERNBLOCK INDEX KERNVALUE) (* ; "Edited 17-May-2025 09:18 by rmk") + (CL:SETF (CL:AREF LEFTKERNBLOCK INDEX) + KERNVALUE]) + (\FGETLEFTKERN - [LAMBDA (FONT PREVCHARCODE CHARCODE) (* ; "Edited 19-Dec-2024 15:25 by rmk") + [LAMBDA (FONT PREVCHARCODE CHARCODE) (* ; "Edited 22-May-2025 09:53 by rmk") + (* ; "Edited 18-May-2025 21:30 by rmk") + (* ; "Edited 1-May-2025 11:08 by rmk") + (* ; "Edited 19-Dec-2024 15:25 by rmk") (* ;; "Returns the kern information for CHARCODE in FONT, given that it is an immediate successor of PREVCHARCODE. Returns 0 if no PREVCHARCODE/CHARCODE kerning is specified. For now, assume that the kerning information is sparse for characters within a character set, stored as a 2-level alist. ") (* ;; "If the kerning information for a character is already a FIXP, then it is an offset no matter what the preceding character might be. This appears to be the way at least AC font files are set up.") (OR [AND (fetch (FONTDESCRIPTOR FONTHASLEFTKERNS) of FONT) - (LET [(CHARKERNS (CDR (FASSOC (\GETCHARSETINFO (\CHARSET CHARCODE) - FONT T) - (\CHAR8CODE CHARCODE] + (LET [(CHARKERNS (CDR (FASSOC (\CHAR8CODE CHARCODE) + (fetch (CHARSETINFO LEFTKERN) of (\INSURECHARSETINFO + (\CHARSET CHARCODE) + FONT] (OR (FIXP CHARKERNS) (CDR (FASSOC PREVCHARCODE CHARKERNS] 0]) ) +(DEFINEQ +(\CREATEFONT + [LAMBDA (FAMILY SIZE FACE ROTATION DEVICE CHARSET) (* ; "Edited 20-May-2025 21:10 by rmk") + (* ;; "Generic font creation. Uses fontcreate method from device, build a fontdescriptor but doesn't call SETFONTDESCRIPTOR to install it.") -(* ; "NS Character specific code") + (* ;; "\DEFAULTCHARSET is kind of foolish, since \AVGCHARWIDTH wants the width of A=0,101 and therefore forces charset 0. (A may be some random character in Symbol, Math, but...).") -(DEFINEQ + (DECLARE (GLOBALVARS \DEFAULTCHARSET)) + (CL:UNLESS DEVICE + (SETQ DEVICE 'DISPLAY)) + (LET (FN FONT) + (CL:WHEN [AND [SETQ FN (CADR (ASSOC 'FONTCREATE (CDR (ASSOC DEVICE IMAGESTREAMTYPES] + (SETQ FONT (APPLY* FN (\FONTSYMBOL FAMILY) + SIZE + (\FONTFACE FACE) + (OR ROTATION 0) + DEVICE + (OR CHARSET \DEFAULTCHARSET] + (replace (FONTDESCRIPTOR FONTAVGCHARWIDTH) of FONT with (\AVGCHARWIDTH FONT)) + FONT)]) (\CREATECHARSET - [LAMBDA (CHARSET FONT NOSLUG?) (* ; "Edited 12-Jul-2022 14:37 by rmk") + [LAMBDA (CHARSET FONT NOSLUG?) (* ; "Edited 9-Jun-2025 17:55 by rmk") + (* ; "Edited 7-Jun-2025 15:10 by rmk") + (* ; "Edited 18-May-2025 21:40 by rmk") + (* ; "Edited 16-May-2025 21:37 by rmk") + (* ; "Edited 12-Jul-2022 14:37 by rmk") (* ; "Edited 8-May-93 23:42 by rmk:") (* ; "Edited 4-Dec-92 11:43 by jds") @@ -3229,23 +3572,22 @@ (CL:WHEN (OR (ILESSP CHARSET 0) (IGREATERP CHARSET \MAXCHARSET)) (\ILLEGAL.ARG CHARSET)) - (LET [CSINFO (CREATEFN (COND - ((FMEMB (FONTPROP FONT 'DEVICE) - \DISPLAYSTREAMTYPES) - (FUNCTION \CREATECHARSET.DISPLAY)) - (T (CADR (ASSOC 'CREATECHARSET (CDR (ASSOC (FONTPROP FONT 'DEVICE) - IMAGESTREAMTYPES] + (LET* [[CREATEFN (CADR (ASSOC 'CREATECHARSET (CDR (ASSOC (FONTPROP FONT 'DEVICE) + IMAGESTREAMTYPES] + (CSINFO (APPLY CREATEFN (APPEND (FONTPROP FONT 'DEVICESPEC) + (LIST CHARSET FONT NOSLUG?] - (* ;; "Create a descriptor of info for that charset, and use it to fill things in.") + (* ;; "Create a descriptor of info for that charset. If we got one, the subfunction may have ignored NOSLUG?. But if not, we store it in the vector so that we don't search later. But we don't return a slug. ") - (CL:WHEN [SETQ CSINFO (APPLY CREATEFN (APPEND (FONTPROP FONT 'DEVICESPEC) - (LIST CHARSET FONT NOSLUG?] - (* ; - "the create method did not return NIL--NOSLUG? must be T. ") - (\INSTALLCHARSETINFO FONT CSINFO CHARSET))]) + (CL:WHEN CSINFO + (\INSTALLCHARSETINFO FONT CSINFO CHARSET) + (CL:UNLESS (fetch (CHARSETINFO CSSLUGP) of CSINFO) + CSINFO))]) (\INSTALLCHARSETINFO - [LAMBDA (FONT CSINFO CHARSET) (* ; "Edited 12-Jul-2022 15:08 by rmk") + [LAMBDA (FONT CSINFO CHARSET) (* ; "Edited 25-May-2025 07:48 by rmk") + (* ; "Edited 23-May-2025 14:44 by rmk") + (* ; "Edited 12-Jul-2022 15:08 by rmk") (replace \SFAscent of FONT with (IMAX (fetch \SFAscent of FONT) (SIGNED (fetch CHARSETASCENT of CSINFO) 16))) @@ -3267,46 +3609,45 @@ (* ;; "\AVGCHARWIDTH has to be confused after the CSINFO is stuck in.") (replace (FONTDESCRIPTOR FONTAVGCHARWIDTH) of FONT with (\AVGCHARWIDTH FONT)) + (\INSTALLCHARSETINFO.CHARENCODING FONT CSINFO CHARSET) CSINFO]) + +(\INSTALLCHARSETINFO.CHARENCODING + [LAMBDA (FONT CSINFO CHARSET) (* ; "Edited 25-May-2025 23:05 by rmk") + (* ; "Edited 24-May-2025 21:42 by rmk") + (CL:UNLESS (fetch (CHARSETINFO CSSLUGP) of CSINFO) + (LET [(FONTCHARENCODING (fetch (FONTDESCRIPTOR FONTCHARENCODING) of FONT)) + (CSCHARENCODING (CDR (ASSOC 'CSCHARENCODING (fetch (CHARSETINFO CSINFOPROPS) + of CSINFO] + (if (EQ FONTCHARENCODING CSCHARENCODING) + elseif FONTCHARENCODING + then (CL:WHEN NIL + CSCHARENCODING + (ERROR (CONCAT "The character encoding for character set " CHARSET + " does not match the font's encoding") + (LIST FONT CSINFO))) + (change (fetch (CHARSETINFO CSINFOPROPS) of CSINFO) + (CONS (CONS 'CSCHARENCODING FONTCHARENCODING) + DATUM)) + else (replace (FONTDESCRIPTOR FONTCHARENCODING) of FONT with CSCHARENCODING))))]) ) (DECLARE%: DOEVAL@COMPILE DONTCOPY -(GLOBALVARS DISPLAYFONTCOERCIONS MISSINGDISPLAYFONTCOERCIONS MISSINGCHARSETDISPLAYFONTCOERCIONS - CHARSETERRORFLG) +(GLOBALVARS DISPLAYFONTCOERCIONS DISPLAYCHARSETCOERCIONS) ) (RPAQ? DISPLAYFONTCOERCIONS NIL) -(RPAQ? MISSINGCHARSETDISPLAYFONTCOERCIONS - '(((GACHA) - (TERMINAL)) - ((MODERN) - (CLASSIC)) - ((TIMESROMAN) - (CLASSIC)) - ((HELVETICA) - (MODERN)) - ((TERMINAL 6) - (MODERN 6)) - ((TERMINAL 8) - (MODERN 8)) - ((TERMINAL 10) - (MODERN 10)) - ((TERMINAL 12) - (MODERN 12)))) - -(RPAQ? MISSINGDISPLAYFONTCOERCIONS '(((GACHA) - (TERMINAL)) - ((MODERN) - (CLASSIC)) - ((TIMESROMAN) - (CLASSIC)) - ((HELVETICA) - (MODERN)) - ((TERMINAL) - (MODERN)))) - -(RPAQ? CHARSETERRORFLG NIL) +(RPAQ? DISPLAYCHARSETCOERCIONS '(((GACHA) + (TERMINAL)) + ((MODERN) + (CLASSIC)) + ((TIMESROMAN) + (CLASSIC)) + ((HELVETICA) + (MODERN)) + ((TERMINAL) + (MODERN)))) (RPAQ? \DEFAULTCHARSET 0) (DEFINEQ @@ -3341,12 +3682,22 @@ (\FSETOFFSET offsets (ADD1 \MAXCHAR) dummycharoffset]) ) -(DECLARE%: DONTEVAL@LOAD +(DECLARE%: DOEVAL@COMPILE DONTCOPY + +(GLOBALVARS DISPLAYCHARSETFNS) +) +(DECLARE%: DONTEVAL@LOAD DOCOPY -(RPAQ? DISPLAYFONTEXTENSIONS 'DISPLAYFONT) +(RPAQ? DISPLAYFONTDIRECTORIES NIL) + + +(RPAQQ DISPLAYCHARSETFNS ((MEDLEYFONT MEDLEYFONT.FILEP MEDLEYFONT.GETCHARSET) + (AC ACFONT.FILEP ACFONT.GETCHARSET) + (STRIKE STRIKEFONT.FILEP \READSTRIKEFONTFILE))) +) +(DECLARE%: DONTEVAL@LOAD DOCOPY -(RPAQ? DISPLAYFONTDIRECTORIES '({DSK}/USR/LOCAL/LDE/FONTS/DISPLAY/PRESENTATION/ - {dsk}/usr/local/lde/fonts/display/publishing/)) +(ADDTOVAR DISPLAYFONTEXTENSIONS MEDLEYDISPLAYFONT DISPLAYFONT STRIKE) ) (DECLARE%: EVAL@COMPILE DONTCOPY (DECLARE%: EVAL@COMPILE @@ -3364,7 +3715,7 @@ (PUTPROPS \FGETCHARIMAGEWIDTH MACRO (OPENLAMBDA (FONT CHARCODE) (\FGETWIDTH (ffetch (CHARSETINFO IMAGEWIDTHS) - of (\GETCHARSETINFO (\CHARSET CHARCODE) + of (\INSURECHARSETINFO (\CHARSET CHARCODE) FONT)) (\CHAR8CODE CHARCODE)))) @@ -3394,31 +3745,39 @@ (ADDTOVAR LAMA FONTCOPY) ) (DECLARE%: DONTCOPY - (FILEMAP (NIL (8870 18389 (CHARWIDTH 8880 . 9665) (CHARWIDTHY 9667 . 11037) (STRINGWIDTH 11039 . 12132 -) (\CHARWIDTH.DISPLAY 12134 . 12547) (\STRINGWIDTH.DISPLAY 12549 . 12973) (\STRINGWIDTH.GENERIC 12975 - . 18387)) (18390 24772 (DEFAULTFONT 18400 . 20233) (FONTCLASS 20235 . 22397) (FONTCLASSUNPARSE 22399 - . 23298) (FONTCLASSCOMPONENT 23300 . 23809) (SETFONTCLASSCOMPONENT 23811 . 24770)) (25446 38178 ( -FONTCREATE 25456 . 34723) (\FONT.SYMBOLMEMB 34725 . 34955) (\FONT.SYMBOLASSOC 34957 . 36115) ( -\FONT.COMPARESYMBOL 36117 . 38176)) (38217 42841 (FONTASCENT 38227 . 38395) (FONTDESCENT 38397 . 38666 -) (FONTHEIGHT 38668 . 38854) (FONTPROP 38856 . 42299) (\AVGCHARWIDTH 42301 . 42839)) (42888 55527 ( -GETCHARBITMAP 42898 . 45788) (PUTCHARBITMAP 45790 . 53847) (MOVECHARBITMAP 53849 . 55525)) (55528 -140067 (FONTCOPY 55538 . 60846) (FONTSAVAILABLE 60848 . 66053) (FONTFILEFORMAT 66055 . 67679) (FONTP -67681 . 67980) (FONTUNPARSE 67982 . 70546) (SETFONTDESCRIPTOR 70548 . 72257) (CHARCODEP 72259 . 72620) - (EDITCHAR 72622 . 73051) (\STREAMCHARWIDTH 73053 . 77217) (\UNITWIDTHSVECTOR 77219 . 77582) ( -\CREATEDISPLAYFONT 77584 . 78337) (\CREATECHARSET.DISPLAY 78339 . 81255) (\CREATE-REAL-CHARSET.DISPLAY - 81257 . 88161) (\BUILDSLUGCSINFO 88163 . 89606) (\SEARCHDISPLAYFONTFILES 89608 . 91541) ( -\SEARCHFONTFILES 91543 . 94854) (\FINDFONTFILE 94856 . 96047) (\FONTSYMBOL 96049 . 96699) ( -\DEVICESYMBOL 96701 . 97570) (\FONTFACE 97572 . 104762) (\FONTFACE.COLOR 104764 . 111684) ( -\FONTFILENAME 111686 . 115101) (\FONTFILENAME.OLD 115103 . 118052) (\FONTFILENAME.NEW 118054 . 120311) - (\FONTINFOFROMFILENAME 120313 . 123427) (\FONTINFOFROMFILENAME.OLD 123429 . 125706) (\GETFONTDESC -125708 . 126099) (\COERCEFONTDESC 126101 . 131486) (\LOOKUPFONT 131488 . 132832) (\LOOKUPFONTSINCORE -132834 . 134907) (\READDISPLAYFONTFILE 134909 . 140065)) (140970 157694 (\READSTRIKEFONTFILE 140980 . -145182) (\SFMAKEBOLD 145184 . 147580) (\SFMAKEITALIC 147582 . 150485) (\SFMAKEROTATEDFONT 150487 . -151888) (\SFROTATECSINFO 151890 . 152527) (\SFROTATEFONTCHARACTERS 152529 . 152909) ( -\SFFIXOFFSETSAFTERROTATION 152911 . 155050) (\SFROTATECSINFOOFFSETS 155052 . 156321) (\SFMAKECOLOR -156323 . 157692)) (157695 165057 (WRITESTRIKEFONTFILE 157705 . 161597) (STRIKECSINFO 161599 . 165055)) - (165058 166897 (FONTDESCRIPTOR.DEFPRINT 165068 . 166419) (FONTCLASS.DEFPRINT 166421 . 166895)) ( -182093 182415 (\CREATEKERNELEMENT 182093 . 182415)) (182417 182545 (\FSETLEFTKERN 182417 . 182545)) ( -182671 183718 (\FGETLEFTKERN 182681 . 183716)) (183762 187272 (\CREATECHARSET 183772 . 185523) ( -\INSTALLCHARSETINFO 185525 . 187270)) (188427 190179 (\FONTRESETCHARWIDTHS 188437 . 190177))))) + (FILEMAP (NIL (8030 17476 (CHARWIDTH 8040 . 8825) (CHARWIDTHY 8827 . 10300) (STRINGWIDTH 10302 . 11395 +) (\CHARWIDTH.DISPLAY 11397 . 11810) (\STRINGWIDTH.DISPLAY 11812 . 12236) (\STRINGWIDTH.GENERIC 12238 + . 17474)) (17477 23859 (DEFAULTFONT 17487 . 19320) (FONTCLASS 19322 . 21484) (FONTCLASSUNPARSE 21486 + . 22385) (FONTCLASSCOMPONENT 22387 . 22896) (SETFONTCLASSCOMPONENT 22898 . 23857)) (24712 42324 ( +FONTCREATE 24722 . 34079) (COMPLETEFONT 34081 . 35376) (COMPLETEFONTP 35378 . 35893) (COMPLETECHARSET +35895 . 36680) (\COMPLETECHARSET.CSINFO 36682 . 38257) (PRUNEFONTSLUGS 38259 . 38869) ( +\FONT.SYMBOLMEMB 38871 . 39101) (\FONT.SYMBOLASSOC 39103 . 40261) (\FONT.COMPARESYMBOL 40263 . 42322)) + (42363 48199 (FONTASCENT 42373 . 42541) (FONTDESCENT 42543 . 42812) (FONTHEIGHT 42814 . 43000) ( +FONTPROP 43002 . 47585) (\AVGCHARWIDTH 47587 . 48197)) (48246 48687 (EDITCHAR 48256 . 48685)) (48733 +60299 (GETCHARBITMAP 48743 . 49565) (PUTCHARBITMAP 49567 . 51644) (\GETCHARBITMAP.CSINFO 51646 . 53553 +) (\PUTCHARBITMAP.CSINFO 53555 . 60297)) (60300 71961 (MOVECHARBITMAP 60310 . 61986) (MOVEFONTCHARS +61988 . 66498) (\MOVEFONTCHAR 66500 . 69871) (SLUGCHARP.DISPLAY 69873 . 70771) (\GETFONTCHARINFO 70773 + . 71959)) (72237 90137 (FONTFILES 72247 . 73058) (\FINDFONTFILE 73060 . 74777) (\FONTFILENAMES 74779 + . 75653) (\FONTFILENAME 75655 . 79530) (\FONTFILENAME.OLD 79532 . 82481) (\FONTFILENAME.NEW 82483 . +84740) (\FONTINFOFROMFILENAME 84742 . 87856) (\FONTINFOFROMFILENAME.OLD 87858 . 90135)) (90404 159617 +(FONTCOPY 90414 . 95722) (FONTSAVAILABLE 95724 . 100929) (FONTFILEFORMAT 100931 . 101520) (FONTP +101522 . 101821) (FONTUNPARSE 101823 . 104387) (SETFONTDESCRIPTOR 104389 . 106098) (CHARCODEP 106100 + . 106461) (\STREAMCHARWIDTH 106463 . 110627) (\UNITWIDTHSVECTOR 110629 . 110992) (\CREATEDISPLAYFONT +110994 . 112427) (\CREATECHARSET.DISPLAY 112429 . 116740) (\COERCECHARSET 116742 . 119817) ( +\CREATE-REAL-CHARSET.DISPLAY 119819 . 123498) (\BUILDSLUGCSINFO 123500 . 125165) ( +\SEARCHDISPLAYFONTFILES 125167 . 126100) (\SEARCHFONTFILES 126102 . 129185) (\FONTSYMBOL 129187 . +129837) (\DEVICESYMBOL 129839 . 130708) (\FONTFACE 130710 . 137900) (\FONTFACE.COLOR 137902 . 144822) +(\GETFONTDESC 144824 . 145215) (\COERCEFONTDESC 145217 . 150602) (\LOOKUPFONT 150604 . 151948) ( +\LOOKUPFONTSINCORE 151950 . 154023) (\READDISPLAYFONTFILE 154025 . 158672) (SETFONTCHARENCODING 158674 + . 159615)) (159618 161404 (ACFONT.FILEP 159628 . 160512) (STRIKEFONT.FILEP 160514 . 161402)) (161493 +178797 (\READSTRIKEFONTFILE 161503 . 166285) (\SFMAKEBOLD 166287 . 168683) (\SFMAKEITALIC 168685 . +171588) (\SFMAKEROTATEDFONT 171590 . 172991) (\SFROTATECSINFO 172993 . 173630) ( +\SFROTATEFONTCHARACTERS 173632 . 174012) (\SFFIXOFFSETSAFTERROTATION 174014 . 176153) ( +\SFROTATECSINFOOFFSETS 176155 . 177424) (\SFMAKECOLOR 177426 . 178795)) (178798 186272 ( +WRITESTRIKEFONTFILE 178808 . 182812) (STRIKECSINFO 182814 . 186270)) (186273 188112 ( +FONTDESCRIPTOR.DEFPRINT 186283 . 187634) (FONTCLASS.DEFPRINT 187636 . 188110)) (205968 208079 ( +\CREATEKERNELEMENT 205978 . 206374) (\FSETLEFTKERN 206376 . 206569) (\FGETLEFTKERN 206571 . 208077)) ( +208080 214589 (\CREATEFONT 208090 . 209255) (\CREATECHARSET 209257 . 211252) (\INSTALLCHARSETINFO +211254 . 213280) (\INSTALLCHARSETINFO.CHARENCODING 213282 . 214587)) (215209 216961 ( +\FONTRESETCHARWIDTHS 215219 . 216959))))) STOP diff --git a/sources/FONT.LCOM b/sources/FONT.LCOM index 4f13ebbee..112ef13a5 100644 Binary files a/sources/FONT.LCOM and b/sources/FONT.LCOM differ diff --git a/sources/IMAGEIO b/sources/IMAGEIO index 77770c5a5..8667fdfa4 100644 --- a/sources/IMAGEIO +++ b/sources/IMAGEIO @@ -1,13 +1,10 @@ (DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) -(FILECREATED " 8-Dec-2023 21:42:20" {WMEDLEY}IMAGEIO.;8 79284 +(FILECREATED "18-May-2025 21:24:12" {WMEDLEY}IMAGEIO.;9 79433 :EDIT-BY rmk - :CHANGES-TO (FNS \IMAGEIOINIT) - (RECORDS IMAGEOPS) - - :PREVIOUS-DATE "30-Oct-2021 19:09:48" {WMEDLEY}IMAGEIO.;7) + :PREVIOUS-DATE " 8-Dec-2023 21:42:20" {WMEDLEY}IMAGEIO.;8) (PRETTYCOMPRINT IMAGEIOCOMS) @@ -1472,16 +1469,20 @@ (ADDTOVAR IMAGESTREAMTYPES (DISPLAY (OPENSTREAM OPENDISPLAYSTREAM) (FONTCREATE \CREATEDISPLAYFONT) - (FONTSAVAILABLE \SEARCHDISPLAYFONTFILES)) + (FONTSAVAILABLE \SEARCHDISPLAYFONTFILES) + (CREATECHARSET \CREATECHARSET.DISPLAY)) (4DISPLAY (OPENSTREAM OPENDISPLAYSTREAM) (FONTCREATE \CREATEDISPLAYFONT) - (FONTSAVAILABLE \SEARCHDISPLAYFONTFILES)) + (FONTSAVAILABLE \SEARCHDISPLAYFONTFILES) + (CREATECHARSET \CREATECHARSET.DISPLAY)) (8DISPLAY (OPENSTREAM OPENDISPLAYSTREAM) (FONTCREATE \CREATEDISPLAYFONT) - (FONTSAVAILABLE \SEARCHDISPLAYFONTFILES)) + (FONTSAVAILABLE \SEARCHDISPLAYFONTFILES) + (CREATECHARSET \CREATECHARSET.DISPLAY)) (24DISPLAY (OPENSTREAM OPENDISPLAYSTREAM) (FONTCREATE \CREATEDISPLAYFONT) - (FONTSAVAILABLE \SEARCHDISPLAYFONTFILES))) + (FONTSAVAILABLE \SEARCHDISPLAYFONTFILES) + (CREATECHARSET \CREATECHARSET.DISPLAY))) (DECLARE%: DOEVAL@COMPILE DONTCOPY (GLOBALVARS DisplayFDEV \4DISPLAYFDEV \8DISPLAYFDEV \24DISPLAYFDEV) @@ -1505,24 +1506,24 @@ (ADDTOVAR LAMA IMAGESTREAMP) ) (DECLARE%: DONTCOPY - (FILEMAP (NIL (3234 11991 (IMAGESTREAMP 3244 . 4076) (IMAGESTREAMTYPE 4078 . 4291) (IMAGESTREAMTYPEP -4293 . 4928) (OPENIMAGESTREAM 4930 . 9884) (\GOOD.DASHLST 9886 . 11989)) (12026 14323 (DRAWDASHEDLINE -12036 . 14321)) (14324 21664 (DSPBACKCOLOR 14334 . 14706) (DSPBOTTOMMARGIN 14708 . 15093) (DSPCOLOR -15095 . 15459) (DSPCLIPPINGREGION 15461 . 16166) (DSPRESET 16168 . 16448) (DSPFONT 16450 . 16814) ( -DSPLEFTMARGIN 16816 . 17197) (DSPLINEFEED 17199 . 17499) (DSPOPERATION 17501 . 17878) (DSPRIGHTMARGIN -17880 . 18263) (DSPTOPMARGIN 18265 . 18644) (DSPSCALE 18646 . 19013) (DSPSPACEFACTOR 19015 . 19408) ( -DSPXPOSITION 19410 . 19715) (DSPYPOSITION 19717 . 20022) (DSPROTATE 20024 . 20319) (DSPPUSHSTATE 20321 - . 20567) (DSPPOPSTATE 20569 . 20812) (DSPDEFAULTSTATE 20814 . 21066) (DSPSCALE2 21068 . 21359) ( -DSPTRANSLATE 21361 . 21662)) (21665 30466 (DSPNEWPAGE 21675 . 22367) (DRAWBETWEEN 22369 . 23071) ( -DRAWCIRCLE 23073 . 23569) (DRAWARC 23571 . 24088) (DRAWCURVE 24090 . 24767) (DRAWELLIPSE 24769 . 25555 -) (DRAWLINE 25557 . 25947) (DRAWPOLYGON 25949 . 26404) (DRAWPOINT 26406 . 26825) (FILLPOLYGON 26827 . -27393) (DRAWTO 27395 . 27813) (FILLCIRCLE 27815 . 28038) (MOVETO 28040 . 28404) (RELDRAWTO 28406 . -29323) (BITMAPIMAGESIZE 29325 . 29496) (SCALEDBITBLT 29498 . 30464)) (30467 37506 (\DRAWPOINT.GENERIC -30477 . 30824) (\DRAWPOLYGON.GENERIC 30826 . 33134) (\DRAWCIRCLE.GENERIC 33136 . 34794) ( -\DRAWELLIPSE.GENERIC 34796 . 37504)) (37507 42451 (\IMAGEIOINIT 37517 . 40797) (\NOIMAGE.DSPFONT 40799 - . 42285) (\UNIMPIMAGEOP 42287 . 42449)) (42574 45698 (INSURE.BRUSH 42584 . 43958) (BRUSHP 43960 . -44750) (\POSSIBLECOLOR 44752 . 45303) (NEGSHADE 45305 . 45696)) (46254 46938 (DASHINGP 46264 . 46594) -(INSURE.DASHING 46596 . 46936)) (57676 78222 (\DisplayEventFn 57686 . 58196) (\DISPLAYINIT 58198 . -63781) (\4DISPLAYINIT 63783 . 68484) (\8DISPLAYINIT 68486 . 73189) (\24DISPLAYINIT 73191 . 77963) ( -\DISPLAYSTREAMTYPEBPP 77965 . 78220))))) + (FILEMAP (NIL (3159 11916 (IMAGESTREAMP 3169 . 4001) (IMAGESTREAMTYPE 4003 . 4216) (IMAGESTREAMTYPEP +4218 . 4853) (OPENIMAGESTREAM 4855 . 9809) (\GOOD.DASHLST 9811 . 11914)) (11951 14248 (DRAWDASHEDLINE +11961 . 14246)) (14249 21589 (DSPBACKCOLOR 14259 . 14631) (DSPBOTTOMMARGIN 14633 . 15018) (DSPCOLOR +15020 . 15384) (DSPCLIPPINGREGION 15386 . 16091) (DSPRESET 16093 . 16373) (DSPFONT 16375 . 16739) ( +DSPLEFTMARGIN 16741 . 17122) (DSPLINEFEED 17124 . 17424) (DSPOPERATION 17426 . 17803) (DSPRIGHTMARGIN +17805 . 18188) (DSPTOPMARGIN 18190 . 18569) (DSPSCALE 18571 . 18938) (DSPSPACEFACTOR 18940 . 19333) ( +DSPXPOSITION 19335 . 19640) (DSPYPOSITION 19642 . 19947) (DSPROTATE 19949 . 20244) (DSPPUSHSTATE 20246 + . 20492) (DSPPOPSTATE 20494 . 20737) (DSPDEFAULTSTATE 20739 . 20991) (DSPSCALE2 20993 . 21284) ( +DSPTRANSLATE 21286 . 21587)) (21590 30391 (DSPNEWPAGE 21600 . 22292) (DRAWBETWEEN 22294 . 22996) ( +DRAWCIRCLE 22998 . 23494) (DRAWARC 23496 . 24013) (DRAWCURVE 24015 . 24692) (DRAWELLIPSE 24694 . 25480 +) (DRAWLINE 25482 . 25872) (DRAWPOLYGON 25874 . 26329) (DRAWPOINT 26331 . 26750) (FILLPOLYGON 26752 . +27318) (DRAWTO 27320 . 27738) (FILLCIRCLE 27740 . 27963) (MOVETO 27965 . 28329) (RELDRAWTO 28331 . +29248) (BITMAPIMAGESIZE 29250 . 29421) (SCALEDBITBLT 29423 . 30389)) (30392 37431 (\DRAWPOINT.GENERIC +30402 . 30749) (\DRAWPOLYGON.GENERIC 30751 . 33059) (\DRAWCIRCLE.GENERIC 33061 . 34719) ( +\DRAWELLIPSE.GENERIC 34721 . 37429)) (37432 42376 (\IMAGEIOINIT 37442 . 40722) (\NOIMAGE.DSPFONT 40724 + . 42210) (\UNIMPIMAGEOP 42212 . 42374)) (42499 45623 (INSURE.BRUSH 42509 . 43883) (BRUSHP 43885 . +44675) (\POSSIBLECOLOR 44677 . 45228) (NEGSHADE 45230 . 45621)) (46179 46863 (DASHINGP 46189 . 46519) +(INSURE.DASHING 46521 . 46861)) (57601 78147 (\DisplayEventFn 57611 . 58121) (\DISPLAYINIT 58123 . +63706) (\4DISPLAYINIT 63708 . 68409) (\8DISPLAYINIT 68411 . 73114) (\24DISPLAYINIT 73116 . 77888) ( +\DISPLAYSTREAMTYPEBPP 77890 . 78145))))) STOP diff --git a/sources/IMAGEIO.LCOM b/sources/IMAGEIO.LCOM index 8a1433603..f13ee30c9 100644 Binary files a/sources/IMAGEIO.LCOM and b/sources/IMAGEIO.LCOM differ diff --git a/sources/INTERPRESS b/sources/INTERPRESS index 923628fe6..a7f607114 100644 --- a/sources/INTERPRESS +++ b/sources/INTERPRESS @@ -1,13 +1,12 @@ (DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) -(FILECREATED "21-Dec-2024 19:05:30" {WMEDLEY}INTERPRESS.;44 220448 +(FILECREATED "24-May-2025 10:48:53" {WMEDLEY}INTERPRESS.;48 209527 :EDIT-BY rmk - :CHANGES-TO (VARS \ASCII2XCCSMAP INTERPRESSCOMS) - (FNS \ASCIIMAPARRAY \ASCIITONS \ASCII2XCCS \ASCII2MCCS \CREATEINTERPRESSFONT) + :CHANGES-TO (VARS INTERPRESSCOMS) - :PREVIOUS-DATE "20-Dec-2024 13:43:13" {WMEDLEY}INTERPRESS.;36) + :PREVIOUS-DATE "24-Apr-2025 23:18:00" {WMEDLEY}INTERPRESS.;46) (PRETTYCOMPRINT INTERPRESSCOMS) @@ -107,29 +106,7 @@ SCIENTIFIC SPOKESMAN TITAN TREND TRENDPS TROJAN VINTAGE)) (INTERPRESSFAMILYALIASES '(LOGO LOGOTYPES-XEROX] - [COMS (* ; "NS Character Encoding") - (FNS \COERCEASCIITONSFONT \CREATEINTERPRESSFONT \SEARCHINTERPRESSFONTS) - (DECLARE%: EVAL@COMPILE DONTCOPY (CONSTANTS (noInfoCode 32768))) - (INITVARS (ASCIITONSTRANSLATIONS)) - - (* ;; "These are in priority order: if an early one doesn't find a font for a family, the later ones are tried (essentially going to MODERN as the default).") - - (ADDVARS (ASCIITONSTRANSLATIONS (TIMESROMAN NIL CLASSIC) - (GACHA NIL TERMINAL) - (HELVETICA NIL MODERN) - (CLASSIC NIL MODERN) - (GACHA NIL MODERN) - (TIMESROMAN NIL MODERN) - (LOGO NIL LOGOTYPES) - (HIPPO HIPPOTONSARRAY CLASSIC) - (CYRILLIC CYRILLICTONSARRAY CLASSIC) - (SYMBOL \SYMBOLTONSARRAY MODERN) - (MATH \MATHTONSARRAY CLASSIC))) - (UGLYVARS \SYMBOLTONSARRAY HIPPOTONSARRAY CYRILLICTONSARRAY \MATHTONSARRAY) - (VARS \ASCII2XCCSMAP) - (FNS \ASCIIMAPARRAY) - (INITVARS (\ASCII2XCCS (\ASCIIMAPARRAY \ASCII2XCCSMAP)) - (\ASCII2MCCS (\ASCIIMAPARRAY \ASCII2XCCSMAP '("$" "-"] + (FNS \CREATEINTERPRESSFONT \SEARCHINTERPRESSFONTS) (DECLARE%: DONTEVAL@LOAD DOCOPY (P (\INTERPRESSINIT))) (DECLARE%: EVAL@COMPILE DONTCOPY (P (LOADDEF 'SYSTEMBRUSH 'RESOURCES 'IMAGEIO) (LOADDEF 'BRUSH 'RECORDS 'IMAGEIO]) @@ -1378,10 +1355,12 @@ (T RATIO]) (INTERPRESS.OUTCHARFN - [LAMBDA (IPSTREAM CHARCODE) (* ; "Edited 6-Jan-89 23:03 by jds") + [LAMBDA (IPSTREAM CHARCODE) (* ; "Edited 24-Apr-2025 23:14 by rmk") + (* ; "Edited 6-Jan-89 23:03 by jds") (* ;; "The \OUTCHAR method for interpress streams. Print a character, taking account of margins and visible region, and things like ^L.") + (SETQ CHARCODE (MTOXCODE CHARCODE)) (LET* ((IPDATA (ffetch IPDATA of IPSTREAM)) [NSCODE (COND ((\FATCHARCODEP CHARCODE) @@ -1402,10 +1381,10 @@ (SELCHARQ NSCODE (EOL (NEWLINE.IP IPSTREAM)) (LF (\DSPXPOSITION.IP IPSTREAM (PROG1 (\DSPXPOSITION.IP IPSTREAM) - (NEWLINE.IP IPSTREAM)))) + (NEWLINE.IP IPSTREAM)))) (^L (DSPNEWPAGE IPSTREAM)) (PROG (CHAR-WIDTH NEWXPOS) (* ; - "Have to switch charset before fetching width from cache, even though we might later clip") + "Have to switch charset before fetching width from cache, even though we might later clip") [SETQ CHAR-WIDTH (COND ((EQ NSCODE (CHARCODE SPACE)) (ffetch IPSPACEWIDTH of IPDATA)) @@ -1415,14 +1394,14 @@ CHAR-WIDTH)) RETRY (* ; - "Return to here if we have to emit a newline before printing") + "Return to here if we have to emit a newline before printing") (COND ((AND (fetch IPCHARVISIBLEP of IPDATA) (<= NEWXPOS (fetch IPMINCHARRIGHT of IPDATA))) (* ;; "Char vis means starting pos is inside the character clipping region. Minright is the min of the right margin and clipping right, so we're OK if we end up left of that") (* ; -"This is the common case we've optimized for: char starts and ends visible and before right margin") + "This is the common case we've optimized for: char starts and ends visible and before right margin") (freplace IPXPOS of IPDATA with NEWXPOS) [COND ((NEQ (\CHARSET NSCODE) @@ -1433,7 +1412,7 @@ (\CHARSET NSCODE)) (* ;; - "have to repeat this, since we may have done a CR before printing it.") + "have to repeat this, since we may have done a CR before printing it.") (\CHANGECHARSET.IP IPDATA (\CHARSET NSCODE] (\BOUT (ffetch IPSHOWSTREAM of IPDATA) @@ -1442,13 +1421,13 @@ ((> NEWXPOS (ffetch IPRIGHT of IPDATA)) (* ;; - "Failed visible or micharright, if over right margin, do newline and try again, otherwise clip ") + "Failed visible or micharright, if over right margin, do newline and try again, otherwise clip ") - (NEWLINE.IP IPSTREAM) (* ; - "This will reset the IPCHARVISIBLEP") + (NEWLINE.IP IPSTREAM) (* ; + "This will reset the IPCHARVISIBLEP") (SETQ NEWXPOS (+ (ffetch IPXPOS of IPDATA) CHAR-WIDTH)) (* ; - "Retry to print if we ended up unclipped and within the margin, otherwise fall thru to clip") + "Retry to print if we ended up unclipped and within the margin, otherwise fall thru to clip") (AND (<= NEWXPOS (ffetch IPMINCHARRIGHT of IPDATA)) (GO RETRY))) ((AND (ffetch IPCLIPINCLUSIVE of IPDATA) @@ -1457,7 +1436,7 @@ (>= NEWXPOS (ffetch IPVISRIGHT of IPDATA))) (* ;; - "We're clipping him, but he wants the straddling character left visible. Print it.") + "We're clipping him, but he wants the straddling character left visible. Print it.") (freplace IPXPOS of IPDATA with NEWXPOS) [COND @@ -1469,7 +1448,7 @@ (\CHARSET NSCODE)) (* ;; - "have to repeat this, since we may have done a CR before printing it.") + "have to repeat this, since we may have done a CR before printing it.") (\CHANGECHARSET.IP IPDATA (\CHARSET NSCODE] (\BOUT (ffetch IPSHOWSTREAM of IPDATA) @@ -1479,7 +1458,7 @@ (* ;; "Nothing printed; have to reset the charset.") (\CHANGECHARSET.IP IPDATA OLD-CSET))) - (SHOW.IP IPSTREAM T) (* ; "Either failed CHARVIS, or failed both VISRIGHT and IPRIGHT, so not in clipping region. Just move X position") + (SHOW.IP IPSTREAM T) (* ; "Either failed CHARVIS, or failed both VISRIGHT and IPRIGHT, so not in clipping region. Just move X position") (SETX.IP IPSTREAM NEWXPOS]) (INTERPRESSFILEP @@ -3698,61 +3677,8 @@ SPOKESMAN TITAN TREND TRENDPS TROJAN VINTAGE)) (RPAQ? INTERPRESSFAMILYALIASES '(LOGO LOGOTYPES-XEROX)) - - - -(* ; "NS Character Encoding") - (DEFINEQ -(\COERCEASCIITONSFONT - [LAMBDA (ASCIITONSMAPARRAY ASCIIFAMILY NSFAMILY SIZE FONTFACE ROTATION DEVICE) - (* ; "Edited 20-Dec-2024 13:37 by rmk") - (* gbn "12-Sep-85 15:10") - - (* ;; "Produces an ascii font with the proper widths for the ns-character correspondences defined by ASCIITONSMAPARRAY") - - (PROG (CHARSETDIR [ASCIITONSMAP (fetch (ARRAYP BASE) of (\DTEST ASCIITONSMAPARRAY 'ARRAYP] - (FD (\CREATESTARFONT NSFAMILY SIZE FONTFACE ROTATION DEVICE))) - (OR FD (RETURN NIL)) - [SETQ CHARSETDIR (CONS (CONS 0 (\GETCHARSETINFO 0 FD] - [bind NSCODE CS for I from 0 to 255 unless (OR (EQ I (SETQ NSCODE (\GETBASE ASCIITONSMAP I) - )) - (ASSOC (SETQ CS (\CHARSET NSCODE)) - CHARSETDIR)) - do (* ; - "Run thru the translate table looking for non-0 charsets. Add their width info to the directory") - (push CHARSETDIR (CONS CS - (COND - ((\GETCHARSETINFO CS FD)) - (T (* ; - "There isn't any info for that character. Warn the guy, but continue.") - (FRESHLINE PROMPTWINDOW) - (printout PROMPTWINDOW - "Warning: Information about character set " - .I3.8 CS " missing from font " ASCIIFAMILY %, - SIZE ".") - NIL] (* ; - "Return if one of the fonts couldn't be found") - [bind CHARSETINFO NSCODE (WIDTHS _ (fetch (CHARSETINFO WIDTHS) of (\GETCHARSETINFO 0 FD))) - for I from 0 to 255 unless (EQ I (SETQ NSCODE (\GETBASE ASCIITONSMAP I))) - when (SETQ CHARSETINFO (CDR (ASSOC (\CHARSET NSCODE) - CHARSETDIR))) - do (* ; - "For each non-ASCII character, look for width info in the right NS place. If none, use zero width.") - (\FSETWIDTH WIDTHS I (\FGETWIDTH (fetch (CHARSETINFO WIDTHS) of CHARSETINFO) - (\CHAR8CODE NSCODE] - [replace OTHERDEVICEFONTPROPS of FD with (fetch (ARRAYP BASE) of (\DTEST ASCIITONSMAPARRAY - 'ARRAYP] - [COND - ((NEQ NSFAMILY ASCIIFAMILY) - - (* ;; "Update the font deacriptor so it looks like it's really for the family the guy wanted. Also save the info we used to get here.") - - (replace FONTFAMILY of FD with ASCIIFAMILY) - (replace FONTDEVICESPEC of FD with (LIST NSFAMILY SIZE FONTFACE ROTATION DEVICE] - (RETURN FD]) - (\CREATEINTERPRESSFONT [LAMBDA (FAMILY SIZE FONTFACE ROTATION DEVICE) (* ; "Edited 21-Dec-2024 16:26 by rmk") (* ; "Edited 20-Dec-2024 13:43 by rmk") @@ -3782,116 +3708,6 @@ (\SEARCHFONTFILES FAMILY PSIZE FACE ROTATION 'INTERPRESS INTERPRESSFONTDIRECTORIES INTERPRESSFONTEXTENSIONS]) ) -(DECLARE%: EVAL@COMPILE DONTCOPY -(DECLARE%: EVAL@COMPILE - -(RPAQQ noInfoCode 32768) - - -(CONSTANTS (noInfoCode 32768)) -) -) - -(RPAQ? ASCIITONSTRANSLATIONS ) - - - -(* ;; -"These are in priority order: if an early one doesn't find a font for a family, the later ones are tried (essentially going to MODERN as the default)." -) - - -(ADDTOVAR ASCIITONSTRANSLATIONS - (TIMESROMAN NIL CLASSIC) - (GACHA NIL TERMINAL) - (HELVETICA NIL MODERN) - (CLASSIC NIL MODERN) - (GACHA NIL MODERN) - (TIMESROMAN NIL MODERN) - (LOGO NIL LOGOTYPES) - (HIPPO HIPPOTONSARRAY CLASSIC) - (CYRILLIC CYRILLICTONSARRAY CLASSIC) - (SYMBOL \SYMBOLTONSARRAY MODERN) - (MATH \MATHTONSARRAY CLASSIC)) - -(READVARS-FROM-STRINGS '(\SYMBOLTONSARRAY HIPPOTONSARRAY CYRILLICTONSARRAY \MATHTONSARRAY) - "({Y256 SMALLPOSP 0 0 0 180 8546 0 8574 177 61309 61282 61283 61284 61285 0 184 0 0 61296 61298 61273 -61272 8549 8550 0 0 61054 61305 61275 61274 8546 61299 0 0 0 174 173 175 61266 61250 61251 61303 61261 - 61263 0 0 61262 {R4 0} 8551 61258 61259 61281 0 61292 172 61365 61364 61290 61351 0 0 0 47 0 65 66 67 - 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 61271 61270 0 61366 61367 61238 -61239 61362 61363 61360 61361 123 125 61234 61235 61052 8514 61243 61242 8740 8742 61308 8546 0 61301 -{R4 0} 167 61232 61233 182 64 211 163 36 {R128 0} } {Y256 SMALLPOSP 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 - 60973 61229 16 17 18 61221 20 21 61220 23 60973 61228 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 - 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 9793 9794 9809 9797 9798 9818 -9796 9802 9804 74 9805 9806 9807 9808 9810 9811 9803 9813 9814 9816 9817 86 9821 9819 9820 9801 91 92 -93 173 172 96 9825 9826 9841 9829 9830 9850 9828 9834 9836 106 9837 9838 9839 9840 9842 9843 9835 9845 - 9846 9848 9849 118 9853 9851 9852 9833 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 -138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 61220 61221 157 158 159 160 161 -162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 61286 184 185 186 -187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 -212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 -237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 } {Y256 SMALLPOSP 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 26 27 28 29 30 31 32 33 34 35 10023 37 -38 39 40 41 10041 43 44 8510 46 47 48 49 10095 51 10071 53 10088 55 10089 57 58 59 171 61 187 63 10047 - 10017 10018 10046 10021 10022 10038 10020 10049 10026 10027 10028 10029 10030 10031 10032 10033 10039 - 10034 10035 10036 10037 10019 10024 10045 10048 10025 10090 9984 10091 10044 10092 9984 10065 10066 -10110 10069 10070 10086 10068 10097 10074 10075 10076 10077 10078 10079 10080 10081 10087 10082 10083 -10084 10085 10067 10072 10093 10096 10073 10042 9984 10043 10040 9984 128 129 130 131 132 133 134 135 -136 137 138 139 140 141 142 10094 144 145 146 147 148 149 150 151 152 153 154 61220 61221 157 158 159 -160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 61286 184 -185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 -210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 -235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 } {Y256 SMALLPOSP - 0 0 61307 61234 61235 0 163 61301 61302 0 0 0 182 0 0 0 61286 0 0 0 61306 0 0 61295 {R9 0} 32 61232 -61287 8551 162 184 61366 61299 194 61308 199 177 61260 61309 8552 61285 61287 8738 8740 8574 61282 -61283 61284 61292 8570 199 167 0 8549 8546 8550 191 61248 61365 61258 61356 61369 61364 61233 61275 -61279 61273 61274 61278 61272 61629 61259 61281 61297 61265 61358 61305 61296 61271 61367 61298 180 -61626 61368 0 0 0 175 174 0 61351 61267 211 61370 61303 61266 61263 61288 61360 61361 61362 61363 -61256 61290 61287 61238 61240 210 61246 61244 61247 61245 61250 61251 61270 61239 188 189 190 61264 {R -129 0} }) -") - -(RPAQQ \ASCII2XCCSMAP - (("$" "0,244" Currency to dollar) - ("-" "41,76" Hyphen to Japanese hyphen) - ("_" "0,254" Underscore to left arrow) - ("^" "0,255" Caret to Up arrow) - ("^K" "0,302" Acute) - ("^N" "0,305" Macron) - ("^S" "357,45" Em dash) - ("^V" "357,44" En dash) - ("^X" "0,55" Neutral hyphen) - ("^O" "357,55" Em quad) - ("^\" "357,54" En quad) - ("^Y" "357,56" Figure space) - ("^D" "0,310" Diaresis) - ("^G" "0,271" Left quote) - ("^H" "0,241" Inverted !) - ("^B" "0,277" Inverted ?) - ("`" "0,251" Back quote to left quote) - ("0,233" "357,44" En dash (again?)) - ("0,234" "357,45" Em dash (again?)) - ("^^" "0,270" Divide))) -(DEFINEQ - -(\ASCIIMAPARRAY - [LAMBDA (MAP SKIP) (* ; "Edited 21-Dec-2024 18:57 by rmk") - (SETQ SKIP (CHARCODE.DECODE SKIP)) - (LET ((TABLE (ARRAY 256 'WORD 0 0))) - (for I from 0 to 255 do (SETA TABLE I I)) - [for X FROMCODE in MAP eachtime [SETQ FROMCODE (OR (FIXP (CAR X)) - (CHARCODE.DECODE (CAR X] - unless (MEMB FROMCODE SKIP) do (SETA TABLE FROMCODE (CL:IF (STRINGP (CADR X)) - (CHARCODE.DECODE (CADR X)) - (LOGOR (LLSH (CADR X) - 8) - (CADDR X)))] - TABLE]) -) - -(RPAQ? \ASCII2XCCS (\ASCIIMAPARRAY \ASCII2XCCSMAP)) - -(RPAQ? \ASCII2MCCS (\ASCIIMAPARRAY \ASCII2XCCSMAP '("$" "-"))) (DECLARE%: DONTEVAL@LOAD DOCOPY (\INTERPRESSINIT) @@ -3903,45 +3719,44 @@ (LOADDEF 'BRUSH 'RECORDS 'IMAGEIO) ) (DECLARE%: DONTCOPY - (FILEMAP (NIL (15741 16594 (\IPC 15741 . 16594)) (16827 22479 (APPENDBYTE.IP 16837 . 16973) ( -APPENDIDENTIFIER.IP 16975 . 17497) (APPENDINT.IP 17499 . 17950) (APPENDINTEGER.IP 17952 . 18524) ( -APPENDLARGEVECTOR.IP 18526 . 19491) (APPENDNUMBER.IP 19493 . 19962) (APPENDOP.IP 19964 . 20610) ( -APPENDRATIONAL.IP 20612 . 21105) (APPENDSEQUENCEDESCRIPTOR.IP 21107 . 22302) (BYTESININT.IP 22304 . -22477)) (22515 62322 (ARCTO.IP 22525 . 23806) (BEGINMASTER.IP 23808 . 24081) (BEGINPAGE.IP 24083 . -24439) (BEGINPREAMBLE.IP 24441 . 24812) (CLIPRECTANGLE.IP 24814 . 25304) (CONCAT.IP 25306 . 25571) ( -CONCATT.IP 25573 . 25840) (ENDMASTER.IP 25842 . 26286) (ENDPAGE.IP 26288 . 26665) (ENDPREAMBLE.IP -26667 . 27466) (FGET.IP 27468 . 27771) (FILLRECTANGLE.IP 27773 . 30101) (FILLTRAJECTORY.IP 30103 . -30738) (FILLNGON.IP 30740 . 33017) (FSET.IP 33019 . 33322) (GETFRAMEVAR.IP 33324 . 33642) ( -INITIALIZEMASTER.IP 33644 . 34245) (INITIALIZECOLOR.IP 34247 . 35568) (ISET.IP 35570 . 35941) ( -GETCP.IP 35943 . 36252) (LINETO.IP 36254 . 36859) (MASKSTROKE.IP 36861 . 37134) (MOVETO.IP 37136 . -37473) (ROTATE.IP 37475 . 37777) (SCALE.IP 37779 . 38082) (SCALE2.IP 38084 . 38421) (SETCOLOR.IP 38423 - . 40652) (SETRGB.IP 40654 . 41710) (SETCOLORLV.IP 41712 . 46325) (SETCOLOR16.IP 46327 . 49433) ( -SETFONT.IP 49435 . 50256) (SETSPACE.IP 50258 . 50570) (SETXREL.IP 50572 . 51756) (SETX.IP 51758 . -53275) (SETXY.IP 53277 . 54449) (SETXYREL.IP 54451 . 55757) (SETY.IP 55759 . 57068) (SETYREL.IP 57070 - . 57970) (SHOW.IP 57972 . 61232) (TRAJECTORY.IP 61234 . 61632) (TRANS.IP 61634 . 61973) (TRANSLATE.IP - 61975 . 62320)) (62353 68443 (\CHANGE-VISIBLE-REGION.IP 62363 . 66024) (\PAPERSIZE.IP 66026 . 66847) -(HEADINGOP.IP 66849 . 68441)) (68444 173454 (DEFINEFONT.IP 68454 . 69428) (FONTNAME.IP 69430 . 70360) -(INTERPRESS.BITMAPSCALE 70362 . 71171) (INTERPRESS.OUTCHARFN 71173 . 77345) (INTERPRESSFILEP 77347 . -78681) (MAKEINTERPRESS 78683 . 78867) (NEWLINE.IP 78869 . 79601) (NEWPAGE.IP 79603 . 84578) ( -NEWPAGE?.IP 84580 . 85059) (OPENIPSTREAM 85061 . 93412) (SETUPFONTS.IP 93414 . 94406) (SHOWBITMAP.IP -94408 . 98949) (\BITMAPSIZE.IP 98951 . 99728) (SHOWBITMAP1.IP 99730 . 104102) (SHOWSHADE.IP 104104 . -105057) (\BITBLT.IP 105059 . 109263) (\SCALEDBITBLT.IP 109265 . 112910) (\BLTSHADE.IP 112912 . 114370) - (\CHARWIDTH.IP 114372 . 114822) (\CLOSEIPSTREAM 114824 . 115151) (\DRAWARC.IP 115153 . 115600) ( -\DRAWCURVE.IP 115602 . 118039) (\DRAWPOINT.IP 118041 . 119078) (\DSPCOLOR.IP 119080 . 120031) ( -ENSURE.RGB 120033 . 120697) (\IPCURVE2 120699 . 133953) (\CLIPCURVELINE.IP 133955 . 138653) ( -\DRAWLINE.IP 138655 . 142387) (\CLIPLINE 142389 . 147089) (\DSPBOTTOMMARGIN.IP 147091 . 147507) ( -\DSPFONT.IP 147509 . 151556) (\DSPLEFTMARGIN.IP 151558 . 152018) (\DSPLINEFEED.IP 152020 . 152687) ( -\DSPRIGHTMARGIN.IP 152689 . 153486) (\DSPSPACEFACTOR.IP 153488 . 154617) (\DSPTOPMARGIN.IP 154619 . -155055) (\DSPXPOSITION.IP 155057 . 156044) (\DSPROTATE.IP 156046 . 156224) (\PUSHSTATE.IP 156226 . -157118) (\POPSTATE.IP 157120 . 157755) (\DEFAULTSTATE.IP 157757 . 158109) (\DSPTRANSLATE.IP 158111 . -158292) (\DSPSCALE2.IP 158294 . 158469) (\DSPYPOSITION.IP 158471 . 158772) (FILLCIRCLE.IP 158774 . -159857) (\FILLPOLYGON.IP 159859 . 161190) (\DRAWPOLYGON.IP 161192 . 167322) (\FIXLINELENGTH.IP 167324 - . 168538) (\MOVETO.IP 168540 . 168904) (\SETBRUSH.IP 168906 . 171072) (\STRINGWIDTH.IP 171074 . -171477) (\DSPCLIPPINGREGION.IP 171479 . 172655) (\DSPOPERATION.IP 172657 . 173452)) (173645 174400 ( -IP-TOS 173655 . 173915) (POP-IP-STACK 173917 . 174212) (PUSH-IP-STACK 174214 . 174398)) (174461 187025 - (\CREATECHARSET.IP 174471 . 186262) (\CHANGECHARSET.IP 186264 . 187023)) (187026 190646 ( -\INTERPRESSINIT 187036 . 190644)) (190647 191205 (SCALEREGION 190657 . 191203)) (204133 206557 ( -INTERPRESSBITMAP 204143 . 206555)) (208765 214180 (\COERCEASCIITONSFONT 208775 . 212264) ( -\CREATEINTERPRESSFONT 212266 . 213839) (\SEARCHINTERPRESSFONTS 213841 . 214178)) (219195 220126 ( -\ASCIIMAPARRAY 219205 . 220124))))) + (FILEMAP (NIL (14246 15099 (\IPC 14246 . 15099)) (15332 20984 (APPENDBYTE.IP 15342 . 15478) ( +APPENDIDENTIFIER.IP 15480 . 16002) (APPENDINT.IP 16004 . 16455) (APPENDINTEGER.IP 16457 . 17029) ( +APPENDLARGEVECTOR.IP 17031 . 17996) (APPENDNUMBER.IP 17998 . 18467) (APPENDOP.IP 18469 . 19115) ( +APPENDRATIONAL.IP 19117 . 19610) (APPENDSEQUENCEDESCRIPTOR.IP 19612 . 20807) (BYTESININT.IP 20809 . +20982)) (21020 60827 (ARCTO.IP 21030 . 22311) (BEGINMASTER.IP 22313 . 22586) (BEGINPAGE.IP 22588 . +22944) (BEGINPREAMBLE.IP 22946 . 23317) (CLIPRECTANGLE.IP 23319 . 23809) (CONCAT.IP 23811 . 24076) ( +CONCATT.IP 24078 . 24345) (ENDMASTER.IP 24347 . 24791) (ENDPAGE.IP 24793 . 25170) (ENDPREAMBLE.IP +25172 . 25971) (FGET.IP 25973 . 26276) (FILLRECTANGLE.IP 26278 . 28606) (FILLTRAJECTORY.IP 28608 . +29243) (FILLNGON.IP 29245 . 31522) (FSET.IP 31524 . 31827) (GETFRAMEVAR.IP 31829 . 32147) ( +INITIALIZEMASTER.IP 32149 . 32750) (INITIALIZECOLOR.IP 32752 . 34073) (ISET.IP 34075 . 34446) ( +GETCP.IP 34448 . 34757) (LINETO.IP 34759 . 35364) (MASKSTROKE.IP 35366 . 35639) (MOVETO.IP 35641 . +35978) (ROTATE.IP 35980 . 36282) (SCALE.IP 36284 . 36587) (SCALE2.IP 36589 . 36926) (SETCOLOR.IP 36928 + . 39157) (SETRGB.IP 39159 . 40215) (SETCOLORLV.IP 40217 . 44830) (SETCOLOR16.IP 44832 . 47938) ( +SETFONT.IP 47940 . 48761) (SETSPACE.IP 48763 . 49075) (SETXREL.IP 49077 . 50261) (SETX.IP 50263 . +51780) (SETXY.IP 51782 . 52954) (SETXYREL.IP 52956 . 54262) (SETY.IP 54264 . 55573) (SETYREL.IP 55575 + . 56475) (SHOW.IP 56477 . 59737) (TRAJECTORY.IP 59739 . 60137) (TRANS.IP 60139 . 60478) (TRANSLATE.IP + 60480 . 60825)) (60858 66948 (\CHANGE-VISIBLE-REGION.IP 60868 . 64529) (\PAPERSIZE.IP 64531 . 65352) +(HEADINGOP.IP 65354 . 66946)) (66949 172133 (DEFINEFONT.IP 66959 . 67933) (FONTNAME.IP 67935 . 68865) +(INTERPRESS.BITMAPSCALE 68867 . 69676) (INTERPRESS.OUTCHARFN 69678 . 76024) (INTERPRESSFILEP 76026 . +77360) (MAKEINTERPRESS 77362 . 77546) (NEWLINE.IP 77548 . 78280) (NEWPAGE.IP 78282 . 83257) ( +NEWPAGE?.IP 83259 . 83738) (OPENIPSTREAM 83740 . 92091) (SETUPFONTS.IP 92093 . 93085) (SHOWBITMAP.IP +93087 . 97628) (\BITMAPSIZE.IP 97630 . 98407) (SHOWBITMAP1.IP 98409 . 102781) (SHOWSHADE.IP 102783 . +103736) (\BITBLT.IP 103738 . 107942) (\SCALEDBITBLT.IP 107944 . 111589) (\BLTSHADE.IP 111591 . 113049) + (\CHARWIDTH.IP 113051 . 113501) (\CLOSEIPSTREAM 113503 . 113830) (\DRAWARC.IP 113832 . 114279) ( +\DRAWCURVE.IP 114281 . 116718) (\DRAWPOINT.IP 116720 . 117757) (\DSPCOLOR.IP 117759 . 118710) ( +ENSURE.RGB 118712 . 119376) (\IPCURVE2 119378 . 132632) (\CLIPCURVELINE.IP 132634 . 137332) ( +\DRAWLINE.IP 137334 . 141066) (\CLIPLINE 141068 . 145768) (\DSPBOTTOMMARGIN.IP 145770 . 146186) ( +\DSPFONT.IP 146188 . 150235) (\DSPLEFTMARGIN.IP 150237 . 150697) (\DSPLINEFEED.IP 150699 . 151366) ( +\DSPRIGHTMARGIN.IP 151368 . 152165) (\DSPSPACEFACTOR.IP 152167 . 153296) (\DSPTOPMARGIN.IP 153298 . +153734) (\DSPXPOSITION.IP 153736 . 154723) (\DSPROTATE.IP 154725 . 154903) (\PUSHSTATE.IP 154905 . +155797) (\POPSTATE.IP 155799 . 156434) (\DEFAULTSTATE.IP 156436 . 156788) (\DSPTRANSLATE.IP 156790 . +156971) (\DSPSCALE2.IP 156973 . 157148) (\DSPYPOSITION.IP 157150 . 157451) (FILLCIRCLE.IP 157453 . +158536) (\FILLPOLYGON.IP 158538 . 159869) (\DRAWPOLYGON.IP 159871 . 166001) (\FIXLINELENGTH.IP 166003 + . 167217) (\MOVETO.IP 167219 . 167583) (\SETBRUSH.IP 167585 . 169751) (\STRINGWIDTH.IP 169753 . +170156) (\DSPCLIPPINGREGION.IP 170158 . 171334) (\DSPOPERATION.IP 171336 . 172131)) (172324 173079 ( +IP-TOS 172334 . 172594) (POP-IP-STACK 172596 . 172891) (PUSH-IP-STACK 172893 . 173077)) (173140 185704 + (\CREATECHARSET.IP 173150 . 184941) (\CHANGECHARSET.IP 184943 . 185702)) (185705 189325 ( +\INTERPRESSINIT 185715 . 189323)) (189326 189884 (SCALEREGION 189336 . 189882)) (202812 205236 ( +INTERPRESSBITMAP 202822 . 205234)) (207406 209330 (\CREATEINTERPRESSFONT 207416 . 208989) ( +\SEARCHINTERPRESSFONTS 208991 . 209328))))) STOP diff --git a/sources/INTERPRESS.LCOM b/sources/INTERPRESS.LCOM index 3d1bad66a..c839eccf4 100644 Binary files a/sources/INTERPRESS.LCOM and b/sources/INTERPRESS.LCOM differ diff --git a/sources/LLDISPLAY b/sources/LLDISPLAY index 634f7a058..2e9501fb6 100644 --- a/sources/LLDISPLAY +++ b/sources/LLDISPLAY @@ -1,12 +1,13 @@ (DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) -(FILECREATED "31-Jul-2023 14:50:58" {WMEDLEY}LLDISPLAY.;19 270570 +(FILECREATED " 9-Jun-2025 20:34:14" {WMEDLEY}LLDISPLAY.;20 272103 :EDIT-BY rmk - :CHANGES-TO (FNS BITMAPEQUAL) + :CHANGES-TO (VARS LLDISPLAYCOMS) + (FNS \PRINTBINARYBITMAP) - :PREVIOUS-DATE "31-Jul-2023 14:45:32" {WMEDLEY}LLDISPLAY.;18) + :PREVIOUS-DATE "31-Jul-2023 14:50:58" {WMEDLEY}LLDISPLAY.;19) (PRETTYCOMPRINT LLDISPLAYCOMS) @@ -33,6 +34,7 @@ \SLOWBLTCHAR TEXTUREP INVERT.TEXTURE INVERT.TEXTURE.BITMAP BITMAPWIDTH READBITMAP \INSUREBITSPERPIXEL MAXIMUMCOLOR OPPOSITECOLOR MAXIMUMSHADE OPPOSITESHADE \MEDW.BITBLT) + (FNS \READBINARYBITMAP \PRINTBINARYBITMAP) (FUNCTIONS FINISH-READING-BITMAP) (CONSTANTS (MINIMUMCOLOR 0) (MINIMUMSHADE 0)) @@ -1501,6 +1503,44 @@ (T (SHOULDNT "Invalid argument to \XW.BIBLT"))) T]) ) +(DEFINEQ + +(\READBINARYBITMAP + [LAMBDA (STREAM) (* rrb "23-Jul-84 15:17") + + (* * reads a bitmap printed on STREAM by \PRINTBINARYBITMAP.) + + (SETQ STREAM (GETSTREAM STREAM 'INPUT)) + (PROG ((BMW (\WIN STREAM)) + (BMH (\WIN STREAM)) + (BPP (\WIN STREAM)) + BITMAP) + (SETQ BITMAP (BITMAPCREATE BMW BMH BPP)) + (\BINS STREAM (fetch (BITMAP BITMAPBASE) of BITMAP) + 0 + (ITIMES (fetch (BITMAP BITMAPRASTERWIDTH) of BITMAP) + BMH BYTESPERWORD)) + (RETURN BITMAP]) + +(\PRINTBINARYBITMAP + [LAMBDA (BITMAP STREAM) (* rrb "23-Jul-84 15:16") + + (* * prints the representation of a bitmap onto STREAM in a form that can be read + back by \READBINARYBITMAP.) + + (PROG ((STREAM (GETSTREAM STREAM 'OUTPUT)) + BMH) + (OR (BITMAPP BITMAP) + (\ILLEGAL.ARG BITMAP)) + (\WOUT STREAM (BITMAPWIDTH BITMAP)) + (\WOUT STREAM (SETQ BMH (BITMAPHEIGHT BITMAP))) + (\WOUT STREAM (BITSPERPIXEL BITMAP)) + (\BOUTS STREAM (fetch (BITMAP BITMAPBASE) of BITMAP) + 0 + (ITIMES (fetch (BITMAP BITMAPRASTERWIDTH) of BITMAP) + BMH BYTESPERWORD)) + (RETURN BITMAP]) +) (CL:DEFUN FINISH-READING-BITMAP (STREAM) @@ -4573,43 +4613,44 @@ (ADDTOVAR LAMA ) ) (DECLARE%: DONTCOPY - (FILEMAP (NIL (20459 23127 (\FBITMAPBIT 20469 . 20929) (\FBITMAPBIT.UFN 20931 . 21950) ( -\NEWPAGE.DISPLAY 21952 . 22087) (INITBITMASKS 22089 . 23125)) (25052 25561 (\CreateCursorBitMap 25062 - . 25559)) (25678 86230 (BITBLT 25688 . 36078) (BLTSHADE 36080 . 36858) (\BITBLTSUB 36860 . 46995) ( -\GETPILOTBBTSCRATCHBM 46997 . 47612) (BITMAPCOPY 47614 . 48190) (BITMAPCREATE 48192 . 49752) ( -BITMAPBIT 49754 . 58141) (BITMAPEQUAL 58143 . 59605) (BLTCHAR 59607 . 60223) (\BLTCHAR 60225 . 60727) -(\MEDW.BLTCHAR 60729 . 65607) (\CHANGECHARSET.DISPLAY 65609 . 68567) (\INDICATESTRING 68569 . 69765) ( -\SLOWBLTCHAR 69767 . 76863) (TEXTUREP 76865 . 77135) (INVERT.TEXTURE 77137 . 77411) ( -INVERT.TEXTURE.BITMAP 77413 . 78948) (BITMAPWIDTH 78950 . 79322) (READBITMAP 79324 . 81834) ( -\INSUREBITSPERPIXEL 81836 . 82131) (MAXIMUMCOLOR 82133 . 82274) (OPPOSITECOLOR 82276 . 82455) ( -MAXIMUMSHADE 82457 . 82668) (OPPOSITESHADE 82670 . 82849) (\MEDW.BITBLT 82851 . 86228)) (86232 91418 ( -FINISH-READING-BITMAP 86232 . 91418)) (92540 93021 (BITMAPBIT.EXPANDER 92550 . 93019)) (93022 141556 ( -\BITBLT.DISPLAY 93032 . 116271) (\BITBLT.BITMAP 116273 . 125372) (\BITBLT.MERGE 125374 . 127627) ( -\BLTSHADE.DISPLAY 127629 . 134729) (\BLTSHADE.BITMAP 134731 . 141554)) (141557 150877 ( -\BITBLT.BITMAP.SLOW 141567 . 150875)) (150878 167259 (\PUNT.BLTSHADE.BITMAP 150888 . 157984) ( -\PUNT.BITBLT.BITMAP 157986 . 167257)) (167260 170700 (\SCALEDBITBLT.DISPLAY 167270 . 168903) ( -\BACKCOLOR.DISPLAY 168905 . 170698)) (174555 176828 (DISPLAYSTREAMP 174565 . 175173) (DSPSOURCETYPE -175175 . 176184) (DSPXOFFSET 176186 . 176505) (DSPYOFFSET 176507 . 176826)) (176829 191024 ( -DSPDESTINATION 176839 . 179942) (DSPTEXTURE 179944 . 180106) (\DISPLAYSTREAMINCRXPOSITION 180108 . -180395) (\SFFixDestination 180397 . 181575) (\SFFixClippingRegion 181577 . 183749) (\SFFixFont 183751 - . 184801) (\SFFIXLINELENGTH 184803 . 186299) (\UPDATE-SYNONYM-STREAM-LINELENGTH-FIELD 186301 . 188114 -) (\SFFixY 188116 . 191022)) (191025 194872 (\SIMPLE.DSPCREATE 191035 . 191585) (\COMMON.DSPCREATE -191587 . 194870)) (194973 197167 (\MEDW.XOFFSET 194983 . 196124) (\MEDW.YOFFSET 196126 . 197165)) ( -197168 205094 (\DSPCLIPPINGREGION.DISPLAY 197178 . 197924) (\DSPFONT.DISPLAY 197926 . 200296) ( -\DISPLAY.PILOTBITBLT 200298 . 200447) (\DSPLINEFEED.DISPLAY 200449 . 201020) (\DSPLEFTMARGIN.DISPLAY -201022 . 201753) (\DSPOPERATION.DISPLAY 201755 . 202779) (\DSPRIGHTMARGIN.DISPLAY 202781 . 203626) ( -\DSPXPOSITION.DISPLAY 203628 . 204485) (\DSPYPOSITION.DISPLAY 204487 . 205092)) (209282 214318 ( -TTYDISPLAYSTREAM 209292 . 214316)) (214621 215651 (DSPSCROLL 214631 . 215331) (PAGEHEIGHT 215333 . -215649)) (215696 218718 (\DSPRESET.DISPLAY 215706 . 218716)) (218754 219277 (\MAYBE-DRIBBLE-CHAR -218754 . 219277)) (219278 239916 (\DSPPRINTCHAR 219288 . 227126) (\DSPPRINTCR/LF 227128 . 239914)) ( -239917 240509 (\TTYBACKGROUND 239927 . 240507)) (240510 243797 (DSPBACKUP 240520 . 243795)) (243981 -244237 (COLORDISPLAYP 243991 . 244235)) (244238 246309 (DISPLAYBEFOREEXIT 244248 . 245074) ( -DISPLAYAFTERENTRY 245076 . 246307)) (246681 251213 (\DSPCLIPTRANSFORMX 246691 . 247280) ( -\DSPCLIPTRANSFORMY 247282 . 248007) (\DSPTRANSFORMREGION 248009 . 248541) (\DSPUNTRANSFORMY 248543 . -248803) (\DSPUNTRANSFORMX 248805 . 249065) (\OFFSETCLIPPINGREGION 249067 . 251211)) (252527 255114 ( -UPDATESCREENDIMENSIONS 252537 . 253166) (\CreateScreenBitMap 253168 . 255112)) (255673 268832 ( -\CoerceToDisplayDevice 255683 . 256096) (\CREATEDISPLAY 256098 . 257938) (DISPLAYSTREAMINIT 257940 . -261084) (\STARTDISPLAY 261086 . 263997) (\MOVE.WINDOWS.ONTO.SCREEN 263999 . 266191) ( -\UPDATE.PBT.RASTERWIDTHS 266193 . 267975) (\STOPDISPLAY 267977 . 268469) (\DEFINEDISPLAYINFO 268471 . -268830)) (269440 270201 (INITIALIZEDISPLAYSTREAMS 269450 . 270199))))) + (FILEMAP (NIL (20562 23230 (\FBITMAPBIT 20572 . 21032) (\FBITMAPBIT.UFN 21034 . 22053) ( +\NEWPAGE.DISPLAY 22055 . 22190) (INITBITMASKS 22192 . 23228)) (25155 25664 (\CreateCursorBitMap 25165 + . 25662)) (25781 86333 (BITBLT 25791 . 36181) (BLTSHADE 36183 . 36961) (\BITBLTSUB 36963 . 47098) ( +\GETPILOTBBTSCRATCHBM 47100 . 47715) (BITMAPCOPY 47717 . 48293) (BITMAPCREATE 48295 . 49855) ( +BITMAPBIT 49857 . 58244) (BITMAPEQUAL 58246 . 59708) (BLTCHAR 59710 . 60326) (\BLTCHAR 60328 . 60830) +(\MEDW.BLTCHAR 60832 . 65710) (\CHANGECHARSET.DISPLAY 65712 . 68670) (\INDICATESTRING 68672 . 69868) ( +\SLOWBLTCHAR 69870 . 76966) (TEXTUREP 76968 . 77238) (INVERT.TEXTURE 77240 . 77514) ( +INVERT.TEXTURE.BITMAP 77516 . 79051) (BITMAPWIDTH 79053 . 79425) (READBITMAP 79427 . 81937) ( +\INSUREBITSPERPIXEL 81939 . 82234) (MAXIMUMCOLOR 82236 . 82377) (OPPOSITECOLOR 82379 . 82558) ( +MAXIMUMSHADE 82560 . 82771) (OPPOSITESHADE 82773 . 82952) (\MEDW.BITBLT 82954 . 86331)) (86334 87763 ( +\READBINARYBITMAP 86344 . 86982) (\PRINTBINARYBITMAP 86984 . 87761)) (87765 92951 ( +FINISH-READING-BITMAP 87765 . 92951)) (94073 94554 (BITMAPBIT.EXPANDER 94083 . 94552)) (94555 143089 ( +\BITBLT.DISPLAY 94565 . 117804) (\BITBLT.BITMAP 117806 . 126905) (\BITBLT.MERGE 126907 . 129160) ( +\BLTSHADE.DISPLAY 129162 . 136262) (\BLTSHADE.BITMAP 136264 . 143087)) (143090 152410 ( +\BITBLT.BITMAP.SLOW 143100 . 152408)) (152411 168792 (\PUNT.BLTSHADE.BITMAP 152421 . 159517) ( +\PUNT.BITBLT.BITMAP 159519 . 168790)) (168793 172233 (\SCALEDBITBLT.DISPLAY 168803 . 170436) ( +\BACKCOLOR.DISPLAY 170438 . 172231)) (176088 178361 (DISPLAYSTREAMP 176098 . 176706) (DSPSOURCETYPE +176708 . 177717) (DSPXOFFSET 177719 . 178038) (DSPYOFFSET 178040 . 178359)) (178362 192557 ( +DSPDESTINATION 178372 . 181475) (DSPTEXTURE 181477 . 181639) (\DISPLAYSTREAMINCRXPOSITION 181641 . +181928) (\SFFixDestination 181930 . 183108) (\SFFixClippingRegion 183110 . 185282) (\SFFixFont 185284 + . 186334) (\SFFIXLINELENGTH 186336 . 187832) (\UPDATE-SYNONYM-STREAM-LINELENGTH-FIELD 187834 . 189647 +) (\SFFixY 189649 . 192555)) (192558 196405 (\SIMPLE.DSPCREATE 192568 . 193118) (\COMMON.DSPCREATE +193120 . 196403)) (196506 198700 (\MEDW.XOFFSET 196516 . 197657) (\MEDW.YOFFSET 197659 . 198698)) ( +198701 206627 (\DSPCLIPPINGREGION.DISPLAY 198711 . 199457) (\DSPFONT.DISPLAY 199459 . 201829) ( +\DISPLAY.PILOTBITBLT 201831 . 201980) (\DSPLINEFEED.DISPLAY 201982 . 202553) (\DSPLEFTMARGIN.DISPLAY +202555 . 203286) (\DSPOPERATION.DISPLAY 203288 . 204312) (\DSPRIGHTMARGIN.DISPLAY 204314 . 205159) ( +\DSPXPOSITION.DISPLAY 205161 . 206018) (\DSPYPOSITION.DISPLAY 206020 . 206625)) (210815 215851 ( +TTYDISPLAYSTREAM 210825 . 215849)) (216154 217184 (DSPSCROLL 216164 . 216864) (PAGEHEIGHT 216866 . +217182)) (217229 220251 (\DSPRESET.DISPLAY 217239 . 220249)) (220287 220810 (\MAYBE-DRIBBLE-CHAR +220287 . 220810)) (220811 241449 (\DSPPRINTCHAR 220821 . 228659) (\DSPPRINTCR/LF 228661 . 241447)) ( +241450 242042 (\TTYBACKGROUND 241460 . 242040)) (242043 245330 (DSPBACKUP 242053 . 245328)) (245514 +245770 (COLORDISPLAYP 245524 . 245768)) (245771 247842 (DISPLAYBEFOREEXIT 245781 . 246607) ( +DISPLAYAFTERENTRY 246609 . 247840)) (248214 252746 (\DSPCLIPTRANSFORMX 248224 . 248813) ( +\DSPCLIPTRANSFORMY 248815 . 249540) (\DSPTRANSFORMREGION 249542 . 250074) (\DSPUNTRANSFORMY 250076 . +250336) (\DSPUNTRANSFORMX 250338 . 250598) (\OFFSETCLIPPINGREGION 250600 . 252744)) (254060 256647 ( +UPDATESCREENDIMENSIONS 254070 . 254699) (\CreateScreenBitMap 254701 . 256645)) (257206 270365 ( +\CoerceToDisplayDevice 257216 . 257629) (\CREATEDISPLAY 257631 . 259471) (DISPLAYSTREAMINIT 259473 . +262617) (\STARTDISPLAY 262619 . 265530) (\MOVE.WINDOWS.ONTO.SCREEN 265532 . 267724) ( +\UPDATE.PBT.RASTERWIDTHS 267726 . 269508) (\STOPDISPLAY 269510 . 270002) (\DEFINEDISPLAYINFO 270004 . +270363)) (270973 271734 (INITIALIZEDISPLAYSTREAMS 270983 . 271732))))) STOP diff --git a/sources/LLDISPLAY.LCOM b/sources/LLDISPLAY.LCOM index 7aba939d9..fde2f0f03 100644 --- a/sources/LLDISPLAY.LCOM +++ b/sources/LLDISPLAY.LCOM @@ -1,9 +1,10 @@ (DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) -(FILECREATED "31-Jul-2023 14:50:58" ("compiled on " {WMEDLEY}LLDISPLAY.;19) -"31-Jul-2023 14:48:17" "COMPILE-FILEd" in "FULL 31-Jul-2023 ..." dated "31-Jul-2023 14:48:24") -(FILECREATED "31-Jul-2023 14:50:58" {WMEDLEY}LLDISPLAY.;19 270570 :EDIT-BY rmk :CHANGES-TO ( -FNS BITMAPEQUAL) :PREVIOUS-DATE "31-Jul-2023 14:45:32" {WMEDLEY}LLDISPLAY.;18) +(FILECREATED " 9-Jun-2025 20:34:14" ("compiled on " {WMEDLEY}LLDISPLAY.;20) +" 3-Jun-2025 19:15:01" "COMPILE-FILEd" in "FULL 3-Jun-2025 ..." dated " 3-Jun-2025 19:15:08") +(FILECREATED " 9-Jun-2025 20:34:14" {WMEDLEY}LLDISPLAY.;20 272103 :EDIT-BY rmk :CHANGES-TO ( +VARS LLDISPLAYCOMS) (FNS \PRINTBINARYBITMAP) :PREVIOUS-DATE "31-Jul-2023 14:50:58" +{WMEDLEY}LLDISPLAY.;19) (RPAQQ LLDISPLAYCOMS ((DECLARE%: DONTCOPY (EXPORT (RECORDS PILOTBBT \DISPLAYDATA DISPLAYSTATE DISPLAYINFO) (MACROS \GETDISPLAYDATA))) (* ; "User-visible records are on ADISPLAY --- must be init'ed here") (INITRECORDS BITMAP PILOTBBT REGION @@ -15,11 +16,12 @@ WORDMASK 65535)))) (DECLARE%: DONTEVAL@LOAD DOCOPY (P (INITBITMASKS)))) (COMS (* COMS (* ; "bitmap functions.") (FNS BITBLT BLTSHADE \BITBLTSUB \GETPILOTBBTSCRATCHBM BITMAPCOPY BITMAPCREATE BITMAPBIT BITMAPEQUAL BLTCHAR \BLTCHAR \MEDW.BLTCHAR \CHANGECHARSET.DISPLAY \INDICATESTRING \SLOWBLTCHAR TEXTUREP INVERT.TEXTURE INVERT.TEXTURE.BITMAP BITMAPWIDTH READBITMAP -\INSUREBITSPERPIXEL MAXIMUMCOLOR OPPOSITECOLOR MAXIMUMSHADE OPPOSITESHADE \MEDW.BITBLT) (FUNCTIONS -FINISH-READING-BITMAP) (CONSTANTS (MINIMUMCOLOR 0) (MINIMUMSHADE 0)) (P (MOVD (QUOTE BITMAPBIT) (QUOTE - \BITMAPBIT))) (DECLARE%: DONTCOPY (EXPORT (MACROS \INVALIDATEDISPLAYCACHE))) (OPTIMIZERS BITMAPBIT -BITMAPP) (FNS BITMAPBIT.EXPANDER) (FNS \BITBLT.DISPLAY \BITBLT.BITMAP \BITBLT.MERGE \BLTSHADE.DISPLAY -\BLTSHADE.BITMAP) (FNS (* ;; "For SunLoadup") \BITBLT.BITMAP.SLOW) (FNS (* ;; +\INSUREBITSPERPIXEL MAXIMUMCOLOR OPPOSITECOLOR MAXIMUMSHADE OPPOSITESHADE \MEDW.BITBLT) (FNS +\READBINARYBITMAP \PRINTBINARYBITMAP) (FUNCTIONS FINISH-READING-BITMAP) (CONSTANTS (MINIMUMCOLOR 0) ( +MINIMUMSHADE 0)) (P (MOVD (QUOTE BITMAPBIT) (QUOTE \BITMAPBIT))) (DECLARE%: DONTCOPY (EXPORT (MACROS +\INVALIDATEDISPLAYCACHE))) (OPTIMIZERS BITMAPBIT BITMAPP) (FNS BITMAPBIT.EXPANDER) (FNS +\BITBLT.DISPLAY \BITBLT.BITMAP \BITBLT.MERGE \BLTSHADE.DISPLAY \BLTSHADE.BITMAP) (FNS (* ;; +"For SunLoadup") \BITBLT.BITMAP.SLOW) (FNS (* ;; " punt case for C funcs.bitblt_bitmap,bitshade.bitmap") \PUNT.BLTSHADE.BITMAP \PUNT.BITBLT.BITMAP) ( FNS (* ;; "from SUMEX-AIM") \SCALEDBITBLT.DISPLAY \BACKCOLOR.DISPLAY) (DECLARE%: DONTCOPY (CONSTANTS ( \DisplayWordAlign 16) (\MaxBitMapWidth 65535) (\MaxBitMapHeight 65535) (\MaxBitMapWords 131066)) ( @@ -192,7 +194,7 @@ BLTCHAR :D8 (42 \DISPLAYDATA 35 STREAM 24 OUTPUT) () \BLTCHAR :D8 -(P 0 A0229 I 2 DISPLAYDATA I 1 DISPLAYSTREAM I 0 CHARCODE) (Agh bÉ.ÉZ@ABlH(11 \GETSTREAM) +(P 0 A0185 I 2 DISPLAYDATA I 1 DISPLAYSTREAM I 0 CHARCODE) (Agh bÉ.ÉZ@ABlH(11 \GETSTREAM) (25 IMAGEOPS 18 STREAM 5 OUTPUT) () \MEDW.BLTCHAR :D8 @@ -205,10 +207,11 @@ BLTCHAR :D8 (256 \EM.DISPINTERRUPT 191 \TOPWDS 175 \EM.DISPINTERRUPT 167 \EM.DISPINTERRUPT 132 PILOTBBT) () \CHANGECHARSET.DISPLAY :D8 -(P 4 \INTERRUPTABLE P 2 BM P 1 CSINFO P 0 PBT I 1 CHARSET I 0 DISPLAYDATA) Š@É*@É ÉAàÐɵ A@É h "@IÉ¿@IÉ¿@IÉ0¿@A>¿IɺHJÈàààànÿÿåÍ¿@È'IÈ -ð—@È@IÈ ð©@I -¿°#JÉJÈ@ÉBÚлHKÒÍ¿HKÓÍh(98 \SFFixY 24 \CREATECHARSET) -(130 PILOTBBT 119 PILOTBBT) +(P 7 \INTERRUPTABLE P 5 BM P 4 CSINFO P 3 PBT I 1 CHARSET I 0 DISPLAYDATA) œ@É*@É ÉAàÐɵ@É ÉAàA@É +HIÐJ¿J"@LÉ¿@LÉ¿@LÉ0¿@A>¿LɽKMÈàààànÿÿåÍ¿@È'LÈ +ð—@È@LÈ ð©@L +¿°#MÉMÈ@ÉBÚоKNÒÍ¿KNÓÍh(116 \SFFixY 30 \CREATECHARSET) +(148 PILOTBBT 137 PILOTBBT) () \INDICATESTRINGA0001 :D8 (NAME SI::*UNWIND-PROTECT* I 0 SI::*CLEANUP-FORMS* F 0 SI::*RESETFORMS* F 1 CHARCODE) Hgd gi @@ -220,17 +223,18 @@ BLTCHAR :D8 (75 ^ 52 %# 16 SI::RESETUNWIND) ( 81 "" 58 "") \SLOWBLTCHAR :D8 -(P 16 CSINFO P 15 HEIGHTMOVED P 14 YPOS P 13 SOFTCURSORUP P 12 DISPINTERRUPT P 11 SOURCEBIT P 10 WIDTH P 9 DESTBIT P 8 PILOTBBT P 7 CURX P 6 RIGHT P 5 LEFT P 4 NEWX P 2 DD P 1 CHAR8CODE P 0 ROTATION I 1 DISPLAYSTREAM I 0 CHARCODE F 17 \SOFTCURSORP F 18 \SOFTCURSORUPP F 19 \CURSORDESTINATION F 20 \SCREENBITMAPS) K@@lÿåYAÉ0ZdÉ È Xdjð¢±~€ JÉ_JÉIÐÈØ\JÉñ²l A -¿JÉ_JÉIÐÈØ¼JL¿OJÉØ_¿JÈ"dOñ¢¿O½JÈ#LJÉØ»dKñ‘¿K¾JÉ*_¿NMñ¢± OÈ jð’±M_¿NMÙ_¿JÉIÐÈMØOÙ_¿JÉÈdkð³adlð²¿Oàà_¿Oàà_¿Oàà_°Ddlð²¿Oààà_¿Oààà_¿Oààà_°$lð²lOÚ_¿lOÚ_¿lOÚ_„¿ W"²-W$´ hA -W&ð_²`È_¿`jÍ¿¿A`ð³hA -W(–A ¿OOÍ¿OOÍ¿OOÍ¿Ojv¿OŸ¿`OÍ¿±·0JÉ_¿JÉIÐÈ_¿JÉ É@ãàÐɵ @ãJÉ h _ ¿HdlZð²;¿AOOØ +(P 16 CSINFO P 15 HEIGHTMOVED P 14 YPOS P 13 SOFTCURSORUP P 12 DISPINTERRUPT P 11 SOURCEBIT P 10 WIDTH P 9 DESTBIT P 8 PILOTBBT P 7 CURX P 6 RIGHT P 5 LEFT P 4 NEWX P 2 DD P 1 CHAR8CODE P 0 ROTATION I 1 DISPLAYSTREAM I 0 CHARCODE F 20 \SOFTCURSORP F 21 \SOFTCURSORUPP F 22 \CURSORDESTINATION F 23 \SCREENBITMAPS) b@@lÿåYAÉ0ZdÉ È Xdjð¢±~€ JÉ_JÉIÐÈØ\JÉñ²l A +¿JÉ_JÉIÐÈØ¼JL¿OJÉØ_¿JÈ"dOñ¢¿O½JÈ#LJÉØ»dKñ‘¿K¾JÉ*_¿NMñ¢± OÈ jð’±M_¿NMÙ_¿JÉIÐÈMØOÙ_¿JÉÈdkð³adlð²¿Oàà_¿Oàà_¿Oàà_°Ddlð²¿Oààà_¿Oààà_¿Oààà_°$lð²lOÚ_¿lOÚ_¿lOÚ_„¿ W(²-W*´ hA +W,ð_²`È_¿`jÍ¿¿A`ð³hA +W.–A ¿OOÍ¿OOÍ¿OOÍ¿Ojv¿OŸ¿`OÍ¿±Î0JÉ_¿JÉIÐÈ_¿JÉ É@ãàÐɵ$JÉ É@ãà@ãJÉ +O"O$ÐO&¿O&_ ¿HdlZð²;¿AOOØ ¿O ÉjJÉIÐÈAJÉO È ÙkØOO È O È ØO °Hnð²8AOOÙ ¿O ÉjJÉIÐÈAJÉO È ÙJÉO È -O È ØO ‰o h(583 ERROR 572 BKBITBLT 530 \DSPYPOSITION.DISPLAY 511 BKBITBLT 468 \DSPYPOSITION.DISPLAY 446 \CREATECHARSET 387 \SOFTCURSORUPCURRENT 352 \TOTOPWDS 342 DSPDESTINATION 325 \SOFTCURSORDOWN 294 DSPDESTINATION 275 SHOULDNT 55 \DSPPRINTCR/LF) +O È ØO ‰o h(606 ERROR 595 BKBITBLT 553 \DSPYPOSITION.DISPLAY 534 BKBITBLT 491 \DSPYPOSITION.DISPLAY 453 \CREATECHARSET 387 \SOFTCURSORUPCURRENT 352 \TOTOPWDS 342 DSPDESTINATION 325 \SOFTCURSORDOWN 294 DSPDESTINATION 275 SHOULDNT 55 \DSPPRINTCR/LF) (393 \EM.DISPINTERRUPT 332 \TOPWDS 316 \EM.DISPINTERRUPT 306 \EM.DISPINTERRUPT 111 \DISPLAYDATA 83 \DISPLAYDATA) -( 578 "Not implemented to rotate by other than 0, 90 or 270") +( 601 "Not implemented to rotate by other than 0, 90 or 270") TEXTUREP :D8 (I 0 OBJECT) @d3 ³ô@Èkð´@NIL (18 BITMAP 10 BITMAP) @@ -278,7 +282,7 @@ OPPOSITESHADE :D8 NIL () \MEDW.BITBLT :D8 -(P 9 A0232 P 8 A0231 P 7 SOURCEBOTTOMTRANSFORMED P 6 SOURCELEFTTRANSFORMED P 3 SRCWIN P 2 A0230 P 1 DD P 0 DSTWIN I 11 CLIPPINGREGION I 10 TEXTURE I 9 OPERATION I 8 SOURCETYPE I 7 HEIGHT I 6 WIDTH I 5 DESTINATIONBOTTOM I 4 DESTINATIONLEFT I 3 DESTINATION I 2 SOURCEBOTTOM I 1 SOURCELEFT I 0 SOURCE F 10 \SCREENBITMAPS)  +(P 9 A0188 P 8 A0187 P 7 SOURCEBOTTOMTRANSFORMED P 6 SOURCELEFTTRANSFORMED P 3 SRCWIN P 2 A0186 P 1 DD P 0 DSTWIN I 11 CLIPPINGREGION I 10 TEXTURE I 9 OPERATION I 8 SOURCETYPE I 7 HEIGHT I 6 WIDTH I 5 DESTINATIONBOTTOM I 4 DESTINATIONLEFT I 3 DESTINATION I 2 SOURCEBOTTOM I 1 SOURCELEFT I 0 SOURCE F 10 \SCREENBITMAPS)   @ ³C ªo ¿@òZ@²WCi Cgh É0HÉ2ÉHºHÉ2@ABCDEFGGGGGABlJ±–Cô‚±¯C´‚±¨@i !@gh É0AIÉصABIÉصBKÉ2ÉJ_¿KÉ2IÉNOCDEFGGGGGNIÈ"¼dLñ¡¿LOIÈ$½dMñ¡¿MlO±Þ@ @@ -288,6 +292,25 @@ NIL W–@ ¿KÉ2ÉL KÉ2IÉNOCDEFGGGGGNIÈ"¼dLñ¡¿LOIÈ$½dMñ¡¿MlO‰o i(524 SHOULDNT 418 \TOTOPWDS 408 DSPDESTINATION 345 \GETSTREAM 330 WFROMDS 318 DSPDESTINATION 311 DSPDESTINATION 162 \GETSTREAM 147 WFROMDS 55 \GETSTREAM 43 WFROMDS 24 SHOULDNT 13 IMAGESTREAMP 5 IMAGESTREAMP) (494 \DISPLAYDATA 477 \DISPLAYDATA 451 \DISPLAYDATA 443 WINDOW 432 SCREEN 425 WINDOW 398 \TOPWDS 383 \DISPLAYDATA 367 \DISPLAYDATA 357 \DISPLAYDATA 350 STREAM 339 OUTPUT 284 \DISPLAYDATA 267 \DISPLAYDATA 241 \DISPLAYDATA 233 WINDOW 222 SCREEN 215 WINDOW 200 \DISPLAYDATA 184 \DISPLAYDATA 174 \DISPLAYDATA 167 STREAM 156 OUTPUT 127 BITMAP 92 WINDOW 83 SCREEN 76 WINDOW 67 \DISPLAYDATA 60 STREAM 49 OUTPUT 31 BITMAP) ( 519 "Invalid argument to \XW.BIBLT" 19 "Neither SOURCE nor DESTINATION is an imagestream.") +\READBINARYBITMAP :D8 +(P 3 BITMAP P 2 BPP P 1 BMH P 0 BMW I 0 STREAM) `@g +bd á@ Ø@ á@ Ø@ á@ Ø#HIJ [@KÉKÈIÚlÚMÉ +É>¼MNjOlLK(41 BITMAPCREATE 10 GETSTREAM) +(80 FDEV 73 STREAM 57 BITMAP 49 BITMAP 5 INPUT) +() +\PRINTBINARYBITMAP :D8 +(P 1 BMH P 0 STREAM I 1 STREAM I 0 BITMAP) ­ Ag +q@Ñ@¦@ ¿H@ »ZKã +¿JKlÿå +¿H@ ¹\Iã +¿LIlÿå +¿H@ ¾]Nã +¿MNlÿå +¿H@É@ÈIÚlÚ +OÉ +É@_¿OOjOlO@(112 \BOUT 101 \BOUT 92 BITSPERPIXEL 84 \BOUT 73 \BOUT 64 BITMAPHEIGHT 56 \BOUT 45 \BOUT 36 BITMAPWIDTH 28 \ILLEGAL.ARG 10 GETSTREAM) +(152 FDEV 145 STREAM 128 BITMAP 120 BITMAP 19 BITMAP 5 OUTPUT) +() FINISH-READING-BITMAP :D8 (L (0 STREAM) F 29 *READ-SUPPRESS*) (@ ñ Hd²µoH ¿°íYºI[¼K]µLk¾M_¿J3 šL3 –N3 ’O›oH @@ -414,8 +437,8 @@ JI (RPAQQ \PILOTBBTSCRATCHBM NIL) (MOVD? (QUOTE BITBLT) (QUOTE BKBITBLT)) DISPLAYSTREAMP :D8 -(I 0 X F 0 \DISPLAYSTREAMTYPES) :@ô2@É.ÉP³@É.É…dP¤µùh´@NIL -(39 IMAGEOPS 32 STREAM 20 IMAGEOPS 13 STREAM 5 STREAM) +(I 0 X) B@ô:@É.É`³"@É.ɉd`¤µõh´@NIL +(53 \DISPLAYSTREAMTYPES 43 IMAGEOPS 36 STREAM 27 \DISPLAYSTREAMTYPES 20 IMAGEOPS 13 STREAM 5 STREAM) () DSPSOURCETYPE :D8 (P 1 \INTERRUPTABLE P 0 DD I 1 DISPLAYSTREAM I 0 SOURCETYPE) ŸAgh É0HÉ @²y@gð³@dgð¦l @@ -425,11 +448,11 @@ Q (145 ERASE 138 INVERT 121 INVERT 110 PAINT 99 ERASE 86 \DISPLAYDATA 77 \DISPLAYDATA 53 INVERT 43 INPUT 32 \DISPLAYDATA 23 \DISPLAYDATA 16 STREAM 5 OUTPUT) () DSPXOFFSET :D8 -(P 0 A0244 I 1 DISPLAYSTREAM I 0 XOFFSET) 'Agh bÉ.É\@AlH(11 \GETSTREAM) +(P 0 A0202 I 1 DISPLAYSTREAM I 0 XOFFSET) 'Agh bÉ.É\@AlH(11 \GETSTREAM) (25 IMAGEOPS 18 STREAM 5 OUTPUT) () DSPYOFFSET :D8 -(P 0 A0245 I 1 DISPLAYSTREAM I 0 YOFFSET) 'Agh bÉ.É^@AlH(11 \GETSTREAM) +(P 0 A0203 I 1 DISPLAYSTREAM I 0 YOFFSET) 'Agh bÉ.É^@AlH(11 \GETSTREAM) (25 IMAGEOPS 18 STREAM 5 OUTPUT) () DSPDESTINATION :D8 @@ -481,20 +504,20 @@ I@A (15 BITMAP 7 ScreenBitMap) () \COMMON.DSPCREATE :D8 -(P 2 DSTRM I 3 OLDDSP I 2 IMAGEOPS I 1 FDEV I 0 DESTINATION F 5 DisplayFDEV F 6 OLDSTREAM F 7 DEFAULTFONT) ÀCµ‚±nl djÏ0¿dg&¿`dj6¿dk.¿dk,¿`dkÏ +(P 2 DSTRM I 3 OLDDSP I 2 IMAGEOPS I 1 FDEV I 0 DESTINATION F 5 DisplayFDEV F 6 OLDSTREAM) ÃCµ‚±ql djÏ0¿dg&¿`dj6¿dk.¿dk,¿`dkÏ ¿HdI*¿dj¿d`¿odnÿdhHdI ¿d`¿dj¿dj¿dj¿dj¿HdI0¿Bµ`HdI.¿AµUHdI ¿dkÏ 0¿dnÿÿÍ5¿`HdIÍ4¿dh2¿dg*¿dg$¿`HdIÍ¿dj¿dj¿dkÏ ¿dkÏ ¿djÍ¿dlÏ¿dh¿djÏ¿HdÉ Éhµg ¿Hdg -¿!WJ +¿!`J @J `@ȼ[Ló²3K°1 ¦C ¿VAµU -¿VBµ`.¿C°¬LJ +¿VBµ`.¿C°©LJ gJ gJ -J(444 DSPOPERATION 433 DSPSOURCETYPE 422 DSPRIGHTMARGIN 381 \ILLEGAL.ARG 374 DISPLAYSTREAMP 347 DSPDESTINATION 340 DSPFONT 328 \SETACCESS 314 \EXTERNALFORMAT) -(438 REPLACE 427 INPUT 409 \DISPLAYIMAGEOPS 401 STREAM 388 STREAM 358 BITMAP 352 SCREENWIDTH 323 OUTPUT 309 :DEFAULT 300 FDEV 233 FILELINELENGTH 225 \STREAM.NOT.OPEN 216 \EOSERROR 195 \STREAM.DEFAULT.MAXBUFFERS 153 \DISPLAYIMAGEOPS 112 ScreenBitMap 78 SCREENWIDTH 50 |PILOTBBTTYPE#| 29 |\DISPLAYDATATYPE#| 21 \DSPPRINTCHAR) +J(447 DSPOPERATION 436 DSPSOURCETYPE 425 DSPRIGHTMARGIN 384 \ILLEGAL.ARG 377 DISPLAYSTREAMP 350 DSPDESTINATION 343 DSPFONT 328 \SETACCESS 314 \EXTERNALFORMAT) +(441 REPLACE 430 INPUT 412 \DISPLAYIMAGEOPS 404 STREAM 391 STREAM 361 BITMAP 355 SCREENWIDTH 337 DEFAULTFONT 323 OUTPUT 309 :DEFAULT 300 FDEV 233 FILELINELENGTH 225 \STREAM.NOT.OPEN 216 \EOSERROR 195 \STREAM.DEFAULT.MAXBUFFERS 153 \DISPLAYIMAGEOPS 112 ScreenBitMap 78 SCREENWIDTH 50 |PILOTBBTTYPE#| 29 |\DISPLAYDATATYPE#| 21 \DSPPRINTCHAR) ( 86 -16383) (MOVD? (QUOTE \SIMPLE.DSPCREATE) (QUOTE DSPCREATE)) \MEDW.XOFFSET :D8 @@ -514,11 +537,11 @@ A (23 \DISPLAYDATA 16 STREAM 5 OUTPUT) ( 63 " is not a REGION.") \DSPFONT.DISPLAY :D8 -(P 3 \INTERRUPTABLE P 2 DD P 1 OLDFONT P 0 XFONT I 1 FONT I 0 DISPLAYSTREAM) {0@É0ZdÉ YA²cA@i µJÉ giA -µ o XIð³7JH ¿JjHÈ -Ù¿JHÉɵ -jHh ÉÈ ÍA¿@J -(119 \SFFixFont 105 \CREATECHARSET 62 ERROR 50 FONTCOPY 31 \COERCEFONTDESC) +(P 4 \INTERRUPTABLE P 2 DD P 1 OLDFONT P 0 XFONT I 1 FONT I 0 DISPLAYSTREAM) ‚@@É0ZdÉ YA²jA@i µJÉ giA +µ o XIð³>JH ¿JjHÈ +Ù¿JHÉɵHÉjH +[¿KÉÈ ÍA¿@J +(126 \SFFixFont 107 \CREATECHARSET 62 ERROR 50 FONTCOPY 31 \COERCEFONTDESC) (83 FONTDESCRIPTOR 41 NOERROR 17 \DISPLAYDATA 8 STREAM) ( 57 "FONT NOT FOUND OR ILLEGAL FONTCOPY PARAMETER") \DISPLAY.PILOTBITBLT :D8 @@ -563,14 +586,13 @@ Q (RPAQ? \SCREENBITMAPS) (MOVD? (QUOTE NILL) (QUOTE \TOTOPWDS)) TTYDISPLAYSTREAM :D8 -(P 3 DD P 2 WIN P 0 \INTERRUPTABLE I 0 DISPLAYSTREAM F 4 \TERM.OFD F 5 \LINEBUF.OFD F 6 *STANDARD-OUTPUT* F 7 *STANDARD-INPUT* F 8 \DISPLAYSTREAMTYPES F 9 TtyDisplayStream) T@¢± -@gh b ³g –@ ¦@ ¿ @dTð’±…¿Tµ VTð²8@c °4`ð³ð`–h ¿Ti +(P 3 DD P 2 WIN P 0 \INTERRUPTABLE I 0 DISPLAYSTREAM F 4 \TERM.OFD F 5 \LINEBUF.OFD F 6 *STANDARD-OUTPUT* F 7 *STANDARD-INPUT* F 8 TtyDisplayStream) T@¢± @gh b ³g –@ ¦@ ¿ @dTð’±…¿Tµ VTð²8@c °4`ð³ð`–h ¿Ti JœJgU ¿°Ç@c¿WU@i Z² Jg` ¿Jg µc -ð“Uc¿@c W²Cg@ -¿@É0[È%KÈ$ÙKɹjIñ¡I‚jIÙÛ (266 PAGEHEIGHT 213 DSPSCROLL 197 IMAGESTREAMTYPE 180 \CREATELINEBUFFER 173 GETWINDOWUSERPROP 161 PUTWINDOWPROP 142 WFROMDS 121 PUTWINDOWPROP 104 WFROMDS 96 \CARET.DOWN 50 \ILLEGAL.ARG 43 TEXTSTREAMP 36 \DEFINEDP 24 DISPLAYSTREAMP 17 \GETSTREAM) -(248 \DISPLAYDATA 239 \DISPLAYDATA 231 \DISPLAYDATA 223 STREAM 207 ON 168 \LINEBUF.OFD 156 \RUNNING.PROCESS 151 PROCESS 115 \LINEBUF.OFD 89 \CARET.UP 81 \DEFAULTTTYDISPLAYSTREAM 31 TEXTSTREAMP 11 OUTPUT) +ð“Uc¿@c `²Cg@ +¿@É0[È%KÈ$ÙKɹjIñ¡I‚jIÙÛ (269 PAGEHEIGHT 216 DSPSCROLL 197 IMAGESTREAMTYPE 180 \CREATELINEBUFFER 173 GETWINDOWUSERPROP 161 PUTWINDOWPROP 142 WFROMDS 121 PUTWINDOWPROP 104 WFROMDS 96 \CARET.DOWN 50 \ILLEGAL.ARG 43 TEXTSTREAMP 36 \DEFINEDP 24 DISPLAYSTREAMP 17 \GETSTREAM) +(251 \DISPLAYDATA 242 \DISPLAYDATA 234 \DISPLAYDATA 226 STREAM 210 ON 202 \DISPLAYSTREAMTYPES 168 \LINEBUF.OFD 156 \RUNNING.PROCESS 151 PROCESS 115 \LINEBUF.OFD 89 \CARET.UP 81 \DEFAULTTTYDISPLAYSTREAM 31 TEXTSTREAMP 11 OUTPUT) () optimize-TTYDISPLAYSTREAM :D8 (L (2 $$CTX 1 $$ENV 0 $$WHOLE)) @¥ggNIL @@ -785,11 +807,11 @@ NIL (PUTPROPS DISPLAYSTARTEDP MACRO (NIL \DisplayStarted)) (ADDTOVAR GLOBALVARS WHOLESCREEN) INITIALIZEDISPLAYSTREAMS :D8 -(F 0 \GUARANTEEDDISPLAYFONT F 1 DEFAULTFONT) Uodnÿdh`ld +(F 0 \GUARANTEEDDISPLAYFONT) Xodnÿdh`ld gl hdg cgkPh -c(80 FONTCLASS 63 FONTCREATE 38 BITMAPCREATE) -(70 DEFAULTFONT 57 DISPLAY 48 GACHA 43 \SYSBBTEXTURE 30 \SYSPILOTBBT 24 |PILOTBBTTYPE#| 19 WHOLEDISPLAY) +(80 FONTCLASS 63 FONTCREATE 38 BITMAPCREATE) +(85 DEFAULTFONT 70 DEFAULTFONT 57 DISPLAY 48 GACHA 43 \SYSBBTEXTURE 30 \SYSPILOTBBT 24 |PILOTBBTTYPE#| 19 WHOLEDISPLAY) ( 4 -16383) (RPAQQ \DisplayStarted NIL) (RPAQQ \LastTTYLines 12) diff --git a/sources/LLKEY b/sources/LLKEY index ad5216cfd..032f719b6 100644 --- a/sources/LLKEY +++ b/sources/LLKEY @@ -1,13 +1,12 @@ (DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) -(FILECREATED " 4-Apr-2025 17:10:10" {WMEDLEY}LLKEY.;11 199518 +(FILECREATED " 5-May-2025 20:57:08" {WMEDLEY}LLKEY.;15 199508 :EDIT-BY rmk - :CHANGES-TO (VARS LLKEYCOMS) - (FNS \DECODETRANSITION) + :CHANGES-TO (VARS \MAIKOKEYACTIONS \KEYNAMES) - :PREVIOUS-DATE "13-Feb-2025 08:22:19" {WMEDLEY}LLKEY.;8) + :PREVIOUS-DATE " 4-Apr-2025 17:10:10" {WMEDLEY}LLKEY.;11) (PRETTYCOMPRINT LLKEYCOMS) @@ -1522,7 +1521,7 @@ (UTIL0 SUN-KEYPAD=) (UTIL1 SUN-KEYPAD/) (UTIL2 SUPER/SUB) - (UTIL3 CASE) + (UTIL3 CASE SUN-F4) (UTIL4 STRIKEOUT) (UTIL5 KEYPAD2 DOWNARROW) (UTIL6 KEYPAD3 PGDN) @@ -1556,7 +1555,7 @@ (K52 KEYPAD0 INS) (BOLD) (ITALICS) - (UNDERLINE) + (UNDERLINE SUN-F6) (SUPERSCRIPT) (SUBSCRIPT) (LARGER SMALLER) @@ -1766,9 +1765,9 @@ (97 ("Function,A" "Function,a" NOLOCKSHIFT)) (99 ("Function,B" "Function,b" NOLOCKSHIFT)) (100 ("Function,C" "Function,c" NOLOCKSHIFT)) - (67 ("Function,D" "Function,d" NOLOCKSHIFT)) + (67 ("0,244" "0,244")) (68 ("Function,E" "Function,e" NOLOCKSHIFT)) - (101 ("Function,F" "Function,f" NOLOCKSHIFT)) + (101 ("0,255" "0,255" NOLOCKSHIFT)) (66 ("Function,G" "Function,g" NOLOCKSHIFT)) (104 ("Function,H" "Function,h" NOLOCKSHIFT)) (80 ("Function,I" "Function,i" NOLOCKSHIFT)) @@ -1784,7 +1783,8 @@ (14 METADOWN . METAUP) (71 ("LF" "LF" NOLOCKSHIFT)) (47 ("Function,^R" "Function,62" NOLOCKSHIFT)) - (105 ("\" "|" NOLOCKSHIFT)))) + (105 ("\" "|" NOLOCKSHIFT)) + (106 ("0,254" "0,254")))) (RPAQQ \MAIKOKEYACTIONST4 ((61 ("^E" "Bell" NOLOCKSHIFT)) @@ -3916,33 +3916,33 @@ (ADDTOVAR LAMA CURSORPROP METASHIFT MOUSECHORDWAIT) ) (DECLARE%: DONTCOPY - (FILEMAP (NIL (14626 21942 (BKSYSCHARCODE 14636 . 14985) (\CLEARSYSBUF 14987 . 15545) (\GETKEY 15547 - . 16722) (\NSYSBUFCHARS 16724 . 17466) (\SAVESYSBUF 17468 . 19077) (\SYSBUFP 19079 . 19383) ( -\GETSYSBUF 19385 . 19565) (\PUTSYSBUF 19567 . 20780) (\PEEKSYSBUF 20782 . 21940)) (23227 60785 ( -\KEYBOARDINIT 23237 . 24957) (\KEYBOARDEVENTFN 24959 . 29659) (\ALLOCLOCKED 29661 . 30251) ( -\SETIOPOINTERS 30253 . 34789) (\KEYBOARDOFF 34791 . 35205) (\KEYBOARDON 35207 . 35586) (\KEYHANDLER -35588 . 35719) (\KEYHANDLER1 35721 . 43167) (\RESETKEYBOARD 43169 . 44817) (\DOMOUSECHORDING 44819 . -48639) (\DOTRANSITIONS 48641 . 49318) (\DECODETRANSITION 49320 . 56733) (MOUSECHORDWAIT 56735 . 57399) - (\TRACKCURSOR 57401 . 60783)) (95237 117110 (KEYACTION 95247 . 96100) (KEYACTIONTABLE 96102 . 97284) -(KEYBOARDTYPE 97286 . 98388) (RESETKEYACTION 98390 . 100149) (\KEYBOARD.MACHINE-SPECIFIC-KEYACTIONS -100151 . 102053) (\KEYACTION1 102055 . 112171) (KEYDOWNP 112173 . 112508) (KEYNUMBERP 112510 . 112708) - (\KEYNAMETONUMBER 112710 . 113404) (\KEYNUMBERTONAME 113406 . 113596) (MODIFY.KEYACTIONS 113598 . -114459) (METASHIFT 114461 . 115405) (SHIFTDOWNP 115407 . 117108)) (117173 117469 ( -SETUP.OFFICE.KEYBOARD 117183 . 117467)) (120448 122160 (\INIT.KEYBOARD.STREAM 120458 . 122158)) ( -122425 138802 (\DOBUFFEREDTRANSITIONS 122435 . 137865) (\TIMER.INTERRUPTFRAME 137867 . 138592) ( -\PERIODIC.INTERRUPTFRAME 138594 . 138800)) (139056 143133 (\HARDCURSORUP 139066 . 140948) ( -\HARDCURSORPOSITION 140950 . 142986) (\HARDCURSORDOWN 142988 . 143131)) (143134 167194 (CURSOR.INIT -143144 . 146844) (\CURSORDESTINATION 146846 . 149164) (\SOFTCURSORUP 149166 . 154420) ( -\SOFTCURSORUPCURRENT 154422 . 161458) (\SOFTCURSORPOSITION 161460 . 162225) (\SOFTCURSORDOWN 162227 . -162935) (CURSORPROP 162937 . 163279) (GETCURSORPROP 163281 . 163469) (PUTCURSORPROP 163471 . 164626) ( -\CURSORBITSPERPIXEL 164628 . 166744) (\CURSORIMAGEPROPNAME 166746 . 166970) (\CURSORMASKPROPNAME -166972 . 167192)) (167195 185145 (CURSORCREATE 167205 . 169880) (CURSOR 169882 . 171694) ( -\CURSOR-VALID-P 171696 . 172783) (\CURSORUP 172785 . 174500) (\CURSORPOSITION 174502 . 177030) ( -\CURSORDOWN 177032 . 177265) (ADJUSTCURSORPOSITION 177267 . 177845) (CURSORPOSITION 177847 . 179389) ( -CURSORSCREEN 179391 . 180047) (CURSOREXIT 180049 . 181440) (FLIPCURSOR 181442 . 182568) (FLIPCURSORBAR - 182570 . 183550) (LASTMOUSEX 183552 . 183806) (LASTMOUSEY 183808 . 184062) (CREATEPOSITION 184064 . -184270) (POSITIONP 184272 . 184556) (CURSORHOTSPOT 184558 . 185143)) (186383 187931 (GETMOUSESTATE -186393 . 187052) (\EVENTKEYS 187054 . 187929)) (194130 194926 (MACHINETYPE 194140 . 194540) ( -SETMAINTPANEL 194542 . 194924)) (194956 196095 (BEEPON 194966 . 195619) (BEEPOFF 195621 . 196093)) ( -196546 196809 (WITHOUT-INTERRUPTS 196556 . 196807))))) + (FILEMAP (NIL (14602 21918 (BKSYSCHARCODE 14612 . 14961) (\CLEARSYSBUF 14963 . 15521) (\GETKEY 15523 + . 16698) (\NSYSBUFCHARS 16700 . 17442) (\SAVESYSBUF 17444 . 19053) (\SYSBUFP 19055 . 19359) ( +\GETSYSBUF 19361 . 19541) (\PUTSYSBUF 19543 . 20756) (\PEEKSYSBUF 20758 . 21916)) (23203 60761 ( +\KEYBOARDINIT 23213 . 24933) (\KEYBOARDEVENTFN 24935 . 29635) (\ALLOCLOCKED 29637 . 30227) ( +\SETIOPOINTERS 30229 . 34765) (\KEYBOARDOFF 34767 . 35181) (\KEYBOARDON 35183 . 35562) (\KEYHANDLER +35564 . 35695) (\KEYHANDLER1 35697 . 43143) (\RESETKEYBOARD 43145 . 44793) (\DOMOUSECHORDING 44795 . +48615) (\DOTRANSITIONS 48617 . 49294) (\DECODETRANSITION 49296 . 56709) (MOUSECHORDWAIT 56711 . 57375) + (\TRACKCURSOR 57377 . 60759)) (95227 117100 (KEYACTION 95237 . 96090) (KEYACTIONTABLE 96092 . 97274) +(KEYBOARDTYPE 97276 . 98378) (RESETKEYACTION 98380 . 100139) (\KEYBOARD.MACHINE-SPECIFIC-KEYACTIONS +100141 . 102043) (\KEYACTION1 102045 . 112161) (KEYDOWNP 112163 . 112498) (KEYNUMBERP 112500 . 112698) + (\KEYNAMETONUMBER 112700 . 113394) (\KEYNUMBERTONAME 113396 . 113586) (MODIFY.KEYACTIONS 113588 . +114449) (METASHIFT 114451 . 115395) (SHIFTDOWNP 115397 . 117098)) (117163 117459 ( +SETUP.OFFICE.KEYBOARD 117173 . 117457)) (120438 122150 (\INIT.KEYBOARD.STREAM 120448 . 122148)) ( +122415 138792 (\DOBUFFEREDTRANSITIONS 122425 . 137855) (\TIMER.INTERRUPTFRAME 137857 . 138582) ( +\PERIODIC.INTERRUPTFRAME 138584 . 138790)) (139046 143123 (\HARDCURSORUP 139056 . 140938) ( +\HARDCURSORPOSITION 140940 . 142976) (\HARDCURSORDOWN 142978 . 143121)) (143124 167184 (CURSOR.INIT +143134 . 146834) (\CURSORDESTINATION 146836 . 149154) (\SOFTCURSORUP 149156 . 154410) ( +\SOFTCURSORUPCURRENT 154412 . 161448) (\SOFTCURSORPOSITION 161450 . 162215) (\SOFTCURSORDOWN 162217 . +162925) (CURSORPROP 162927 . 163269) (GETCURSORPROP 163271 . 163459) (PUTCURSORPROP 163461 . 164616) ( +\CURSORBITSPERPIXEL 164618 . 166734) (\CURSORIMAGEPROPNAME 166736 . 166960) (\CURSORMASKPROPNAME +166962 . 167182)) (167185 185135 (CURSORCREATE 167195 . 169870) (CURSOR 169872 . 171684) ( +\CURSOR-VALID-P 171686 . 172773) (\CURSORUP 172775 . 174490) (\CURSORPOSITION 174492 . 177020) ( +\CURSORDOWN 177022 . 177255) (ADJUSTCURSORPOSITION 177257 . 177835) (CURSORPOSITION 177837 . 179379) ( +CURSORSCREEN 179381 . 180037) (CURSOREXIT 180039 . 181430) (FLIPCURSOR 181432 . 182558) (FLIPCURSORBAR + 182560 . 183540) (LASTMOUSEX 183542 . 183796) (LASTMOUSEY 183798 . 184052) (CREATEPOSITION 184054 . +184260) (POSITIONP 184262 . 184546) (CURSORHOTSPOT 184548 . 185133)) (186373 187921 (GETMOUSESTATE +186383 . 187042) (\EVENTKEYS 187044 . 187919)) (194120 194916 (MACHINETYPE 194130 . 194530) ( +SETMAINTPANEL 194532 . 194914)) (194946 196085 (BEEPON 194956 . 195609) (BEEPOFF 195611 . 196083)) ( +196536 196799 (WITHOUT-INTERRUPTS 196546 . 196797))))) STOP diff --git a/sources/LLKEY.LCOM b/sources/LLKEY.LCOM index 0fc5012ce..aba3cfe8d 100644 Binary files a/sources/LLKEY.LCOM and b/sources/LLKEY.LCOM differ diff --git a/sources/MCCS b/sources/MCCS new file mode 100644 index 000000000..b3bf608a3 --- /dev/null +++ b/sources/MCCS @@ -0,0 +1,1327 @@ +(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) + +(FILECREATED " 2-Jun-2025 12:46:07" {WMEDLEY}MCCS.;61 41922 + + :EDIT-BY rmk + + :CHANGES-TO (VARS SIGMATOMCCS) + (FNS \ASCIIMAPARRAY) + + :PREVIOUS-DATE " 2-Jun-2025 10:58:20" {WMEDLEY}MCCS.;58) + + +(PRETTYCOMPRINT MCCSCOMS) + +(RPAQQ MCCSCOMS + ( + (* ;; "Stringlet number encoding common to MCCS and XCCS") + + (FNS \MCCSINCCODE \MCCSPEEKCCODE \MCCSOUTCHAR \MCCSBACKCCODE \MCCSFORMATBYTESTREAM + \MCCSCHARSETFN) + (FNS \CREATE.MCCS.EXTERNALFORMAT) + (FNS \MCCS.24BITENCODING.ERROR) + (INITVARS (*SIGNAL-MCCS.24BITENCODING.ERROR*)) + (DECLARE%: EVAL@COMPILE DONTCOPY (EXPORT (CONSTANTS (\NORUNCODE 255) + (NSCHARSETSHIFT 255)) + (MACROS \RUNCODED))) + (DECLARE%: DONTEVAL@LOAD DOCOPY (P (\CREATE.MCCS.EXTERNALFORMAT :MCCS) + (\CREATE.MCCS.EXTERNALFORMAT :XCCS))) + + (* ;; "") + + + (* ;; "Assignment of MCCS characters") + + (ALISTS (CHARACTERNAMES Lowline Caret Currency Leftarrow Uparrow Dollar)) + [DECLARE%: EVAL@COMPILE DONTCOPY (CONSTANTS (MTOXCODEMAP (CHARCODE (($ "0,244") + (^ "0,255") + (_ "0,254") + (Currency "0,44") + (Lowline "0,137") + (Caret "0,136"] + + (* ;; "Mapping between true XCCS and MCCS codes") + + (FNS MTOXCODE XTOMCODE) + (FNS MTOXCODE$ XTOMCODE$) + (COMS (* ; + "From INTERPRESS: Mapping functions to MCCS") + (INITVARS (ASCIITONSTRANSLATIONS)) + + (* ;; "Currently used by \TEDIT.TRANSLATE.ASCIICHARS \CREATEINTERPRESSFONTS.") + + + (* ;; "These are in priority order: if an early one doesn't find a font for a family, the later ones are tried (essentially going to MODERN as the default).") + + + (* ;; "Not clear whether/how these relate to DISPLAYFONTCOERCIONS: TBD.") + + (ADDVARS (ASCIITONSTRANSLATIONS (TIMESROMAN NIL CLASSIC) + (GACHA NIL TERMINAL) + (HELVETICA NIL MODERN) + (CLASSIC NIL MODERN) + (GACHA NIL MODERN) + (TIMESROMAN NIL MODERN) + (LOGO NIL LOGOTYPES) + (HIPPO HIPPOTONSARRAY CLASSIC) + (CYRILLIC CYRILLICTONSARRAY CLASSIC) + (SYMBOL SYMBOLTONSARRAY MODERN) + (MATH MATHTONSARRAY CLASSIC) + (SIGMA SIGMATOMCCSARRAY MODERN))) + (FNS \COERCEASCIITONSFONT) + (VARS ASCIITOMCCS SYMBOLTOMCCS SIGMATOMCCS HIPPOTOMCCS CYRILLICTOMCCS MATHTOMCCS) + (FNS \ASCIIMAPARRAY) + (* ; + "The arrays may not be useful--can be constructed when/if needed?") + (INITVARS (\ASCII2MCCS (\ASCIIMAPARRAY 'MCCS)) + (\ASCII2XCCS (\ASCIIMAPARRAY 'XCCS)) + (SYMBOLTONSARRAY (\ASCIIMAPARRAY SYMBOLTOMCCS)) + (HIPPOTONSARRAY (\ASCIIMAPARRAY HIPPOTOMCCS)) + (CYRILLICTONSARRAY (\ASCIIMAPARRAY CYRILLICTOMCCS)) + (\MATHTONSARRAY (\ASCIIMAPARRAY MATHTOMCCS)) + (SIGMATONSARRAY (\ASCIIMAPARRAY SIGMATOMCCS))) + (FNS MCCSCODEMAP ATOMCODE SYMBOLTOMCODE SIGMATOMCODE MATHTOMCODE HTOMCODE CTOMCODE + ATOXCODE)))) + + + +(* ;; "Stringlet number encoding common to MCCS and XCCS") + +(DEFINEQ + +(\MCCSINCCODE + [LAMBDA (STREAM COUNTP) (* ; "Edited 8-Dec-2023 15:28 by rmk") + (* ; "Edited 6-Aug-2021 15:57 by rmk:") + +(* ;;; "Returns a 16 bit character code. SHIFTEDCSET is STREAM's char set left shifted 8.") + +(* ;;; "If COUNTP is non-NIL, the variable *BYTECOUNTER* is set freely to the number of bytes read.") + +(* ;;; "This doesn't do EOL conversion, \INCHAR does that") + + (DECLARE (USEDFREE *BYTECOUNTER*)) + (\DTEST STREAM 'STREAM) + (LET (NUMBYTES (CSET (ffetch (STREAM CHARSET) of STREAM)) + (CHAR (\BIN STREAM))) (* ; + "Error on EOF unless ENDOFSTREAMOP does something else.") + + (* ;; " NUMBYTES tracks the number of \BINs. ") + + (IF (EQ CHAR NSCHARSETSHIFT) + THEN (* ; + "Shifting character sets, toss CHAR") + (SETQ CSET (\BIN STREAM)) + (IF (NEQ NSCHARSETSHIFT CSET) + THEN (* ; + "Shift to new runcode CSET: SH CS CH") + (SETQ CHAR (\BIN STREAM)) + (SETQ NUMBYTES 3) + (freplace (STREAM CHARSET) of STREAM with CSET) + ELSEIF (EQ 0 (\BIN STREAM)) + THEN (* ; "SH SH CSH CS CH where CSH is 0") + + (* ;; + "The high-order character set byte must be 0, because we don't support obese characters (24 bit)") + + (SETQ CSET (\BIN STREAM)) + (SETQ CHAR (\BIN STREAM)) (* ; "To align with below") + (SETQ NUMBYTES 5) + (freplace (STREAM CHARSET) of STREAM with \NORUNCODE) + ELSE (\NSIN.24BITENCODING.ERROR STREAM)) + + (* ;; "The stream now knows the new character set, runcoded or not.") + + ELSEIF (EQ CSET \NORUNCODE) + THEN (* ; "2-bytes") + (SETQ CSET CHAR) + (SETQ CHAR (\BIN STREAM)) + (SETQ NUMBYTES 2) + ELSE + (* ;; "Runcoded CSET and CHAR") + + (SETQ NUMBYTES 1)) + (CL:WHEN COUNTP (SETQ *BYTECOUNTER* NUMBYTES)) + (CL:WHEN CHAR (* ; + "Typically NIL if ENDOFSTREAMOP returned NIL at EOF ") + (LOGOR (UNFOLD CSET 256) + CHAR))]) + +(\MCCSPEEKCCODE + [LAMBDA (STREAM NOERROR) (* ; "Edited 23-Apr-2025 14:16 by rmk") + (* ; "Edited 8-Dec-2023 15:32 by rmk") + (* ; "Edited 21-Jun-2021 23:44 by rmk:") + + (* ;; + "Modeled on \MCCSINCCODE, but peeks at the last byte in the sequence, leaves the stream unchanged") + + (\DTEST STREAM 'STREAM) + (LET ((CSET (ffetch (STREAM CHARSET) of STREAM)) + (CHAR (\PEEKBIN STREAM NOERROR))) + + (* ;; "Returns a 16 bit character code. Doesn't do EOL conversion--\PEEKCCODE does that. ") + + (* ;; "We don't change the charset in the stream, put the file ptr back the way it was.") + + (CL:WHEN CHAR + (IF (EQ CHAR NSCHARSETSHIFT) + THEN (\BIN STREAM) (* ; "Read the peeked shifting byte") + (SETQ CSET (\BIN STREAM)) (* ; "Consume the char shift byte") + (IF (NEQ CSET NSCHARSETSHIFT) + THEN + (* ;; + "Shift to new runcode CSET: SH CS CH. We have to BIN what we peeked, BIN, and peek again") + + (SETQ CHAR (\PEEKBIN STREAM NOERROR)) + (\BACKFILEPTR STREAM) + (\BACKFILEPTR STREAM) + ELSEIF (EQ 0 (\BIN STREAM)) + THEN (* ; "SH SH CSH CS CH where CSH is 0") + + (* ;; + "Note: no eof error check on this \BIN -- an eof in the middle of a charset shift is an error") + + (SETQ CSET (\BIN STREAM)) + (SETQ CHAR (\PEEKBIN STREAM NOERROR)) + (\BACKFILEPTR STREAM) + (\BACKFILEPTR STREAM) + (\BACKFILEPTR STREAM) + (\BACKFILEPTR STREAM) + ELSE (\NSIN.24BITENCODING.ERROR STREAM)) + ELSEIF (EQ CSET \NORUNCODE) + THEN (* ; "2 byte runs, BIN/PEEK/BACK") + (SETQ CSET CHAR) + (\BIN STREAM) + (SETQ CHAR (\PEEKBIN STREAM NOERROR)) (* ; "One BACKFILEPTR seems OK") + (\BACKFILEPTR STREAM)) + + (* ;; "No need to back up for the runcoded case") + + (CL:WHEN CHAR + (LOGOR (UNFOLD CSET 256) + CHAR)))]) + +(\MCCSOUTCHAR + [LAMBDA (STREAM CHARCODE) (* ; "Edited 23-Apr-2025 14:16 by rmk") + (* ; "Edited 13-Aug-2021 10:24 by rmk:") + + (* ;; "Closed function for the :MCCS external format") + + (COND + ((EQ CHARCODE (CHARCODE EOL)) + (FREPLACE (STREAM CHARPOSITION) OF STREAM WITH 0) + [COND + [(NOT (\RUNCODED STREAM)) (* ; + "Charset is a constant 0, we put out the high-order byte.") + (\BOUT STREAM (\CHARSET (CHARCODE EOL] + ((EQ (\CHARSET (CHARCODE EOL)) + (ffetch (STREAM CHARSET) of STREAM))) + (T (* ; + "We are runcoded, and not in character set 0, have to shift.") + (\BOUT STREAM NSCHARSETSHIFT) + (\BOUT STREAM (freplace (STREAM CHARSET) of STREAM with (\CHARSET (CHARCODE EOL] + + (* ;; "We are now in the right charset (0) for the first EOL byte. For CRLF, the CR is immediately followed by the LF byte, without the prefix 0 byte even if not runcoded, i.e. the 2 bytes are though of as a composite. The stream is left in CSET0 (the freplace above), read for another shift according to the next shift in a runcoded file.") + + (\BOUTEOL STREAM)) + (T (CHANGE (FFETCH (STREAM CHARPOSITION) OF STREAM) + (IPLUS16 1 DATUM)) + (COND + ((NOT (\RUNCODED STREAM)) + (\BOUT STREAM (\CHARSET CHARCODE)) + (\BOUT STREAM (\CHAR8CODE CHARCODE))) + ((EQ (\CHARSET CHARCODE) + (ffetch (STREAM CHARSET) of STREAM)) + (\BOUT STREAM (\CHAR8CODE CHARCODE))) + (T (\BOUT STREAM NSCHARSETSHIFT) + (\BOUT STREAM (freplace (STREAM CHARSET) of STREAM with (\CHARSET CHARCODE))) + (\BOUT STREAM (\CHAR8CODE CHARCODE]) + +(\MCCSBACKCCODE + [LAMBDA (STREAM COUNTP) (* ; "Edited 8-Dec-2023 15:34 by rmk") + (* ; "Edited 19-Jul-2022 17:12 by rmk") + (* ; "Edited 13-Aug-2021 14:08 by rmk:") + (DECLARE (USEDFREE *BYTECOUNTER*)) + (LET ((BYTE (AND (\BACKFILEPTR STREAM) + (\PEEKBIN STREAM))) + (CSET (fetch (STREAM CHARSET) of STREAM))) + (CL:WHEN BYTE + + (* ;; "The immediately preceding byte must be a character byte. If it is a byte in a runcode, then we are done, even if the byte before is part of a shift sequence.") + + (* ;; "But if we are currently in a nonruncoded file, we have to go back one more to get the character set byte.") + + (* ;; "If we can't back up, we are already at the beginning.") + + (IF (EQ \NORUNCODE CSET) + THEN (IF (\BACKFILEPTR STREAM) + THEN (CL:WHEN COUNTP (SETQ *BYTECOUNTER* -2)) + (LOGOR (UNFOLD (\PEEKBIN STREAM) + 256) + BYTE) + ELSE (CL:WHEN COUNTP (SETQ *BYTECOUNTER* -1)) + NIL) + ELSE (CL:WHEN COUNTP (SETQ *BYTECOUNTER* -1)) + (LOGOR (UNFOLD CSET 256) + BYTE)))]) + +(\MCCSFORMATBYTESTREAM + [LAMBDA (STREAM BYTESTREAM) (* ; "Edited 27-May-2025 23:42 by rmk") + (* ; "Edited 26-Mar-2024 11:00 by rmk") + (* ; "Edited 19-Mar-2024 16:02 by rmk") + (\EXTERNALFORMAT BYTESTREAM (\EXTERNALFORMAT STREAM)) + + (* ;; "This stream may be read as a continuation of STREAM (TTYIN, LAFITE?), and we want to make sure that the bytes are encoded properly. So let's assert (and possibly mark) that that's its current situation.") + + (\MCCSCHARSETFN BYTESTREAM (fetch (STREAM CHARSET) of STREAM)) + BYTESTREAM]) + +(\MCCSCHARSETFN + [LAMBDA (STREAM CHARSET DONTMARKSTREAM) (* ; "Edited 9-Dec-2023 11:18 by rmk") + + (* ;; "This differs from \GENERIC.CHARSET in that it actually writes the shifting bytes into an output stream, unless DONTMARKSTREAM. It will do write the shifts, even if it just replicates the situation that is already there (presumably CHARSET = the old CHARSET). The client should test and avoid calling if useless shifts are not desired.") + + (LET [(CSET (ffetch (STREAM CHARSET) of (\DTEST STREAM 'STREAM] + (CL:WHEN CHARSET + (CL:WHEN (EQ CHARSET T) + (SETQ CHARSET \NORUNCODE)) + (CL:UNLESS (EQ CHARSET CSET) + (freplace (STREAM CHARSET) of STREAM with CHARSET) + (CL:UNLESS DONTMARKSTREAM + (CL:WHEN (\IOMODEP STREAM 'OUTPUT T) + (\BOUT STREAM NSCHARSETSHIFT) + (if (EQ CHARSET \NORUNCODE) + then (\BOUT STREAM \NORUNCODE) + (\BOUT STREAM 0) + else (\BOUT STREAM CHARSET)))))) + CSET]) +) +(DEFINEQ + +(\CREATE.MCCS.EXTERNALFORMAT + [LAMBDA (NAME EOL) (* ; "Edited 23-Apr-2025 14:19 by rmk") + (* ; "Edited 7-Dec-2023 23:03 by rmk") + (* ; "Edited 30-Jun-2022 18:08 by rmk") + (* ; "Edited 10-Sep-2021 19:49 by rmk:") + +(* ;;; "Create the :MCCS external format. Stream's EOL overrides the (vacuous) default here") + + (MAKE-EXTERNALFORMAT (OR NAME :MCCS) + (FUNCTION \MCCSINCCODE) + (FUNCTION \MCCSPEEKCCODE) + (FUNCTION \MCCSBACKCCODE) + (FUNCTION \MCCSOUTCHAR) + (FUNCTION \MCCSFORMATBYTESTREAM) + (OR EOL 'LF) + T NIL NIL (FUNCTION \MCCSCHARSETFN]) +) +(DEFINEQ + +(\MCCS.24BITENCODING.ERROR + [LAMBDA (STREAM) (* ; "Edited 23-Apr-2025 14:34 by rmk") + (* bvm%: "12-Mar-86 15:35") + (DECLARE (USEDFREE *SIGNAL-MCCS.24BITENCODING.ERROR*)) + +(* ;;; "Called if we see the sequence shift,shift on STREAM -- means shift to 24-bit character set, which we don't support. Usually this just means we're erroneously reading a binary file as text. If this function returns, its value is taken as a character set to shift to") + + (CL:WHEN *SIGNAL-MCCS.24BITENCODING.ERROR* (* ; + "Only cause error if user/reader cares") + (ERROR "24-bit NS encoding not supported" STREAM)) (* ; "Return charset zero") + 0]) +) + +(RPAQ? *SIGNAL-MCCS.24BITENCODING.ERROR* ) +(DECLARE%: EVAL@COMPILE DONTCOPY +(* "FOLLOWING DEFINITIONS EXPORTED")(DECLARE%: EVAL@COMPILE + +(RPAQQ \NORUNCODE 255) + +(RPAQQ NSCHARSETSHIFT 255) + + +(CONSTANTS (\NORUNCODE 255) + (NSCHARSETSHIFT 255)) +) +(DECLARE%: EVAL@COMPILE + +(PUTPROPS \RUNCODED MACRO (OPENLAMBDA (STREAM) + + (* ;; "returns NIL is the stream is not runcoded, that is, if the stream has 16 bit bytes explicitly represented") + (* ; + "note that neq is ok since charsets are known to be SMALLP's") + (NEQ (fetch CHARSET of STREAM) + \NORUNCODE))) +) + +(* "END EXPORTED DEFINITIONS") + +) +(DECLARE%: DONTEVAL@LOAD DOCOPY + +(\CREATE.MCCS.EXTERNALFORMAT :MCCS) + +(\CREATE.MCCS.EXTERNALFORMAT :XCCS) +) + + + +(* ;; "") + + + + +(* ;; "Assignment of MCCS characters") + + +(ADDTOVAR CHARACTERNAMES (Lowline "0,254") + (Caret "0,255") + (Currency "0,244") + (Leftarrow "_") + (Uparrow "^") + (Dollar $)) +(DECLARE%: EVAL@COMPILE DONTCOPY +(DECLARE%: EVAL@COMPILE + +(RPAQ MTOXCODEMAP (CHARCODE (($ "0,244") + (^ "0,255") + (_ "0,254") + (Currency "0,44") + (Lowline "0,137") + (Caret "0,136")))) + + +[CONSTANTS (MTOXCODEMAP (CHARCODE (($ "0,244") + (^ "0,255") + (_ "0,254") + (Currency "0,44") + (Lowline "0,137") + (Caret "0,136"] +) +) + + + +(* ;; "Mapping between true XCCS and MCCS codes") + +(DEFINEQ + +(MTOXCODE + [LAMBDA (MCODE) (* ; "Edited 1-May-2025 20:05 by rmk") + (* ; "Edited 27-Apr-2025 13:42 by rmk") + (* ; "Edited 23-Apr-2025 14:13 by rmk") + (OR (CADR (FASSOC MCODE MTOXCODEMAP)) + MCODE]) + +(XTOMCODE + [LAMBDA (XCODE) (* ; "Edited 11-May-2025 19:21 by rmk") + (* ; "Edited 1-May-2025 18:57 by rmk") + (* ; "Edited 27-Apr-2025 13:42 by rmk") + (* ; "Edited 23-Apr-2025 14:13 by rmk") + (OR [CAR (find PAIR in MTOXCODEMAP suchthat (EQ XCODE (CADR PAIR] + XCODE]) +) +(DEFINEQ + +(MTOXCODE$ + [LAMBDA (MCODE) (* ; "Edited 11-May-2025 16:54 by rmk") + + (* ;; "For the variant of XCCS where $ is at 44Q and currency is at 244Q") + + (SELCHARQ MCODE + (($ Currency) + MCODE) + (MTOXCODE MCODE]) + +(XTOMCODE$ + [LAMBDA (XCODE) (* ; "Edited 11-May-2025 16:54 by rmk") + + (* ;; "For the variant of XCCS where $ is at 44Q and currency is at 244Q") + + (SELCHARQ XCODE + (($ Currency) + XCODE) + (XTOMCODE XCODE]) +) + + + +(* ; "From INTERPRESS: Mapping functions to MCCS") + + +(RPAQ? ASCIITONSTRANSLATIONS ) + + + +(* ;; "Currently used by \TEDIT.TRANSLATE.ASCIICHARS \CREATEINTERPRESSFONTS.") + + + + +(* ;; +"These are in priority order: if an early one doesn't find a font for a family, the later ones are tried (essentially going to MODERN as the default)." +) + + + + +(* ;; "Not clear whether/how these relate to DISPLAYFONTCOERCIONS: TBD.") + + +(ADDTOVAR ASCIITONSTRANSLATIONS + (TIMESROMAN NIL CLASSIC) + (GACHA NIL TERMINAL) + (HELVETICA NIL MODERN) + (CLASSIC NIL MODERN) + (GACHA NIL MODERN) + (TIMESROMAN NIL MODERN) + (LOGO NIL LOGOTYPES) + (HIPPO HIPPOTONSARRAY CLASSIC) + (CYRILLIC CYRILLICTONSARRAY CLASSIC) + (SYMBOL SYMBOLTONSARRAY MODERN) + (MATH MATHTONSARRAY CLASSIC) + (SIGMA SIGMATOMCCSARRAY MODERN)) +(DEFINEQ + +(\COERCEASCIITONSFONT + [LAMBDA (MAPARRAY ASCIIFAMILY NSFAMILY SIZE FONTFACE ROTATION DEVICE) + (* ; "Edited 24-May-2025 20:04 by rmk") + (* ; "Edited 20-Dec-2024 13:37 by rmk") + (* gbn "12-Sep-85 15:10") + + (* ;; "Produces an ascii font with the proper widths for the ns-character correspondences defined by \ASCII2XCCS") + + (PROG (CHARSETDIR (FD (\CREATESTARFONT NSFAMILY SIZE FONTFACE ROTATION DEVICE))) + (OR FD (RETURN NIL)) + [SETQ CHARSETDIR (CONS (CONS 0 (\GETCHARSETINFO 0 FD] + [bind NSCODE CS for I from 0 to 255 unless (OR (EQ I (SETQ NSCODE (ELT MAPARRAY I))) + (ASSOC (SETQ CS (\CHARSET NSCODE)) + CHARSETDIR)) + do (* ; + "Run thru the translate table looking for non-0 charsets. Add their width info to the directory") + (push CHARSETDIR (CONS CS + (COND + ((\GETCHARSETINFO CS FD)) + (T (* ; + "There isn't any info for that character. Warn the guy, but continue.") + (FRESHLINE PROMPTWINDOW) + (printout PROMPTWINDOW + "Warning: Information about character set " + .I3.8 CS " missing from font " ASCIIFAMILY %, + SIZE ".") + NIL] (* ; + "Return if one of the fonts couldn't be found") + [bind CHARSETINFO NSCODE (WIDTHS _ (fetch (CHARSETINFO WIDTHS) of (\GETCHARSETINFO 0 FD))) + for I from 0 to 255 unless (EQ I (SETQ NSCODE (ELT MAPARRAY I))) + when (SETQ CHARSETINFO (CDR (ASSOC (\CHARSET NSCODE) + CHARSETDIR))) + do (* ; + "For each non-ASCII character, look for width info in the right NS place. If none, use zero width.") + (\FSETWIDTH WIDTHS I (\FGETWIDTH (fetch (CHARSETINFO WIDTHS) of CHARSETINFO) + (\CHAR8CODE NSCODE] + (replace OTHERDEVICEFONTPROPS of FD with MAPARRAY) + [COND + ((NEQ NSFAMILY ASCIIFAMILY) + + (* ;; "Update the font deacriptor so it looks like it's really for the family the guy wanted. Also save the info we used to get here.") + + (replace FONTFAMILY of FD with ASCIIFAMILY) + (replace FONTDEVICESPEC of FD with (LIST NSFAMILY SIZE FONTFACE ROTATION DEVICE] + (RETURN FD]) +) + +(RPAQQ ASCIITOMCCS + ((2 191) + (4 200) + (7 185) + (8 161) + (11 194) + (14 197) + (15 61229) + (19 61221) + (22 61220) + (24 45) + (25 61230) + (28 61228) + (30 184) + (96 169) + (155 61220) + (156 61221))) + +(RPAQQ SYMBOLTOMCCS + ((1 0) + (2 180) + (3 8546) + (4 0) + (5 8574) + (6 177) + (7 61309) + (8 61282) + (9 61283) + (10 61284) + (11 61285) + (12 0) + (13 184) + (14 0) + (15 0) + (16 61296) + (17 61298) + (18 61273) + (19 61272) + (20 8549) + (21 8550) + (22 0) + (23 0) + (24 61054) + (25 61305) + (26 61275) + (27 61274) + (28 8546) + (29 61299) + (30 0) + (31 0) + (32 0) + (33 174) + (34 173) + (35 175) + (36 61266) + (37 61250) + (38 61251) + (39 61303) + (40 61261) + (41 61263) + (42 0) + (43 0) + (44 61262) + (45 0) + (46 0) + (47 0) + (48 0) + (49 8551) + (50 61258) + (51 61259) + (52 61281) + (53 0) + (54 61292) + (55 172) + (56 61365) + (57 61364) + (58 61290) + (59 61351) + (60 0) + (61 0) + (62 0) + (63 47) + (64 0) + (91 61271) + (92 61270) + (93 0) + (94 61366) + (95 61367) + (96 61238) + (97 61239) + (98 61362) + (99 61363) + (100 61360) + (101 61361) + (102 123) + (103 125) + (104 61234) + (105 61235) + (106 61052) + (107 8514) + (108 61243) + (109 61242) + (110 8740) + (111 8742) + (112 61308) + (113 8546) + (114 0) + (115 61301) + (116 0) + (117 0) + (118 0) + (119 0) + (120 167) + (121 61232) + (122 61233) + (123 182) + (124 64) + (125 211) + (126 163) + (127 36) + (128 0) + (129 0) + (130 0) + (131 0) + (132 0) + (133 0) + (134 0) + (135 0) + (136 0) + (137 0) + (138 0) + (139 0) + (140 0) + (141 0) + (142 0) + (143 0) + (144 0) + (145 0) + (146 0) + (147 0) + (148 0) + (149 0) + (150 0) + (151 0) + (152 0) + (153 0) + (154 0) + (155 0) + (156 0) + (157 0) + (158 0) + (159 0) + (160 0) + (161 0) + (162 0) + (163 0) + (164 0) + (165 0) + (166 0) + (167 0) + (168 0) + (169 0) + (170 0) + (171 0) + (172 0) + (173 0) + (174 0) + (175 0) + (176 0) + (177 0) + (178 0) + (179 0) + (180 0) + (181 0) + (182 0) + (183 0) + (184 0) + (185 0) + (186 0) + (187 0) + (188 0) + (189 0) + (190 0) + (191 0) + (192 0) + (193 0) + (194 0) + (195 0) + (196 0) + (197 0) + (198 0) + (199 0) + (200 0) + (201 0) + (202 0) + (203 0) + (204 0) + (205 0) + (206 0) + (207 0) + (208 0) + (209 0) + (210 0) + (211 0) + (212 0) + (213 0) + (214 0) + (215 0) + (216 0) + (217 0) + (218 0) + (219 0) + (220 0) + (221 0) + (222 0) + (223 0) + (224 0) + (225 0) + (226 0) + (227 0) + (228 0) + (229 0) + (230 0) + (231 0) + (232 0) + (233 0) + (234 0) + (235 0) + (236 0) + (237 0) + (238 0) + (239 0) + (240 0) + (241 0) + (242 0) + (243 0) + (244 0) + (245 0) + (246 0) + (247 0) + (248 0) + (249 0) + (250 0) + (251 0) + (252 0) + (253 0) + (254 0) + (255 0))) + +(RPAQQ SIGMATOMCCS + ((65 65 low squaredot not in XCCS) + (67 61302 "357,166" contourintegral) + (73 61270 "357,126" intersection) + (76 61366 "357,266" and) + (77 61306 "357,172" Summation) + (80 61307 "357,173" Product) + (82 61308 "357,174" radical) + (83 61301 "357,165" integral) + (85 61271 "357,127" union) + (86 61367 "357,267" or))) + +(RPAQQ HIPPOTOMCCS + ((14 60973) + (15 61229) + (19 61221) + (22 61220) + (24 60973) + (25 61228) + (65 9793) + (66 9794) + (67 9809) + (68 9797) + (69 9798) + (70 9818) + (71 9796) + (72 9802) + (73 9804) + (75 9805) + (76 9806) + (77 9807) + (78 9808) + (79 9810) + (80 9811) + (81 9803) + (82 9813) + (83 9814) + (84 9816) + (85 9817) + (87 9821) + (88 9819) + (89 9820) + (90 9801) + (94 173) + (95 172) + (97 9825) + (98 9826) + (99 9841) + (100 9829) + (101 9830) + (102 9850) + (103 9828) + (104 9834) + (105 9836) + (107 9837) + (108 9838) + (109 9839) + (110 9840) + (111 9842) + (112 9843) + (113 9835) + (114 9845) + (115 9846) + (116 9848) + (117 9849) + (119 9853) + (120 9851) + (121 9852) + (122 9833) + (155 61220) + (156 61221) + (183 61286))) + +(RPAQQ CYRILLICTOMCCS + ((36 10023) + (42 10041) + (45 8510) + (50 10095) + (52 10071) + (54 10088) + (56 10089) + (60 171) + (62 187) + (64 10047) + (65 10017) + (66 10018) + (67 10046) + (68 10021) + (69 10022) + (70 10038) + (71 10020) + (72 10049) + (73 10026) + (74 10027) + (75 10028) + (76 10029) + (77 10030) + (78 10031) + (79 10032) + (80 10033) + (81 10039) + (82 10034) + (83 10035) + (84 10036) + (85 10037) + (86 10019) + (87 10024) + (88 10045) + (89 10048) + (90 10025) + (91 10090) + (92 9984) + (93 10091) + (94 10044) + (95 10092) + (96 9984) + (97 10065) + (98 10066) + (99 10110) + (100 10069) + (101 10070) + (102 10086) + (103 10068) + (104 10097) + (105 10074) + (106 10075) + (107 10076) + (108 10077) + (109 10078) + (110 10079) + (111 10080) + (112 10081) + (113 10087) + (114 10082) + (115 10083) + (116 10084) + (117 10085) + (118 10067) + (119 10072) + (120 10093) + (121 10096) + (122 10073) + (123 10042) + (124 9984) + (125 10043) + (126 10040) + (127 9984) + (143 10094) + (155 61220) + (156 61221) + (183 61286))) + +(RPAQQ MATHTOMCCS + ((1 61307) + (2 61234) + (3 61235) + (4 0) + (5 163) + (6 61301) + (7 61302) + (8 0) + (9 0) + (10 0) + (11 182) + (12 0) + (13 0) + (14 0) + (15 61286) + (16 0) + (17 0) + (18 0) + (19 61306) + (20 0) + (21 0) + (22 61295) + (23 0) + (24 0) + (25 0) + (26 0) + (27 0) + (28 0) + (29 0) + (30 0) + (31 0) + (33 61232) + (34 61287) + (35 8551) + (36 162) + (37 184) + (38 61366) + (39 61299) + (40 194) + (41 61308) + (42 199) + (43 177) + (44 61260) + (45 61309) + (46 8552) + (47 61285) + (48 61287) + (49 8738) + (50 8740) + (51 8574) + (52 61282) + (53 61283) + (54 61284) + (55 61292) + (56 8570) + (57 199) + (58 167) + (59 0) + (60 8549) + (61 8546) + (62 8550) + (63 191) + (64 61248) + (65 61365) + (66 61258) + (67 61356) + (68 61369) + (69 61364) + (70 61233) + (71 61275) + (72 61279) + (73 61273) + (74 61274) + (75 61278) + (76 61272) + (77 61629) + (78 61259) + (79 61281) + (80 61297) + (81 61265) + (82 61358) + (83 61305) + (84 61296) + (85 61271) + (86 61367) + (87 61298) + (88 180) + (89 61626) + (90 61368) + (91 0) + (92 0) + (93 0) + (94 175) + (95 174) + (96 0) + (97 61351) + (98 61267) + (99 211) + (100 61370) + (101 61303) + (102 61266) + (103 61263) + (104 61288) + (105 61360) + (106 61361) + (107 61362) + (108 61363) + (109 61256) + (110 61290) + (111 61287) + (112 61238) + (113 61240) + (114 210) + (115 61246) + (116 61244) + (117 61247) + (118 61245) + (119 61250) + (120 61251) + (121 61270) + (122 61239) + (123 188) + (124 189) + (125 190) + (126 61264) + (127 0) + (128 0) + (129 0) + (130 0) + (131 0) + (132 0) + (133 0) + (134 0) + (135 0) + (136 0) + (137 0) + (138 0) + (139 0) + (140 0) + (141 0) + (142 0) + (143 0) + (144 0) + (145 0) + (146 0) + (147 0) + (148 0) + (149 0) + (150 0) + (151 0) + (152 0) + (153 0) + (154 0) + (155 0) + (156 0) + (157 0) + (158 0) + (159 0) + (160 0) + (161 0) + (162 0) + (163 0) + (164 0) + (165 0) + (166 0) + (167 0) + (168 0) + (169 0) + (170 0) + (171 0) + (172 0) + (173 0) + (174 0) + (175 0) + (176 0) + (177 0) + (178 0) + (179 0) + (180 0) + (181 0) + (182 0) + (183 0) + (184 0) + (185 0) + (186 0) + (187 0) + (188 0) + (189 0) + (190 0) + (191 0) + (192 0) + (193 0) + (194 0) + (195 0) + (196 0) + (197 0) + (198 0) + (199 0) + (200 0) + (201 0) + (202 0) + (203 0) + (204 0) + (205 0) + (206 0) + (207 0) + (208 0) + (209 0) + (210 0) + (211 0) + (212 0) + (213 0) + (214 0) + (215 0) + (216 0) + (217 0) + (218 0) + (219 0) + (220 0) + (221 0) + (222 0) + (223 0) + (224 0) + (225 0) + (226 0) + (227 0) + (228 0) + (229 0) + (230 0) + (231 0) + (232 0) + (233 0) + (234 0) + (235 0) + (236 0) + (237 0) + (238 0) + (239 0) + (240 0) + (241 0) + (242 0) + (243 0) + (244 0) + (245 0) + (246 0) + (247 0) + (248 0) + (249 0) + (250 0) + (251 0) + (252 0) + (253 0) + (254 0) + (255 0))) +(DEFINEQ + +(\ASCIIMAPARRAY + [LAMBDA (MAP) (* ; "Edited 2-Jun-2025 11:45 by rmk") + (* ; "Edited 1-Jun-2025 07:26 by rmk") + (* ; "Edited 24-May-2025 12:22 by rmk") + (* ; "Edited 21-Dec-2024 18:57 by rmk") + + (* ;; "Atom cases for loadup") + + (SELECTQ MAP + (:XCCS (SETQ MAP (CONSTANT (APPEND MTOXCODEMAP ASCIITOMCCS)))) + (:MCCS (SETQ MAP (CONSTANT ASCIITOMCCS))) + NIL) + (LET ((TABLE (ARRAY (ADD1 \MAXTHINCHAR) + 'WORD 0 0))) + (for I from 0 to \MAXTHINCHAR do (SETA TABLE I I)) + [for X FROMCODE in MAP when (SETQ FROMCODE (CL:IF (CHARCODEP (CAR X)) + (CAR X) + (CHARCODE.DECODE (CAR X) + T))) + do (SETA TABLE FROMCODE (CL:IF (CHARCODEP (CADR X)) + (CADR X) + (CHARCODE.DECODE (CADR X)))] + TABLE]) +) + + + +(* ; "The arrays may not be useful--can be constructed when/if needed?") + + +(RPAQ? \ASCII2MCCS (\ASCIIMAPARRAY 'MCCS)) + +(RPAQ? \ASCII2XCCS (\ASCIIMAPARRAY 'XCCS)) + +(RPAQ? SYMBOLTONSARRAY (\ASCIIMAPARRAY SYMBOLTOMCCS)) + +(RPAQ? HIPPOTONSARRAY (\ASCIIMAPARRAY HIPPOTOMCCS)) + +(RPAQ? CYRILLICTONSARRAY (\ASCIIMAPARRAY CYRILLICTOMCCS)) + +(RPAQ? \MATHTONSARRAY (\ASCIIMAPARRAY MATHTOMCCS)) + +(RPAQ? SIGMATONSARRAY (\ASCIIMAPARRAY SIGMATOMCCS)) +(DEFINEQ + +(MCCSCODEMAP + [LAMBDA (FROMENCODING NONIDENTITY) (* ; "Edited 27-May-2025 23:02 by rmk") + (* ; "Edited 24-May-2025 10:55 by rmk") + (LET ((FN (SELECTQ FROMENCODING + (XCCS$ (FUNCTION XTOMCODE$)) + (ALTOTEXT (FUNCTION ATOMCODE)) + (SYMBOL (FUNCTION STOMCODE)) + (MATH (FUNCTION MTOMCODE)) + (HIPPO (FUNCTION HTOMCODE)) + (CYRILLIC (FUNCTION CTOMCODE)) + NIL))) + (CL:WHEN FN + (for C M from 0 to \MAXCHAR when (SETQ M (APPLY* FN C NONIDENTITY)) + collect (LIST C M)))]) + +(ATOMCODE + [LAMBDA (CCODE NOIDENTITY) (* ; "Edited 24-May-2025 09:41 by rmk") + (LET ((MCODE (CL:IF (ILEQ CCODE \MAXTHINCHAR) + (ELT \ASCII2MCCS CCODE) + CCODE))) + (CL:IF (AND (EQ CCODE MCODE) + NOIDENTITY) + NIL + MCODE)]) + +(SYMBOLTOMCODE + [LAMBDA (CCODE NOIDENTITY) (* ; "Edited 1-Jun-2025 07:02 by rmk") + (* ; "Edited 24-May-2025 10:54 by rmk") + (LET ((MCODE (CL:IF (ILEQ CCODE \MAXTHINCHAR) + (ELT SYMBOLTONSARRAY CCODE) + CCODE))) + (CL:IF (AND (EQ CCODE MCODE) + NOIDENTITY) + NIL + MCODE)]) + +(SIGMATOMCODE + [LAMBDA (CCODE NOIDENTITY) (* ; "Edited 1-Jun-2025 07:02 by rmk") + (* ; "Edited 24-May-2025 10:54 by rmk") + (LET ((MCODE (CL:IF (ILEQ CCODE \MAXTHINCHAR) + (ELT SIGMATOMCCSARRAY CCODE) + CCODE))) + (CL:IF (AND (EQ CCODE MCODE) + NOIDENTITY) + NIL + MCODE)]) + +(MATHTOMCODE + [LAMBDA (CCODE NOIDENTITY) (* ; "Edited 1-Jun-2025 07:02 by rmk") + (* ; "Edited 24-May-2025 10:58 by rmk") + (LET ((MCODE (CL:IF (ILEQ CCODE \MAXTHINCHAR) + (ELT MATHTONSARRAY CCODE) + CCODE))) + (CL:IF (AND (EQ CCODE MCODE) + NOIDENTITY) + NIL + MCODE)]) + +(HTOMCODE + [LAMBDA (CCODE NOIDENTITY) (* ; "Edited 24-May-2025 09:40 by rmk") + (LET ((MCODE (CL:IF (ILEQ CCODE \MAXTHINCHAR) + (ELT HIPPOTONSARRAY CCODE) + CCODE))) + (CL:IF (AND (EQ CCODE MCODE) + NOIDENTITY) + NIL + MCODE)]) + +(CTOMCODE + [LAMBDA (CCODE NOIDENTITY) (* ; "Edited 24-May-2025 09:38 by rmk") + (LET ((MCODE (CL:IF (ILEQ CCODE \MAXTHINCHAR) + (ELT CYRILLICTONSARRAY CCODE) + CCODE))) + (CL:IF (AND (EQ CCODE MCODE) + NOIDENTITY) + NIL + MCODE)]) + +(ATOXCODE + [LAMBDA (CODE NONIDENTITY) (* ; "Edited 24-May-2025 09:45 by rmk") + (MTOXCODE (ATOMCODE CODE) + NONIDENTITY]) +) +(DECLARE%: DONTCOPY + (FILEMAP (NIL (4294 15647 (\MCCSINCCODE 4304 . 7283) (\MCCSPEEKCCODE 7285 . 10063) (\MCCSOUTCHAR 10065 + . 12164) (\MCCSBACKCCODE 12166 . 13710) (\MCCSFORMATBYTESTREAM 13712 . 14442) (\MCCSCHARSETFN 14444 + . 15645)) (15648 16530 (\CREATE.MCCS.EXTERNALFORMAT 15658 . 16528)) (16531 17399 ( +\MCCS.24BITENCODING.ERROR 16541 . 17397)) (19345 20304 (MTOXCODE 19355 . 19753) (XTOMCODE 19755 . +20302)) (20305 20927 (MTOXCODE$ 20315 . 20619) (XTOMCODE$ 20621 . 20925)) (21837 25112 ( +\COERCEASCIITONSFONT 21847 . 25110)) (36655 37978 (\ASCIIMAPARRAY 36665 . 37976)) (38448 41899 ( +MCCSCODEMAP 38458 . 39197) (ATOMCODE 39199 . 39556) (SYMBOLTOMCODE 39558 . 40033) (SIGMATOMCODE 40035 + . 40510) (MATHTOMCODE 40512 . 40983) (HTOMCODE 40985 . 41345) (CTOMCODE 41347 . 41710) (ATOXCODE +41712 . 41897))))) +STOP diff --git a/sources/MCCS.LCOM b/sources/MCCS.LCOM new file mode 100644 index 000000000..5a4160f91 Binary files /dev/null and b/sources/MCCS.LCOM differ diff --git a/sources/MEDLEYDIR b/sources/MEDLEYDIR index 4a760d1a7..128ff803c 100644 --- a/sources/MEDLEYDIR +++ b/sources/MEDLEYDIR @@ -1,10 +1,12 @@ (DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) -(FILECREATED "15-May-2025 00:18:25" {DSK}frank>il>qmedley>sources>MEDLEYDIR.;2 11450 +(FILECREATED "16-May-2025 14:46:03" {WMEDLEY}MEDLEYDIR.;25 11276 + + :EDIT-BY rmk :CHANGES-TO (VARS MEDLEY-INIT-VARS) - :PREVIOUS-DATE "26-Aug-2024 22:11:48" {DSK}frank>il>qmedley>sources>MEDLEYDIR.;1) + :PREVIOUS-DATE "26-Aug-2024 22:11:48" {WMEDLEY}MEDLEYDIR.;24) (PRETTYCOMPRINT MEDLEYDIRCOMS) @@ -190,29 +192,24 @@ (IRM.HOST&DIR (MEDLEYDIR '"docs/dinfo")) (IRM.DINFOGRAPH) (DIRECTORIES (APPEND LISPUSERSDIRECTORIES LISPSOURCEDIRECTORIES)) - (LOGINHOST/DIR (LET [(LHD (DIRECTORYNAME (OR (UNIX-GETENV "LOGINDIR") - (UNIX-GETENV "HOME"] - (AND (GETD 'PSEUDOHOSTS) - (TARGETHOST 'LI) - (PSEUDOHOST 'LI LHD)) - LHD)) + [LOGINHOST/DIR (DIRECTORYNAME (OR (UNIX-GETENV "LOGINDIR") + (UNIX-GETENV "HOME"] [USERGREETFILES (LIST (CONS LOGINHOST/DIR '("INIT" COM)) (CONS LOGINHOST/DIR '("INIT"] - (DISPLAYFONTDIRECTORIES (MEDLEYDIR '("fonts/displayfonts" "fonts/altofonts" "fonts/adobe" - "fonts/big" "fonts/other") + (DISPLAYFONTDIRECTORIES (MEDLEYDIR '("fonts/medleydisplayfonts" "fonts/displayfonts" + "fonts/altofonts" "fonts/adobe" "fonts/big" + "fonts/other") NIL NIL T)) - (POSTSCRIPTFONTDIRECTORIES (MEDLEYDIR '("fonts/postscriptfonts") + (POSTSCRIPTFONTDIRECTORIES (MEDLEYDIR '("fonts/postscriptfonts" "fonts/medleypostscriptfonts" + ) NIL NIL T)) - (INTERPRESSFONTDIRECTORIES (MEDLEYDIR '("fonts/ipfonts") + (INTERPRESSFONTDIRECTORIES (MEDLEYDIR '("fonts/ipfonts" "fonts/ipfonts" + "fonts/medleyinterpressfonts") NIL NIL T)) (UNICODEDIRECTORIES (MEDLEYDIR '("unicode/xerox") NIL NIL T)) - (LOGINHOST/DIR (LET [(LHD (DIRECTORYNAME (OR (UNIX-GETENV "LOGINDIR") - (UNIX-GETENV "HOME"] - (AND (GETD 'PSEUDOHOSTS) - (TARGETHOST 'LI) - (PSEUDOHOST 'LI LHD)) - LHD) + (LOGINHOST/DIR (DIRECTORYNAME (OR (UNIX-GETENV "LOGINDIR") + (UNIX-GETENV "HOME"))) RESET) (USERGREETFILES [LIST (CONS LOGINHOST/DIR '("INIT" COM)) (CONS LOGINHOST/DIR '("INIT"] @@ -226,6 +223,6 @@ (ADDTOVAR GLOBALVARS MEDLEYDIR MEDLEY-INIT-VARS \SAVE.MEDLEYDIR DIRECTORIES SYSOUTCOMMITS) ) (DECLARE%: DONTCOPY - (FILEMAP (NIL (1661 8735 (MEDLEY-INIT-VARS 1671 . 5149) (MEDLEYDIR 5151 . 7535) (MEDLEYSUBSTDIR 7537 - . 8515) (SET-SYSOUT-COMMIT 8517 . 8733))))) + (FILEMAP (NIL (1647 8721 (MEDLEY-INIT-VARS 1657 . 5135) (MEDLEYDIR 5137 . 7521) (MEDLEYSUBSTDIR 7523 + . 8501) (SET-SYSOUT-COMMIT 8503 . 8719))))) STOP diff --git a/sources/MEDLEYDIR.LCOM b/sources/MEDLEYDIR.LCOM index 3a75aceae..628fead61 100644 Binary files a/sources/MEDLEYDIR.LCOM and b/sources/MEDLEYDIR.LCOM differ diff --git a/sources/MEDLEYFONTFORMAT b/sources/MEDLEYFONTFORMAT new file mode 100644 index 000000000..0bc3eecd8 --- /dev/null +++ b/sources/MEDLEYFONTFORMAT @@ -0,0 +1,696 @@ +(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) + +(FILECREATED " 9-Jun-2025 12:21:22" {WMEDLEY}MEDLEYFONTFORMAT.;166 41758 + + :EDIT-BY rmk + + :CHANGES-TO (FNS MEDLEYFONT.WRITE.FONT MEDLEYFONT.READ.FONT MEDLEYFONT.READ.ITEM) + + :PREVIOUS-DATE " 8-Jun-2025 23:10:12" {WMEDLEY}MEDLEYFONTFORMAT.;161) + + +(PRETTYCOMPRINT MEDLEYFONTFORMATCOMS) + +(RPAQQ MEDLEYFONTFORMATCOMS + [ + (* ;; "Eventually, MEDLEYFONT should be a package") + + + (* ;; "Main public entries") + + (FNS MEDLEYFONT.WRITE.FONT MEDLEYFONT.GETCHARSET MEDLEYFONT.CHARSET? MEDLEYFONT.GETFILEPROP + MEDLEYFONT.FILEP) + + (* ;; "Reading") + + (FNS MEDLEYFONT.READ.FONT MEDLEYFONT.READ.CHARSET MEDLEYFONT.READ.ITEM + MEDLEYFONT.READ.FONTPROPS MEDLEYFONT.READ.VERIFIEDFONT) + + (* ;; "Writing") + + (FNS MEDLEYFONT.WRITE.CHARSET MEDLEYFONT.WRITE.ITEM MEDLEYFONT.WRITE.FONTPROPS + MEDLEYFONT.WRITE.HEADER) + (FNS MEDLEYFONT.FILENAME) + (ADDVARS (DISPLAYFONTEXTENSIONS MEDLEYDISPLAYFONT) + (INTERPRESSFONTEXTENSIONS MEDLEYINTERPRESSFONT)) + (DECLARE%: EVAL@COMPILE DONTCOPY (CONSTANTS (PRINTDATA 0) + (SMALLPDATA 1) + (BITMAPDATA 2) + (WORDBLOCKDATA 3) + (CLARRAYDATA 4) + (FIXPDATA 5) + (ILARRAYDATA 6) + (HPRINTDATA 7) + (ALISTDATA 8) + (PLISTDATA 9) + (LISTDATA 10]) + + + +(* ;; "Eventually, MEDLEYFONT should be a package") + + + + +(* ;; "Main public entries") + +(DEFINEQ + +(MEDLEYFONT.WRITE.FONT + [LAMBDA (FONT FILE CHARSETNOS OTHERFONTPROPS) (* ; "Edited 9-Jun-2025 12:17 by rmk") + (* ; "Edited 25-May-2025 20:48 by rmk") + (* ; "Edited 23-May-2025 14:59 by rmk") + (* ; "Edited 22-May-2025 09:58 by rmk") + (* ; "Edited 16-May-2025 20:17 by rmk") + (* ; "Edited 14-May-2025 17:45 by rmk") + (SETQ FONT (FONTCREATE FONT)) + (CL:UNLESS FILE + (SETQ FILE (MEDLEYFONT.FILENAME FONT CHARSETNOS))) + (SETQ CHARSETNOS (SORT (MKLIST CHARSETNOS))) + (CL:WITH-OPEN-FILE (STREAM FILE :DIRECTION :OUTPUT :IF-EXISTS :NEW-VERSION) + (MEDLEYFONT.WRITE.HEADER STREAM OTHERFONTPROPS) + (LET ((CHARSETLOCS (CL:MAKE-ARRAY 256 :INITIAL-ELEMENT 0)) + (FONTCHARENCODING (FONTPROP FONT 'CHARENCODING)) + (*READTABLE* (FIND-READTABLE "INTERLISP")) + CSVECTORPTRLOC CSVECTORLOC FILECHARSETS) + + (* ;; "Figure out the actual non empty/sluggish charsets that will be wrtitten.") + + (SETQ FILECHARSETS (for CSNO CSINFO from 0 to \MAXCHARSET + when (OR (NULL CHARSETNOS) + (MEMB CSNO CHARSETNOS)) + when (SETQ CSINFO (\XGETCHARSETINFO FONT CSNO)) + unless (fetch (CHARSETINFO CSSLUGP) of CSINFO) collect CSNO)) + + (* ;; "Right after the header, leave 4 bytes for the pointer to the charset dispatch vector. If writing a single charset, we store the negative of the byte location so we can still easily skip the font properties without writing the whole vector.") + + (* ;; "") + + (SETQ CSVECTORPTRLOC (GETFILEPTR STREAM)) (* ; + "Ptr is before fontproperties, vector is after") + (\FIXPOUT STREAM 0) + (MEDLEYFONT.WRITE.ITEM STREAM 'FILECHARSETS (OR CHARSETNOS 'ALL)) + (MEDLEYFONT.WRITE.FONTPROPS STREAM FONT) + (CL:WHEN (CDR FILECHARSETS) (* ; + "Allocate the vector space if multiple") + (PRINTOUT STREAM "CHARSET LOCATIONS" T) + (SETQ CSVECTORLOC (GETFILEPTR STREAM)) + (for I from 0 to \MAXCHARSET do (\FIXPOUT STREAM 0)) + (TERPRI STREAM)) + (for CSNO in FILECHARSETS do + (* ;; + "LOC remains zero for missing charsets, slug properties are determined by font-level properties.") + + (CL:SETF (CL:SVREF CHARSETLOCS CSNO) + (GETFILEPTR STREAM)) + (MEDLEYFONT.WRITE.CHARSET FONT CSNO STREAM + FONTCHARENCODING)) + (CL:WHEN FILECHARSETS (* ; + "An empty font? Cause an error? Print a message?") + [if (CDR FILECHARSETS) + then + (* ;; "More than one, fill in the vector") + + (SETFILEPTR STREAM CSVECTORLOC) + (for CSNO from 0 to \MAXCHARSET do (\FIXPOUT STREAM (CL:SVREF + CHARSETLOCS + CSNO))) + else + (* ;; + "Minus means direct for one charset, no need for the dispatch vector.") + + (SETQ CSVECTORLOC (IMINUS (CL:SVREF CHARSETLOCS (CAR FILECHARSETS]) + (SETFILEPTR STREAM CSVECTORPTRLOC) + (\FIXPOUT STREAM (OR CSVECTORLOC 0)) (* ; + "Pointer to the charset dispatch vector--or negative of actual location for a singleton") + (FULLNAME STREAM]) + +(MEDLEYFONT.GETCHARSET + [LAMBDA (STREAM FAMILY SIZE FACE ROTATION DEVICE CHARSET) (* ; "Edited 25-May-2025 20:52 by rmk") + (* ; "Edited 21-May-2025 11:35 by rmk") + (* ; "Edited 17-May-2025 00:45 by rmk") + (* ; "Edited 14-May-2025 17:46 by rmk") + + (* ;; "Assume that the initial Me etc. has been checked, and we are positioned after the header information") + + (CL:WITH-OPEN-STREAM (STREAM STREAM) + (PROG ((CSVECTORLOC (\FIXPIN STREAM)) + (FILECHARSETS (MEDLEYFONT.READ.ITEM STREAM 'FILECHARSETS)) + FONTPROPS CSLOC) + (CL:UNLESS (OR (EQ FILECHARSETS 'ALL) + (MEMB CHARSET FILECHARSETS)) + (RETURN NIL)) + + (* ;; "We know now that this file has information about the requested charset, including NIL entries for empty/slugglish ones in the middle of populated ones. A file that would have contain a single empty/sluggish charset cannot be created--the caller would recognize the case of a missing file and provide either NIL or a slug-vector.") + + (SETQ FONTPROPS (MEDLEYFONT.READ.FONTPROPS STREAM)) + (if (ILESSP CSVECTORLOC 0) + then + (* ;; "File contains only one charset and it's the one we want. If the intended charset is empty/sluggish, the file would not have been constructed and we wouldn't be here.") + + (SETFILEPTR STREAM (IMINUS CSVECTORLOC)) + else + (* ;; "The vector-entry points to the one we want") + + (SETFILEPTR STREAM (IPLUS CSVECTORLOC (UNFOLD CHARSET BYTESPERCELL))) + (CL:WHEN (EQ 0 (SETQ CSLOC (\FIXPIN STREAM))) + (RETURN NIL)) + (SETFILEPTR STREAM CSLOC)) + (RETURN (CADR (MEDLEYFONT.READ.CHARSET STREAM]) + +(MEDLEYFONT.CHARSET? + [LAMBDA (FILE CHARSET) (* ; "Edited 25-May-2025 20:53 by rmk") + (* ; "Edited 21-May-2025 11:35 by rmk") + (* ; "Edited 17-May-2025 11:29 by rmk") + (* ; "Edited 14-May-2025 17:46 by rmk") + + (* ;; "If CHARSET, returns T if FILE contains a non-slug entry for CHARSET. If not CHARSET, returns the list of non-slug charsets in FILE.") + + (CL:WITH-OPEN-FILE (STREAM FILE :DIRECTION :INPUT) + (CL:UNLESS (MEDLEYFONT.FILEP STREAM) + (ERROR "Not a MEDLEYFONT file" FILE)) + (LET [(CSVECTORLOC (\FIXPIN STREAM)) + (FILECHARSETS (MEDLEYFONT.READ.ITEM STREAM 'FILECHARSETS] + (if (EQ FILECHARSETS 'ALL) + then (if CHARSET + then (SETFILEPTR STREAM (IPLUS CSVECTORLOC (UNFOLD CHARSET BYTESPERCELL) + )) + (NEQ 0 (\FIXPIN STREAM)) + else (SETFILEPTR STREAM CSVECTORLOC) + (for CS from 0 to \MAXCHARSET unless (EQ 0 (\FIXPIN STREAM)) + collect CS)) + elseif CHARSET + then (MEMB CHARSET FILECHARSETS]) + +(MEDLEYFONT.GETFILEPROP + [LAMBDA (FILE PROP) (* ; "Edited 25-May-2025 20:53 by rmk") + (* ; "Edited 21-May-2025 11:36 by rmk") + (* ; "Edited 17-May-2025 19:07 by rmk") + (* ; "Edited 14-May-2025 17:46 by rmk") + (CL:WITH-OPEN-FILE (STREAM FILE :DIRECTION :INPUT) + (LET (HEADERPROPS CSVECTORLOC FILECHARSETS) + (CL:UNLESS (SETQ HEADERPROPS (MEDLEYFONT.FILEP STREAM)) + (ERROR "Not a MEDLEYFONT file" FILE)) + (SETQ CSVECTORLOC (\FIXPIN STREAM)) + (SETQ FILECHARSETS (MEDLEYFONT.READ.ITEM STREAM 'FILECHARSETS)) + (SELECTQ PROP + (OTHERPROPS (CDDR HEADERPROPS)) + (DATE (CADR HEADERPROPS)) + (FONTPROPS (MEDLEYFONT.READ.FONTPROPS STREAM)) + (CHARSETS (if (EQ FILECHARSETS 'ALL) + then (SETFILEPTR STREAM CSVECTORLOC) + (for CS from 0 to \MAXCHARSET unless (EQ 0 (\FIXPIN STREAM)) + collect CS) + else FILECHARSETS)) + (ERROR "Unknown MEDLEYFONT property"]) + +(MEDLEYFONT.FILEP + [LAMBDA (FILE) (* ; "Edited 8-Jun-2025 22:55 by rmk") + (* ; "Edited 25-May-2025 20:54 by rmk") + (* ; "Edited 21-May-2025 11:37 by rmk") + (* ; "Edited 16-May-2025 21:58 by rmk") + (* ; "Edited 14-May-2025 17:00 by rmk") + + (* ;; "Me in first 2 bytes distinguishes MEDLEYFONT format from others. This may be called after the first 2 bytes have been read to verify the %"Me%", if not we skip over it here.") + + (* ;; "For a valid file, returns (fullname date)") + + (* ;; "If FILE is an open stream, it is left open. Otherwise it is opened and closed.") + + (RESETLST + [PROG (STREAM VERSION DATE) + [if (\GETSTREAM FILE 'INPUT T) + then (SETQ STREAM FILE) + else (RESETSAVE (SETQ STREAM (OPENSTREAM FILE 'INPUT)) + `(PROGN (CLOSEF? OLDVALUE] + (CL:UNLESS (ZEROP (GETFILEPTR STREAM)) + (SETFILEPTR STREAM 0)) + (CL:UNLESS (for C in (CONSTANT (CHCON "Medley font")) always (EQ C (READCCODE STREAM))) + (RETURN NIL)) + (SETQ VERSION (MEDLEYFONT.READ.ITEM STREAM 'VERSION)) + (CL:UNLESS (EQ 0 VERSION) + (RETURN NIL)) + (RETURN `(,(FULLNAME STREAM) + ,(MEDLEYFONT.READ.ITEM STREAM 'DATE) + ,VERSION + ,@(MEDLEYFONT.READ.ITEM STREAM 'OTHERFONTPROPS])]) +) + + + +(* ;; "Reading") + +(DEFINEQ + +(MEDLEYFONT.READ.FONT + [LAMBDA (FILE CHARSETNOS FONT) (* ; "Edited 9-Jun-2025 12:20 by rmk") + (* ; "Edited 25-May-2025 20:54 by rmk") + (* ; "Edited 24-May-2025 08:24 by rmk") + (* ; "Edited 21-May-2025 22:59 by rmk") + (* ; "Edited 19-May-2025 18:01 by rmk") + (* ; "Edited 16-May-2025 20:23 by rmk") + (* ; "Edited 14-May-2025 17:46 by rmk") + (CL:WHEN (type? FONTDESCRIPTOR FILE) + (CL:UNLESS FONT (SETQ FONT FILE)) + (SETQ FILE (MEDLEYFONT.FILENAME FONT))) + (CL:WITH-OPEN-FILE + (STREAM FILE :DIRECTION :INPUT) + (CL:UNLESS (MEDLEYFONT.FILEP STREAM) + (ERROR "NOT A MEDLEYFONT FILE" (FULLNAME STREAM))) + (LET ((*READTABLE* (FIND-READTABLE "INTERLISP")) + FONTCHARSETVECTOR CSVECTORLOC FILECHARSETS) + (SETQ CHARSETNOS (SORT (MKLIST CHARSETNOS))) (* ; "The request") + (SETQ CSVECTORLOC (\FIXPIN STREAM)) (* ; + "Byte location of the charset dispatch vector") + (SETQ FILECHARSETS (MEDLEYFONT.READ.ITEM STREAM 'FILECHARSETS)) + (CL:UNLESS (OR (EQ FILECHARSETS 'ALL) + (NULL (LDIFFERENCE CHARSETNOS FILECHARSETS))) + [ERROR FILE (CONCAT " does not contain information for charsets " + (SORT (LDIFFERENCE CHARSETNOS FILECHARSETS]) + + (* ;; "We know now that this file has information about all requested charsets, including NIL entries for empty/slugglish ones in the middle of populated ones. A file that would have contain a single empty/sluggish charset cannot be created--the caller would recognize the case of a missing file and provide either NIL or a slug-vector.") + + (SETQ FONT (MEDLEYFONT.READ.VERIFIEDFONT STREAM FONT)) + (SETQ FONTCHARSETVECTOR (fetch (FONTDESCRIPTOR FONTCHARSETVECTOR) of FONT)) + (CL:UNLESS (EQ CSVECTORLOC 0) (* ; "Not empty") + [if (ILESSP CSVECTORLOC 0) + then + (* ;; "File contains only one charset and it's the one we want. If the intended charset is empty/sluggish, the file would not have been constructed and we wouldn't be here.") + + (SETFILEPTR STREAM (IMINUS CSVECTORLOC)) + (\SETCHARSETINFO FONTCHARSETVECTOR (CAR CHARSETNOS) + (CADR (MEDLEYFONT.READ.CHARSET STREAM FONT))) + else + (* ;; "Gather all of the CSLOCS before reading, so that we always move forward") + + (for CSNO CSLOC inside (OR CHARSETNOS (for I from 0 to \MAXCHARSET collect + I)) + eachtime (SETFILEPTR STREAM (IPLUS CSVECTORLOC (UNFOLD CSNO BYTESPERCELL))) + (SETQ CSLOC (\FIXPIN STREAM)) unless (ZEROP CSLOC) + collect (CONS CSNO CSLOC) + finally (for X CS in $$VAL + do (SETQ CSNO (CAR X)) + (SETFILEPTR STREAM (CDR X)) + (SETQ CS (MEDLEYFONT.READ.CHARSET STREAM)) + (CL:WHEN CS + (CL:UNLESS (EQ CSNO (CAR CS)) + (ERROR "MISMATCHED CHARSET NUMBERS" (LIST CSNO + (CAR CS))))) + (\SETCHARSETINFO FONTCHARSETVECTOR CSNO (CADR CS]) + FONT]) + +(MEDLEYFONT.READ.CHARSET + [LAMBDA (STREAM) (* ; "Edited 25-May-2025 20:54 by rmk") + (* ; "Edited 23-May-2025 11:01 by rmk") + (* ; "Edited 21-May-2025 16:25 by rmk") + (* ; "Edited 16-May-2025 20:19 by rmk") + (* ; "Edited 14-May-2025 10:43 by rmk") + (* ; "Edited 12-May-2025 07:55 by rmk") + (LET (CHARSETNO CSINFO) + (MEDLEYFONT.READ.ITEM STREAM 'CHARSETSTRING) (* ; + "Throwaway for looking with text editor") + (SETQ CHARSETNO (MEDLEYFONT.READ.ITEM STREAM 'CHARSETNO)) + (SETQ CSINFO (create CHARSETINFO + WIDTHS _ NIL + OFFSETS _ NIL)) (* ; + "Wait until we see the vectors, like the others") + (bind PAIR LABEL DATA eachtime (SETQ PAIR (MEDLEYFONT.READ.ITEM STREAM)) + (SETQ LABEL (CAR PAIR)) + (SETQ DATA (CADR PAIR)) until (EQ LABEL 'STOP) + do (SELECTQ LABEL + (WIDTHS (replace (CHARSETINFO WIDTHS) of CSINFO with DATA)) + (OFFSETS (replace (CHARSETINFO OFFSETS) of CSINFO with DATA)) + (IMAGEWIDTHS (replace (CHARSETINFO IMAGEWIDTHS) of CSINFO with DATA)) + (YWIDTHS (replace (CHARSETINFO YWIDTHS) of CSINFO with DATA)) + (ASCENT (replace (CHARSETINFO CHARSETASCENT) of CSINFO with DATA)) + (DESCENT (replace (CHARSETINFO CHARSETDESCENT) of CSINFO with DATA)) + (LEFTKERN (replace (CHARSETINFO LEFTKERN) of CSINFO with DATA)) + (BITMAP (replace (CHARSETINFO CHARSETBITMAP) of CSINFO with DATA)) + (CSINFOPROPS (replace (CHARSETINFO CSINFOPROPS) of CSINFO with DATA)) + (CSCOMPLETEP (replace (CHARSETINFO CSCOMPLETEP) of CSINFO with DATA)) + (SHOULDNT "Unrecognized charsetinfo label'"))) + (CL:UNLESS (fetch (CHARSETINFO IMAGEWIDTHS) of CSINFO) + (replace (CHARSETINFO IMAGEWIDTHS) of CSINFO with (fetch (CHARSETINFO WIDTHS) + of CSINFO))) + (LIST CHARSETNO CSINFO]) + +(MEDLEYFONT.READ.ITEM + [LAMBDA (STREAM LABEL?) (* ; "Edited 9-Jun-2025 11:58 by rmk") + (* ; "Edited 25-May-2025 20:55 by rmk") + (* ; "Edited 23-May-2025 10:57 by rmk") + (* ; "Edited 21-May-2025 23:12 by rmk") + (* ; "Edited 17-May-2025 10:12 by rmk") + (* ; "Edited 13-May-2025 11:36 by rmk") + + (* ;; "Reads and returns the (label data) that starts at the current position in STREAM according to its storage type. If LABEL? is provided, error if the data read does not have that label. ") + + (LET ((*READTABLE* (FIND-READTABLE 'INTERLISP)) + LABEL ITEM NWORDS NELTS) + (SETQ LABEL (RATOM STREAM)) + (CL:WHEN (AND LABEL? (NEQ LABEL? LABEL)) + (ERROR (CONCAT LABEL? " data not found") + LABEL)) + (READCCODE STREAM) + (SETQ ITEM (SELECTC (BIN STREAM) + (SMALLPDATA (\WIN STREAM)) + (FIXPDATA (\FIXPIN STREAM)) + (PRINTDATA (READ STREAM)) + (ALISTDATA (bind X until [EQ 'STOP (CAR (SETQ X (MEDLEYFONT.READ.ITEM STREAM] + collect (CONS (CAR X) + (CADR X)))) + (PLISTDATA (bind X until [EQ 'STOP (CAR (SETQ X (MEDLEYFONT.READ.ITEM STREAM] + join X)) + (LISTDATA (bind ELT until [EQ 'STOP (CAR (SETQ ELT (MEDLEYFONT.READ.ITEM + STREAM] + collect (CADR ELT) finally (CL:WHEN (CADR ELT) + (NCONC $$VAL ELT)))) + (BITMAPDATA (\READBINARYBITMAP STREAM)) + (CLARRAYDATA (LET [[ARRAY (CL:MAKE-ARRAY (READ STREAM) + :ELEMENT-TYPE + (MEDLEYFONT.READ.ITEM STREAM 'ELEMENT-TYPE] + (ALLFIXED (EQ 1 (BIN STREAM] + (for I from 0 to (\FIXPIN STREAM) + do [CL:SETF (XCL:ROW-MAJOR-AREF ARRAY I) + (CL:IF ALLFIXED + (\FIXPIN STREAM) + (CADR (MEDLEYFONT.READ.ITEM STREAM)))] + finally (RETURN ARRAY)))) + (ILARRAYDATA (LET [(NELTS (\FIXPIN STREAM)) + (ORIG (BIN STREAM)) + (ALLFIXED (EQ 1 (BIN STREAM] + (for I (ARRAY _ (ARRAY NELTS NIL ORIG)) from ORIG + to (CL:IF (EQ ORIG 1) + NELTS + (SUB1 NELTS)) + do (SETA ARRAY I (CL:IF ALLFIXED + (\FIXPIN STREAM) + (MEDLEYFONT.READ.ITEM STREAM I))) + finally (RETURN ARRAY)))) + (WORDBLOCKDATA (SETQ NWORDS (\FIXPIN STREAM)) + (for I (BLOCK _ (\ALLOCBLOCK (FOLDHI NWORDS WORDSPERCELL))) + from 0 to (SUB1 NWORDS) do (\PUTBASE BLOCK I (\WIN STREAM)) + finally (RETURN BLOCK))) + (HPRINTDATA (HREAD STREAM)) + (SHOULDNT "UNKNOWN MEDLEYFONT DATA TYPE"))) + (READCCODE STREAM) (* ; "Skip the EOL") + (CL:IF LABEL? + ITEM + (LIST LABEL ITEM))]) + +(MEDLEYFONT.READ.FONTPROPS + [LAMBDA (STREAM) (* ; "Edited 25-May-2025 20:55 by rmk") + (* ; "Edited 16-May-2025 21:58 by rmk") + (* ; "Edited 14-May-2025 09:11 by rmk") + (bind PAIR until [EQ 'STOP (CAR (SETQ PAIR (MEDLEYFONT.READ.ITEM STREAM] collect PAIR]) + +(MEDLEYFONT.READ.VERIFIEDFONT + [LAMBDA (STREAM FONT) (* ; "Edited 21-May-2025 22:55 by rmk") + (* ; "Edited 19-May-2025 17:42 by rmk") + (* ; "Edited 16-May-2025 10:28 by rmk") + (LET ((FONTPROPS (MEDLEYFONT.READ.FONTPROPS STREAM))) + [if FONT + then (* ; "compare/verify") + (for P in FONTPROPS unless (EQUAL (CADR P) + (RECORDACCESS (CAR P) + FONT NIL 'FETCH)) + do (ERROR "Mismatching font property" P)) + else (SETQ FONT (create FONTDESCRIPTOR)) (* ; "Construct") + (for P in FONTPROPS do (RECORDACCESS (CAR P) + FONT NIL 'REPLACE (CADR P] + FONT]) +) + + + +(* ;; "Writing") + +(DEFINEQ + +(MEDLEYFONT.WRITE.CHARSET + [LAMBDA (FONT CHARSETNO STREAM FONTCHARENCODING) (* ; "Edited 25-May-2025 20:49 by rmk") + (* ; "Edited 22-May-2025 09:58 by rmk") + (* ; "Edited 16-May-2025 20:18 by rmk") + (* ; "Edited 13-May-2025 23:26 by rmk") + + (* ;; "This outputs") + + (LET ((CSINFO (\INSURECHARSETINFO CHARSETNO FONT)) + CSCHARENCODING) + (MEDLEYFONT.WRITE.ITEM STREAM 'CHARSETSTRING (MKSTRING CHARSETNO)) + (* ; "For human file-scan") + (MEDLEYFONT.WRITE.ITEM STREAM 'CHARSETNO CHARSETNO) + (CL:UNLESS (OR (NULL CSINFO) + (fetch (CHARSETINFO CSSLUGP) of CSINFO)) + (* ; + "Slug info is determined by FONT properties") + + (* ;; "Copy the fonts charencoding down to each charset info so that it is availble when the charsetinfo is read. The fontdescriptor isn't available at that point and coercion could lead to fonts of different encodings. At least this would make it possible to fix things up.") + + (SETQ CSCHARENCODING (ASSOC 'CSCHARENCODING (fetch (CHARSETINFO CSINFOPROPS) + of CSINFO))) + (if (EQ FONTCHARENCODING (CDR CSCHARENCODING)) + elseif (NULL CSCHARENCODING) + then (CL:WHEN FONTCHARENCODING + (push (fetch (CHARSETINFO CSINFOPROPS) of CSINFO) + (CONS 'CSCHARENCODING FONTCHARENCODING))) + elseif FONTCHARENCODING + then (ERROR "Charencoding of character set " CHARSETNO + " disagrees with font charencoding")) + (CL:WHEN (fetch (CHARSETINFO CSINFOPROPS) of CSINFO) + (MEDLEYFONT.WRITE.ITEM STREAM 'CSINFOPROPS (fetch (CHARSETINFO CSINFOPROPS) + of CSINFO) + NIL + 'ALIST)) + (MEDLEYFONT.WRITE.ITEM STREAM 'WIDTHS (fetch (CHARSETINFO WIDTHS) of CSINFO)) + (CL:UNLESS [OR (EQ (fetch (CHARSETINFO IMAGEWIDTHS) of CSINFO) + (fetch (CHARSETINFO WIDTHS) of CSINFO)) + (for I (W _ (fetch (CHARSETINFO WIDTHS) of CSINFO)) + (IM _ (fetch (CHARSETINFO IMAGEWIDTHS) of CSINFO)) from 0 + to (SUB1 (IPLUS \MAXTHINCHAR 3)) always (EQ (\GETBASE W I) + (\GETBASE IM I] + (MEDLEYFONT.WRITE.ITEM STREAM 'IMAGEWIDTHS (fetch (CHARSETINFO IMAGEWIDTHS) + of CSINFO))) + (MEDLEYFONT.WRITE.ITEM STREAM 'OFFSETS (fetch (CHARSETINFO OFFSETS) of CSINFO)) + (MEDLEYFONT.WRITE.ITEM STREAM 'YWIDTHS (fetch (CHARSETINFO YWIDTHS) of CSINFO)) + (MEDLEYFONT.WRITE.ITEM STREAM 'ASCENT (fetch (CHARSETINFO CHARSETASCENT) of CSINFO)) + (MEDLEYFONT.WRITE.ITEM STREAM 'DESCENT (fetch (CHARSETINFO CHARSETDESCENT) of CSINFO)) + (MEDLEYFONT.WRITE.ITEM STREAM 'LEFTKERN (fetch (CHARSETINFO LEFTKERN) of CSINFO)) + (MEDLEYFONT.WRITE.ITEM STREAM 'BITMAP (fetch (CHARSETINFO CHARSETBITMAP) of CSINFO)) + (MEDLEYFONT.WRITE.ITEM STREAM 'CSCOMPLETEP (fetch (CHARSETINFO CSCOMPLETEP) of CSINFO))) + (MEDLEYFONT.WRITE.ITEM STREAM 'STOP T]) + +(MEDLEYFONT.WRITE.ITEM + [LAMBDA (STREAM LABEL ITEM EVENIFNIL TYPE BLOCKNELTS) (* ; "Edited 8-Jun-2025 21:14 by rmk") + (* ; "Edited 25-May-2025 20:48 by rmk") + (* ; "Edited 23-May-2025 10:58 by rmk") + (* ; "Edited 22-May-2025 10:31 by rmk") + (* ; "Edited 17-May-2025 10:10 by rmk") + (* ; "Edited 14-May-2025 00:07 by rmk") + + (* ;; "Writes ITEM preceded by LABEL. BLOCKNELTS overrides the default for array blocks, because of the uncertainty/complexity in determining arrayblock length.") + + (CL:WHEN (OR ITEM EVENIFNIL) + (PRIN2 LABEL STREAM (FIND-READTABLE "INTERLISP")) + (PRIN1 " " STREAM) + (SELECTQ (OR TYPE (TYPENAME ITEM)) + (SMALLP (BOUT STREAM SMALLPDATA) + (\WOUT STREAM ITEM)) + (FIXP (* ; "Must come after SMALLP") + (BOUT STREAM FIXPDATA) + (\FIXPOUT STREAM ITEM)) + ((LITATOM STRINGP PRINT) + (BOUT STREAM PRINTDATA) (* ; + "A printable Lisp object, even a list") + (PRIN2 ITEM STREAM (FIND-READTABLE 'INTERLISP))) + (ALIST + (* ;; + " This could be done as LISTDATA, but this way it uses the alist keys as labels.") + + (BOUT STREAM ALISTDATA) + (for X KEY in ITEM do (SETQ KEY (CAR X)) + (CL:UNLESS (OR (LITATOM KEY) + (SMALLP KEY)) + (ERROR "NOT AN ALIST" ITEM)) + (MEDLEYFONT.WRITE.ITEM STREAM KEY (CDR X) + EVENIFNIL)) + (MEDLEYFONT.WRITE.ITEM STREAM 'STOP T)) + (PLIST (BOUT STREAM PLISTDATA) + (for DTAIL KEY on ITEM by (CDDR DTAIL) do (SETQ KEY (CAR DTAIL)) + (CL:UNLESS (OR (LITATOM KEY) + (SMALLP KEY)) + (ERROR "NOT A PLIST" ITEM)) + (MEDLEYFONT.WRITE.ITEM STREAM KEY + (CADR DTAIL) + EVENIFNIL)) + (MEDLEYFONT.WRITE.ITEM STREAM 'STOP T)) + (LISTP (BOUT STREAM LISTDATA) + (for TAIL on ITEM as I from 1 do (MEDLEYFONT.WRITE.ITEM STREAM I (CAR TAIL) + T) + (CL:UNLESS (LISTP (CDR TAIL)) + (MEDLEYFONT.WRITE.ITEM STREAM 'STOP + (CDR TAIL) + T) + (RETURN)))) + (BITMAP (BOUT STREAM BITMAPDATA) + (\PRINTBINARYBITMAP ITEM STREAM)) + ((ONED-ARRAY TWOD-ARRAY GENERAL-ARRAY) + (BOUT STREAM CLARRAYDATA) + (PRIN2 (CL:ARRAY-DIMENSIONS ITEM) + STREAM) + (MEDLEYFONT.WRITE.ITEM STREAM 'ELEMENT-TYPE (CL:ARRAY-ELEMENT-TYPE ITEM)) + (for I ALLFIXED ELT from 0 to (SUB1 (CL:ARRAY-TOTAL-SIZE ITEM)) + first [SETQ ALLFIXED (for I from 0 to (SUB1 (CL:ARRAY-TOTAL-SIZE ITEM)) + always (FIXP (XCL:ROW-MAJOR-AREF ITEM I] + (BOUT STREAM (CL:IF ALLFIXED + 1 + 0)) + (\FIXPOUT STREAM (SUB1 (CL:ARRAY-TOTAL-SIZE ITEM))) + do (SETQ ELT (XCL:ROW-MAJOR-AREF ITEM I)) + (CL:IF ALLFIXED + (\FIXPOUT STREAM ELT) + (MEDLEYFONT.WRITE.ITEM STREAM I ELT T)))) + (ARRAYP (BOUT STREAM ILARRAYDATA) + (\FIXPOUT STREAM (ARRAYSIZE ITEM)) + (BOUT STREAM (ARRAYORIG ITEM)) + (for I ALLFIXED from (ARRAYORIG ITEM) to (IDIFFERENCE (ARRAYSIZE ITEM) + (ARRAYORIG ITEM)) + first [SETQ ALLFIXED (for I from 1 to (ARRAYSIZE ITEM) + always (FIXP (ELT ITEM I] + (BOUT STREAM (CL:IF ALLFIXED + 1 + 0)) do (CL:IF ALLFIXED + (\FIXPOUT STREAM (ELT ITEM I)) + (MEDLEYFONT.WRITE.ITEM STREAM I + (ELT ITEM I) + T)))) + (if (\BLOCKDATAP ITEM) + then + (* ;; "This assumes word-element blocks. We can distinguish pointer blocks (from the DTD, see BLOCKEQUALP), caller would have to tell us (a different TYPE?) whether we are looking at full integer or word blocks--how to interpret NELTS") + + (BOUT STREAM WORDBLOCKDATA) + (CL:UNLESS BLOCKNELTS (* ; "Why 3 ?") + (SETQ BLOCKNELTS (IPLUS \MAXTHINCHAR 3))) + (\FIXPOUT STREAM BLOCKNELTS) + (for I from 0 to (SUB1 BLOCKNELTS) do (\WOUT STREAM (\GETBASE ITEM I))) + else (BOUT STREAM HPRINTDATA) (* ; "A datatype?") + (HPRINT ITEM STREAM T T))) + + (* ;; "Terpri to make sure ratom is OK, also looks better") + + (TERPRI STREAM))]) + +(MEDLEYFONT.WRITE.FONTPROPS + [LAMBDA (STREAM FONT) (* ; "Edited 25-May-2025 20:50 by rmk") + (* ; "Edited 22-May-2025 10:31 by rmk") + (* ; "Edited 19-May-2025 10:42 by rmk") + (* ; "Edited 14-May-2025 17:26 by rmk") + (for F in (RECORDFIELDNAMES 'FONTDESCRIPTOR) unless (MEMB F '(FONTDEVICESPEC \SFFACECODE + FONTCHARSETVECTOR)) + do + (* ;; "Write even NIL values, for default override. ") + + (MEDLEYFONT.WRITE.ITEM STREAM F (RECORDACCESS F FONT) + T)) + (MEDLEYFONT.WRITE.ITEM STREAM 'STOP T]) + +(MEDLEYFONT.WRITE.HEADER + [LAMBDA (STREAM OTHERFONTPROPS) (* ; "Edited 25-May-2025 20:51 by rmk") + (* ; "Edited 16-May-2025 20:20 by rmk") + (* ; "Edited 14-May-2025 17:01 by rmk") + + (* ;; "Me in first 2 bytes distinguishes MEDLEYFONT format from others") + + (PRINTOUT STREAM "Medley font" T) + (MEDLEYFONT.WRITE.ITEM STREAM 'VERSION 0) + (MEDLEYFONT.WRITE.ITEM STREAM 'DATE (DATE)) + (MEDLEYFONT.WRITE.ITEM STREAM 'OTHERFONTPROPS OTHERFONTPROPS T]) +) +(DEFINEQ + +(MEDLEYFONT.FILENAME + [LAMBDA (FONT CHARSET EXTENSION FILE) (* ; "Edited 25-May-2025 21:25 by rmk") + (* ; "Edited 19-May-2025 17:42 by rmk") + (* ; "Edited 16-May-2025 14:09 by rmk") + + (* ;; "If EXTENSION and FILE are NIL, puts the file in the MEDLEYDIR fonts/medley[device]fonts/ directory with extension MEDLEY[device]FONT. If CHARSET, goes in the CHARSET subdirectory.") + + (CL:WHEN (AND (LISTP CHARSET) + (NULL (CDR CHARSET))) + (SETQ CHARSET (CAR CHARSET))) (* ; "Edited 14-May-2025 12:02 by rmk") + (LET ((FAMILY (FONTPROP FONT 'FAMILY)) + (SIZE (FONTPROP FONT 'SIZE)) + (FACE (FONTPROP FONT 'FACE)) + FILENAME) + (CL:UNLESS EXTENSION + (SETQ EXTENSION (CONCAT "MEDLEY" (FONTPROP FONT 'DEVICE) + "FONT")) + (CL:UNLESS FILE + [SETQ FILE (PSEUDOFILENAME (MEDLEYDIR (CONCAT "fonts/" (L-CASE EXTENSION) + "s"])) + (SETQ FILENAME (PACK* FAMILY (CL:IF (ILEQ SIZE 9) + "0" + "") + SIZE "-" (NTHCHAR (CAR FACE) + 1) + (NTHCHAR (CADR FACE) + 1) + (NTHCHAR (CADDR FACE) + 1) + (CL:IF (SMALLP CHARSET) + (CONCAT "-C" (OCTALSTRING CHARSET)) + "") + "." EXTENSION)) + (PACKFILENAME 'BODY FILE 'BODY FILENAME]) +) + +(ADDTOVAR DISPLAYFONTEXTENSIONS MEDLEYDISPLAYFONT) + +(ADDTOVAR INTERPRESSFONTEXTENSIONS MEDLEYINTERPRESSFONT) +(DECLARE%: EVAL@COMPILE DONTCOPY +(DECLARE%: EVAL@COMPILE + +(RPAQQ PRINTDATA 0) + +(RPAQQ SMALLPDATA 1) + +(RPAQQ BITMAPDATA 2) + +(RPAQQ WORDBLOCKDATA 3) + +(RPAQQ CLARRAYDATA 4) + +(RPAQQ FIXPDATA 5) + +(RPAQQ ILARRAYDATA 6) + +(RPAQQ HPRINTDATA 7) + +(RPAQQ ALISTDATA 8) + +(RPAQQ PLISTDATA 9) + +(RPAQQ LISTDATA 10) + + +(CONSTANTS (PRINTDATA 0) + (SMALLPDATA 1) + (BITMAPDATA 2) + (WORDBLOCKDATA 3) + (CLARRAYDATA 4) + (FIXPDATA 5) + (ILARRAYDATA 6) + (HPRINTDATA 7) + (ALISTDATA 8) + (PLISTDATA 9) + (LISTDATA 10)) +) +) +(DECLARE%: DONTCOPY + (FILEMAP (NIL (1992 13637 (MEDLEYFONT.WRITE.FONT 2002 . 6642) (MEDLEYFONT.GETCHARSET 6644 . 8807) ( +MEDLEYFONT.CHARSET? 8809 . 10355) (MEDLEYFONT.GETFILEPROP 10357 . 11827) (MEDLEYFONT.FILEP 11829 . +13635)) (13663 26791 (MEDLEYFONT.READ.FONT 13673 . 17876) (MEDLEYFONT.READ.CHARSET 17878 . 20717) ( +MEDLEYFONT.READ.ITEM 20719 . 25240) (MEDLEYFONT.READ.FONTPROPS 25242 . 25707) ( +MEDLEYFONT.READ.VERIFIEDFONT 25709 . 26789)) (26817 39088 (MEDLEYFONT.WRITE.CHARSET 26827 . 30876) ( +MEDLEYFONT.WRITE.ITEM 30878 . 37543) (MEDLEYFONT.WRITE.FONTPROPS 37545 . 38433) ( +MEDLEYFONT.WRITE.HEADER 38435 . 39086)) (39089 41021 (MEDLEYFONT.FILENAME 39099 . 41019))))) +STOP diff --git a/sources/MEDLEYFONTFORMAT.LCOM b/sources/MEDLEYFONTFORMAT.LCOM new file mode 100644 index 000000000..acc765166 Binary files /dev/null and b/sources/MEDLEYFONTFORMAT.LCOM differ diff --git a/sources/PRETTY b/sources/PRETTY index 2bc35acb3..abe945e92 100644 --- a/sources/PRETTY +++ b/sources/PRETTY @@ -1,22 +1,14 @@ (DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) -(FILECREATED " 8-Feb-2023 16:21:26" {DSK}larry>il>medley>sources>PRETTY.;3 65500 +(FILECREATED "24-Apr-2025 22:19:43" {WMEDLEY}PRETTY.;25 65037 - :EDIT-BY "lmm" + :EDIT-BY rmk - :CHANGES-TO (FNS PRINTDATE1) + :CHANGES-TO (VARS PRETTYCOMS) - :PREVIOUS-DATE "19-Jan-2022 20:35:18" {DSK}larry>il>medley>sources>PRETTY.;1) + :PREVIOUS-DATE " 8-Feb-2023 16:21:26" {WMEDLEY}PRETTY.;24) -(* ; " -Copyright (c) 1984-1990, 1999, 2018, 2023 by Venue & Xerox Corporation. -The following program was created in 1984 but has not been published -within the meaning of the copyright law, is furnished under license, -and may not be used, copied and/or disclosed except in accordance -with the terms of said license. -") - (PRETTYCOMPRINT PRETTYCOMS) (RPAQQ PRETTYCOMS @@ -46,7 +38,7 @@ with the terms of said license. " EXPLAINSTRING "] - no copyright notice now" NOECHOFLG T RETURN NIL] (COPYRIGHTSRESERVED T) (*NEW-INTERLISP-MAKEFILE-ENVIRONMENT* '(:READTABLE "INTERLISP" :PACKAGE - "INTERLISP" :FORMAT :XCCS)) + "INTERLISP" :FORMAT :MCCS)) (*DEFAULT-MAKEFILE-ENVIRONMENT*)) (GLOBALVARS COPYRIGHTOWNERS DEFAULTCOPYRIGHTKEYLST COPYRIGHTPRETTYFLG COMMENTFLG *DEFAULT-MAKEFILE-ENVIRONMENT* *NEW-INTERLISP-MAKEFILE-ENVIRONMENT*)) @@ -640,7 +632,7 @@ must replace the declare: by a nop addvars.") (SETQ PRTTYCOM (SUBPAIR (QUOTE (NL (RPAQ? COPYRIGHTSRESERVED T) (RPAQ? *NEW-INTERLISP-MAKEFILE-ENVIRONMENT* '(:READTABLE "INTERLISP" :PACKAGE "INTERLISP" :FORMAT - :XCCS)) + :MCCS)) (RPAQ? *DEFAULT-MAKEFILE-ENVIRONMENT* ) (DECLARE%: DOEVAL@COMPILE DONTCOPY @@ -729,17 +721,15 @@ must replace the declare: by a nop addvars.") (SETQ PRTTYCOM (SUBPAIR (QUOTE (NL (ADDTOVAR LAMA ) ) -(PUTPROPS PRETTY COPYRIGHT ("Venue & Xerox Corporation" T 1984 1985 1986 1987 1988 1989 1990 1999 2018 - 2023)) (DECLARE%: DONTCOPY - (FILEMAP (NIL (5917 48569 (PRETTYDEF 5927 . 21600) (PRETTYDEFCOMS 21602 . 22284) (PRETTYDEF0 22286 . -22477) (PRETTYDEF1 22479 . 24242) (PRINTDATE 24244 . 25480) (PRINTDATE1 25482 . 27260) (PRINTFNS 27262 - . 27831) (PRETTYCOM 27833 . 34174) (PRETTYVAR 34176 . 35214) (PRETTYVAR1 35216 . 37434) (PRETTYCOM1 -37436 . 38140) (ENDFILE 38142 . 38238) (MAKEDEFLIST 38240 . 38644) (PP 38646 . 38922) (PP* 38924 . -39237) (PPT 39239 . 39558) (PRETTYPRINT 39560 . 42712) (PRETTYPRINT1 42714 . 44600) (PRETTYPRINT2 -44602 . 45918) (PRETTYPRINT3 45920 . 46875) (PRINTDEF1 46877 . 47813) (SUPERPRINTEQ 47815 . 47909) ( -SUPERPRINTGETPROP 47911 . 48055) (CHANGEFONT 48057 . 48567)) (48570 53916 (READARRAY 48580 . 49506) ( -PRINTARRAY 49508 . 51248) (READARRAY-FROM-LIST 51250 . 52355) (PRINTARRAY-TO-LIST 52357 . 53914)) ( -54043 61561 (PRINTCOPYRIGHT 54053 . 58130) (PRINTCOPYRIGHT1 58132 . 61256) (SAVECOPYRIGHT 61258 . -61559))))) + (FILEMAP (NIL (5565 48217 (PRETTYDEF 5575 . 21248) (PRETTYDEFCOMS 21250 . 21932) (PRETTYDEF0 21934 . +22125) (PRETTYDEF1 22127 . 23890) (PRINTDATE 23892 . 25128) (PRINTDATE1 25130 . 26908) (PRINTFNS 26910 + . 27479) (PRETTYCOM 27481 . 33822) (PRETTYVAR 33824 . 34862) (PRETTYVAR1 34864 . 37082) (PRETTYCOM1 +37084 . 37788) (ENDFILE 37790 . 37886) (MAKEDEFLIST 37888 . 38292) (PP 38294 . 38570) (PP* 38572 . +38885) (PPT 38887 . 39206) (PRETTYPRINT 39208 . 42360) (PRETTYPRINT1 42362 . 44248) (PRETTYPRINT2 +44250 . 45566) (PRETTYPRINT3 45568 . 46523) (PRINTDEF1 46525 . 47461) (SUPERPRINTEQ 47463 . 47557) ( +SUPERPRINTGETPROP 47559 . 47703) (CHANGEFONT 47705 . 48215)) (48218 53564 (READARRAY 48228 . 49154) ( +PRINTARRAY 49156 . 50896) (READARRAY-FROM-LIST 50898 . 52003) (PRINTARRAY-TO-LIST 52005 . 53562)) ( +53691 61209 (PRINTCOPYRIGHT 53701 . 57778) (PRINTCOPYRIGHT1 57780 . 60904) (SAVECOPYRIGHT 60906 . +61207))))) STOP diff --git a/sources/PRETTY.LCOM b/sources/PRETTY.LCOM index 02e7d893a..e71a4c9cc 100644 Binary files a/sources/PRETTY.LCOM and b/sources/PRETTY.LCOM differ diff --git a/unicode/xerox/MCCS-TO-UNICODE-MAPPINGS.TXT b/unicode/xerox/MCCS-TO-UNICODE-MAPPINGS.TXT new file mode 100644 index 000000000..2ed56e6f6 --- /dev/null +++ b/unicode/xerox/MCCS-TO-UNICODE-MAPPINGS.TXT @@ -0,0 +1,1607 @@ +[0 ((0 0) (1 1) (2 2) (3 3) (4 4) (5 5) (6 6) (7 7) (8 8) (9 9) (10 10) (11 11) (12 12) (13 13) (14 14 +) (15 15) (16 16) (17 17) (18 18) (19 19) (20 20) (21 21) (22 22) (23 23) (24 24) (25 25) (26 26) (27 +27) (28 28) (29 29) (30 30) (31 31) (32 32) (33 33) (34 34) (35 35) (36 36) (37 37) (38 38) (39 39) ( +40 40) (41 41) (42 42) (43 43) (44 44) (45 45) (46 46) (47 47) (48 48) (49 49) (50 50) (51 51) (52 52) + (53 53) (54 54) (55 55) (56 56) (57 57) (58 58) (59 59) (60 60) (61 61) (62 62) (63 63) (64 64) (65 +65) (66 66) (67 67) (68 68) (69 69) (70 70) (71 71) (72 72) (73 73) (74 74) (75 75) (76 76) (77 77) ( +78 78) (79 79) (80 80) (81 81) (82 82) (83 83) (84 84) (85 85) (86 86) (87 87) (88 88) (89 89) (90 90) + (91 91) (92 92) (93 93) (94 8593) (95 8592) (96 96) (97 97) (98 98) (99 99) (100 100) (101 101) (102 +102) (103 103) (104 104) (105 105) (106 106) (107 107) (108 108) (109 109) (110 110) (111 111) (112 +112) (113 113) (114 114) (115 115) (116 116) (117 117) (118 118) (119 119) (120 120) (121 121) (122 +122) (123 123) (124 124) (125 125) (126 126) (161 161) (162 162) (163 163) (164 164) (165 165) (167 +167) (169 8216) (170 8220) (171 171) (172 95) (173 94) (174 8594) (175 8595) (176 176) (177 177) (178 +178) (179 179) (180 215) (181 181) (182 182) (183 183) (184 247) (185 8217) (186 8221) (187 187) (188 +188) (189 189) (190 190) (191 191) (193 768) (194 769) (195 770) (196 771) (197 772) (198 774) (199 +775) (200 776) (202 778) (203 807) (204 818) (205 779) (206 808) (207 780) (208 8213) (209 185) (210 +174) (211 169) (212 8482) (213 9834) (220 8539) (221 8540) (222 8541) (223 8542) (224 8486) (225 198) +(226 208) (227 170) (228 294) (229 567) (230 306) (231 319) (232 321) (233 216) (234 338) (235 186) ( +236 222) (237 358) (238 330) (239 329) (240 312) (241 230) (242 273) (243 240) (244 295) (245 305) ( +246 307) (247 320) (248 322) (249 248) (250 339) (251 223) (252 254) (253 359) (254 331))] + +[33 ((8481 12288) (8482 12289) (8483 12290) (8484 65292) (8485 65294) (8491 12441) (8492 12442) (8499 +12541) (8500 12542) (8501 12445) (8502 12446) (8503 12291) (8504 20189) (8505 12293) (8506 12294) ( +8507 43472) (8508 12540) (8510 8208) (8512 8918) (8513 8919) (8514 8741) (8515 8873) (8516 8230) (8517 + 8229) (8518 8920) (8519 8921) (8520 10220) (8521 10221) (8522 10214) (8523 10215) (8524 12308) (8525 +12309) (8526 8922) (8527 8923) (8528 8826) (8529 8827) (8530 8828) (8531 8829) (8532 8926) (8533 8927) + (8534 12300) (8535 12301) (8536 12302) (8537 12303) (8538 12304) (8539 12305) (8540 10949) (8541 +10950) (8542 8912) (8543 8913) (8544 10901) (8545 10902) (8546 8800) (8547 10885) (8548 10886) (8549 +8804) (8550 8805) (8551 8734) (8552 8756) (8553 9794) (8554 9792) (8555 8244) (8556 8242) (8557 8243) +(8558 8451) (8559 8874) (8560 8806) (8561 8807) (8562 10877) (8563 10878) (8564 8922) (8565 8923) ( +8566 8741) (8567 8861) (8568 8859) (8569 9734) (8570 9733) (8571 9675) (8572 9679) (8573 9678) (8574 +9671) (8609 8830) (8610 8831) (8611 10935) (8612 10936) (8613 8995) (8614 8994) (8615 124) (8616 8785) + (8617 8791) (8618 8790) (8619 8796) (8620 8916) (8621 8720) (8622 10016) (8623 9671) (8624 8769) ( +8625 8936) (8626 8937) (8627 10937) (8628 10938) (8629 8740) (8630 8742) (8631 8876) (8632 8877) (8633 + 8878) (8634 8879) (8635 8938) (8636 8939) (8637 8940) (8638 8941) (8639 8772) (8640 8777) (8641 10955 +) (8642 10956) (8643 8840) (8644 8841) (8645 8842) (8646 8843) (8647 10955) (8648 10956) (8649 8814) ( +8650 8815) (8651 8780) (8652 8775) (8656 8832) (8657 8833) (8658 8928) (8659 8929) (8660 10933) (8661 +10934) (8662 8928) (8665 8820) (8666 8821) (8672 8816) (8673 8817) (8674 10887) (8675 10888) (8676 +8934) (8677 8935) (8678 8816) (8679 8817) (8686 8930) (8687 8931) (8688 8816) (8689 8817) (8690 8808) +(8691 8809) (8692 8808) (8693 8809))] + +[34 ((8737 9670) (8738 9633) (8739 9632) (8740 9651) (8741 9650) (8742 9661) (8743 9660) (8744 8251) ( +8745 12306) (8746 8216) (8747 8242) (8748 8243) (8750 12307) (8751 8862) (8752 8863) (8753 8864) (8754 + 8865) (8756 8813) (8760 12298) (8761 12299) (8764 8258) (8765 8485) (8766 8241) (8768 8647) (8769 +8649) (8770 8648) (8771 8650) (8772 8666) (8773 8667) (8774 8606) (8775 8608) (8776 8639) (8777 8643) +(8778 8638) (8779 8642) (8780 8610) (8781 8611) (8782 8619) (8783 8620) (8784 8624) (8785 8625) (8786 +8621) (8787 8888) (8788 8788) (8789 8789) (8790 8636) (8791 8637) (8792 8640) (8793 8641) (8794 8618) +(8795 8617) (8796 10229) (8797 10230) (8798 10232) (8799 10233) (8800 8657) (8801 8659) (8802 8786) ( +8803 8787) (8804 8781) (8805 10927) (8806 10928) (8807 10231) (8808 10234) (8809 10234) (8810 8748) ( +8811 8614) (8812 8904) (8813 11089) (8814 9838) (8815 8995) (8816 9653) (8817 8810) (8818 8811) (8819 +8853) (8820 8854) (8821 8855) (8822 8856) (8823 8764) (8824 8776) (8825 8733) (8827 9663) (8828 8487) +(8829 8768) (8830 9711) (8866 8801) (8867 9049) (8868 9080) (8869 9079) (8870 8472) (8871 8709) (8872 +8476) (8873 8465) (8874 8868) (8875 8846) (8876 8871) (8877 8852) (8878 8851) (8879 8846) (8880 8849) +(8881 8850) (8882 8743) (8883 8744) (8884 9652) (8885 9662) (8886 8852) (8887 8720) (8888 8738) (8889 +8717) (8890 8951) (8891 9657) (8892 9667) (8893 8857) (8894 8765) (8896 94) (8923 9122) (8924 9125) ( +8927 9647) (8935 8474) (8936 8461) (8938 8853) (8939 8855) (8940 8857) (8941 8356) (8942 8626) (8943 +8627) (8944 8729) (8945 8988) (8946 8989) (8947 8990) (8948 8991) (8949 8858))] + +[35 ((8994 168) (8995 180) (8996 175) (8997 728) (8998 729) (8999 39) (9000 730) (9001 733) (9002 731) + (9003 711) (9004 184) (9008 183) (9009 832) (9010 833) (9011 770) (9012 771) (9013 772) (9014 774) ( +9015 775) (9016 776) (9018 778) (9019 807) (9021 779) (9022 808) (9023 780) (9024 398) (9025 385) ( +9026 394) (9027 408) (9028 416) (9029 431) (9030 399) (9031 418) (9032 437) (9036 415) (9038 400) ( +9039 404) (9040 406) (9041 390) (9042 425) (9043 434) (9044 439) (9045 440) (9046 391) (9047 401) ( +9048 420) (9049 428) (9050 435) (9053 413) (9056 96) (9057 595) (9058 599) (9059 409) (9060 417) (9061 + 432) (9062 477) (9063 419) (9064 438) (9065 447) (9066 410) (9068 629) (9077 441) (9078 392) (9079 +402) (9080 421) (9081 429) (9082 436) (9086 8254) (9121 703) (9122 8216) (9124 450) (9125 451) (9126 +448) (9127 449) (9129 384) (9130 403) (9131 405) (9132 9837) (9134 8471) (9135 8485) (9136 700) (9137 +699) (9138 8218) (9139 865) (9144 8407) (9145 824) (9146 770) (9147 771) (9148 9839) (9149 697) (9150 +698) (9151 785) (9152 777) (9153 823) (9154 8417) (9155 773) (9157 768) (9158 769) (9160 8406) (9161 +776) (9162 781) (9163 789) (9164 786) (9166 795) (9167 821) (9168 782) (9169 808) (9170 807) (9171 806 +) (9172 805) (9173 814) (9174 803) (9175 804) (9176 816) (9177 819) (9178 809) (9179 813) (9180 817) ( +9181 65056) (9182 65057) (9183 65059) (9184 8401) (9186 783) (9200 831) (9201 784) (9204 788) (9205 +790) (9206 791) (9207 792) (9208 793) (9209 794) (9210 815) (9211 822) (9212 825) (9213 826) (9214 827 +))] + +[36 ((9249 12353) (9250 12354) (9251 12355) (9252 12356) (9253 12357) (9254 12358) (9255 12359) (9256 +12360) (9257 12361) (9258 12362) (9259 12363) (9260 12364) (9261 12365) (9262 12366) (9263 12367) ( +9264 12368) (9265 12369) (9266 12370) (9267 12371) (9268 12372) (9269 12373) (9270 12374) (9271 12375) + (9272 12376) (9273 12377) (9274 12378) (9275 12379) (9276 12380) (9277 12381) (9278 12382) (9279 +12383) (9280 12384) (9281 12385) (9282 12386) (9283 12387) (9284 12388) (9285 12389) (9286 12390) ( +9287 12391) (9288 12392) (9289 12393) (9290 12394) (9291 12395) (9292 12396) (9293 12397) (9294 12398) + (9295 12399) (9296 12400) (9297 12401) (9298 12402) (9299 12403) (9300 12404) (9301 12405) (9302 +12406) (9303 12407) (9304 12408) (9305 12409) (9306 12410) (9307 12411) (9308 12412) (9309 12413) ( +9310 12414) (9311 12415) (9312 12416) (9313 12417) (9314 12418) (9315 12419) (9316 12420) (9317 12421) + (9318 12422) (9319 12423) (9320 12424) (9321 12425) (9322 12426) (9323 12427) (9324 12428) (9325 +12429) (9326 12430) (9327 12431) (9328 12432) (9329 12433) (9330 12434) (9331 12435) (9377 12549) ( +9378 12550) (9379 12551) (9380 12552) (9381 12553) (9382 12554) (9383 12555) (9384 12556) (9385 12557) + (9386 12558) (9387 12559) (9388 12560) (9389 12561) (9390 12562) (9391 12563) (9392 12564) (9393 +12565) (9394 12566) (9395 12567) (9396 12568) (9397 12569) (9398 12570) (9399 12571) (9400 12572) ( +9401 12573) (9402 12574) (9403 12575) (9404 12576) (9405 12577) (9406 12578) (9407 12579) (9408 12580) + (9409 12581) (9410 12582) (9411 12583) (9412 12584) (9413 12585) (9414 714) (9415 711) (9416 715) ( +9417 729) (9418 713) (9419 12587) (9420 12586) (9421 12588))] + +[37 ((9505 12449) (9506 12450) (9507 12451) (9508 12452) (9509 12453) (9510 12454) (9511 12455) (9512 +12456) (9513 12457) (9514 12458) (9515 12459) (9516 12460) (9517 12461) (9518 12462) (9519 12463) ( +9520 12464) (9521 12465) (9522 12466) (9523 12467) (9524 12468) (9525 12469) (9526 12470) (9527 12471) + (9528 12472) (9529 12473) (9530 12474) (9531 12475) (9532 12476) (9533 12477) (9534 12478) (9535 +12479) (9536 12480) (9537 12481) (9538 12482) (9539 12483) (9540 12484) (9541 12485) (9542 12486) ( +9543 12487) (9544 12488) (9545 12489) (9546 12490) (9547 12491) (9548 12492) (9549 12493) (9550 12494) + (9551 12495) (9552 12496) (9553 12497) (9554 12498) (9555 12499) (9556 12500) (9557 12501) (9558 +12502) (9559 12503) (9560 12504) (9561 12505) (9562 12506) (9563 12507) (9564 12508) (9565 12509) ( +9566 12510) (9567 12511) (9568 12512) (9569 12513) (9570 12514) (9571 12515) (9572 12516) (9573 12517) + (9574 12518) (9575 12519) (9576 12520) (9577 12521) (9578 12522) (9579 12523) (9580 12524) (9581 +12525) (9582 12526) (9583 12527) (9584 12528) (9585 12529) (9586 12530) (9587 12531) (9588 12532) ( +9589 12533) (9590 12534) (9591 12535) (9592 12536) (9593 12537) (9594 12538) (9595 12539))] + +[38 ((9762 894) (9763 835) (9764 900) (9765 787) (9766 788) (9767 837) (9769 8158) (9770 8157) (9771 +901) (9772 8159) (9773 8128) (9774 8189) (9775 8175) (9776 1010) (9777 900) (9778 890) (9779 8125) ( +9780 884) (9781 885) (9782 8174) (9783 8173) (9785 8142) (9786 8141) (9787 903) (9788 8143) (9789 8129 +) (9790 8127) (9791 8190) (9792 990) (9793 913) (9794 914) (9796 915) (9797 916) (9798 917) (9799 986) + (9800 988) (9801 918) (9802 919) (9803 920) (9804 921) (9805 922) (9806 923) (9807 924) (9808 925) ( +9809 926) (9810 927) (9811 928) (9812 984) (9813 929) (9814 931) (9816 932) (9817 933) (9818 934) ( +9819 935) (9820 936) (9821 937) (9822 992) (9824 991) (9825 945) (9826 946) (9827 976) (9828 947) ( +9829 948) (9830 949) (9831 987) (9832 989) (9833 950) (9834 951) (9835 952) (9836 953) (9837 954) ( +9838 955) (9839 956) (9840 957) (9841 958) (9842 959) (9843 960) (9844 985) (9845 961) (9846 963) ( +9847 962) (9848 964) (9849 965) (9850 966) (9851 967) (9852 968) (9853 969) (9854 993) (9904 1001) ( +9905 1003) (9906 1005) (9907 1007) (9920 836) (9921 8158) (9922 8142) (9923 8159) (9924 8143) (9925 +769) (9926 768) (9927 834) (9928 8158) (9929 8157) (9930 8142) (9931 8141) (9932 776) (9933 901) (9934 + 8173) (9935 8129) (9936 902) (9937 904) (9938 905) (9939 906) (9940 908) (9941 910) (9942 911) (9943 +938) (9944 939) (9948 994) (9949 996) (9950 998) (9952 979) (9953 980) (9968 940) (9969 941) (9970 942 +) (9971 943) (9972 972) (9973 973) (9974 974) (9975 970) (9976 971) (9977 912) (9978 944) (9979 1011) +(9980 995) (9981 997) (9982 999))] + +[39 ((10017 1040) (10018 1041) (10019 1042) (10020 1043) (10021 1044) (10022 1045) (10023 1025) (10024 + 1046) (10025 1047) (10026 1048) (10027 1049) (10028 1050) (10029 1051) (10030 1052) (10031 1053) ( +10032 1054) (10033 1055) (10034 1056) (10035 1057) (10036 1058) (10037 1059) (10038 1060) (10039 1061) + (10040 1062) (10041 1063) (10042 1064) (10043 1065) (10044 1066) (10045 1067) (10046 1068) (10047 +1069) (10048 1070) (10049 1071) (10050 1168) (10051 1026) (10052 1027) (10053 1028) (10054 1029) ( +10055 1030) (10056 1031) (10057 1032) (10058 1033) (10059 1034) (10060 1035) (10061 1036) (10062 1038) + (10065 1072) (10066 1073) (10067 1074) (10068 1075) (10069 1076) (10070 1077) (10071 1105) (10072 +1078) (10073 1079) (10074 1080) (10075 1081) (10076 1082) (10077 1083) (10078 1084) (10079 1085) ( +10080 1086) (10081 1087) (10082 1088) (10083 1089) (10084 1090) (10085 1091) (10086 1092) (10087 1093) + (10088 1094) (10089 1095) (10090 1096) (10091 1097) (10092 1098) (10093 1099) (10094 1100) (10095 +1101) (10096 1102) (10097 1103) (10098 1169) (10099 1106) (10100 1107) (10101 1108) (10102 1109) ( +10103 1110) (10104 1111) (10105 1112) (10106 1113) (10107 1114) (10108 1115) (10109 1116) (10110 1118) + (10145 1039) (10146 1122) (10147 1138) (10148 1140) (10149 1130) (10150 1306) (10151 1308) (10152 +1198) (10154 1234) (10155 1232) (10156 1236) (10157 1170) (10158 1172) (10160 1238) (10161 1244) ( +10162 1174) (10163 1246) (10164 1176) (10166 1252) (10167 1250) (10168 1178) (10170 1180) (10171 1184) + (10172 1182) (10173 1186) (10174 1188) (10176 1254) (10178 1190) (10179 1194) (10181 1196) (10182 +1204) (10184 1264) (10185 1266) (10187 1262) (10188 1202) (10189 1276) (10190 1268) (10191 1216) ( +10193 1119) (10194 1123) (10195 1139) (10196 1141) (10197 1131) (10198 1307) (10199 1309) (10200 1199) + (10202 1235) (10203 1233) (10204 1237) (10205 1171) (10206 1173) (10208 1239) (10209 1245) (10210 +1175) (10211 1247) (10212 1177) (10214 1253) (10215 1251) (10216 1179) (10218 1181) (10219 1185) ( +10220 1183) (10221 1187) (10222 1189) (10224 1255) (10226 1191) (10227 1195) (10229 1197) (10230 1205) + (10232 1265) (10233 1267) (10235 1263) (10236 1203) (10237 1277) (10238 1269))] + +[40 ((10273 9472) (10274 9474) (10275 9484) (10276 9488) (10277 9496) (10278 9492) (10279 9500) (10280 + 9516) (10281 9508) (10282 9524) (10283 9532) (10284 9473) (10285 9475) (10286 9487) (10287 9491) ( +10288 9499) (10289 9495) (10290 9507) (10291 9523) (10292 9515) (10293 9531) (10294 9547) (10295 9504) + (10296 9519) (10297 9512) (10298 9527) (10299 9535) (10300 9501) (10301 9520) (10302 9509) (10303 +9528) (10304 9538) (10305 9550) (10306 9551) (10307 9545) (10308 9543) (10309 9544) (10310 9546) ( +10311 9548) (10313 9486) (10314 9490) (10315 9498) (10316 9494) (10317 9485) (10318 9489) (10319 9497) + (10320 9569) (10321 9570) (10322 9558) (10323 9557) (10324 9571) (10325 9553) (10326 9559) (10327 +9565) (10328 9564) (10329 9563) (10330 9566) (10331 9567) (10332 9562) (10333 9556) (10334 9577) ( +10335 9574) (10336 9568) (10337 9552) (10338 9580) (10339 9575) (10340 9576) (10341 9572) (10342 9573) + (10343 9561) (10344 9560) (10345 9554) (10346 9555) (10347 9579) (10348 9578) (10363 9493) (10444 +9502) (10445 9503) (10446 9505) (10447 9506) (10448 9476) (10449 9477) (10450 9478) (10451 9479) ( +10452 9480) (10453 9481) (10454 9482) (10455 9483) (10456 9549) (10457 9581) (10458 9582) (10459 9583) + (10460 9584) (10461 9585) (10462 9586) (10463 9608))] + +[41 ((10530 5792) (10532 5794) (10535 5798) (10539 5800) (10546 5809) (10549 5810) (10551 5812) (10554 + 5815) (10555 5813) (10557 5817) (10559 5818) (10560 5819) (10564 5820) (10567 5822) (10570 5823) ( +10571 5825) (10572 5827) (10582 5831) (10585 5832) (10607 5839) (10608 5840) (10610 5842) (10615 5846) + (10616 5847) (10618 5848) (10620 5849) (10622 5850) (10623 5852) (10658 5853) (10659 5855) (10661 +5805) (10662 5806) (10663 5854) (10664 5841) (10665 5829) (10666 5807) (10667 5801) (10669 5873) ( +10671 5802) (10673 5803) (10674 5796) (10677 5795) (10678 5856) (10680 5857) (10721 66352) (10722 +66353) (10723 66354) (10724 66355) (10725 66356) (10726 66357) (10727 66358) (10728 66359) (10729 +66360) (10731 66361) (10732 66362) (10733 66363) (10734 66364) (10735 66365) (10736 66366) (10737 +66367) (10738 66368) (10739 66369) (10740 66370) (10741 66371) (10742 66372) (10743 66373) (10744 +66374) (10745 66375) (10746 66376) (10747 66377) (10748 66378))] + +[42 ((10785 1206) (10786 1227) (10787 1208) (10795 1272) (10798 1240) (10799 1212) (10800 1214) (10801 + 1192) (10803 1200) (10808 1242) (10809 1248) (10810 1219) (10811 1258) (10816 1170) (10817 1256) ( +10818 1217) (10819 1210) (10822 1223) (10827 1142) (10833 1207) (10834 1228) (10835 1209) (10843 1273) + (10846 1241) (10847 1213) (10848 1215) (10849 1193) (10851 1201) (10856 1243) (10857 1249) (10858 +1220) (10859 1259) (10864 1171) (10865 1257) (10866 1218) (10867 1211) (10870 1224) (10875 1143) ( +10914 1146) (10920 1120) (10924 1124) (10927 1126) (10929 1128) (10930 1132) (10931 1134) (10932 1136) + (10934 1152) (10943 1150) (10944 1148) (10951 1144) (10952 1156) (10957 1154) (10962 1147) (10967 +1145) (10968 1121) (10972 1125) (10975 1127) (10977 1129) (10978 1133) (10979 1135) (10980 1137) ( +10982 1153) (10991 1151) (10992 1149) (10999 1155))] + +[46 ((11809 9472) (11810 9135) (11811 9473) (11827 65079) (11828 65080))] + +[47 ((12068 65075) (12070 65073) (12075 8942) (12076 65072) (12077 65077) (12078 65078) (12079 65081) +(12080 65082) (12081 65079) (12082 65080) (12089 65089) (12090 65090) (12091 65091) (12092 65092) ( +12093 65083) (12094 65084) (12096 12353) (12097 12357) (12098 12357) (12099 12359) (12100 12361) ( +12101 12387) (12102 12419) (12103 12421) (12104 12423) (12105 12430) (12106 12449) (12107 12451) ( +12108 12453) (12109 12455) (12110 12457) (12111 12483) (12112 12515) (12113 12517) (12114 12519) ( +12115 12526) (12116 12533) (12117 12534) (12130 12307) (12193 65087) (12194 65088) (12216 65076) ( +12224 12832) (12225 12833) (12226 12834) (12227 12835) (12228 12836) (12229 12837) (12230 12838) ( +12231 12839) (12232 12840) (12233 12841) (12257 12337) (12258 12338) (12264 65085) (12265 65086) ( +12273 12339) (12274 12340) (12275 12341))] + +[48 ((12321 20124) (12322 21782) (12323 23043) (12324 38463) (12325 21696) (12326 24859) (12327 25384) + (12328 23030) (12329 36898) (12330 33909) (12331 33564) (12332 31312) (12333 24746) (12334 25569) ( +12335 28197) (12336 26093) (12337 33894) (12338 33446) (12339 39925) (12340 26771) (12341 22311) ( +12342 26017) (12343 25201) (12344 23451) (12345 22992) (12346 34427) (12347 39156) (12348 32098) ( +12349 32190) (12350 39822) (12351 25110) (12352 31903) (12353 34999) (12354 23433) (12355 24245) ( +12356 25353) (12357 26263) (12358 26696) (12359 38343) (12360 38797) (12361 26447) (12362 20197) ( +12363 20234) (12364 20301) (12365 20381) (12366 20553) (12367 22258) (12368 22839) (12369 22996) ( +12370 23041) (12371 23561) (12372 24799) (12373 24847) (12374 24944) (12375 26131) (12376 26885) ( +12377 28858) (12378 30031) (12379 30064) (12380 31227) (12381 32173) (12382 32239) (12383 32963) ( +12384 33806) (12385 34915) (12386 35586) (12387 36949) (12388 36986) (12389 21307) (12390 20117) ( +12391 20133) (12392 22495) (12393 32946) (12394 37057) (12395 30959) (12396 19968) (12397 22769) ( +12398 28322) (12399 36920) (12400 31282) (12401 33576) (12402 33419) (12403 39983) (12404 20801) ( +12405 21360) (12406 21693) (12407 21729) (12408 22240) (12409 23035) (12410 24341) (12411 39154) ( +12412 28139) (12413 32996) (12414 34093))] + +[49 ((12577 38498) (12578 38512) (12579 38560) (12580 38907) (12581 21515) (12582 21491) (12583 23431) + (12584 28879) (12585 32701) (12586 36802) (12587 38632) (12588 21359) (12589 40284) (12590 31418) ( +12591 19985) (12592 30867) (12593 33276) (12594 28198) (12595 22040) (12596 21764) (12597 27421) ( +12598 34074) (12599 39995) (12600 23013) (12601 21417) (12602 28006) (12603 29916) (12604 38287) ( +12605 22082) (12606 20113) (12607 36939) (12608 38642) (12609 33615) (12610 39180) (12611 21473) ( +12612 21942) (12613 23344) (12614 24433) (12615 26144) (12616 26355) (12617 26628) (12618 27704) ( +12619 27891) (12620 27945) (12621 29787) (12622 30408) (12623 31310) (12624 38964) (12625 33521) ( +12626 34907) (12627 35424) (12628 37613) (12629 28082) (12630 30123) (12631 30410) (12632 39365) ( +12633 24742) (12634 35585) (12635 36234) (12636 38322) (12637 27022) (12638 21421) (12639 20870) ( +12640 22290) (12641 22576) (12642 22852) (12643 23476) (12644 24310) (12645 24616) (12646 25513) ( +12647 25588) (12648 27839) (12649 28436) (12650 28814) (12651 28948) (12652 29017) (12653 29141) ( +12654 29503) (12655 32257) (12656 33398) (12657 33489) (12658 34199) (12659 36960) (12660 37467) ( +12661 40219) (12662 22633) (12663 26044) (12664 27738) (12665 29989) (12666 20985) (12667 22830) ( +12668 22885) (12669 24448) (12670 24540))] + +[50 ((12833 25276) (12834 26106) (12835 27178) (12836 27431) (12837 27572) (12838 29579) (12839 32705) + (12840 35158) (12841 40236) (12842 40206) (12843 40644) (12844 23713) (12845 27798) (12846 33659) ( +12847 20740) (12848 23627) (12849 25014) (12850 33222) (12851 26742) (12852 29281) (12853 20057) ( +12854 20474) (12855 21368) (12856 24681) (12857 28201) (12858 31311) (12859 38899) (12860 19979) ( +12861 21270) (12862 20206) (12863 20309) (12864 20285) (12865 20385) (12866 20339) (12867 21152) ( +12868 21487) (12869 22025) (12870 22799) (12871 23233) (12872 23478) (12873 23521) (12874 31185) ( +12875 26247) (12876 26524) (12877 26550) (12878 27468) (12879 27827) (12880 28779) (12881 29634) ( +12882 31117) (12883 31166) (12884 31292) (12885 31623) (12886 33457) (12887 33499) (12888 33540) ( +12889 33655) (12890 33775) (12891 33747) (12892 34662) (12893 35506) (12894 22057) (12895 36008) ( +12896 36838) (12897 36942) (12898 38686) (12899 34442) (12900 20420) (12901 23784) (12902 25105) ( +12903 29273) (12904 30011) (12905 33253) (12906 33469) (12907 34558) (12908 36032) (12909 38597) ( +12910 39187) (12911 39381) (12912 20171) (12913 20250) (12914 35299) (12915 22238) (12916 22602) ( +12917 22730) (12918 24315) (12919 24555) (12920 24618) (12921 24724) (12922 24674) (12923 25040) ( +12924 25106) (12925 25296) (12926 25913))] + +[51 ((13089 39745) (13090 26214) (13091 26800) (13092 28023) (13093 28784) (13094 30028) (13095 30342) + (13096 32117) (13097 33445) (13098 34809) (13099 38283) (13100 38542) (13101 35997) (13102 20977) ( +13103 21182) (13104 22806) (13105 21683) (13106 23475) (13107 23830) (13108 24936) (13109 27010) ( +13110 28079) (13111 30861) (13112 33995) (13113 34903) (13114 35442) (13115 37799) (13116 39608) ( +13117 28012) (13118 39336) (13119 34521) (13120 22435) (13121 26623) (13122 34510) (13123 37390) ( +13124 21123) (13125 22151) (13126 21508) (13127 24275) (13128 25313) (13129 25785) (13130 26684) ( +13131 26680) (13132 27579) (13133 29554) (13134 30906) (13135 31339) (13136 35226) (13137 35282) ( +13138 36203) (13139 36611) (13140 37101) (13141 38307) (13142 38548) (13143 38761) (13144 23398) ( +13145 23731) (13146 27005) (13147 38989) (13148 38990) (13149 25499) (13150 31520) (13151 27179) ( +13152 27263) (13153 26806) (13154 39949) (13155 28511) (13156 21106) (13157 21917) (13158 24688) ( +13159 25324) (13160 27963) (13161 28167) (13162 28369) (13163 33883) (13164 35088) (13165 36676) ( +13166 19988) (13167 39993) (13168 21494) (13169 26907) (13170 27194) (13171 38788) (13172 26666) ( +13173 20828) (13174 31427) (13175 33970) (13176 37340) (13177 37772) (13178 22107) (13179 40232) ( +13180 26658) (13181 33541) (13182 33841))] + +[52 ((13345 31909) (13346 21000) (13347 33477) (13348 29926) (13349 20094) (13350 20355) (13351 20896) + (13352 23506) (13353 21002) (13354 21208) (13355 21223) (13356 24059) (13357 21914) (13358 22570) ( +13359 23014) (13360 23436) (13361 23448) (13362 23515) (13363 24178) (13364 24185) (13365 24739) ( +13366 24863) (13367 24931) (13368 25022) (13369 25563) (13370 25954) (13371 26577) (13372 26707) ( +13373 26874) (13374 27454) (13375 27475) (13376 27735) (13377 28450) (13378 28567) (13379 28485) ( +13380 29872) (13381 29976) (13382 30435) (13383 30475) (13384 31487) (13385 31649) (13386 31777) ( +13387 32233) (13388 32566) (13389 32752) (13390 32925) (13391 33382) (13392 33694) (13393 35251) ( +13394 35532) (13395 36011) (13396 36996) (13397 37969) (13398 38291) (13399 38289) (13400 38306) ( +13401 38501) (13402 38867) (13403 39208) (13404 33304) (13405 20024) (13406 21547) (13407 23736) ( +13408 24012) (13409 29609) (13410 30284) (13411 30524) (13412 23721) (13413 32747) (13414 36107) ( +13415 38593) (13416 38929) (13417 38996) (13418 39000) (13419 20225) (13420 20238) (13421 21361) ( +13422 21916) (13423 22120) (13424 22522) (13425 22855) (13426 23305) (13427 23492) (13428 23696) ( +13429 24076) (13430 24190) (13431 24524) (13432 25582) (13433 26426) (13434 26071) (13435 26082) ( +13436 26399) (13437 26827) (13438 26820))] + +[53 ((13601 27231) (13602 24112) (13603 27589) (13604 27671) (13605 27773) (13606 30079) (13607 31048) + (13608 23395) (13609 31232) (13610 32000) (13611 24509) (13612 35215) (13613 35352) (13614 36020) ( +13615 36215) (13616 36556) (13617 36637) (13618 39138) (13619 39438) (13620 39740) (13621 20096) ( +13622 20605) (13623 20736) (13624 22931) (13625 23452) (13626 25135) (13627 25216) (13628 25836) ( +13629 27450) (13630 29344) (13631 30097) (13632 31047) (13633 32681) (13634 34811) (13635 35516) ( +13636 35696) (13637 25516) (13638 33738) (13639 38816) (13640 21513) (13641 21507) (13642 21931) ( +13643 26708) (13644 27224) (13645 35440) (13646 30759) (13647 26485) (13648 40653) (13649 21364) ( +13650 23458) (13651 33050) (13652 34384) (13653 36870) (13654 19992) (13655 20037) (13656 20167) ( +13657 20241) (13658 21450) (13659 21560) (13660 23470) (13661 24339) (13662 24613) (13663 25937) ( +13664 26429) (13665 27714) (13666 27762) (13667 27875) (13668 28792) (13669 29699) (13670 31350) ( +13671 31406) (13672 31496) (13673 32026) (13674 31998) (13675 32102) (13676 26087) (13677 29275) ( +13678 21435) (13679 23621) (13680 24040) (13681 25298) (13682 25312) (13683 25369) (13684 28192) ( +13685 34394) (13686 35377) (13687 36317) (13688 37624) (13689 28417) (13690 31142) (13691 39770) ( +13692 20136) (13693 20139) (13694 20140))] + +[54 ((13857 20379) (13858 20384) (13859 20689) (13860 20807) (13861 31478) (13862 20849) (13863 20982) + (13864 21332) (13865 21281) (13866 21375) (13867 21483) (13868 21932) (13869 22659) (13870 23777) ( +13871 24375) (13872 24394) (13873 24623) (13874 24656) (13875 24685) (13876 25375) (13877 25945) ( +13878 27211) (13879 27841) (13880 29378) (13881 29421) (13882 30703) (13883 33016) (13884 33029) ( +13885 33288) (13886 34126) (13887 37111) (13888 37857) (13889 38911) (13890 39255) (13891 39514) ( +13892 20208) (13893 20957) (13894 23597) (13895 26241) (13896 26989) (13897 23616) (13898 26354) ( +13899 26997) (13900 29577) (13901 26704) (13902 31873) (13903 20677) (13904 21220) (13905 22343) ( +13906 24062) (13907 37670) (13908 26020) (13909 27427) (13910 27453) (13911 29748) (13912 31105) ( +13913 31165) (13914 31563) (13915 32202) (13916 33465) (13917 33740) (13918 34943) (13919 35167) ( +13920 35641) (13921 36817) (13922 37329) (13923 21535) (13924 37504) (13925 20061) (13926 20534) ( +13927 21477) (13928 21306) (13929 29399) (13930 29590) (13931 30697) (13932 33510) (13933 36527) ( +13934 39366) (13935 39368) (13936 39378) (13937 20855) (13938 24858) (13939 34398) (13940 21936) ( +13941 31354) (13942 20598) (13943 23507) (13944 36935) (13945 38533) (13946 20018) (13947 27355) ( +13948 37351) (13949 23633) (13950 23624))] + +[55 ((14113 25496) (14114 31391) (14115 27795) (14116 38772) (14117 36705) (14118 31402) (14119 29066) + (14120 38536) (14121 31874) (14122 26647) (14123 32368) (14124 26705) (14125 37740) (14126 21234) ( +14127 21531) (14128 34219) (14129 35347) (14130 32676) (14131 36557) (14132 37089) (14133 21350) ( +14134 34952) (14135 31041) (14136 20418) (14137 20670) (14138 21009) (14139 20804) (14140 21843) ( +14141 22317) (14142 29674) (14143 22411) (14144 22865) (14145 24418) (14146 24452) (14147 24693) ( +14148 24950) (14149 24935) (14150 25001) (14151 25522) (14152 25658) (14153 25964) (14154 26223) ( +14155 26690) (14156 28179) (14157 30054) (14158 31293) (14159 31995) (14160 32076) (14161 32153) ( +14162 32331) (14163 32619) (14164 33550) (14165 33610) (14166 34509) (14167 35336) (14168 35427) ( +14169 35686) (14170 36605) (14171 38938) (14172 40335) (14173 33464) (14174 36814) (14175 39912) ( +14176 21127) (14177 25119) (14178 25731) (14179 28608) (14180 38553) (14181 26689) (14182 20625) ( +14183 27424) (14184 27770) (14185 28500) (14186 31348) (14187 32080) (14188 34880) (14189 35363) ( +14190 26376) (14191 20214) (14192 20537) (14193 20518) (14194 20581) (14195 20860) (14196 21048) ( +14197 21091) (14198 21927) (14199 22287) (14200 22533) (14201 23244) (14202 24314) (14203 25010) ( +14204 25080) (14205 25331) (14206 25458))] + +[56 ((14369 26908) (14370 27177) (14371 29309) (14372 29356) (14373 29486) (14374 30740) (14375 30831) + (14376 32121) (14377 30476) (14378 32937) (14379 35211) (14380 35609) (14381 36066) (14382 36562) ( +14383 36963) (14384 37749) (14385 38522) (14386 38997) (14387 39443) (14388 40568) (14389 20803) ( +14390 21407) (14391 21427) (14392 24187) (14393 24358) (14394 28187) (14395 28304) (14396 29572) ( +14397 29694) (14398 32067) (14399 33335) (14400 35328) (14401 35578) (14402 38480) (14403 20046) ( +14404 20491) (14405 21476) (14406 21628) (14407 22266) (14408 22993) (14409 23396) (14410 24049) ( +14411 24235) (14412 24359) (14413 25144) (14414 25925) (14415 26543) (14416 28246) (14417 29392) ( +14418 31946) (14419 34996) (14420 32929) (14421 32993) (14422 33776) (14423 34382) (14424 35463) ( +14425 36328) (14426 37431) (14427 38599) (14428 39015) (14429 40723) (14430 20116) (14431 20114) ( +14432 20237) (14433 21320) (14434 21577) (14435 21566) (14436 23087) (14437 24460) (14438 24481) ( +14439 24735) (14440 26791) (14441 27278) (14442 29786) (14443 30849) (14444 35486) (14445 35492) ( +14446 35703) (14447 37264) (14448 20062) (14449 39881) (14450 20132) (14451 20348) (14452 20399) ( +14453 20505) (14454 20502) (14455 20809) (14456 20844) (14457 21151) (14458 21177) (14459 21246) ( +14460 21402) (14461 21475) (14462 21521))] + +[57 ((14625 21518) (14626 21897) (14627 22353) (14628 22434) (14629 22909) (14630 23380) (14631 23389) + (14632 23439) (14633 24037) (14634 24039) (14635 24055) (14636 24184) (14637 24195) (14638 24218) ( +14639 24247) (14640 24344) (14641 24658) (14642 24908) (14643 25239) (14644 25304) (14645 25511) ( +14646 25915) (14647 26114) (14648 26179) (14649 26356) (14650 26477) (14651 26657) (14652 26775) ( +14653 27083) (14654 27743) (14655 27946) (14656 28009) (14657 28207) (14658 28317) (14659 30002) ( +14660 30343) (14661 30828) (14662 31295) (14663 31968) (14664 32005) (14665 32024) (14666 32094) ( +14667 32177) (14668 32789) (14669 32771) (14670 32943) (14671 32945) (14672 33108) (14673 33167) ( +14674 33322) (14675 33618) (14676 34892) (14677 34913) (14678 35611) (14679 36002) (14680 36092) ( +14681 37066) (14682 37237) (14683 37489) (14684 30783) (14685 37628) (14686 38308) (14687 38477) ( +14688 38917) (14689 39321) (14690 39640) (14691 40251) (14692 21083) (14693 21163) (14694 21495) ( +14695 21512) (14696 22741) (14697 25335) (14698 28640) (14699 35946) (14700 36703) (14701 40633) ( +14702 20811) (14703 21051) (14704 21578) (14705 22269) (14706 31296) (14707 37239) (14708 40288) ( +14709 40658) (14710 29508) (14711 28425) (14712 33136) (14713 29969) (14714 24573) (14715 24794) ( +14716 39592) (14717 29403) (14718 36796))] + +[58 ((14881 27492) (14882 38915) (14883 20170) (14884 22256) (14885 22372) (14886 22718) (14887 23130) + (14888 24680) (14889 25031) (14890 26127) (14891 26118) (14892 26681) (14893 26801) (14894 28151) ( +14895 30165) (14896 32058) (14897 33390) (14898 39746) (14899 20123) (14900 20304) (14901 21449) ( +14902 21766) (14903 23919) (14904 24038) (14905 24046) (14906 26619) (14907 27801) (14908 29811) ( +14909 30722) (14910 35408) (14911 37782) (14912 35039) (14913 22352) (14914 24231) (14915 25387) ( +14916 20661) (14917 20652) (14918 20877) (14919 26368) (14920 21705) (14921 22622) (14922 22971) ( +14923 23472) (14924 24425) (14925 25165) (14926 25505) (14927 26685) (14928 27507) (14929 28168) ( +14930 28797) (14931 37319) (14932 29312) (14933 30741) (14934 30758) (14935 31085) (14936 25998) ( +14937 32048) (14938 33756) (14939 35009) (14940 36617) (14941 38555) (14942 21092) (14943 22312) ( +14944 26448) (14945 32618) (14946 36001) (14947 20916) (14948 22338) (14949 38442) (14950 22586) ( +14951 27018) (14952 32948) (14953 21682) (14954 23822) (14955 22524) (14956 30869) (14957 40442) ( +14958 20316) (14959 21066) (14960 21643) (14961 25662) (14962 26152) (14963 26388) (14964 26613) ( +14965 31364) (14966 31574) (14967 32034) (14968 37679) (14969 26716) (14970 39853) (14971 31545) ( +14972 21273) (14973 20874) (14974 21047))] + +[59 ((15137 23519) (15138 25334) (15139 25774) (15140 25830) (15141 26413) (15142 27578) (15143 34217) + (15144 38609) (15145 30352) (15146 39894) (15147 25420) (15148 37638) (15149 39851) (15150 30399) ( +15151 26194) (15152 19977) (15153 20632) (15154 21442) (15155 23665) (15156 24808) (15157 25746) ( +15158 25955) (15159 26719) (15160 29158) (15161 29642) (15162 29987) (15163 31639) (15164 32386) ( +15165 34453) (15166 35715) (15167 36059) (15168 37240) (15169 39184) (15170 26028) (15171 26283) ( +15172 27531) (15173 20181) (15174 20180) (15175 20282) (15176 20351) (15177 21050) (15178 21496) ( +15179 21490) (15180 21987) (15181 22235) (15182 22763) (15183 22987) (15184 22985) (15185 23039) ( +15186 23376) (15187 23629) (15188 24066) (15189 24107) (15190 24535) (15191 24605) (15192 25351) ( +15193 25903) (15194 23388) (15195 26031) (15196 26045) (15197 26088) (15198 26525) (15199 27490) ( +15200 27515) (15201 27663) (15202 29509) (15203 31049) (15204 31169) (15205 31992) (15206 32025) ( +15207 32043) (15208 32930) (15209 33026) (15210 33267) (15211 35222) (15212 35422) (15213 35433) ( +15214 35430) (15215 35468) (15216 35566) (15217 36039) (15218 36060) (15219 38604) (15220 39164) ( +15221 27503) (15222 20107) (15223 20284) (15224 20365) (15225 20816) (15226 23383) (15227 23546) ( +15228 24904) (15229 25345) (15230 26178))] + +[60 ((15393 27425) (15394 28363) (15395 27835) (15396 29246) (15397 29885) (15398 30164) (15399 30913) + (15400 31034) (15401 32780) (15402 32819) (15403 33258) (15404 33940) (15405 36766) (15406 27728) ( +15407 40575) (15408 24335) (15409 35672) (15410 40235) (15411 31482) (15412 36600) (15413 23437) ( +15414 38635) (15415 19971) (15416 21489) (15417 22519) (15418 22833) (15419 23241) (15420 23460) ( +15421 24713) (15422 28287) (15423 28422) (15424 30142) (15425 36074) (15426 23455) (15427 34048) ( +15428 31712) (15429 20594) (15430 26612) (15431 33437) (15432 23649) (15433 34122) (15434 32286) ( +15435 33294) (15436 20889) (15437 23556) (15438 25448) (15439 36198) (15440 26012) (15441 29038) ( +15442 31038) (15443 32023) (15444 32773) (15445 35613) (15446 36554) (15447 36974) (15448 34503) ( +15449 37034) (15450 20511) (15451 21242) (15452 23610) (15453 26451) (15454 28796) (15455 29237) ( +15456 37196) (15457 37320) (15458 37675) (15459 33509) (15460 23490) (15461 24369) (15462 24825) ( +15463 20027) (15464 21462) (15465 23432) (15466 25163) (15467 26417) (15468 27530) (15469 29417) ( +15470 29664) (15471 31278) (15472 33131) (15473 36259) (15474 37202) (15475 39318) (15476 20754) ( +15477 21463) (15478 21610) (15479 23551) (15480 25480) (15481 27193) (15482 32172) (15483 38656) ( +15484 22234) (15485 21454) (15486 21608))] + +[61 ((15649 23447) (15650 23601) (15651 24030) (15652 20462) (15653 24833) (15654 25342) (15655 27954) + (15656 31168) (15657 31179) (15658 32066) (15659 32333) (15660 32722) (15661 33261) (15662 33311) ( +15663 33936) (15664 34886) (15665 35186) (15666 35728) (15667 36468) (15668 36655) (15669 36913) ( +15670 37195) (15671 37228) (15672 38598) (15673 37276) (15674 20160) (15675 20303) (15676 20805) ( +15677 21313) (15678 24467) (15679 25102) (15680 26580) (15681 27713) (15682 28171) (15683 29539) ( +15684 32294) (15685 37325) (15686 37507) (15687 21460) (15688 22809) (15689 23487) (15690 28113) ( +15691 31069) (15692 32302) (15693 31899) (15694 22654) (15695 29087) (15696 20986) (15697 34899) ( +15698 36848) (15699 20426) (15700 23803) (15701 26149) (15702 30636) (15703 31459) (15704 33308) ( +15705 39423) (15706 20934) (15707 24490) (15708 26092) (15709 26991) (15710 27529) (15711 28147) ( +15712 28310) (15713 28516) (15714 30462) (15715 32020) (15716 24033) (15717 36981) (15718 37255) ( +15719 38918) (15720 20966) (15721 21021) (15722 25152) (15723 26257) (15724 26329) (15725 28186) ( +15726 24246) (15727 32210) (15728 32626) (15729 26360) (15730 34223) (15731 34295) (15732 35576) ( +15733 21161) (15734 21465) (15735 22899) (15736 24207) (15737 24464) (15738 24661) (15739 37604) ( +15740 38500) (15741 20663) (15742 20767))] + +[62 ((15905 21213) (15906 21280) (15907 21319) (15908 21484) (15909 21736) (15910 21830) (15911 21809) + (15912 22039) (15913 22888) (15914 22974) (15915 23100) (15916 23477) (15917 23558) (15918 23567) ( +15919 23569) (15920 23578) (15921 24196) (15922 24202) (15923 24288) (15924 24432) (15925 25215) ( +15926 25220) (15927 25307) (15928 25484) (15929 25463) (15930 26119) (15931 26124) (15932 26157) ( +15933 26230) (15934 26494) (15935 26786) (15936 27167) (15937 27189) (15938 27836) (15939 28040) ( +15940 28169) (15941 28248) (15942 28988) (15943 28966) (15944 29031) (15945 30151) (15946 30465) ( +15947 30813) (15948 30977) (15949 31077) (15950 31216) (15951 31456) (15952 31505) (15953 31911) ( +15954 32057) (15955 32918) (15956 33750) (15957 33931) (15958 34121) (15959 34909) (15960 35059) ( +15961 35359) (15962 35388) (15963 35412) (15964 35443) (15965 35937) (15966 36062) (15967 37284) ( +15968 37478) (15969 37758) (15970 37912) (15971 38556) (15972 38808) (15973 19978) (15974 19976) ( +15975 19998) (15976 20055) (15977 20887) (15978 21104) (15979 22478) (15980 22580) (15981 22732) ( +15982 23330) (15983 24120) (15984 24773) (15985 25854) (15986 26465) (15987 26454) (15988 27972) ( +15989 29366) (15990 30067) (15991 31331) (15992 33976) (15993 35698) (15994 37304) (15995 37664) ( +15996 22065) (15997 22516) (15998 39166))] + +[63 ((16161 25325) (16162 26893) (16163 27542) (16164 29165) (16165 32340) (16166 32887) (16167 33394) + (16168 35302) (16169 39135) (16170 34645) (16171 36785) (16172 23611) (16173 20280) (16174 20449) ( +16175 20405) (16176 21767) (16177 23072) (16178 23517) (16179 23529) (16180 24515) (16181 24910) ( +16182 25391) (16183 26032) (16184 26187) (16185 26862) (16186 27035) (16187 28024) (16188 28145) ( +16189 30003) (16190 30137) (16191 30495) (16192 31070) (16193 31206) (16194 32051) (16195 33251) ( +16196 33455) (16197 34218) (16198 35242) (16199 35386) (16200 36523) (16201 36763) (16202 36914) ( +16203 37341) (16204 38663) (16205 20154) (16206 20161) (16207 20995) (16208 22645) (16209 22764) ( +16210 23563) (16211 29978) (16212 23613) (16213 33102) (16214 35338) (16215 36805) (16216 38499) ( +16217 38765) (16218 31525) (16219 35535) (16220 38920) (16221 37218) (16222 22259) (16223 21416) ( +16224 36887) (16225 21561) (16226 22402) (16227 24101) (16228 25512) (16229 27700) (16230 28810) ( +16231 30561) (16232 31883) (16233 32736) (16234 34928) (16235 36930) (16236 37204) (16237 37648) ( +16238 37656) (16239 38543) (16240 29790) (16241 39620) (16242 23815) (16243 23913) (16244 25968) ( +16245 26530) (16246 36264) (16247 38619) (16248 25454) (16249 26441) (16250 26905) (16251 33733) ( +16252 38935) (16253 38592) (16254 35070))] + +[64 ((16417 28548) (16418 25722) (16419 23544) (16420 19990) (16421 28716) (16422 30045) (16423 26159) + (16424 20932) (16425 21046) (16426 21218) (16427 22995) (16428 24449) (16429 24615) (16430 25104) ( +16431 25919) (16432 25972) (16433 26143) (16434 26228) (16435 26866) (16436 26646) (16437 27491) ( +16438 28165) (16439 29298) (16440 29983) (16441 30427) (16442 31934) (16443 32854) (16444 22768) ( +16445 35069) (16446 35199) (16447 35488) (16448 35475) (16449 35531) (16450 36893) (16451 37266) ( +16452 38738) (16453 38745) (16454 25993) (16455 31246) (16456 33030) (16457 38587) (16458 24109) ( +16459 24796) (16460 25114) (16461 26021) (16462 26132) (16463 26512) (16464 30707) (16465 31309) ( +16466 31821) (16467 32318) (16468 33034) (16469 36012) (16470 36196) (16471 36321) (16472 36447) ( +16473 30889) (16474 20999) (16475 25305) (16476 25509) (16477 25666) (16478 25240) (16479 35373) ( +16480 31363) (16481 31680) (16482 35500) (16483 38634) (16484 32118) (16485 33292) (16486 34633) ( +16487 20185) (16488 20808) (16489 21315) (16490 21344) (16491 23459) (16492 23554) (16493 23574) ( +16494 24029) (16495 25126) (16496 25159) (16497 25776) (16498 26643) (16499 26676) (16500 27849) ( +16501 27973) (16502 27927) (16503 26579) (16504 28508) (16505 29006) (16506 29053) (16507 26059) ( +16508 31359) (16509 31661) (16510 32218))] + +[65 ((16673 32330) (16674 32680) (16675 33146) (16676 33307) (16677 33337) (16678 34214) (16679 35438) + (16680 36046) (16681 36341) (16682 36984) (16683 36983) (16684 37549) (16685 37521) (16686 38275) ( +16687 39854) (16688 21069) (16689 21892) (16690 28472) (16691 28982) (16692 20840) (16693 31109) ( +16694 32341) (16695 33203) (16696 31950) (16697 22092) (16698 22609) (16699 23720) (16700 25514) ( +16701 26366) (16702 26365) (16703 26970) (16704 29401) (16705 30095) (16706 30094) (16707 30990) ( +16708 31062) (16709 31199) (16710 31895) (16711 32032) (16712 32068) (16713 34311) (16714 35380) ( +16715 38459) (16716 36961) (16717 40736) (16718 20711) (16719 21109) (16720 21452) (16721 21474) ( +16722 20489) (16723 21930) (16724 22766) (16725 22863) (16726 29245) (16727 23435) (16728 23652) ( +16729 21277) (16730 24803) (16731 24819) (16732 25436) (16733 25475) (16734 25407) (16735 25531) ( +16736 25805) (16737 26089) (16738 26361) (16739 24035) (16740 27085) (16741 27133) (16742 28437) ( +16743 29157) (16744 20105) (16745 30185) (16746 30456) (16747 31379) (16748 31967) (16749 32207) ( +16750 32156) (16751 32865) (16752 33609) (16753 33624) (16754 33900) (16755 33980) (16756 34299) ( +16757 35013) (16758 36208) (16759 36865) (16760 36973) (16761 37783) (16762 38684) (16763 39442) ( +16764 20687) (16765 22679) (16766 24974))] + +[66 ((16929 33235) (16930 34101) (16931 36104) (16932 36896) (16933 20419) (16934 20596) (16935 21063) + (16936 21363) (16937 24687) (16938 25417) (16939 26463) (16940 28204) (16941 36275) (16942 36895) ( +16943 20439) (16944 23646) (16945 36042) (16946 26063) (16947 32154) (16948 21330) (16949 34966) ( +16950 20854) (16951 25539) (16952 23384) (16953 23403) (16954 23562) (16955 25613) (16956 26449) ( +16957 36956) (16958 20182) (16959 22810) (16960 22826) (16961 27760) (16962 35409) (16963 21822) ( +16964 22549) (16965 22949) (16966 24816) (16967 25171) (16968 26561) (16969 33333) (16970 26965) ( +16971 38464) (16972 39364) (16973 39464) (16974 20307) (16975 22534) (16976 23550) (16977 32784) ( +16978 23729) (16979 24111) (16980 24453) (16981 24608) (16982 24907) (16983 25140) (16984 26367) ( +16985 27888) (16986 28382) (16987 32974) (16988 33151) (16989 33492) (16990 34955) (16991 36024) ( +16992 36864) (16993 36910) (16994 38538) (16995 40667) (16996 39899) (16997 20195) (16998 21488) ( +16999 22823) (17000 31532) (17001 37261) (17002 38988) (17003 40441) (17004 28381) (17005 28711) ( +17006 21331) (17007 21828) (17008 23429) (17009 25176) (17010 25246) (17011 25299) (17012 27810) ( +17013 28655) (17014 29730) (17015 35351) (17016 37944) (17017 28609) (17018 35582) (17019 33592) ( +17020 20967) (17021 34552) (17022 21482))] + +[67 ((17185 21481) (17186 20294) (17187 36948) (17188 36784) (17189 22890) (17190 33073) (17191 24061) + (17192 31466) (17193 36799) (17194 26842) (17195 35895) (17196 29432) (17197 40008) (17198 27197) ( +17199 35504) (17200 20025) (17201 21336) (17202 22022) (17203 22374) (17204 25285) (17205 25506) ( +17206 26086) (17207 27470) (17208 28129) (17209 28251) (17210 28845) (17211 30701) (17212 31471) ( +17213 31658) (17214 32187) (17215 32829) (17216 32966) (17217 34507) (17218 35477) (17219 37723) ( +17220 22243) (17221 22727) (17222 24382) (17223 26029) (17224 26262) (17225 27264) (17226 27573) ( +17227 30007) (17228 35527) (17229 20516) (17230 30693) (17231 22320) (17232 24347) (17233 24677) ( +17234 26234) (17235 27744) (17236 30196) (17237 31258) (17238 32622) (17239 33268) (17240 34584) ( +17241 36933) (17242 39347) (17243 31689) (17244 30044) (17245 31481) (17246 31569) (17247 33988) ( +17248 36880) (17249 31209) (17250 31378) (17251 33590) (17252 23265) (17253 30528) (17254 20013) ( +17255 20210) (17256 23449) (17257 24544) (17258 25277) (17259 26172) (17260 26609) (17261 27880) ( +17262 34411) (17263 34935) (17264 35387) (17265 37198) (17266 37619) (17267 39376) (17268 27159) ( +17269 28710) (17270 29482) (17271 33511) (17272 33879) (17273 36015) (17274 19969) (17275 20806) ( +17276 20939) (17277 21899) (17278 23541))] + +[68 ((17441 24086) (17442 24115) (17443 24193) (17444 24340) (17445 24373) (17446 24427) (17447 24500) + (17448 25074) (17449 25361) (17450 26274) (17451 26397) (17452 28526) (17453 29266) (17454 30010) ( +17455 30522) (17456 32884) (17457 33081) (17458 33144) (17459 34678) (17460 35519) (17461 35548) ( +17462 36229) (17463 36339) (17464 37530) (17465 38263) (17466 38914) (17467 40165) (17468 21189) ( +17469 25431) (17470 30452) (17471 26389) (17472 27784) (17473 29645) (17474 36035) (17475 37806) ( +17476 38515) (17477 27941) (17478 22684) (17479 26894) (17480 27084) (17481 36861) (17482 37786) ( +17483 30171) (17484 36890) (17485 22618) (17486 26626) (17487 25524) (17488 27131) (17489 20291) ( +17490 28460) (17491 26584) (17492 36795) (17493 34086) (17494 32180) (17495 37716) (17496 26943) ( +17497 28528) (17498 22378) (17499 22775) (17500 23340) (17501 32044) (17502 29226) (17503 21514) ( +17504 37347) (17505 40372) (17506 20141) (17507 20302) (17508 20572) (17509 20597) (17510 21059) ( +17511 35998) (17512 21576) (17513 22564) (17514 23450) (17515 24093) (17516 24213) (17517 24237) ( +17518 24311) (17519 24351) (17520 24716) (17521 25269) (17522 25402) (17523 25552) (17524 26799) ( +17525 27712) (17526 30855) (17527 31118) (17528 31243) (17529 32224) (17530 33351) (17531 35330) ( +17532 35558) (17533 36420) (17534 36883))] + +[69 ((17697 37048) (17698 37165) (17699 37336) (17700 40718) (17701 27877) (17702 25688) (17703 25826) + (17704 25973) (17705 28404) (17706 30340) (17707 31515) (17708 36969) (17709 37841) (17710 28346) ( +17711 21746) (17712 24505) (17713 25764) (17714 36685) (17715 36845) (17716 37444) (17717 20856) ( +17718 22635) (17719 22825) (17720 23637) (17721 24215) (17722 28155) (17723 32399) (17724 29980) ( +17725 36028) (17726 36578) (17727 39003) (17728 28857) (17729 20253) (17730 27583) (17731 28593) ( +17732 30000) (17733 38651) (17734 20814) (17735 21520) (17736 22581) (17737 22615) (17738 22956) ( +17739 23648) (17740 24466) (17741 26007) (17742 26460) (17743 28193) (17744 30331) (17745 33759) ( +17746 36077) (17747 36884) (17748 37117) (17749 37709) (17750 30757) (17751 30778) (17752 21162) ( +17753 24230) (17754 22303) (17755 22900) (17756 24594) (17757 20498) (17758 20826) (17759 20908) ( +17760 20941) (17761 20992) (17762 21776) (17763 22612) (17764 22616) (17765 22871) (17766 23445) ( +17767 23798) (17768 23947) (17769 24764) (17770 25237) (17771 25645) (17772 26481) (17773 26691) ( +17774 26812) (17775 26847) (17776 30423) (17777 28120) (17778 28271) (17779 28059) (17780 28783) ( +17781 29128) (17782 24403) (17783 30168) (17784 31095) (17785 31561) (17786 31572) (17787 31570) ( +17788 31958) (17789 32113) (17790 21040))] + +[70 ((17953 33891) (17954 34153) (17955 34276) (17956 35342) (17957 35588) (17958 35910) (17959 36367) + (17960 36867) (17961 36879) (17962 37913) (17963 38518) (17964 38957) (17965 39472) (17966 38360) ( +17967 20685) (17968 21205) (17969 21516) (17970 22530) (17971 23566) (17972 24999) (17973 25758) ( +17974 27934) (17975 30643) (17976 31461) (17977 33012) (17978 33796) (17979 36947) (17980 37509) ( +17981 23776) (17982 40199) (17983 21311) (17984 24471) (17985 24499) (17986 28060) (17987 29305) ( +17988 30563) (17989 31167) (17990 31716) (17991 27602) (17992 29420) (17993 35501) (17994 26627) ( +17995 27233) (17996 20984) (17997 31361) (17998 26932) (17999 23626) (18000 40182) (18001 33515) ( +18002 23493) (18003 37193) (18004 28702) (18005 22136) (18006 23663) (18007 24775) (18008 25958) ( +18009 27788) (18010 35930) (18011 36929) (18012 38931) (18013 21585) (18014 26311) (18015 37389) ( +18016 22856) (18017 37027) (18018 20869) (18019 20045) (18020 20970) (18021 34201) (18022 35598) ( +18023 28760) (18024 25466) (18025 37707) (18026 26978) (18027 39348) (18028 32260) (18029 30071) ( +18030 21335) (18031 26976) (18032 36575) (18033 38627) (18034 27741) (18035 20108) (18036 23612) ( +18037 24336) (18038 36841) (18039 21250) (18040 36049) (18041 32905) (18042 34425) (18043 24319) ( +18044 26085) (18045 20083) (18046 20837))] + +[71 ((18209 22914) (18210 23615) (18211 38894) (18212 20219) (18213 22922) (18214 24525) (18215 35469) + (18216 28641) (18217 31152) (18218 31074) (18219 23527) (18220 33905) (18221 29483) (18222 29105) ( +18223 24180) (18224 24565) (18225 25467) (18226 25754) (18227 29123) (18228 31896) (18229 20035) ( +18230 24316) (18231 20043) (18232 22492) (18233 22178) (18234 24745) (18235 28611) (18236 32013) ( +18237 33021) (18238 33075) (18239 33215) (18240 36786) (18241 35223) (18242 34468) (18243 24052) ( +18244 25226) (18245 25773) (18246 35207) (18247 26487) (18248 27874) (18249 27966) (18250 29750) ( +18251 30772) (18252 23110) (18253 32629) (18254 33453) (18255 39340) (18256 20467) (18257 24259) ( +18258 25309) (18259 25490) (18260 25943) (18261 26479) (18262 30403) (18263 29260) (18264 32972) ( +18265 32954) (18266 36649) (18267 37197) (18268 20493) (18269 22521) (18270 23186) (18271 26757) ( +18272 26995) (18273 29028) (18274 29437) (18275 36023) (18276 22770) (18277 36064) (18278 38506) ( +18279 36889) (18280 34687) (18281 31204) (18282 30695) (18283 33833) (18284 20271) (18285 21093) ( +18286 21338) (18287 25293) (18288 26575) (18289 27850) (18290 30333) (18291 31636) (18292 31893) ( +18293 33334) (18294 34180) (18295 36843) (18296 26333) (18297 28448) (18298 29190) (18299 32283) ( +18300 33707) (18301 39361) (18302 40614))] + +[72 ((18465 20989) (18466 31665) (18467 30834) (18468 31672) (18469 32903) (18470 31560) (18471 27368) + (18472 24161) (18473 32908) (18474 30033) (18475 30048) (18476 20843) (18477 37474) (18478 28300) ( +18479 30330) (18480 37271) (18481 39658) (18482 20240) (18483 32624) (18484 25244) (18485 31567) ( +18486 38309) (18487 40169) (18488 22138) (18489 22617) (18490 34532) (18491 38588) (18492 20276) ( +18493 21028) (18494 21322) (18495 21453) (18496 21467) (18497 24070) (18498 25644) (18499 26001) ( +18500 26495) (18501 27710) (18502 27726) (18503 29256) (18504 29359) (18505 29677) (18506 30036) ( +18507 32321) (18508 33324) (18509 34281) (18510 36009) (18511 31684) (18512 37318) (18513 29033) ( +18514 38930) (18515 39151) (18516 25405) (18517 26217) (18518 30058) (18519 30436) (18520 30928) ( +18521 34115) (18522 34542) (18523 21290) (18524 21329) (18525 21542) (18526 22915) (18527 24199) ( +18528 24444) (18529 24754) (18530 25161) (18531 25209) (18532 25259) (18533 26000) (18534 27604) ( +18535 27852) (18536 30130) (18537 30382) (18538 30865) (18539 31192) (18540 32203) (18541 32631) ( +18542 32933) (18543 34987) (18544 35513) (18545 36027) (18546 36991) (18547 38750) (18548 39131) ( +18549 27147) (18550 31800) (18551 20633) (18552 23614) (18553 24494) (18554 26503) (18555 27608) ( +18556 29749) (18557 30473) (18558 32654))] + +[73 ((18721 40763) (18722 26570) (18723 31255) (18724 21305) (18725 30091) (18726 39661) (18727 24422) + (18728 33181) (18729 33777) (18730 32920) (18731 24380) (18732 24517) (18733 30050) (18734 31558) ( +18735 36924) (18736 26727) (18737 23019) (18738 23195) (18739 32016) (18740 30334) (18741 35628) ( +18742 20469) (18743 24426) (18744 27161) (18745 27703) (18746 28418) (18747 29922) (18748 31080) ( +18749 34920) (18750 35413) (18751 35961) (18752 24287) (18753 25551) (18754 30149) (18755 31186) ( +18756 33495) (18757 37672) (18758 37618) (18759 33948) (18760 34541) (18761 39981) (18762 21697) ( +18763 24428) (18764 25996) (18765 27996) (18766 28693) (18767 36007) (18768 36051) (18769 38971) ( +18770 25935) (18771 29942) (18772 19981) (18773 20184) (18774 22496) (18775 22827) (18776 23142) ( +18777 23500) (18778 20904) (18779 24067) (18780 24220) (18781 24598) (18782 25206) (18783 25975) ( +18784 26023) (18785 26222) (18786 28014) (18787 29238) (18788 31526) (18789 33104) (18790 33178) ( +18791 33433) (18792 35676) (18793 36000) (18794 36070) (18795 36212) (18796 38428) (18797 38468) ( +18798 20398) (18799 25771) (18800 27494) (18801 33310) (18802 33889) (18803 34154) (18804 37096) ( +18805 23553) (18806 26963) (18807 39080) (18808 33914) (18809 34135) (18810 20239) (18811 21103) ( +18812 24489) (18813 24133) (18814 26381))] + +[74 ((18977 31119) (18978 33145) (18979 35079) (18980 35206) (18981 28149) (18982 24343) (18983 25173) + (18984 27832) (18985 20175) (18986 29289) (18987 39826) (18988 20998) (18989 21563) (18990 22132) ( +18991 22707) (18992 24996) (18993 25198) (18994 28954) (18995 22894) (18996 31881) (18997 31966) ( +18998 32027) (18999 38640) (19000 25991) (19001 32862) (19002 19993) (19003 20341) (19004 20853) ( +19005 22592) (19006 24163) (19007 24179) (19008 24330) (19009 26564) (19010 20006) (19011 34109) ( +19012 38281) (19013 38491) (19014 31859) (19015 38913) (19016 20731) (19017 22721) (19018 30294) ( +19019 30887) (19020 21029) (19021 30629) (19022 34065) (19023 31622) (19024 20559) (19025 22793) ( +19026 29255) (19027 31687) (19028 32232) (19029 36794) (19030 36820) (19031 36941) (19032 20415) ( +19033 21193) (19034 23081) (19035 24321) (19036 38829) (19037 20445) (19038 33303) (19039 37610) ( +19040 22275) (19041 25429) (19042 27497) (19043 29995) (19044 35036) (19045 36628) (19046 31298) ( +19047 21215) (19048 22675) (19049 24917) (19050 25098) (19051 26286) (19052 27597) (19053 31807) ( +19054 33769) (19055 20515) (19056 20472) (19057 21253) (19058 21574) (19059 22577) (19060 22857) ( +19061 23453) (19062 23792) (19063 23791) (19064 23849) (19065 24214) (19066 25265) (19067 25447) ( +19068 25918) (19069 26041) (19070 26379))] + +[75 ((19233 27861) (19234 27873) (19235 28921) (19236 30770) (19237 32299) (19238 32990) (19239 33459) + (19240 33804) (19241 34028) (19242 34562) (19243 35090) (19244 35370) (19245 35914) (19246 37030) ( +19247 37586) (19248 39165) (19249 40179) (19250 40300) (19251 20047) (19252 20129) (19253 20621) ( +19254 21078) (19255 22346) (19256 22952) (19257 24125) (19258 24536) (19259 24537) (19260 25151) ( +19261 26292) (19262 26395) (19263 26576) (19264 26834) (19265 20882) (19266 32033) (19267 32938) ( +19268 33192) (19269 35584) (19270 35980) (19271 36031) (19272 37502) (19273 38450) (19274 21536) ( +19275 38956) (19276 21271) (19277 20693) (19278 21340) (19279 22696) (19280 25778) (19281 26420) ( +19282 29287) (19283 30566) (19284 31302) (19285 37350) (19286 21187) (19287 27809) (19288 27526) ( +19289 22528) (19290 24140) (19291 22868) (19292 26412) (19293 32763) (19294 20961) (19295 30406) ( +19296 25705) (19297 30952) (19298 39764) (19299 40635) (19300 22475) (19301 22969) (19302 26151) ( +19303 26522) (19304 27598) (19305 21737) (19306 27097) (19307 24149) (19308 33180) (19309 26517) ( +19310 39850) (19311 26622) (19312 40018) (19313 26717) (19314 20134) (19315 20451) (19316 21448) ( +19317 25273) (19318 26411) (19319 27819) (19320 36804) (19321 20397) (19322 32365) (19323 40639) ( +19324 19975) (19325 24930) (19326 28288))] + +[76 ((19489 28459) (19490 34067) (19491 21619) (19492 26410) (19493 39749) (19494 24051) (19495 31637) + (19496 23724) (19497 23494) (19498 34588) (19499 28234) (19500 34001) (19501 31252) (19502 33032) ( +19503 22937) (19504 31885) (19505 27665) (19506 30496) (19507 21209) (19508 22818) (19509 28961) ( +19510 29279) (19511 30683) (19512 38695) (19513 40289) (19514 26891) (19515 23167) (19516 23064) ( +19517 20901) (19518 21517) (19519 21629) (19520 26126) (19521 30431) (19522 36855) (19523 37528) ( +19524 40180) (19525 23018) (19526 29277) (19527 28357) (19528 20813) (19529 26825) (19530 32191) ( +19531 32236) (19532 38754) (19533 40634) (19534 25720) (19535 27169) (19536 33538) (19537 22916) ( +19538 23391) (19539 27611) (19540 29467) (19541 30450) (19542 32178) (19543 32791) (19544 33945) ( +19545 20786) (19546 26408) (19547 40665) (19548 30446) (19549 26466) (19550 21247) (19551 39173) ( +19552 23588) (19553 25147) (19554 31870) (19555 36016) (19556 21839) (19557 24758) (19558 32011) ( +19559 38272) (19560 21249) (19561 20063) (19562 20918) (19563 22812) (19564 29242) (19565 32822) ( +19566 37326) (19567 24357) (19568 30690) (19569 21380) (19570 24441) (19571 32004) (19572 34220) ( +19573 35379) (19574 36493) (19575 38742) (19576 26611) (19577 34222) (19578 37971) (19579 24841) ( +19580 24840) (19581 27833) (19582 30290))] + +[77 ((19745 35565) (19746 36664) (19747 21807) (19748 20305) (19749 20778) (19750 21191) (19751 21451) + (19752 23461) (19753 24189) (19754 24736) (19755 24962) (19756 25558) (19757 26377) (19758 26586) ( +19759 28263) (19760 28044) (19761 29494) (19762 29495) (19763 30001) (19764 31056) (19765 35029) ( +19766 35480) (19767 36938) (19768 37009) (19769 37109) (19770 38596) (19771 34701) (19772 22805) ( +19773 20104) (19774 20313) (19775 19982) (19776 35465) (19777 36671) (19778 38928) (19779 20653) ( +19780 24188) (19781 22934) (19782 23481) (19783 24248) (19784 25562) (19785 25594) (19786 25793) ( +19787 26332) (19788 26954) (19789 27096) (19790 27915) (19791 28342) (19792 29076) (19793 29992) ( +19794 31407) (19795 32650) (19796 32768) (19797 33865) (19798 33993) (19799 35201) (19800 35617) ( +19801 36362) (19802 36965) (19803 38525) (19804 39178) (19805 24958) (19806 25233) (19807 27442) ( +19808 27779) (19809 28020) (19810 32716) (19811 32764) (19812 28096) (19813 32645) (19814 34746) ( +19815 35064) (19816 26469) (19817 33713) (19818 38972) (19819 38647) (19820 27931) (19821 32097) ( +19822 33853) (19823 37226) (19824 20081) (19825 21365) (19826 23888) (19827 27396) (19828 28651) ( +19829 34253) (19830 34349) (19831 35239) (19832 21033) (19833 21519) (19834 23653) (19835 26446) ( +19836 26792) (19837 29702) (19838 29827))] + +[78 ((20001 30178) (20002 35023) (20003 35041) (20004 37324) (20005 38626) (20006 38520) (20007 24459) + (20008 29575) (20009 31435) (20010 33870) (20011 25504) (20012 30053) (20013 21129) (20014 27969) ( +20015 28316) (20016 29705) (20017 30041) (20018 30827) (20019 31890) (20020 38534) (20021 31452) ( +20022 40845) (20023 20406) (20024 24942) (20025 26053) (20026 34396) (20027 20102) (20028 20142) ( +20029 20698) (20030 20001) (20031 20940) (20032 23534) (20033 26009) (20034 26753) (20035 28092) ( +20036 29471) (20037 30274) (20038 30637) (20039 31260) (20040 31975) (20041 33391) (20042 35538) ( +20043 36988) (20044 37327) (20045 38517) (20046 38936) (20047 21147) (20048 32209) (20049 20523) ( +20050 21400) (20051 26519) (20052 28107) (20053 29136) (20054 29747) (20055 33256) (20056 36650) ( +20057 38563) (20058 40023) (20059 40607) (20060 29792) (20061 22593) (20062 28057) (20063 32047) ( +20064 39006) (20065 20196) (20066 20278) (20067 20363) (20068 20919) (20069 21169) (20070 23994) ( +20071 24604) (20072 29618) (20073 31036) (20074 33491) (20075 37428) (20076 38583) (20077 38646) ( +20078 38666) (20079 40599) (20080 40802) (20081 26278) (20082 27508) (20083 21015) (20084 21155) ( +20085 28872) (20086 35010) (20087 24265) (20088 24651) (20089 24976) (20090 28451) (20091 29001) ( +20092 31806) (20093 32244) (20094 32879))] + +[79 ((20257 34030) (20258 36899) (20259 37676) (20260 21570) (20261 39791) (20262 27347) (20263 28809) + (20264 36034) (20265 36335) (20266 38706) (20267 21172) (20268 23105) (20269 24266) (20270 24324) ( +20271 26391) (20272 27004) (20273 27028) (20274 28010) (20275 28431) (20276 29282) (20277 29436) ( +20278 31725) (20279 32769) (20280 32894) (20281 34635) (20282 37070) (20283 20845) (20284 40595) ( +20285 31108) (20286 32907) (20287 37682) (20288 35542) (20289 20525) (20290 21644) (20291 35441) ( +20292 27498) (20293 36036) (20294 33031) (20295 24785) (20296 26528) (20297 40434) (20298 20121) ( +20299 20120) (20300 39952) (20301 35435) (20302 34241) (20303 34152) (20304 26880) (20305 28286) ( +20306 30871) (20307 33109))] + +[80 ((20513 24332) (20514 19984) (20515 19989) (20516 20010) (20517 20017) (20518 20022) (20519 20028) + (20520 20031) (20521 20034) (20522 20054) (20523 20056) (20524 20098) (20525 20101) (20526 35947) ( +20527 20106) (20528 33298) (20529 24333) (20530 20110) (20531 20126) (20532 20127) (20533 20128) ( +20534 20130) (20535 20144) (20536 20147) (20537 20150) (20538 20174) (20539 20173) (20540 20164) ( +20541 20166) (20542 20162) (20543 20183) (20544 20190) (20545 20205) (20546 20191) (20547 20215) ( +20548 20233) (20549 20314) (20550 20272) (20551 20315) (20552 20317) (20553 20311) (20554 20295) ( +20555 20342) (20556 20360) (20557 20367) (20558 20376) (20559 20347) (20560 20329) (20561 20336) ( +20562 20369) (20563 20335) (20564 20358) (20565 20374) (20566 20760) (20567 20436) (20568 20447) ( +20569 20430) (20570 20440) (20571 20443) (20572 20433) (20573 20442) (20574 20432) (20575 20452) ( +20576 20453) (20577 20506) (20578 20520) (20579 20500) (20580 20522) (20581 20517) (20582 20485) ( +20583 20252) (20584 20470) (20585 20513) (20586 20521) (20587 20524) (20588 20478) (20589 20463) ( +20590 20497) (20591 20486) (20592 20547) (20593 20551) (20594 26371) (20595 20565) (20596 20560) ( +20597 20552) (20598 20570) (20599 20566) (20600 20588) (20601 20600) (20602 20608) (20603 20634) ( +20604 20613) (20605 20660) (20606 20658))] + +[81 ((20769 20681) (20770 20682) (20771 20659) (20772 20674) (20773 20694) (20774 20702) (20775 20709) + (20776 20717) (20777 20707) (20778 20718) (20779 20729) (20780 20725) (20781 20745) (20782 20737) ( +20783 20738) (20784 20758) (20785 20757) (20786 20756) (20787 20762) (20788 20769) (20789 20794) ( +20790 20791) (20791 20796) (20792 20795) (20793 20799) (20794 20800) (20795 20818) (20796 20812) ( +20797 20820) (20798 20834) (20799 31480) (20800 20841) (20801 20842) (20802 20846) (20803 20864) ( +20804 20866) (20805 22232) (20806 20876) (20807 20873) (20808 20879) (20809 20881) (20810 20883) ( +20811 20885) (20812 20886) (20813 20900) (20814 20902) (20815 20898) (20816 20905) (20817 20906) ( +20818 20907) (20819 20915) (20820 20913) (20821 20914) (20822 20912) (20823 20917) (20824 20925) ( +20825 20933) (20826 20937) (20827 20955) (20828 20960) (20829 34389) (20830 20969) (20831 20973) ( +20832 20976) (20833 20981) (20834 20990) (20835 20996) (20836 21003) (20837 21012) (20838 21006) ( +20839 21031) (20840 21034) (20841 21038) (20842 21043) (20843 21049) (20844 21071) (20845 21060) ( +20846 21067) (20847 21068) (20848 21086) (20849 21076) (20850 21098) (20851 21108) (20852 21097) ( +20853 21107) (20854 21119) (20855 21117) (20856 21133) (20857 21140) (20858 21138) (20859 21105) ( +20860 21128) (20861 21137) (20862 36776))] + +[82 ((21025 36775) (21026 21164) (21027 21165) (21028 21180) (21029 21173) (21030 21185) (21031 21197) + (21032 21207) (21033 21214) (21034 21219) (21035 21222) (21036 39149) (21037 21216) (21038 21235) ( +21039 21237) (21040 21240) (21041 21241) (21042 21254) (21043 21256) (21044 30008) (21045 21261) ( +21046 21264) (21047 21263) (21048 21269) (21049 21274) (21050 21283) (21051 21295) (21052 21297) ( +21053 21299) (21054 21304) (21055 21312) (21056 21318) (21057 21317) (21058 19991) (21059 21321) ( +21060 21325) (21061 20950) (21062 21342) (21063 21353) (21064 21358) (21065 22808) (21066 21371) ( +21067 21367) (21068 21378) (21069 21398) (21070 21408) (21071 21414) (21072 21413) (21073 21422) ( +21074 21424) (21075 21430) (21076 21443) (21077 31762) (21078 38617) (21079 21471) (21080 26364) ( +21081 29166) (21082 21486) (21083 21480) (21084 21485) (21085 21498) (21086 21505) (21087 21565) ( +21088 21568) (21089 21548) (21090 21549) (21091 21564) (21092 21550) (21093 21558) (21094 21545) ( +21095 21533) (21096 21582) (21097 21647) (21098 21621) (21099 21646) (21100 21599) (21101 21617) ( +21102 21623) (21103 21616) (21104 21650) (21105 21627) (21106 21632) (21107 21622) (21108 21636) ( +21109 21648) (21110 21638) (21111 21703) (21112 21666) (21113 21688) (21114 21669) (21115 21676) ( +21116 21700) (21117 21704) (21118 21672))] + +[83 ((21281 21675) (21282 21698) (21283 21668) (21284 21694) (21285 21692) (21286 21720) (21287 21733) + (21288 21734) (21289 21775) (21290 21780) (21291 21757) (21292 21742) (21293 21741) (21294 21754) ( +21295 21730) (21296 21817) (21297 21824) (21298 21859) (21299 21836) (21300 21806) (21301 21852) ( +21302 21829) (21303 21846) (21304 21847) (21305 21816) (21306 21811) (21307 21853) (21308 21913) ( +21309 21888) (21310 21679) (21311 21898) (21312 21919) (21313 21883) (21314 21886) (21315 21912) ( +21316 21918) (21317 21934) (21318 21884) (21319 21891) (21320 21929) (21321 21895) (21322 21928) ( +21323 21978) (21324 21957) (21325 21983) (21326 21956) (21327 21980) (21328 21988) (21329 21972) ( +21330 22036) (21331 22007) (21332 22038) (21333 22014) (21334 22013) (21335 22043) (21336 22009) ( +21337 22094) (21338 22096) (21339 29151) (21340 22068) (21341 22070) (21342 22066) (21343 22072) ( +21344 22123) (21345 22116) (21346 22063) (21347 22124) (21348 22122) (21349 22150) (21350 22144) ( +21351 22154) (21352 22176) (21353 22164) (21354 22159) (21355 22181) (21356 22190) (21357 22198) ( +21358 22196) (21359 22210) (21360 22204) (21361 22209) (21362 22211) (21363 22208) (21364 22216) ( +21365 22222) (21366 22225) (21367 22227) (21368 22231) (21369 22254) (21370 22265) (21371 22272) ( +21372 22271) (21373 22276) (21374 22281))] + +[84 ((21537 22280) (21538 22283) (21539 22285) (21540 22291) (21541 22296) (21542 22294) (21543 21959) + (21544 22300) (21545 22310) (21546 22327) (21547 22328) (21548 22350) (21549 22331) (21550 22336) ( +21551 22351) (21552 22377) (21553 22464) (21554 22408) (21555 22369) (21556 22399) (21557 22409) ( +21558 22419) (21559 22432) (21560 22451) (21561 22436) (21562 22442) (21563 22448) (21564 22467) ( +21565 22470) (21566 22484) (21567 22482) (21568 22483) (21569 22538) (21570 22486) (21571 22499) ( +21572 22539) (21573 22553) (21574 22557) (21575 22642) (21576 22561) (21577 22626) (21578 22603) ( +21579 22640) (21580 27584) (21581 22610) (21582 22589) (21583 22649) (21584 22661) (21585 22713) ( +21586 22687) (21587 22699) (21588 22714) (21589 22750) (21590 22715) (21591 22712) (21592 22702) ( +21593 22725) (21594 22739) (21595 22737) (21596 22743) (21597 22745) (21598 22744) (21599 22757) ( +21600 22748) (21601 22756) (21602 22751) (21603 22767) (21604 22778) (21605 22777) (21606 22779) ( +21607 22780) (21608 22781) (21609 22786) (21610 22794) (21611 22800) (21612 22811) (21613 26790) ( +21614 22821) (21615 22828) (21616 22829) (21617 22834) (21618 22840) (21619 22846) (21620 31442) ( +21621 22869) (21622 22864) (21623 22862) (21624 22874) (21625 22872) (21626 22882) (21627 22880) ( +21628 22887) (21629 22892) (21630 22889))] + +[85 ((21793 22904) (21794 22913) (21795 22941) (21796 20318) (21797 20395) (21798 22947) (21799 22962) + (21800 22982) (21801 23016) (21802 23004) (21803 22925) (21804 23001) (21805 23002) (21806 23077) ( +21807 23071) (21808 23057) (21809 23068) (21810 23049) (21811 23066) (21812 23104) (21813 23148) ( +21814 23113) (21815 23093) (21816 23094) (21817 23138) (21818 23146) (21819 23194) (21820 23228) ( +21821 23230) (21822 23243) (21823 23234) (21824 23229) (21825 23267) (21826 23255) (21827 23270) ( +21828 23273) (21829 23254) (21830 23290) (21831 23291) (21832 23308) (21833 23307) (21834 23318) ( +21835 23346) (21836 23248) (21837 23338) (21838 23350) (21839 23358) (21840 23363) (21841 23365) ( +21842 23360) (21843 23377) (21844 23381) (21845 23386) (21846 23387) (21847 23397) (21848 23401) ( +21849 23408) (21850 23411) (21851 23413) (21852 23416) (21853 25992) (21854 23418) (21855 23424) ( +21856 23427) (21857 23462) (21858 23480) (21859 23491) (21860 23495) (21861 23497) (21862 23508) ( +21863 23504) (21864 23524) (21865 23526) (21866 23522) (21867 23518) (21868 23525) (21869 23531) ( +21870 23536) (21871 23542) (21872 23539) (21873 23557) (21874 23559) (21875 23560) (21876 23565) ( +21877 23571) (21878 23584) (21879 23586) (21880 23592) (21881 23608) (21882 23609) (21883 23617) ( +21884 23622) (21885 23630) (21886 23635))] + +[86 ((22049 23632) (22050 23631) (22051 23409) (22052 23660) (22053 23662) (22054 20066) (22055 23670) + (22056 23673) (22057 23692) (22058 23697) (22059 23700) (22060 22939) (22061 23723) (22062 23739) ( +22063 23734) (22064 23740) (22065 23735) (22066 23749) (22067 23742) (22068 23751) (22069 23769) ( +22070 23785) (22071 23805) (22072 23802) (22073 23789) (22074 23948) (22075 23786) (22076 23819) ( +22077 23829) (22078 23831) (22079 23900) (22080 23839) (22081 23835) (22082 23825) (22083 23828) ( +22084 23842) (22085 23834) (22086 23833) (22087 23832) (22088 23884) (22089 23890) (22090 23886) ( +22091 23883) (22092 23916) (22093 23923) (22094 23926) (22095 23943) (22096 23940) (22097 23938) ( +22098 23970) (22099 23965) (22100 23980) (22101 23982) (22102 23997) (22103 23952) (22104 23991) ( +22105 23996) (22106 24009) (22107 24013) (22108 24019) (22109 24018) (22110 24022) (22111 24027) ( +22112 24043) (22113 24050) (22114 24053) (22115 24075) (22116 24090) (22117 24089) (22118 24081) ( +22119 24091) (22120 24118) (22121 24119) (22122 24132) (22123 24131) (22124 24128) (22125 24142) ( +22126 24151) (22127 24148) (22128 24159) (22129 24162) (22130 24164) (22131 24135) (22132 24181) ( +22133 24182) (22134 24186) (22135 40636) (22136 24191) (22137 24224) (22138 24257) (22139 24258) ( +22140 24264) (22141 24272) (22142 24271))] + +[87 ((22305 24278) (22306 24291) (22307 24285) (22308 24282) (22309 24283) (22310 24290) (22311 24289) + (22312 24296) (22313 24297) (22314 24300) (22315 24305) (22316 24307) (22317 24304) (22318 24308) ( +22319 24312) (22320 24318) (22321 24323) (22322 24329) (22323 24413) (22324 24412) (22325 24331) ( +22326 24337) (22327 24342) (22328 24361) (22329 24365) (22330 24376) (22331 24385) (22332 24392) ( +22333 24396) (22334 24398) (22335 24367) (22336 24401) (22337 24406) (22338 24407) (22339 24409) ( +22340 24417) (22341 24429) (22342 24435) (22343 24439) (22344 24451) (22345 24450) (22346 24447) ( +22347 24458) (22348 24456) (22349 24465) (22350 24455) (22351 24478) (22352 24473) (22353 24472) ( +22354 24480) (22355 24488) (22356 24493) (22357 24508) (22358 24534) (22359 24571) (22360 24548) ( +22361 24568) (22362 24561) (22363 24541) (22364 24755) (22365 24575) (22366 24609) (22367 24672) ( +22368 24601) (22369 24592) (22370 24617) (22371 24590) (22372 24625) (22373 24603) (22374 24597) ( +22375 24619) (22376 24614) (22377 24591) (22378 24634) (22379 24666) (22380 24641) (22381 24682) ( +22382 24695) (22383 24671) (22384 24650) (22385 24646) (22386 24653) (22387 24675) (22388 24643) ( +22389 24676) (22390 24642) (22391 24684) (22392 24683) (22393 24665) (22394 24705) (22395 24717) ( +22396 24807) (22397 24707) (22398 24730))] + +[88 ((22561 24708) (22562 24731) (22563 24726) (22564 24727) (22565 24722) (22566 24743) (22567 24715) + (22568 24801) (22569 24760) (22570 24800) (22571 24787) (22572 24756) (22573 24560) (22574 24765) ( +22575 24774) (22576 24757) (22577 24792) (22578 24909) (22579 24853) (22580 24838) (22581 24822) ( +22582 24823) (22583 24832) (22584 24820) (22585 24826) (22586 24835) (22587 24865) (22588 24827) ( +22589 24817) (22590 24845) (22591 24846) (22592 24903) (22593 24894) (22594 24872) (22595 24871) ( +22596 24906) (22597 24895) (22598 24892) (22599 24876) (22600 24884) (22601 24893) (22602 24898) ( +22603 24900) (22604 24947) (22605 24951) (22606 24920) (22607 24921) (22608 24922) (22609 24939) ( +22610 24948) (22611 24943) (22612 24933) (22613 24945) (22614 24927) (22615 24925) (22616 24915) ( +22617 24949) (22618 24985) (22619 24982) (22620 24967) (22621 25004) (22622 24980) (22623 24986) ( +22624 24970) (22625 24977) (22626 25003) (22627 25006) (22628 25036) (22629 25034) (22630 25033) ( +22631 25079) (22632 25032) (22633 25027) (22634 25030) (22635 25018) (22636 25035) (22637 32633) ( +22638 25037) (22639 25062) (22640 25059) (22641 25078) (22642 25082) (22643 25076) (22644 25087) ( +22645 25085) (22646 25084) (22647 25086) (22648 25088) (22649 25096) (22650 25097) (22651 25101) ( +22652 25100) (22653 25108) (22654 25115))] + +[89 ((22817 25118) (22818 25121) (22819 25130) (22820 25134) (22821 25136) (22822 25138) (22823 25139) + (22824 25153) (22825 25166) (22826 25182) (22827 25187) (22828 25179) (22829 25184) (22830 25192) ( +22831 25212) (22832 25218) (22833 25225) (22834 25214) (22835 25234) (22836 25235) (22837 25238) ( +22838 25300) (22839 25219) (22840 25236) (22841 25303) (22842 25297) (22843 25275) (22844 25295) ( +22845 25343) (22846 25286) (22847 25812) (22848 25288) (22849 25308) (22850 25292) (22851 25290) ( +22852 25282) (22853 25287) (22854 25243) (22855 25289) (22856 25356) (22857 25326) (22858 25329) ( +22859 25383) (22860 25346) (22861 25352) (22862 25327) (22863 25333) (22864 25424) (22865 25406) ( +22866 25421) (22867 25628) (22868 25423) (22869 25494) (22870 25486) (22871 25472) (22872 25515) ( +22873 25462) (22874 25507) (22875 25487) (22876 25481) (22877 25503) (22878 25525) (22879 25451) ( +22880 25449) (22881 25534) (22882 25577) (22883 25536) (22884 25542) (22885 25571) (22886 25545) ( +22887 25554) (22888 25590) (22889 25540) (22890 25622) (22891 25652) (22892 25606) (22893 25619) ( +22894 25638) (22895 25654) (22896 25885) (22897 25623) (22898 25640) (22899 25615) (22900 25703) ( +22901 25711) (22902 25718) (22903 25678) (22904 25898) (22905 25749) (22906 25747) (22907 25765) ( +22908 25769) (22909 25736) (22910 25788))] + +[90 ((23073 25818) (23074 25810) (23075 25797) (23076 25799) (23077 25787) (23078 25816) (23079 25794) + (23080 25841) (23081 25831) (23082 33289) (23083 25824) (23084 25825) (23085 25260) (23086 25827) ( +23087 25839) (23088 25900) (23089 25846) (23090 25844) (23091 25842) (23092 25850) (23093 25856) ( +23094 25853) (23095 25880) (23096 25884) (23097 25861) (23098 25892) (23099 25891) (23100 25899) ( +23101 25908) (23102 25909) (23103 25911) (23104 25910) (23105 25912) (23106 30027) (23107 25928) ( +23108 25942) (23109 25941) (23110 25933) (23111 25944) (23112 25950) (23113 25949) (23114 25970) ( +23115 25976) (23116 25986) (23117 25987) (23118 35722) (23119 26011) (23120 26015) (23121 26027) ( +23122 26039) (23123 26051) (23124 26054) (23125 26049) (23126 26052) (23127 26060) (23128 26066) ( +23129 26075) (23130 26073) (23131 26080) (23132 26081) (23133 26097) (23134 26482) (23135 26122) ( +23136 26115) (23137 26107) (23138 26483) (23139 26165) (23140 26166) (23141 26164) (23142 26140) ( +23143 26191) (23144 26180) (23145 26185) (23146 26177) (23147 26206) (23148 26205) (23149 26212) ( +23150 26215) (23151 26216) (23152 26207) (23153 26210) (23154 26224) (23155 26243) (23156 26248) ( +23157 26254) (23158 26249) (23159 26244) (23160 26264) (23161 26269) (23162 26305) (23163 26297) ( +23164 26313) (23165 26302) (23166 26300))] + +[91 ((23329 26308) (23330 26296) (23331 26326) (23332 26330) (23333 26336) (23334 26175) (23335 26342) + (23336 26345) (23337 26352) (23338 26357) (23339 26359) (23340 26383) (23341 26390) (23342 26398) ( +23343 26406) (23344 26407) (23345 38712) (23346 26414) (23347 26431) (23348 26422) (23349 26433) ( +23350 26424) (23351 26423) (23352 26438) (23353 26462) (23354 26464) (23355 26457) (23356 26467) ( +23357 26468) (23358 26505) (23359 26480) (23360 26537) (23361 26492) (23362 26474) (23363 26508) ( +23364 26507) (23365 26534) (23366 26529) (23367 26501) (23368 26551) (23369 26607) (23370 26548) ( +23371 26604) (23372 26547) (23373 26601) (23374 26552) (23375 26596) (23376 26590) (23377 26589) ( +23378 26594) (23379 26606) (23380 26553) (23381 26574) (23382 26566) (23383 26599) (23384 27292) ( +23385 26654) (23386 26694) (23387 26665) (23388 26688) (23389 26701) (23390 26674) (23391 26702) ( +23392 26803) (23393 26667) (23394 26713) (23395 26723) (23396 26743) (23397 26751) (23398 26783) ( +23399 26767) (23400 26797) (23401 26772) (23402 26781) (23403 26779) (23404 26755) (23405 27310) ( +23406 26809) (23407 26740) (23408 26805) (23409 26784) (23410 26810) (23411 26895) (23412 26765) ( +23413 26750) (23414 26881) (23415 26826) (23416 26888) (23417 26840) (23418 26914) (23419 26918) ( +23420 26849) (23421 26892) (23422 26829))] + +[92 ((23585 26836) (23586 26855) (23587 26837) (23588 26934) (23589 26898) (23590 26884) (23591 26839) + (23592 26851) (23593 26917) (23594 26873) (23595 26848) (23596 26863) (23597 26920) (23598 26922) ( +23599 26906) (23600 26915) (23601 26913) (23602 26822) (23603 27001) (23604 26999) (23605 26972) ( +23606 27000) (23607 26987) (23608 26964) (23609 27006) (23610 26990) (23611 26937) (23612 26996) ( +23613 26941) (23614 26969) (23615 26928) (23616 26977) (23617 26974) (23618 26973) (23619 27009) ( +23620 26986) (23621 27058) (23622 27054) (23623 27088) (23624 27071) (23625 27073) (23626 27091) ( +23627 27070) (23628 27086) (23629 23528) (23630 27082) (23631 27101) (23632 27067) (23633 27075) ( +23634 27047) (23635 27182) (23636 27025) (23637 27040) (23638 27036) (23639 27029) (23640 27060) ( +23641 27102) (23642 27112) (23643 27138) (23644 27163) (23645 27135) (23646 27402) (23647 27129) ( +23648 27122) (23649 27111) (23650 27141) (23651 27057) (23652 27166) (23653 27117) (23654 27156) ( +23655 27115) (23656 27146) (23657 27154) (23658 27329) (23659 27171) (23660 27155) (23661 27204) ( +23662 27148) (23663 27250) (23664 27190) (23665 27256) (23666 27207) (23667 27234) (23668 27225) ( +23669 27238) (23670 27208) (23671 27192) (23672 27170) (23673 27280) (23674 27277) (23675 27296) ( +23676 27268) (23677 27298) (23678 27299))] + +[93 ((23841 27287) (23842 34327) (23843 27323) (23844 27331) (23845 27330) (23846 27320) (23847 27315) + (23848 27308) (23849 27358) (23850 27345) (23851 27359) (23852 27306) (23853 27354) (23854 27370) ( +23855 27387) (23856 27397) (23857 34326) (23858 27386) (23859 27410) (23860 27414) (23861 39729) ( +23862 27423) (23863 27448) (23864 27447) (23865 30428) (23866 27449) (23867 39150) (23868 27463) ( +23869 27459) (23870 27465) (23871 27472) (23872 27481) (23873 27476) (23874 27483) (23875 27487) ( +23876 27489) (23877 27512) (23878 27513) (23879 27519) (23880 27520) (23881 27524) (23882 27523) ( +23883 27533) (23884 27544) (23885 27541) (23886 27550) (23887 27556) (23888 27562) (23889 27563) ( +23890 27567) (23891 27570) (23892 27569) (23893 27571) (23894 27575) (23895 27580) (23896 27590) ( +23897 27595) (23898 27603) (23899 27615) (23900 27628) (23901 27627) (23902 27635) (23903 27631) ( +23904 40638) (23905 27656) (23906 27667) (23907 27668) (23908 27675) (23909 27684) (23910 27683) ( +23911 27742) (23912 27733) (23913 27746) (23914 27754) (23915 27778) (23916 27789) (23917 27802) ( +23918 27777) (23919 27803) (23920 27774) (23921 27752) (23922 27763) (23923 27794) (23924 27792) ( +23925 27844) (23926 27889) (23927 27859) (23928 27837) (23929 27863) (23930 27845) (23931 27869) ( +23932 27822) (23933 27825) (23934 27838))] + +[94 ((24097 27834) (24098 27867) (24099 27887) (24100 27865) (24101 27882) (24102 27935) (24103 34893) + (24104 27958) (24105 27947) (24106 27965) (24107 27960) (24108 27929) (24109 27957) (24110 27955) ( +24111 27922) (24112 27916) (24113 28003) (24114 28051) (24115 28004) (24116 27994) (24117 28025) ( +24118 27993) (24119 28046) (24120 28053) (24121 28644) (24122 28037) (24123 28153) (24124 28181) ( +24125 28170) (24126 28085) (24127 28103) (24128 28134) (24129 28088) (24130 28102) (24131 28140) ( +24132 28126) (24133 28108) (24134 28136) (24135 28114) (24136 28101) (24137 28154) (24138 28121) ( +24139 28132) (24140 28117) (24141 28138) (24142 28142) (24143 28205) (24144 28270) (24145 28206) ( +24146 28185) (24147 28274) (24148 28255) (24149 28222) (24150 28195) (24151 28267) (24152 28203) ( +24153 28278) (24154 28237) (24155 28191) (24156 28227) (24157 28218) (24158 28238) (24159 28196) ( +24160 28415) (24161 28189) (24162 28216) (24163 28290) (24164 28330) (24165 28312) (24166 28361) ( +24167 28343) (24168 28371) (24169 28349) (24170 28335) (24171 28356) (24172 28338) (24173 28372) ( +24174 28373) (24175 28303) (24176 28325) (24177 28354) (24178 28319) (24179 28481) (24180 28433) ( +24181 28748) (24182 28396) (24183 28408) (24184 28414) (24185 28479) (24186 28402) (24187 28465) ( +24188 28399) (24189 28466) (24190 28364))] + +[95 ((24353 28478) (24354 28435) (24355 28407) (24356 28550) (24357 28538) (24358 28536) (24359 28545) + (24360 28544) (24361 28527) (24362 28507) (24363 28659) (24364 28525) (24365 28546) (24366 28540) ( +24367 28504) (24368 28558) (24369 28561) (24370 28610) (24371 28518) (24372 28595) (24373 28579) ( +24374 28577) (24375 28580) (24376 28601) (24377 28614) (24378 28586) (24379 28639) (24380 28629) ( +24381 28652) (24382 28628) (24383 28632) (24384 28657) (24385 28654) (24386 28635) (24387 28681) ( +24388 28683) (24389 28666) (24390 28689) (24391 28673) (24392 28687) (24393 28670) (24394 28699) ( +24395 28698) (24396 28532) (24397 28701) (24398 28696) (24399 28703) (24400 28720) (24401 28734) ( +24402 28722) (24403 28753) (24404 28771) (24405 28825) (24406 28818) (24407 28847) (24408 28913) ( +24409 28844) (24410 28856) (24411 28851) (24412 28846) (24413 28895) (24414 28875) (24415 28893) ( +24416 28889) (24417 28937) (24418 28925) (24419 28956) (24420 28953) (24421 29029) (24422 29013) ( +24423 29064) (24424 29030) (24425 29026) (24426 29004) (24427 29014) (24428 29036) (24429 29071) ( +24430 29179) (24431 29060) (24432 29077) (24433 29096) (24434 29100) (24435 29143) (24436 29113) ( +24437 29118) (24438 29138) (24439 29129) (24440 29140) (24441 29134) (24442 29152) (24443 29164) ( +24444 29159) (24445 29173) (24446 29180))] + +[96 ((24609 29177) (24610 29183) (24611 29197) (24612 29200) (24613 29211) (24614 29224) (24615 29229) + (24616 29228) (24617 29232) (24618 29234) (24619 29243) (24620 29244) (24621 29247) (24622 29248) ( +24623 29254) (24624 29259) (24625 29272) (24626 29300) (24627 29310) (24628 29314) (24629 29313) ( +24630 29319) (24631 29330) (24632 29334) (24633 29346) (24634 29351) (24635 29369) (24636 29362) ( +24637 29379) (24638 29382) (24639 29380) (24640 29390) (24641 29394) (24642 29410) (24643 29408) ( +24644 29409) (24645 29433) (24646 29431) (24647 20495) (24648 29463) (24649 29450) (24650 29468) ( +24651 29462) (24652 29469) (24653 29492) (24654 29487) (24655 29481) (24656 29477) (24657 29502) ( +24658 29518) (24659 29519) (24660 40664) (24661 29527) (24662 29546) (24663 29544) (24664 29552) ( +24665 29560) (24666 29557) (24667 29563) (24668 29562) (24669 29640) (24670 29619) (24671 29646) ( +24672 29627) (24673 29632) (24674 29669) (24675 29678) (24676 29662) (24677 29858) (24678 29701) ( +24679 29807) (24680 29733) (24681 29688) (24682 29746) (24683 29754) (24684 29781) (24685 29759) ( +24686 29791) (24687 29785) (24688 29761) (24689 29788) (24690 29801) (24691 29808) (24692 29795) ( +24693 29802) (24694 29814) (24695 29822) (24696 29835) (24697 29854) (24698 29863) (24699 29898) ( +24700 29903) (24701 29908) (24702 29681))] + +[97 ((24865 29920) (24866 29923) (24867 29927) (24868 29929) (24869 29934) (24870 29938) (24871 29936) + (24872 29937) (24873 29944) (24874 29943) (24875 29956) (24876 29955) (24877 29957) (24878 29964) ( +24879 29966) (24880 29965) (24881 29973) (24882 29971) (24883 29982) (24884 29990) (24885 29996) ( +24886 30012) (24887 30020) (24888 30029) (24889 30026) (24890 30025) (24891 30043) (24892 30022) ( +24893 30042) (24894 30057) (24895 30052) (24896 30055) (24897 30059) (24898 30061) (24899 30072) ( +24900 30070) (24901 30086) (24902 30087) (24903 30068) (24904 30090) (24905 30089) (24906 30082) ( +24907 30100) (24908 30106) (24909 30109) (24910 30117) (24911 30115) (24912 30146) (24913 30131) ( +24914 30147) (24915 30133) (24916 30141) (24917 30136) (24918 30140) (24919 30129) (24920 30157) ( +24921 30154) (24922 30162) (24923 30169) (24924 30179) (24925 30174) (24926 30206) (24927 30207) ( +24928 30204) (24929 30209) (24930 30192) (24931 30202) (24932 30194) (24933 30195) (24934 30219) ( +24935 30221) (24936 30217) (24937 30239) (24938 30247) (24939 30240) (24940 30241) (24941 30242) ( +24942 30244) (24943 30260) (24944 30256) (24945 30267) (24946 30279) (24947 30280) (24948 30278) ( +24949 30300) (24950 30296) (24951 30305) (24952 30306) (24953 30312) (24954 30313) (24955 30314) ( +24956 30311) (24957 30316) (24958 30320))] + +[98 ((25121 30322) (25122 30326) (25123 30328) (25124 30332) (25125 30336) (25126 30339) (25127 30344) + (25128 30347) (25129 30350) (25130 30358) (25131 30355) (25132 30361) (25133 30362) (25134 30384) ( +25135 30388) (25136 30392) (25137 30393) (25138 30394) (25139 30402) (25140 30413) (25141 30422) ( +25142 30418) (25143 30430) (25144 30433) (25145 30437) (25146 30439) (25147 30442) (25148 34351) ( +25149 30459) (25150 30472) (25151 30471) (25152 30468) (25153 30505) (25154 30500) (25155 30494) ( +25156 30501) (25157 30502) (25158 30491) (25159 30519) (25160 30520) (25161 30535) (25162 30554) ( +25163 30568) (25164 30571) (25165 30555) (25166 30565) (25167 30591) (25168 30590) (25169 30585) ( +25170 30606) (25171 30603) (25172 30609) (25173 30624) (25174 30622) (25175 30640) (25176 30646) ( +25177 30649) (25178 30655) (25179 30652) (25180 30653) (25181 30651) (25182 30663) (25183 30669) ( +25184 30679) (25185 30682) (25186 30684) (25187 30691) (25188 30702) (25189 30716) (25190 30732) ( +25191 30738) (25192 31014) (25193 30752) (25194 31018) (25195 30789) (25196 30862) (25197 30836) ( +25198 30854) (25199 30844) (25200 30874) (25201 30860) (25202 30883) (25203 30901) (25204 30890) ( +25205 30895) (25206 30929) (25207 30918) (25208 30923) (25209 30932) (25210 30910) (25211 30908) ( +25212 30917) (25213 30922) (25214 30956))] + +[99 ((25377 30951) (25378 30938) (25379 30973) (25380 30964) (25381 30983) (25382 30994) (25383 30993) + (25384 31001) (25385 31020) (25386 31019) (25387 31040) (25388 31072) (25389 31063) (25390 31071) ( +25391 31066) (25392 31061) (25393 31059) (25394 31098) (25395 31103) (25396 31114) (25397 31133) ( +25398 31143) (25399 40779) (25400 31146) (25401 31150) (25402 31155) (25403 31161) (25404 31162) ( +25405 31177) (25406 31189) (25407 31207) (25408 31212) (25409 31201) (25410 31203) (25411 31240) ( +25412 31245) (25413 31256) (25414 31257) (25415 31264) (25416 31263) (25417 31104) (25418 31281) ( +25419 31291) (25420 31294) (25421 31287) (25422 31299) (25423 31319) (25424 31305) (25425 31329) ( +25426 31330) (25427 31337) (25428 40861) (25429 31344) (25430 31353) (25431 31357) (25432 31368) ( +25433 31383) (25434 31381) (25435 31384) (25436 31382) (25437 31401) (25438 31432) (25439 31408) ( +25440 31414) (25441 31429) (25442 31428) (25443 31423) (25444 36995) (25445 31431) (25446 31434) ( +25447 31437) (25448 31439) (25449 31445) (25450 31443) (25451 31449) (25452 31450) (25453 31453) ( +25454 31457) (25455 31458) (25456 31462) (25457 31469) (25458 31472) (25459 31490) (25460 31503) ( +25461 31498) (25462 31494) (25463 31539) (25464 31512) (25465 31513) (25466 31518) (25467 31541) ( +25468 31528) (25469 31542) (25470 31568))] + +[100 ((25633 31610) (25634 31492) (25635 31565) (25636 31499) (25637 31564) (25638 31557) (25639 31605 +) (25640 31589) (25641 31604) (25642 31591) (25643 31600) (25644 31601) (25645 31596) (25646 31598) ( +25647 31645) (25648 31640) (25649 31647) (25650 31629) (25651 31644) (25652 31642) (25653 31627) ( +25654 31634) (25655 31631) (25656 31581) (25657 31641) (25658 31691) (25659 31681) (25660 31692) ( +25661 31695) (25662 31668) (25663 31686) (25664 31709) (25665 31721) (25666 31761) (25667 31764) ( +25668 31718) (25669 31717) (25670 31840) (25671 31744) (25672 31751) (25673 31763) (25674 31731) ( +25675 31735) (25676 31767) (25677 31757) (25678 31734) (25679 31779) (25680 31783) (25681 31786) ( +25682 31775) (25683 31799) (25684 31787) (25685 31805) (25686 31820) (25687 31811) (25688 31828) ( +25689 31823) (25690 31808) (25691 31824) (25692 31832) (25693 31839) (25694 31844) (25695 31830) ( +25696 31845) (25697 31852) (25698 31861) (25699 31875) (25700 31888) (25701 31908) (25702 31917) ( +25703 31906) (25704 31915) (25705 31905) (25706 31912) (25707 31923) (25708 31922) (25709 31921) ( +25710 31918) (25711 31929) (25712 31933) (25713 31936) (25714 31941) (25715 31938) (25716 31960) ( +25717 31954) (25718 31964) (25719 31970) (25720 39739) (25721 31983) (25722 31986) (25723 31988) ( +25724 31990) (25725 31994) (25726 32006))] + +[101 ((25889 32002) (25890 32028) (25891 32021) (25892 32010) (25893 32069) (25894 32075) (25895 32046 +) (25896 32050) (25897 32063) (25898 32053) (25899 32070) (25900 32115) (25901 32086) (25902 32078) ( +25903 32114) (25904 32104) (25905 32110) (25906 32079) (25907 32099) (25908 32147) (25909 32137) ( +25910 32091) (25911 32143) (25912 32125) (25913 32155) (25914 32186) (25915 32174) (25916 32163) ( +25917 32181) (25918 32199) (25919 32189) (25920 32171) (25921 32317) (25922 32162) (25923 32175) ( +25924 32220) (25925 32184) (25926 32159) (25927 32176) (25928 32216) (25929 32221) (25930 32228) ( +25931 32222) (25932 32251) (25933 32242) (25934 32225) (25935 32261) (25936 32266) (25937 32291) ( +25938 32289) (25939 32274) (25940 32305) (25941 32287) (25942 32265) (25943 32267) (25944 32290) ( +25945 32326) (25946 32358) (25947 32315) (25948 32309) (25949 32313) (25950 32323) (25951 32311) ( +25952 32306) (25953 32314) (25954 32359) (25955 32349) (25956 32342) (25957 32350) (25958 32345) ( +25959 32346) (25960 32377) (25961 32362) (25962 32361) (25963 32380) (25964 32379) (25965 32387) ( +25966 32213) (25967 32381) (25968 36782) (25969 32383) (25970 32392) (25971 32393) (25972 32396) ( +25973 32402) (25974 32400) (25975 32403) (25976 32404) (25977 32406) (25978 32398) (25979 32411) ( +25980 32412) (25981 32568) (25982 32570))] + +[102 ((26145 32581) (26146 32588) (26147 32589) (26148 32590) (26149 32592) (26150 32593) (26151 32597 +) (26152 32596) (26153 32600) (26154 32607) (26155 32608) (26156 32616) (26157 32617) (26158 32615) ( +26159 32632) (26160 32642) (26161 32646) (26162 32643) (26163 32648) (26164 32647) (26165 32652) ( +26166 32660) (26167 32670) (26168 32669) (26169 32666) (26170 32675) (26171 32687) (26172 32690) ( +26173 32697) (26174 32686) (26175 32694) (26176 32696) (26177 35697) (26178 32709) (26179 32710) ( +26180 32714) (26181 32725) (26182 32724) (26183 32737) (26184 32742) (26185 32745) (26186 32755) ( +26187 32761) (26188 39132) (26189 32774) (26190 32772) (26191 32779) (26192 32786) (26193 32792) ( +26194 32793) (26195 32796) (26196 32801) (26197 32808) (26198 32831) (26199 32827) (26200 32842) ( +26201 32838) (26202 32850) (26203 32856) (26204 32858) (26205 32863) (26206 32866) (26207 32872) ( +26208 32883) (26209 32882) (26210 32880) (26211 32886) (26212 32889) (26213 32893) (26214 32895) ( +26215 32900) (26216 32902) (26217 32901) (26218 32923) (26219 32915) (26220 32922) (26221 32941) ( +26222 20880) (26223 32940) (26224 32987) (26225 32997) (26226 32985) (26227 32989) (26228 32964) ( +26229 32986) (26230 32982) (26231 33033) (26232 33007) (26233 33009) (26234 33051) (26235 33065) ( +26236 33059) (26237 33071) (26238 33099))] + +[103 ((26401 38539) (26402 33094) (26403 33086) (26404 33107) (26405 33105) (26406 33020) (26407 33137 +) (26408 33134) (26409 33125) (26410 33126) (26411 33140) (26412 33155) (26413 33160) (26414 33162) ( +26415 33152) (26416 33154) (26417 33184) (26418 33173) (26419 33188) (26420 33187) (26421 33119) ( +26422 33171) (26423 33193) (26424 33200) (26425 33205) (26426 33214) (26427 33208) (26428 33213) ( +26429 33216) (26430 33218) (26431 33210) (26432 33225) (26433 33229) (26434 33233) (26435 33241) ( +26436 33240) (26437 33224) (26438 33242) (26439 33247) (26440 33248) (26441 33255) (26442 33274) ( +26443 33275) (26444 33278) (26445 33281) (26446 33282) (26447 33285) (26448 33287) (26449 33290) ( +26450 33293) (26451 33296) (26452 33302) (26453 33321) (26454 33323) (26455 33336) (26456 33331) ( +26457 33344) (26458 33369) (26459 33368) (26460 33373) (26461 33370) (26462 33375) (26463 33380) ( +26464 33378) (26465 33384) (26466 33386) (26467 33387) (26468 33326) (26469 33393) (26470 33399) ( +26471 33400) (26472 33406) (26473 33421) (26474 33426) (26475 33451) (26476 33439) (26477 33467) ( +26478 33452) (26479 33505) (26480 33507) (26481 33503) (26482 33490) (26483 33524) (26484 33523) ( +26485 33530) (26486 33683) (26487 33539) (26488 33531) (26489 33529) (26490 33502) (26491 33542) ( +26492 33500) (26493 33545) (26494 33497))] + +[104 ((26657 33589) (26658 33588) (26659 33558) (26660 33586) (26661 33585) (26662 33600) (26663 33593 +) (26664 33616) (26665 33605) (26666 33583) (26667 33579) (26668 33559) (26669 33560) (26670 33669) ( +26671 33690) (26672 33706) (26673 33695) (26674 33698) (26675 33686) (26676 33571) (26677 33678) ( +26678 33671) (26679 33674) (26680 33660) (26681 33717) (26682 33651) (26683 33653) (26684 33696) ( +26685 33673) (26686 33704) (26687 33780) (26688 33811) (26689 33771) (26690 33742) (26691 33789) ( +26692 33795) (26693 33752) (26694 33803) (26695 33729) (26696 33783) (26697 33799) (26698 33760) ( +26699 33778) (26700 33805) (26701 33826) (26702 33824) (26703 33725) (26704 33848) (26705 34054) ( +26706 33787) (26707 33901) (26708 33834) (26709 33852) (26710 34138) (26711 33924) (26712 33911) ( +26713 33899) (26714 33965) (26715 33902) (26716 33922) (26717 33897) (26718 33862) (26719 33836) ( +26720 33903) (26721 33913) (26722 33845) (26723 33994) (26724 33890) (26725 33977) (26726 33983) ( +26727 33951) (26728 34009) (26729 33997) (26730 33979) (26731 34010) (26732 34000) (26733 33985) ( +26734 33990) (26735 34006) (26736 33953) (26737 34081) (26738 34047) (26739 34036) (26740 34071) ( +26741 34072) (26742 34092) (26743 34079) (26744 34069) (26745 34068) (26746 34044) (26747 34112) ( +26748 34147) (26749 34136) (26750 34120))] + +[105 ((26913 34113) (26914 34306) (26915 34123) (26916 34133) (26917 34176) (26918 34212) (26919 34184 +) (26920 34193) (26921 34186) (26922 34216) (26923 34157) (26924 34196) (26925 34203) (26926 34282) ( +26927 34183) (26928 34204) (26929 34167) (26930 34174) (26931 34192) (26932 34249) (26933 34234) ( +26934 34255) (26935 34233) (26936 34256) (26937 34261) (26938 34269) (26939 34277) (26940 34268) ( +26941 34297) (26942 34314) (26943 34323) (26944 34315) (26945 34302) (26946 34298) (26947 34310) ( +26948 34338) (26949 34330) (26950 34352) (26951 34367) (26952 34381) (26953 20053) (26954 34388) ( +26955 34399) (26956 34407) (26957 34417) (26958 34451) (26959 34467) (26960 34473) (26961 34474) ( +26962 34443) (26963 34444) (26964 34486) (26965 34479) (26966 34500) (26967 34502) (26968 34480) ( +26969 34505) (26970 34851) (26971 34475) (26972 34516) (26973 34526) (26974 34537) (26975 34540) ( +26976 34527) (26977 34523) (26978 34543) (26979 34578) (26980 34566) (26981 34568) (26982 34560) ( +26983 34563) (26984 34555) (26985 34577) (26986 34569) (26987 34573) (26988 34553) (26989 34570) ( +26990 34612) (26991 34623) (26992 34615) (26993 34619) (26994 34597) (26995 34601) (26996 34586) ( +26997 34656) (26998 34655) (26999 34680) (27000 34636) (27001 34638) (27002 34676) (27003 34647) ( +27004 34664) (27005 34670) (27006 34649))] + +[106 ((27169 34643) (27170 34659) (27171 34666) (27172 34821) (27173 34722) (27174 34719) (27175 34690 +) (27176 34735) (27177 34763) (27178 34749) (27179 34752) (27180 34768) (27181 38614) (27182 34731) ( +27183 34756) (27184 34739) (27185 34759) (27186 34758) (27187 34747) (27188 34799) (27189 34802) ( +27190 34784) (27191 34831) (27192 34829) (27193 34814) (27194 34806) (27195 34807) (27196 34830) ( +27197 34770) (27198 34833) (27199 34838) (27200 34837) (27201 34850) (27202 34849) (27203 34865) ( +27204 34870) (27205 34873) (27206 34855) (27207 34875) (27208 34884) (27209 34882) (27210 34898) ( +27211 34905) (27212 34910) (27213 34914) (27214 34923) (27215 34945) (27216 34942) (27217 34974) ( +27218 34933) (27219 34941) (27220 34997) (27221 34930) (27222 34946) (27223 34967) (27224 34962) ( +27225 34990) (27226 34969) (27227 34978) (27228 34957) (27229 34980) (27230 34992) (27231 35007) ( +27232 34993) (27233 35011) (27234 35012) (27235 35028) (27236 35032) (27237 35033) (27238 35037) ( +27239 35065) (27240 35074) (27241 35068) (27242 35060) (27243 35048) (27244 35058) (27245 35076) ( +27246 35084) (27247 35082) (27248 35091) (27249 35139) (27250 35102) (27251 35109) (27252 35114) ( +27253 35115) (27254 35137) (27255 35140) (27256 35131) (27257 35126) (27258 35128) (27259 35148) ( +27260 35101) (27261 35168) (27262 35166))] + +[107 ((27425 35174) (27426 35172) (27427 35181) (27428 35178) (27429 35183) (27430 35188) (27431 35191 +) (27432 35198) (27433 35203) (27434 35208) (27435 35210) (27436 35219) (27437 35224) (27438 35233) ( +27439 35241) (27440 35238) (27441 35244) (27442 35247) (27443 35250) (27444 35258) (27445 35261) ( +27446 35263) (27447 35264) (27448 35290) (27449 35292) (27450 35293) (27451 35303) (27452 35316) ( +27453 35320) (27454 35331) (27455 35350) (27456 35344) (27457 35340) (27458 35355) (27459 35357) ( +27460 35365) (27461 35382) (27462 35393) (27463 35419) (27464 35410) (27465 35398) (27466 35400) ( +27467 35452) (27468 35437) (27469 35436) (27470 35426) (27471 35461) (27472 35458) (27473 35460) ( +27474 35496) (27475 35489) (27476 35473) (27477 35493) (27478 35494) (27479 35482) (27480 35491) ( +27481 35524) (27482 35533) (27483 35522) (27484 35546) (27485 35563) (27486 35571) (27487 35559) ( +27488 35556) (27489 35569) (27490 35604) (27491 35552) (27492 35554) (27493 35575) (27494 35550) ( +27495 35547) (27496 35596) (27497 35591) (27498 35610) (27499 35553) (27500 35606) (27501 35600) ( +27502 35607) (27503 35616) (27504 35635) (27505 38827) (27506 35622) (27507 35627) (27508 35646) ( +27509 35624) (27510 35649) (27511 35660) (27512 35663) (27513 35662) (27514 35657) (27515 35670) ( +27516 35675) (27517 35674) (27518 35691))] + +[108 ((27681 35679) (27682 35692) (27683 35695) (27684 35700) (27685 35709) (27686 35712) (27687 35724 +) (27688 35726) (27689 35730) (27690 35731) (27691 35734) (27692 35737) (27693 35738) (27694 35898) ( +27695 35905) (27696 35903) (27697 35912) (27698 35916) (27699 35918) (27700 35920) (27701 35925) ( +27702 35938) (27703 35948) (27704 35960) (27705 35962) (27706 35970) (27707 35977) (27708 35973) ( +27709 35978) (27710 35981) (27711 35982) (27712 35988) (27713 35964) (27714 35992) (27715 25117) ( +27716 36013) (27717 36010) (27718 36029) (27719 36018) (27720 36019) (27721 36014) (27722 36022) ( +27723 36040) (27724 36033) (27725 36068) (27726 36067) (27727 36058) (27728 36093) (27729 36090) ( +27730 36091) (27731 36100) (27732 36101) (27733 36106) (27734 36103) (27735 36111) (27736 36109) ( +27737 36112) (27738 40782) (27739 36115) (27740 36045) (27741 36116) (27742 36118) (27743 36199) ( +27744 36205) (27745 36209) (27746 36211) (27747 36225) (27748 36249) (27749 36290) (27750 36286) ( +27751 36282) (27752 36303) (27753 36314) (27754 36310) (27755 36300) (27756 36315) (27757 36299) ( +27758 36330) (27759 36331) (27760 36319) (27761 36323) (27762 36348) (27763 36360) (27764 36361) ( +27765 36351) (27766 36381) (27767 36382) (27768 36368) (27769 36383) (27770 36418) (27771 36405) ( +27772 36400) (27773 36404) (27774 36426))] + +[109 ((27937 36423) (27938 36425) (27939 36428) (27940 36432) (27941 36424) (27942 36441) (27943 36452 +) (27944 36448) (27945 36394) (27946 36451) (27947 36437) (27948 36470) (27949 36466) (27950 36476) ( +27951 36481) (27952 36487) (27953 36485) (27954 36484) (27955 36491) (27956 36490) (27957 36499) ( +27958 36497) (27959 36500) (27960 36505) (27961 36522) (27962 36513) (27963 36524) (27964 36528) ( +27965 36550) (27966 36529) (27967 36542) (27968 36549) (27969 36552) (27970 36555) (27971 36571) ( +27972 36579) (27973 36604) (27974 36603) (27975 36587) (27976 36606) (27977 36618) (27978 36613) ( +27979 36629) (27980 36626) (27981 36633) (27982 36627) (27983 36636) (27984 36639) (27985 36635) ( +27986 36620) (27987 36646) (27988 36659) (27989 36667) (27990 36665) (27991 36677) (27992 36674) ( +27993 36670) (27994 36684) (27995 36681) (27996 36678) (27997 36686) (27998 36695) (27999 36700) ( +28000 36706) (28001 36707) (28002 36708) (28003 36764) (28004 36767) (28005 36771) (28006 36781) ( +28007 36783) (28008 36791) (28009 36826) (28010 36837) (28011 36834) (28012 36842) (28013 36847) ( +28014 36999) (28015 36852) (28016 36869) (28017 36857) (28018 36858) (28019 36881) (28020 36885) ( +28021 36897) (28022 36877) (28023 36894) (28024 36886) (28025 36875) (28026 36903) (28027 36918) ( +28028 36917) (28029 36921) (28030 36856))] + +[110 ((28193 36943) (28194 36944) (28195 36945) (28196 36946) (28197 36878) (28198 36937) (28199 36926 +) (28200 36950) (28201 36952) (28202 36958) (28203 36968) (28204 36975) (28205 36982) (28206 38568) ( +28207 36978) (28208 36994) (28209 36989) (28210 36993) (28211 36992) (28212 37002) (28213 37001) ( +28214 37007) (28215 37032) (28216 37039) (28217 37041) (28218 37045) (28219 37090) (28220 37092) ( +28221 25160) (28222 37083) (28223 37122) (28224 37138) (28225 37145) (28226 37170) (28227 37168) ( +28228 37194) (28229 37206) (28230 37208) (28231 37219) (28232 37221) (28233 37225) (28234 37235) ( +28235 37234) (28236 37259) (28237 37257) (28238 37250) (28239 37282) (28240 37291) (28241 37295) ( +28242 37290) (28243 37301) (28244 37300) (28245 37306) (28246 37312) (28247 37313) (28248 37321) ( +28249 37323) (28250 37328) (28251 37334) (28252 37343) (28253 37345) (28254 37339) (28255 37372) ( +28256 37365) (28257 37366) (28258 37406) (28259 37375) (28260 37396) (28261 37420) (28262 37397) ( +28263 37393) (28264 37470) (28265 37463) (28266 37445) (28267 37449) (28268 37476) (28269 37448) ( +28270 37525) (28271 37439) (28272 37451) (28273 37456) (28274 37532) (28275 37526) (28276 37523) ( +28277 37531) (28278 37466) (28279 37583) (28280 37561) (28281 37559) (28282 37609) (28283 37647) ( +28284 37626) (28285 37700) (28286 37678))] + +[111 ((28449 37657) (28450 37666) (28451 37658) (28452 37667) (28453 37690) (28454 37685) (28455 37691 +) (28456 37724) (28457 37728) (28458 37756) (28459 37742) (28460 37718) (28461 37808) (28462 37804) ( +28463 37805) (28464 37780) (28465 37817) (28466 37846) (28467 37847) (28468 37864) (28469 37861) ( +28470 37848) (28471 37827) (28472 37853) (28473 37840) (28474 37832) (28475 37860) (28476 37914) ( +28477 37908) (28478 37907) (28479 37891) (28480 37895) (28481 37904) (28482 37942) (28483 37931) ( +28484 37941) (28485 37921) (28486 37946) (28487 37953) (28488 37970) (28489 37956) (28490 37979) ( +28491 37984) (28492 37986) (28493 37982) (28494 37994) (28495 37417) (28496 38000) (28497 38005) ( +28498 38007) (28499 38013) (28500 37978) (28501 38012) (28502 38014) (28503 38017) (28504 38015) ( +28505 38274) (28506 38279) (28507 38282) (28508 38292) (28509 38294) (28510 38296) (28511 38297) ( +28512 38304) (28513 38312) (28514 38311) (28515 38317) (28516 38332) (28517 38331) (28518 38329) ( +28519 38334) (28520 38346) (28521 28662) (28522 38339) (28523 38349) (28524 38348) (28525 38357) ( +28526 38356) (28527 38358) (28528 38364) (28529 38369) (28530 38373) (28531 38370) (28532 38433) ( +28533 38440) (28534 38446) (28535 38447) (28536 38466) (28537 38476) (28538 38479) (28539 38475) ( +28540 38519) (28541 38492) (28542 38494))] + +[112 ((28705 38493) (28706 38495) (28707 38502) (28708 38514) (28709 38508) (28710 38541) (28711 38552 +) (28712 38549) (28713 38551) (28714 38570) (28715 38567) (28716 38577) (28717 38578) (28718 38576) ( +28719 38580) (28720 38582) (28721 38584) (28722 38585) (28723 38606) (28724 38603) (28725 38601) ( +28726 38605) (28727 35149) (28728 38620) (28729 38669) (28730 38613) (28731 38649) (28732 38660) ( +28733 38662) (28734 38664) (28735 38675) (28736 38670) (28737 38673) (28738 38671) (28739 38678) ( +28740 38681) (28741 38692) (28742 38698) (28743 38704) (28744 38713) (28745 38717) (28746 38718) ( +28747 38724) (28748 38726) (28749 38728) (28750 38722) (28751 38729) (28752 38748) (28753 38752) ( +28754 38756) (28755 38758) (28756 38760) (28757 21202) (28758 38763) (28759 38769) (28760 38777) ( +28761 38789) (28762 38780) (28763 38785) (28764 38778) (28765 38790) (28766 38795) (28767 38799) ( +28768 38800) (28769 38812) (28770 38824) (28771 38822) (28772 38819) (28773 38835) (28774 38836) ( +28775 38851) (28776 38854) (28777 38856) (28778 38859) (28779 38876) (28780 38893) (28781 40783) ( +28782 38898) (28783 31455) (28784 38902) (28785 38901) (28786 38927) (28787 38924) (28788 38968) ( +28789 38948) (28790 38945) (28791 38967) (28792 38973) (28793 38982) (28794 38991) (28795 38987) ( +28796 39019) (28797 39023) (28798 39024))] + +[113 ((28961 39025) (28962 39028) (28963 39027) (28964 39082) (28965 39087) (28966 39089) (28967 39094 +) (28968 39108) (28969 39107) (28970 39110) (28971 39145) (28972 39147) (28973 39171) (28974 39177) ( +28975 39186) (28976 39188) (28977 39192) (28978 39201) (28979 39197) (28980 39198) (28981 39204) ( +28982 39200) (28983 39212) (28984 39214) (28985 39229) (28986 39230) (28987 39234) (28988 39241) ( +28989 39237) (28990 39248) (28991 39243) (28992 39249) (28993 39250) (28994 39244) (28995 39253) ( +28996 39319) (28997 39320) (28998 39333) (28999 39341) (29000 39342) (29001 39356) (29002 39391) ( +29003 39387) (29004 39389) (29005 39384) (29006 39377) (29007 39405) (29008 39406) (29009 39409) ( +29010 39410) (29011 39419) (29012 39416) (29013 39425) (29014 39439) (29015 39429) (29016 39394) ( +29017 39449) (29018 39467) (29019 39479) (29020 39493) (29021 39490) (29022 39488) (29023 39491) ( +29024 39486) (29025 39509) (29026 39501) (29027 39515) (29028 39511) (29029 39519) (29030 39522) ( +29031 39525) (29032 39524) (29033 39529) (29034 39531) (29035 39530) (29036 39597) (29037 39600) ( +29038 39612) (29039 39616) (29040 39631) (29041 39633) (29042 39635) (29043 39636) (29044 39646) ( +29045 39647) (29046 39650) (29047 39651) (29048 39654) (29049 39663) (29050 39659) (29051 39662) ( +29052 39668) (29053 39665) (29054 39671))] + +[114 ((29217 39675) (29218 39686) (29219 39704) (29220 39706) (29221 39711) (29222 39714) (29223 39715 +) (29224 39717) (29225 39719) (29226 39720) (29227 39721) (29228 39722) (29229 39726) (29230 39727) ( +29231 39730) (29232 39748) (29233 39747) (29234 39759) (29235 39757) (29236 39758) (29237 39761) ( +29238 39768) (29239 39796) (29240 39827) (29241 39811) (29242 39825) (29243 39830) (29244 39831) ( +29245 39839) (29246 39840) (29247 39848) (29248 39860) (29249 39872) (29250 39882) (29251 39865) ( +29252 39878) (29253 39887) (29254 39889) (29255 39890) (29256 39907) (29257 39906) (29258 39908) ( +29259 39892) (29260 39905) (29261 39994) (29262 39922) (29263 39921) (29264 39920) (29265 39957) ( +29266 39956) (29267 39945) (29268 39955) (29269 39948) (29270 39942) (29271 39944) (29272 39954) ( +29273 39946) (29274 39940) (29275 39982) (29276 39963) (29277 39973) (29278 39972) (29279 39969) ( +29280 39984) (29281 40007) (29282 39986) (29283 40006) (29284 39998) (29285 40026) (29286 40032) ( +29287 40039) (29288 40054) (29289 40056) (29290 40167) (29291 40172) (29292 40176) (29293 40201) ( +29294 40200) (29295 40171) (29296 40195) (29297 40198) (29298 40234) (29299 40230) (29300 40367) ( +29301 40227) (29302 40223) (29303 40260) (29304 40213) (29305 40210) (29306 40257) (29307 40255) ( +29308 40254) (29309 40262) (29310 40264))] + +[115 ((29473 40285) (29474 40286) (29475 40292) (29476 40273) (29477 40272) (29478 40281) (29479 40306 +) (29480 40329) (29481 40327) (29482 40363) (29483 40303) (29484 40314) (29485 40346) (29486 40356) ( +29487 40361) (29488 40370) (29489 40388) (29490 40385) (29491 40379) (29492 40376) (29493 40378) ( +29494 40390) (29495 40399) (29496 40386) (29497 40409) (29498 40403) (29499 40440) (29500 40422) ( +29501 40429) (29502 40431) (29503 40445) (29504 40474) (29505 40475) (29506 40478) (29507 40565) ( +29508 40569) (29509 40573) (29510 40577) (29511 40584) (29512 40587) (29513 40588) (29514 40594) ( +29515 40597) (29516 40593) (29517 40605) (29518 40613) (29519 40617) (29520 40632) (29521 40618) ( +29522 40621) (29523 38753) (29524 40652) (29525 40654) (29526 40655) (29527 40656) (29528 40660) ( +29529 40668) (29530 40670) (29531 40669) (29532 40672) (29533 40677) (29534 40680) (29535 40687) ( +29536 40692) (29537 40694) (29538 40695) (29539 40697) (29540 40699) (29541 40700) (29542 40701) ( +29543 40711) (29544 40712) (29545 30391) (29546 40725) (29547 40737) (29548 40748) (29549 40766) ( +29550 40778) (29551 40786) (29552 40788) (29553 40803) (29554 40799) (29555 40800) (29556 40801) ( +29557 40806) (29558 40807) (29559 40812) (29560 40810) (29561 40823) (29562 40818) (29563 40822) ( +29564 40853) (29565 40860) (29566 40864))] + +[116 ((29740 13027) (29741 13024) (29742 13047) (29743 13030) (29744 12956) (29745 12957) (29746 12960 +) (29747 12949) (29752 12957) (29753 12950) (29754 12953) (29755 12958) (29756 12938) (29757 12939) ( +29758 12940) (29759 12941) (29760 12848) (29761 12842) (29762 12843) (29763 12844) (29764 12845) ( +29765 12846) (29766 12847) (29767 12864) (29768 12855) (29769 12850) (29770 12851) (29771 12852) ( +29772 12853) (29773 12854) (29774 12856) (29775 12857) (29776 13182) (29777 13181) (29778 13180) ( +29779 13179) (29808 9332) (29809 9333) (29810 9334) (29811 9335) (29812 9336) (29813 9337) (29814 9338 +) (29815 9339) (29816 9340) (29817 9341) (29818 9342) (29819 12292) (29857 12896) (29858 12897) (29859 + 12898) (29860 12899) (29861 12900) (29862 12901) (29863 12902) (29864 12903) (29865 12904) (29866 +12905) (29867 12906) (29868 12907) (29869 12908) (29870 12909) (29871 12910) (29872 12911) (29873 +12912) (29874 12913) (29875 12914) (29876 12915) (29877 12916) (29878 12917) (29879 12918) (29880 +12919) (29881 12920) (29882 12921) (29883 12922) (29884 12923) (29888 12800) (29889 12801) (29890 +12802) (29891 12803) (29892 12804) (29893 12805) (29894 12806) (29895 12807) (29896 12808) (29897 +12809) (29898 12810) (29899 12811) (29900 12812) (29901 12813) (29902 12814) (29903 12815) (29904 +12816) (29905 12817) (29906 12818) (29907 12819) (29908 12820) (29909 12821) (29910 12822) (29911 +12823) (29912 12824) (29913 12825) (29914 12826) (29915 12827) (29916 12828) (29921 9372) (29922 9373) + (29923 9374) (29924 9375) (29925 9376) (29926 9377) (29927 9378) (29928 9379) (29929 9380) (29930 +9381) (29931 9382) (29932 9383) (29933 9384) (29934 9385) (29935 9386) (29936 9387) (29937 9388) ( +29938 9389) (29939 9390) (29940 9391) (29941 9392) (29942 9393) (29943 9394) (29944 9395) (29945 9396) + (29946 9397) (29947 9343) (29948 9344) (29949 9345) (29950 9346))] + +[117 ((29985 22575 23383) (29986 24590 27079) (29987 24555 36953) (29988 24107 29796) (29989 20956 +34389) (29990 29081 30456) (29991 27963) (29992 35242) (29993 28023) (29994 38651) (29995 27597) ( +29996 26524) (29997 31435) (29998 21407) (29999 21512) (30000 26360) (30001 20837) (30002 20006) ( +30003 24179) (30004 26989) (30005 22577) (30006 36523) (30007 24066) (30008 34987) (30009 35377) ( +30010 35531) (30011 23569) (30012 38291) (30013 39636) (30014 20303) (30015 36554) (30016 36557) ( +30017 37002) (30018 37325) (30019 21152) (30020 22294) (30021 25110) (30022 27425) (30023 27599) ( +30024 32317) (30025 28779) (30026 25991) (30027 23401) (30028 19990) (30029 23433) (30030 25918) ( +30031 27231) (30032 20839) (30033 38364) (30034 21033) (30035 20687) (30036 29702) (30037 27604) ( +30038 24859) (30039 29579) (30040 21029) (30041 22827) (30042 33287) (30043 20809) (30044 33457) ( +30045 33775) (30046 35506) (30047 32946) (30048 25925) (30049 24517) (30050 26781) (30051 23229) ( +30052 24351) (30053 29238) (30054 36890) (30055 34920) (30056 37329) (30057 23531) (30058 24049) ( +30059 25165) (30060 27827) (30061 30465) (30062 21488) (30063 27714) (30064 25910) (30065 33836) ( +30066 19988) (30067 20309) (30068 20195) (30069 20849) (30070 21463) (30071 39080) (30072 27743) ( +30073 25343) (30074 38627) (30075 30028) (30076 20449) (30077 26395) (30078 31354) (30113 27515) ( +30114 29677) (30115 39340) (30116 26399) (30117 38750) (30118 27193) (30119 21450) (30120 32080) ( +30121 34399) (30122 24118) (30123 20803) (30124 20132) (30125 35442) (30126 26410) (30127 32681) ( +30128 24220) (30129 23436) (30130 35542) (30131 37666) (30132 39131) (30133 21629) (30134 24373) ( +30135 21729) (30136 25976) (30137 26519) (30138 25509) (30139 23616) (30140 21451) (30141 21916) ( +30142 28165) (30143 27915) (30144 27138) (30145 23130) (30146 31038) (30147 26089) (30148 24067) ( +30149 26997) (30150 30524) (30151 21966) (30152 29986) (30153 21578) (30154 21733) (30155 33288) ( +30156 21214) (30157 37941) (30158 21462) (30159 31639) (30160 26356) (30161 20853) (30162 36896) ( +30163 31572) (30164 25214) (30165 32631) (30166 22833) (30167 36939) (30168 24418) (30169 26131) ( +30170 32675) (30171 24230) (30172 21322) (30173 34915) (30174 33509) (30175 33267) (30176 35696) ( +30177 36817) (30178 29031) (30179 35722) (30180 22992) (30181 26381) (30182 21063) (30183 39006) ( +30184 33521) (30185 29699) (30186 21315) (30187 24448) (30188 35611) (30189 35336) (30190 25136) ( +30191 26408) (30192 31505) (30193 21151) (30194 33289) (30195 36319) (30196 31070) (30197 27770) ( +30198 27969) (30199 29105) (30200 21531) (30201 31350) (30202 32004) (30203 38587) (30204 30452) ( +30205 21476) (30206 40643))] + +[118 ((30273 9398) (30274 9399) (30275 9400) (30276 9401) (30277 9402) (30278 9403) (30279 9404) ( +30280 9405) (30281 9406) (30282 9407) (30283 9408) (30284 9409) (30285 9410) (30286 9411) (30287 9412) + (30288 9413) (30289 9414) (30290 9415) (30291 9416) (30292 9417) (30293 9418) (30294 9419) (30295 +9420) (30296 9421) (30297 9422) (30298 9423) (30299 9322) (30300 9323) (30301 9324) (30302 9325) ( +30303 9326) (30305 9424) (30306 9425) (30307 9426) (30308 9427) (30309 9428) (30310 9429) (30311 9430) + (30312 9431) (30313 9432) (30314 9433) (30315 9434) (30316 9435) (30317 9436) (30318 9437) (30319 +9438) (30320 9439) (30321 9440) (30322 9441) (30323 9442) (30324 9443) (30325 9444) (30326 9445) ( +30327 9446) (30328 9447) (30329 9448) (30330 9449) (30331 9327) (30332 9328) (30333 9329) (30334 9330) + (30395 9331) (30396 9450))] + +[224 ((57381 1642) (57388 1548) (57390 1748) (57392 1632) (57393 1633) (57394 1634) (57395 1635) ( +57396 1636) (57397 1637) (57398 1638) (57399 1639) (57400 1640) (57401 1641) (57403 1563) (57407 1567) + (57409 1569) (57410 1570) (57411 1571) (57412 1572) (57413 1573) (57414 1574) (57415 1575) (57416 +1576) (57417 1577) (57418 1578) (57419 1579) (57420 1580) (57421 1581) (57422 1582) (57423 1583) ( +57424 1584) (57425 1585) (57426 1586) (57427 1587) (57428 1588) (57429 1589) (57430 1590) (57431 1591) + (57432 1592) (57433 1593) (57434 1594) (57440 1600) (57441 1601) (57442 1602) (57443 1603) (57444 +1604) (57445 1605) (57446 1606) (57447 1607) (57448 1608) (57449 1609) (57450 1610) (57451 1611) ( +57452 1612) (57453 1613) (57454 1614) (57455 1615) (57456 1616) (57457 1617) (57458 1618) (57459 1648) + (57460 1649) (57461 1643) (57462 1644) (57505 1700) (57506 1662) (57507 1670) (57508 1688) (57509 +1711) (57510 1728) (57511 1657) (57512 1672) (57513 1681) (57514 1722) (57515 1726) (57516 1729) ( +57517 1731) (57518 1730) (57519 1746) (57521 1660) (57522 1665) (57523 1669) (57524 1673) (57525 1683) + (57526 1686) (57527 1690) (57528 1724) (57529 1744) (57530 1741) (57531 1650) (57532 1651) (57533 +1747) (57534 1749) (57535 64467) (57536 1735) (57537 1734) (57538 1736) (57539 64477) (57540 1739) ( +57541 1733) (57542 1737) (57543 1652) (57544 1653) (57545 1654) (57546 1666) (57547 1655) (57548 1656) + (57549 1661) (57550 1674) (57551 1675) (57552 1707) (57553 1679) (57554 1680) (57555 1740) (57556 +1659) (57557 1664) (57558 1658) (57559 1663) (57560 1702) (57561 1668) (57562 1667) (57563 1671) ( +57564 1677) (57565 1676) (57566 1678) (57567 1705) (57568 1715) (57569 1713) (57570 1723) (57571 1682) + (57572 1684) (57573 1685) (57574 1687) (57575 1689) (57576 1691) (57577 1692) (57578 1693) (57579 +1694) (57580 1695) (57581 1696) (57582 1697) (57583 1698) (57584 1699) (57585 1701) (57586 1703) ( +57587 1704) (57588 1706) (57589 1708) (57590 1709) (57592 1710) (57593 1712) (57594 1714) (57595 1716) + (57596 8206) (57597 8207) (57598 8205))] + +[225 ((57634 1438) (57636 8362) (57639 1436) (57644 44) (57645 8209) (57658 1475) (57659 59) (57664 +1488) (57665 1489) (57666 1490) (57667 1491) (57668 1492) (57669 1493) (57670 1494) (57671 1495) ( +57672 1496) (57673 1497) (57674 1498) (57675 1499) (57676 1500) (57677 1501) (57678 1502) (57679 1503) + (57680 1504) (57681 1505) (57682 1506) (57683 1507) (57684 1508) (57685 1509) (57686 1510) (57687 +1511) (57688 1512) (57689 1513) (57690 1514) (57691 64305) (57692 64315) (57693 64324) (57694 64298) ( +57695 64299) (57696 64300) (57697 64301) (57698 64302) (57699 64303) (57700 64331) (57701 64332) ( +57702 64333) (57703 64334) (57704 64335) (57705 64287) (57706 64288) (57707 64289) (57708 64290) ( +57709 64291) (57710 64292) (57711 64293) (57712 64294) (57713 64295) (57714 64296) (57715 64297) ( +57716 1520) (57717 1521) (57718 1522) (57719 64304) (57720 64306) (57721 64307) (57722 64308) (57723 +64309) (57724 64310) (57725 64312) (57726 64313) (57761 64314) (57762 64316) (57763 64318) (57764 +64320) (57765 64321) (57766 64323) (57767 64326) (57768 64327) (57769 64328) (57770 64329) (57771 +64330) (57793 1460) (57794 1461) (57795 1462) (57796 1467) (57797 1464) (57798 1463) (57799 1456) ( +57800 1458) (57801 1457) (57802 1459) (57803 1474) (57804 1473) (57806 1465) (57807 1468) (57839 1469) + (57840 64286) (57841 1471) (57842 1472))] + +[226 ((57889 776) (57890 771) (57891 774) (57892 775) (57893 865) (57894 820) (57895 801) (57896 802) +(57897 805) (57898 812) (57899 804) (57900 810) (57901 811) (57902 809) (57903 797) (57904 803) (57905 + 798) (57906 796) (57907 799) (57908 800) (57909 860) (57910 724) (57911 725) (57914 720) (57915 721) +(57916 825) (57917 796) (57918 712) (57919 716) (57920 772) (57921 817) (57922 769) (57923 791) (57924 + 768) (57925 790) (57926 770) (57927 780) (57928 788) (57929 787) (57930 702) (57937 105) (57938 121) +(57939 617) (57940 618) (57941 655) (57942 101) (57943 248) (57944 603) (57945 339) (57946 230) (57947 + 97) (57948 630) (57949 616) (57950 649) (57951 601) (57952 602) (57953 629) (57954 604) (57955 592) ( +57956 623) (57957 117) (57958 631) (57959 650) (57960 612) (57961 111) (57962 652) (57963 596) (57964 +593) (57965 594) (57966 600) (57967 605) (57968 606) (57969 639) (57970 645) (57971 666) (57980 644) ( +57981 619) (57982 608) (58017 109) (58018 112) (58019 98) (58020 632) (58021 946) (58022 613) (58023 +653) (58024 119) (58025 595) (58026 664) (58027 625) (58028 102) (58029 118) (58030 651) (58031 110) ( +58032 116) (58033 100) (58034 952) (58035 240) (58036 446) (58037 443) (58038 115) (58039 122) (58040 +963) (58041 397) (58042 633) (58043 620) (58044 622) (58045 108) (58046 636) (58047 634) (58048 114) ( +58049 638) (58050 599) (58051 647) (58052 663) (58053 662) (58054 627) (58055 648) (58056 598) (58057 +642) (58058 656) (58059 635) (58060 621) (58061 637) (58062 597) (58063 657) (58064 643) (58065 658) ( +58066 646) (58067 659) (58068 426) (58069 442) (58070 615) (58071 626) (58072 99) (58073 607) (58074 +231) (58075 669) (58076 654) (58077 331) (58078 107) (58079 609) (58080 120) (58081 611) (58082 624) ( +58083 608) (58084 628) (58085 414) (58086 113) (58087 610) (58088 967) (58089 641) (58090 640) (58091 +295) (58092 661) (58093 660) (58094 104) (58095 614) (58096 665) (58097 667) (58098 668) (58099 669) ( +58100 670) (58101 671) (58102 672) (58103 673) (58104 674) (58105 675) (58106 676) (58107 677) (58108 +678) (58109 679) (58110 680))] + +[227 ((58146 12645) (58147 12646) (58148 12647) (58149 12648) (58150 12649) (58151 12650) (58152 12651 +) (58153 12652) (58154 12653) (58155 12654) (58156 12655) (58157 12656) (58158 12657) (58159 12658) ( +58160 12659) (58161 12660) (58162 12661) (58163 12662) (58164 12663) (58165 12664) (58166 12665) ( +58167 12666) (58168 12667) (58169 12668) (58170 12669) (58171 12670) (58172 12671) (58173 12672) ( +58174 12673) (58175 12674) (58176 12675) (58177 12676) (58178 12677) (58179 12678) (58180 12679) ( +58181 12680) (58182 12681) (58183 12682) (58184 12683) (58185 12684) (58186 12685) (58187 12686) ( +58273 32) (58274 8361) (58305 4352) (58306 4353) (58307 4522) (58308 4354) (58309 4524) (58310 4525) ( +58311 4355) (58312 4356) (58313 4357) (58314 4528) (58315 4529) (58316 4530) (58317 4531) (58318 4532) + (58319 4533) (58320 4534) (58321 4358) (58322 4359) (58323 4360) (58324 4537) (58325 4361) (58326 +4362) (58327 4363) (58328 4364) (58329 4365) (58330 4366) (58331 4367) (58332 4368) (58333 4369) ( +58334 4370) (58338 4449) (58339 4450) (58340 4451) (58341 4452) (58342 4453) (58343 4454) (58346 4455) + (58347 4456) (58348 4457) (58349 4458) (58350 4459) (58351 4460) (58354 4461) (58355 4462) (58356 +4463) (58357 4464) (58358 4465) (58359 4466) (58362 4467) (58363 4468) (58364 4469))] + +[228 ((58401 4304) (58402 4305) (58403 4306) (58404 4307) (58405 4308) (58406 4309) (58407 4310) ( +58408 4337) (58409 4311) (58410 4312) (58411 4313) (58412 4314) (58413 4315) (58414 4316) (58415 4338) + (58416 4317) (58417 4318) (58418 4319) (58419 4320) (58420 4321) (58421 4322) (58422 4323) (58423 +4339) (58424 4324) (58425 4325) (58426 4326) (58427 4327) (58428 4328) (58429 4329) (58430 4330) ( +58431 4331) (58432 4332) (58433 4333) (58434 4334) (58435 4340) (58436 4335) (58437 4336) (58438 4341) + (58439 4342) (58446 1417) (58447 4347) (58449 4256) (58450 4257) (58451 4258) (58452 4259) (58453 +4260) (58454 4261) (58455 4262) (58456 4289) (58457 4263) (58458 4264) (58459 4265) (58460 4266) ( +58461 4267) (58462 4268) (58463 4290) (58464 4269) (58465 4270) (58466 4271) (58467 4272) (58468 4273) + (58469 4274) (58470 4275) (58471 4291) (58472 4276) (58473 4277) (58474 4278) (58475 4279) (58476 +4280) (58477 4281) (58478 4282) (58479 4283) (58480 4284) (58481 4285) (58482 4286) (58483 4292) ( +58484 4287) (58485 4288) (58486 4293) (58529 1329) (58530 1330) (58531 1331) (58532 1332) (58533 1333) + (58534 1334) (58535 1335) (58536 1336) (58537 1337) (58538 1338) (58539 1339) (58540 1340) (58541 +1341) (58542 1342) (58543 1343) (58544 1344) (58545 1345) (58546 1346) (58547 1347) (58548 1348) ( +58549 1349) (58550 1350) (58551 1351) (58552 1352) (58553 1353) (58554 1354) (58555 1355) (58556 1356) + (58557 1357) (58558 1358) (58559 1359) (58560 1360) (58561 1361) (58562 1362) (58563 1363) (58564 +1364) (58565 1365) (58566 1366) (58569 1369) (58570 1417) (58571 1370) (58572 1371) (58573 1372) ( +58574 1373) (58575 1374) (58576 1375) (58577 1377) (58578 1378) (58579 1379) (58580 1380) (58581 1381) + (58582 1382) (58583 1383) (58584 1384) (58585 1385) (58586 1386) (58587 1387) (58588 1388) (58589 +1389) (58590 1390) (58591 1391) (58592 1392) (58593 1393) (58594 1394) (58595 1395) (58596 1396) ( +58597 1397) (58598 1398) (58599 1399) (58600 1400) (58601 1401) (58602 1402) (58603 1403) (58604 1404) + (58605 1405) (58606 1406) (58607 1407) (58608 1408) (58609 1409) (58610 1410) (58611 1411) (58612 +1412) (58613 1413) (58614 1414) (58616 64275) (58617 64276) (58618 64277) (58619 64278) (58620 64279) +(58622 1415))] + +[229 ((58657 2406) (58658 2407) (58659 2408) (58660 2409) (58661 2410) (58662 2411) (58663 2412) ( +58664 2413) (58665 2414) (58666 2415) (58671 8360) (58736 2378) (58737 2385) (58738 2386) (58739 2387) + (58740 2388) (58741 2405) (58785 2305) (58786 2306) (58787 2307) (58788 2317) (58789 2309) (58790 +2310) (58791 2311) (58792 2312) (58793 2313) (58794 2314) (58795 2315) (58796 2400) (58797 2316) ( +58798 2401) (58800 2319) (58801 2320) (58802 2321) (58803 2322) (58804 2323) (58805 2324) (58807 2325) + (58808 2392) (58809 2326) (58810 2393) (58811 2327) (58812 2394) (58813 2328) (58814 2329) (58815 +2330) (58816 2331) (58817 2332) (58818 2395) (58819 2333) (58820 2334) (58821 2335) (58822 2336) ( +58823 2337) (58824 2396) (58825 2338) (58826 2397) (58827 2339) (58828 2340) (58829 2341) (58830 2342) + (58831 2343) (58832 2344) (58833 2345) (58834 2346) (58835 2347) (58836 2398) (58837 2348) (58838 +2349) (58839 2350) (58840 2351) (58841 2399) (58842 2352) (58843 2353) (58844 2354) (58845 2355) ( +58846 2356) (58847 2357) (58848 2358) (58849 2359) (58850 2360) (58851 2361) (58854 2366) (58855 2367) + (58856 2368) (58857 2369) (58858 2370) (58859 2371) (58860 2372) (58861 2402) (58862 2403) (58863 +2364) (58864 2375) (58865 2376) (58866 2373) (58868 2379) (58869 2380) (58870 2374) (58871 2381) ( +58872 2416) (58873 2365) (58874 2384) (58875 2404) (58876 2377) (58877 8360) (58878 2381))] + +[230 ((58913 2534) (58914 2535) (58915 2536) (58916 2537) (58917 2538) (58918 2539) (58919 2540) ( +58920 2541) (58921 2542) (58922 2543) (58928 2547) (58929 2548) (58930 2549) (58931 2550) (58932 2552) + (58933 2546) (58934 2553) (58935 2551) (59041 2433) (59042 2434) (59043 2435) (59045 2437) (59046 +2438) (59047 2439) (59048 2440) (59049 2441) (59050 2442) (59051 2443) (59052 2528) (59053 2444) ( +59054 2529) (59056 2447) (59057 2448) (59060 2451) (59061 2452) (59063 2453) (59065 2454) (59067 2455) + (59069 2456) (59070 2457) (59071 2458) (59072 2459) (59073 2460) (59075 2461) (59076 2462) (59077 +2463) (59078 2464) (59079 2465) (59080 2524) (59081 2466) (59082 2525) (59083 2467) (59084 2468) ( +59085 2469) (59086 2470) (59087 2471) (59088 2472) (59090 2474) (59091 2475) (59093 2476) (59094 2477) + (59095 2478) (59096 2479) (59097 2527) (59098 2480) (59099 2544) (59100 2482) (59103 2545) (59104 +2486) (59105 2487) (59106 2488) (59107 2489) (59108 2492) (59109 160) (59110 2494) (59111 2495) (59112 + 2496) (59113 2497) (59114 2498) (59115 2499) (59116 2500) (59117 2530) (59118 2531) (59120 2503) ( +59121 2504) (59124 2507) (59125 2508) (59127 2509) (59130 2554) (59131 2404))] + +[231 ((59170 2562) (59173 2565) (59174 2566) (59175 2567) (59176 2568) (59177 2569) (59178 2570) ( +59183 2575) (59184 2576) (59187 2579) (59188 2580) (59189 2581) (59190 2582) (59191 2583) (59192 2584) + (59193 2585) (59194 2586) (59195 2587) (59196 2588) (59197 2589) (59198 2590) (59199 2591) (59200 +2592) (59201 2593) (59202 2594) (59203 2595) (59204 2596) (59205 2597) (59206 2598) (59207 2599) ( +59208 2600) (59210 2602) (59211 2603) (59212 2604) (59213 2605) (59214 2606) (59215 2607) (59216 2608) + (59218 2610) (59219 2611) (59221 2613) (59222 2614) (59224 2616) (59225 2617) (59228 2620) (59230 +2622) (59231 2623) (59232 2624) (59233 2625) (59234 2626) (59239 2631) (59240 2632) (59243 2635) ( +59244 2636) (59245 2637) (59257 2649) (59258 2650) (59259 2651) (59260 2652) (59262 2654))] + +[232 ((59425 3585) (59426 3586) (59427 3587) (59428 3588) (59429 3589) (59430 3590) (59431 3591) ( +59432 3592) (59433 3593) (59434 3594) (59435 3595) (59436 3596) (59437 3597) (59438 3598) (59439 3599) + (59440 3600) (59441 3601) (59442 3602) (59443 3603) (59444 3604) (59445 3605) (59446 3606) (59447 +3607) (59448 3608) (59449 3609) (59450 3610) (59451 3611) (59452 3612) (59453 3613) (59454 3614) ( +59455 3615) (59456 3616) (59457 3617) (59458 3618) (59459 3619) (59460 3620) (59461 3621) (59462 3622) + (59463 3623) (59464 3624) (59465 3625) (59466 3626) (59467 3627) (59468 3628) (59469 3629) (59470 +3630) (59471 3631) (59472 3632) (59473 3633) (59474 3634) (59475 3635) (59476 3636) (59477 3637) ( +59478 3638) (59479 3639) (59480 3640) (59481 3641) (59482 3642) (59487 3647) (59488 3648) (59489 3649) + (59490 3650) (59491 3651) (59492 3652) (59493 3653) (59494 3654) (59495 3655) (59496 3656) (59497 +3657) (59498 3658) (59499 3659) (59500 3660) (59501 3661) (59502 3662) (59503 3663) (59504 3664) ( +59505 3665) (59506 3666) (59507 3667) (59508 3668) (59509 3669) (59510 3670) (59511 3671) (59512 3672) + (59513 3673) (59514 3674) (59515 3675) (59553 3713) (59554 3714) (59556 3716) (59559 3719) (59560 +3720) (59562 3722) (59565 3725) (59572 3732) (59573 3733) (59574 3734) (59575 3735) (59577 3737) ( +59578 3738) (59579 3739) (59580 3740) (59581 3741) (59582 3742) (59583 3743) (59585 3745) (59586 3746) + (59587 3747) (59589 3749) (59591 3751) (59594 3754) (59595 3755) (59597 3757) (59598 3758) (59599 +3759) (59600 3760) (59601 3761) (59602 3762) (59603 3763) (59604 3764) (59605 3765) (59606 3766) ( +59607 3767) (59608 3768) (59609 3769) (59611 3771) (59612 3772) (59613 3773) (59616 3776) (59617 3777) + (59618 3778) (59619 3779) (59620 3780) (59621 3773) (59622 3782) (59624 3784) (59625 3785) (59626 +3786) (59627 3787) (59628 3788) (59629 3789) (59632 3792) (59633 3793) (59634 3794) (59635 3795) ( +59636 3796) (59637 3797) (59638 3798) (59639 3799) (59640 3800) (59641 3801) (59644 3804) (59645 3805) +)] + +[235 ((60193 8473) (60194 8459) (60195 8464) (60196 8779) (60197 8860) (60198 8455) (60199 818) (60200 + 8253) (60201 8984) (60203 8460) (60205 120125) (60206 8645) (60207 8693) (60208 8674) (60209 8803) ( +60210 8845) (60211 10941) (60212 10773) (60213 10774) (60214 8751) (60215 8752) (60219 9635) (60220 +8259) (60221 8524) (60222 9878) (60223 8353) (60224 9608) (60225 9764) (60226 8456) (60228 9775) ( +60229 9785) (60230 9855) (60231 9642) (60235 8985) (60236 9700) (60237 9701) (60238 9698) (60239 9699) + (60240 8533) (60241 8534) (60242 8535) (60243 8536) (60244 8537) (60245 8538) (60246 9833) (60249 +8749) (60250 9702) (60254 8499) (60255 8981) (60262 8721) (60267 9632) (60268 9656) (60269 9666) ( +60270 8226) (60271 8495) (60273 8472) (60275 8482) (60276 8482) (60279 9633) (60280 9643) (60281 9702) + (60282 8891) (60283 8493) (60284 8488) (60285 8359) (60326 9676) (60327 9645) (60328 9649) (60330 +8480) (60331 8402) (60332 8403) (60334 8408) (60335 8410) (60336 8409) (60337 8404) (60338 8405) ( +60339 8825) (60340 8824) (60343 8774) (60344 8892) (60345 8893) (60347 8716) (60348 8462) (60350 9769) + (60351 9747) (60353 8754) (60354 8755) (60355 8753) (60356 8887) (60357 8886) (60358 8766) (60359 +8763) (60363 8669) (60364 8668) (60365 8967) (60368 8489) (60369 8554) (60370 8555) (60383 9694) ( +60384 9693) (60385 9695) (60386 9692))] + +[236 ((60450 9755) (60451 9754) (60453 9986) (60454 9988) (60455 9742) (60456 10002) (60458 10003) ( +60459 65291) (60462 9733) (60463 9734) (60464 42) (60480 64) (60486 10008) (60490 9988) (60491 9743) ( +60492 10001) (60494 9989) (60496 64) (60497 9686) (60531 10133) (60535 9754) (60600 9312) (60601 9313) + (60602 9314) (60603 9315) (60604 9316) (60605 9317) (60606 9318) (60607 9319) (60608 9320) (60609 +9321) (60610 10112) (60611 10113) (60612 10114) (60613 10115) (60614 10116) (60615 10117) (60616 10118 +) (60617 10119) (60618 10120) (60619 10121) (60620 10122) (60621 10123) (60622 10124) (60623 10125) ( +60624 10126) (60625 10127) (60626 10128) (60627 10129) (60628 10130) (60629 10131) (60640 9679) (60641 + 9685) (60642 9682) (60643 9681) (60644 9684) (60645 9675) (60661 9680) (60662 9683) (60663 10077) ( +60664 10078) (60665 10072))] + +[237 ((60705 9985) (60706 9986) (60707 9987) (60708 9988) (60709 9742) (60710 9990) (60711 9991) ( +60712 9992) (60713 9993) (60714 9755) (60715 9758) (60716 9996) (60717 9997) (60718 9998) (60719 9999) + (60720 10000) (60721 10001) (60722 10002) (60723 10004) (60724 10005) (60725 10006) (60727 10008) ( +60728 10009) (60729 10010) (60730 10011) (60731 10012) (60732 10013) (60733 10014) (60734 10015) ( +60735 10017) (60736 10018) (60737 10019) (60738 10020) (60739 10021) (60740 10022) (60741 10023) ( +60742 10025) (60743 10026) (60744 10027) (60745 10028) (60746 10029) (60747 10030) (60748 10031) ( +60749 10032) (60750 10033) (60751 10034) (60752 10035) (60753 10036) (60754 10037) (60755 10038) ( +60756 10039) (60757 10040) (60758 10041) (60759 10042) (60760 10043) (60761 10044) (60762 10045) ( +60763 10046) (60764 10047) (60765 10048) (60766 10049) (60767 10050) (60768 10051) (60769 10052) ( +60770 10053) (60771 10054) (60772 10055) (60773 10056) (60774 10057) (60775 10058) (60776 10059) ( +60777 10061) (60778 10063) (60779 10064) (60780 10065) (60781 10066) (60782 10070) (60783 9687) (60784 + 10073) (60785 10074) (60786 10081) (60787 10082) (60788 10083) (60789 10084) (60790 10085) (60791 +10086) (60792 10087) (60793 10102) (60794 10103) (60795 10104) (60796 10105) (60797 10106) (60798 +10107) (60833 10108) (60834 10109) (60835 10110) (60836 10111) (60837 10132) (60838 10136) (60839 +10137) (60840 10138) (60841 10139) (60842 10140) (60843 10141) (60844 10142) (60845 10143) (60846 +10144) (60847 10146) (60848 10147) (60849 10148) (60850 10149) (60851 10150) (60852 10151) (60853 +10152) (60854 10153) (60855 10154) (60856 10155) (60857 10156) (60858 10157) (60859 10158) (60860 +10159) (60861 10161) (60862 10162) (60863 10163) (60864 10164) (60865 10165) (60866 10166) (60867 +10167) (60868 10168) (60869 10169) (60870 10170) (60871 10171) (60872 10172) (60873 10173) (60874 +10174) (60899 10075) (60900 10076))] + +[238 ((60961 8196) (60962 8197) (60963 8202) (60964 8200) (60965 8231) (60966 8974) (60967 8975) ( +60968 8972) (60969 8973) (60970 9646) (60971 8724) (60972 1644) (60973 8722) (60974 1643) (60975 8463) + (60976 8812) (60977 8448) (60979 9743) (60980 8758) (60981 33) (60982 8870) (60983 9007) (60984 9008) + (60985 437) (60986 8962) (60987 8760) (60988 8726) (60989 8793) (60990 8794) (60991 8903) (60992 8454 +) (60993 9688) (60994 8782) (60995 8475) (60996 8466) (60997 8710) (60998 8977) (60999 8248) (61000 +8452) (61001 9188) (61002 9649) (61003 9005) (61004 8978) (61005 8979) (61006 9006) (61007 8982) ( +61008 8644) (61009 8661) (61010 8847) (61011 8848) (61012 402) (61013 9689) (61014 8898) (61015 8899) +(61021 8987) (61024 9617) (61025 9619) (61026 8914) (61027 8915) (61028 8762) (61031 8728) (61032 8770 +) (61033 8705) (61034 8976) (61035 8242) (61036 8822) (61037 8823) (61038 8818) (61039 8819) (61040 +8868) (61041 8708) (61042 8802) (61043 8968) (61044 8970) (61045 124) (61046 8969) (61047 8971) (61048 + 8778) (61049 8783) (61050 8252) (61051 8245) (61052 8739) (61053 8727) (61054 8764) (61089 8890) ( +61090 8228) (61091 8229) (61092 11157) (61093 11013) (61094 11014) (61095 11015) (61096 8680) (61097 +8678) (61098 8679) (61099 8681) (61100 8592) (61101 8593) (61102 8594) (61103 8595) (61104 9654) ( +61105 9664) (61106 9655) (61107 9665) (61108 8901) (61109 8597) (61110 8616) (61111 9074) (61112 9073) + (61113 9608) (61114 9604) (61115 9616) (61116 9612) (61117 9600) (61118 9668) (61119 9658) (61120 +9067) (61121 9042) (61122 9035) (61123 9021) (61124 9033) (61125 9055) (61126 9054) (61127 9017) ( +61128 9023) (61129 9024) (61130 8965) (61131 9828) (61132 9829) (61133 9830) (61134 9831) (61136 9038) + (61137 9045) (61138 9053) (61139 9014) (61140 9019) (61141 9835) (61142 8905) (61143 8906) (61144 +8907) (61145 8908) (61146 8966) (61147 8891) (61148 9015) (61149 8735) (61150 9644) (61151 9787) ( +61152 9131) (61153 9130) (61154 9132) (61155 9133) (61156 9127) (61157 9129) (61158 9128) (61159 9136) + (61160 9137) (61161 8911) (61162 8910) (61163 8884) (61164 8885) (61165 8992) (61166 8993) (61167 +9130) (61168 9026) (61170 8630) (61171 8631) (61172 8634) (61173 8635) (61174 8651) (61175 8602) ( +61176 8603) (61177 8622) (61178 8653) (61179 8655) (61180 8654) (61181 8909) (61182 8769))] + +[239 ((61217 160) (61218 8209) (61219 173) (61220 8211) (61221 8212) (61222 8210) (61223 39) (61224 +8222) (61225 8220) (61226 8249) (61227 8250) (61228 8192) (61229 8193) (61230 8199) (61231 8201) ( +61232 8224) (61233 8225) (61234 9001) (61235 9002) (61236 9758) (61237 9756) (61238 8866) (61239 8867) + (61240 8872) (61241 10980) (61242 12310) (61243 12311) (61244 8598) (61245 8600) (61246 8599) (61247 +8601) (61248 8453) (61249 8240) (61250 8810) (61251 8811) (61252 8814) (61253 8815) (61254 8739) ( +61255 8740) (61256 8741) (61257 8742) (61258 8712) (61259 8713) (61260 8715) (61261 8656) (61262 8660) + (61263 8658) (61264 8652) (61265 8646) (61266 8596) (61267 8605) (61270 8745) (61271 8746) (61272 +8839) (61273 8838) (61274 8835) (61275 8834) (61276 8841) (61277 8840) (61278 8837) (61279 8836) ( +61280 9746) (61281 8709) (61282 8853) (61283 8854) (61284 8855) (61285 8856) (61286 8226) (61287 8728) + (61288 8463) (61289 8467) (61290 172) (61291 166) (61292 8736) (61293 8737) (61294 8759) (61295 8757) + (61296 8869) (61297 8733) (61298 8801) (61299 8784) (61300 8799) (61301 8747) (61302 8750) (61303 +8771) (61304 8773) (61305 8776) (61306 8721) (61307 8719) (61308 8730) (61309 8723) (61310 9618) ( +61345 8354) (61346 402) (61347 8355) (61348 8359) (61349 8352) (61350 36) (61351 8501) (61352 8470) ( +61353 8478) (61354 8481) (61355 658) (61356 8450) (61357 8469) (61358 8477) (61359 8484) (61360 8968) +(61361 8969) (61362 8970) (61363 8971) (61364 8707) (61365 8704) (61366 8896) (61367 8897) (61368 8718 +) (61369 8711) (61370 8706) (61371 9280) (61372 9282) (61373 9281) (61374 9190) (61375 8215) (61376 +8978) (61377 8544) (61378 8545) (61379 8546) (61380 8547) (61381 8548) (61382 8549) (61383 8550) ( +61384 8551) (61385 8552) (61386 8553) (61387 9824) (61388 9825) (61389 9826) (61390 9827) (61391 10003 +) (61392 10007) (61393 9312) (61394 9313) (61395 9314) (61396 9315) (61397 9316) (61398 9317) (61399 +9318) (61400 9319) (61401 9320) (61402 9321) (61406 9774) (61407 9786) (61408 9760) (61409 9475) ( +61410 9473) (61411 9547) (61412 9474) (61413 9472) (61414 9532) (61415 9737) (61416 9789) (61417 9790) + (61418 9791) (61419 9795) (61420 9796) (61421 9797) (61422 9798) (61423 9799) (61424 9810) (61425 +9811) (61426 9800) (61427 9801) (61428 9802) (61429 9803) (61430 9804) (61431 9805) (61432 9806) ( +61433 9807) (61434 9808) (61435 9809) (61436 9742) (61437 8531) (61438 8532))] + +[240 ((61473 64256) (61474 64259) (61475 64260) (61476 64257) (61477 64258) (61478 64261) (61481 64262 +) (61552 188) (61553 189) (61554 190) (61555 8531) (61556 8532) (61557 8539) (61558 8540) (61559 8541) + (61560 8542) (61561 8543) (61608 9227) (61609 9225) (61610 9226) (61611 9228) (61612 9229) (61613 +9252) (61616 9216) (61617 8196) (61618 8197) (61619 8198) (61620 8192) (61621 8193) (61622 8200) ( +61623 8200) (61624 8595) (61625 8594) (61626 8628) (61627 8609) (61628 8592) (61629 8629) (61630 10550 +) (61635 8227) (61636 9679) (61639 65533) (61666 10692) (61692 183) (61693 384) (61694 9251))] + +[241 ((61729 192) (61730 193) (61731 194) (61732 195) (61733 256) (61734 258) (61735 196) (61736 197) +(61737 260) (61738 262) (61739 264) (61740 266) (61741 199) (61742 268) (61743 270) (61744 200) (61745 + 201) (61746 202) (61747 274) (61748 278) (61749 203) (61750 280) (61751 282) (61752 500) (61753 284) +(61754 286) (61755 288) (61756 290) (61757 292) (61758 204) (61759 461) (61760 206) (61761 296) (61762 + 298) (61763 304) (61764 207) (61765 302) (61766 308) (61767 310) (61768 313) (61769 315) (61770 317) +(61771 323) (61772 209) (61773 325) (61774 327) (61775 210) (61776 211) (61777 212) (61778 213) (61779 + 332) (61780 214) (61781 336) (61782 340) (61783 342) (61784 344) (61785 346) (61786 348) (61787 350) +(61788 352) (61789 354) (61790 356) (61791 217) (61792 218) (61793 219) (61794 360) (61795 362) (61796 + 364) (61797 220) (61798 366) (61799 368) (61800 370) (61801 372) (61802 7922) (61803 221) (61804 374) + (61805 376) (61806 377) (61807 379) (61808 381) (61812 7884) (61813 562) (61814 482) (61817 461) ( +61818 276) (61821 486) (61822 300) (61857 224) (61858 225) (61859 226) (61860 227) (61861 257) (61862 +259) (61863 228) (61864 229) (61865 261) (61866 263) (61867 265) (61868 267) (61869 231) (61870 269) ( +61871 271) (61872 232) (61873 233) (61874 234) (61875 275) (61876 279) (61877 235) (61878 281) (61879 +283) (61880 501) (61881 285) (61882 287) (61883 289) (61884 291) (61885 293) (61886 236) (61887 237) ( +61888 238) (61889 297) (61890 299) (61892 239) (61893 303) (61894 309) (61895 311) (61896 314) (61897 +316) (61898 318) (61899 324) (61900 241) (61901 326) (61902 328) (61903 242) (61904 243) (61905 244) ( +61906 245) (61907 333) (61908 246) (61909 337) (61910 341) (61911 343) (61912 345) (61913 347) (61914 +349) (61915 351) (61916 353) (61917 355) (61918 357) (61919 249) (61920 250) (61921 251) (61922 361) ( +61923 363) (61924 365) (61925 252) (61926 367) (61927 369) (61928 371) (61929 373) (61930 7923) (61931 + 253) (61932 375) (61933 255) (61934 378) (61935 380) (61936 382) (61940 7885) (61941 563) (61942 483) + (61945 462) (61946 277) (61949 487) (61950 301))] + +[242 ((61986 463) (61989 465) (61990 334) (61993 490) (61994 467) (62001 7692) (62002 7716) (62003 +7778) (62004 7788) (62114 464) (62117 466) (62118 335) (62121 491) (62122 468) (62123 363) (62127 7695 +) (62128 7791) (62129 7693) (62130 7717) (62131 7779) (62132 7789))] + +[243 ((62241 7937) (62242 7945) (62243 7936) (62244 7944) (62245 8049) (62246 8123) (62247 8048) ( +62248 8122) (62249 8118) (62251 7941) (62252 7949) (62253 7939) (62254 7949) (62255 7943) (62256 7951) + (62257 7940) (62258 7948) (62259 7938) (62260 7946) (62261 7942) (62262 7950) (62263 8115) (62264 +8124) (62265 8065) (62266 8073) (62267 8064) (62268 8072) (62269 8116) (62271 8114) (62273 8119) ( +62275 8069) (62276 8077) (62277 8067) (62278 8075) (62279 8071) (62280 8079) (62281 8068) (62282 8076) + (62283 8066) (62284 8074) (62285 8070) (62286 8078) (62287 7953) (62288 7961) (62289 7952) (62290 +7960) (62291 8051) (62292 8137) (62293 8050) (62294 8136) (62295 7957) (62296 7965) (62297 7955) ( +62298 7963) (62299 7956) (62300 7964) (62301 7954) (62302 7962) (62303 7969) (62304 7977) (62305 7968) + (62306 7976) (62307 8053) (62308 8139) (62309 8052) (62310 8138) (62311 8134) (62313 7973) (62314 +7981) (62315 7971) (62316 7979) (62317 7975) (62318 7983) (62319 8084) (62320 7980) (62321 7970) ( +62322 7978) (62323 7974) (62324 7982) (62325 8131) (62326 8140) (62327 8081) (62328 8089) (62329 8080) + (62330 8088) (62331 8132) (62333 8130) (62369 8135) (62371 8085) (62372 8093) (62373 8083) (62374 +8091) (62375 8087) (62376 8095) (62377 8084) (62378 8092) (62379 8082) (62380 8090) (62381 8086) ( +62382 8094) (62383 7985) (62384 7993) (62385 7984) (62386 7992) (62387 8055) (62388 8155) (62389 8054) + (62390 8154) (62391 8150) (62393 7989) (62394 7997) (62395 7987) (62396 7995) (62397 7991) (62398 +7999) (62399 7988) (62400 7996) (62401 7986) (62402 7994) (62403 7990) (62404 7998) (62411 8001) ( +62412 8009) (62413 8000) (62414 8008) (62415 8057) (62416 8185) (62417 8056) (62418 8184) (62419 8005) + (62420 8013) (62421 8003) (62422 8011) (62423 8004) (62424 8012) (62425 8002) (62426 8010) (62427 +8017) (62428 8025) (62429 8016) (62431 8059) (62432 8171) (62433 8058) (62434 8170) (62435 8166) ( +62437 8021) (62438 8029) (62439 8019) (62440 8027) (62441 8023) (62442 8031) (62445 8020) (62447 8018) + (62449 8022) (62455 8033) (62456 8041) (62457 8032) (62458 8040) (62459 8061) (62460 8187) (62461 +8060) (62462 8186))] + +[244 ((62497 8182) (62499 8037) (62500 8045) (62501 8035) (62502 8043) (62503 8039) (62504 8047) ( +62505 8036) (62506 8044) (62507 8034) (62508 8042) (62509 8038) (62510 8046) (62511 8179) (62512 8188) + (62513 8097) (62514 8105) (62515 8096) (62516 8104) (62517 8180) (62519 8178) (62521 8183) (62523 +8101) (62524 8107) (62525 8099) (62526 8107) (62527 8103) (62528 8111) (62529 8100) (62530 8108) ( +62531 8098) (62532 8106) (62533 8102) (62534 8110) (62535 8165) (62536 8172) (62537 8164))] + +[245 ((62753 65154) (62754 65156) (62755 65158) (62756 65160) (62757 65163) (62758 65164) (62759 65162 +) (62760 65166) (62761 65169) (62762 65170) (62763 65168) (62764 65172) (62765 65175) (62766 65176) ( +62767 65174) (62768 65179) (62769 65180) (62770 65178) (62771 65183) (62772 65184) (62773 65182) ( +62774 65187) (62775 65188) (62776 65186) (62777 65191) (62778 65192) (62779 65190) (62780 65194) ( +62781 65196) (62782 65198) (62783 65200) (62784 65203) (62785 65204) (62786 65202) (62787 65207) ( +62788 65208) (62789 65206) (62790 65211) (62791 65212) (62792 65210) (62793 65215) (62794 65216) ( +62795 65214) (62796 65219) (62797 65220) (62798 65218) (62799 65223) (62800 65224) (62801 65222) ( +62802 65227) (62803 65228) (62804 65226) (62805 65231) (62806 65232) (62807 65230) (62808 65235) ( +62809 65236) (62810 65234) (62811 65239) (62812 65240) (62813 65238) (62814 65243) (62815 65244) ( +62816 65242) (62817 65247) (62818 65248) (62819 65246) (62820 65251) (62821 65252) (62822 65250) ( +62823 65255) (62824 65256) (62825 65254) (62826 65259) (62827 65260) (62828 65258) (62829 65262) ( +62830 65264) (62831 65267) (62832 65268) (62833 65266) (62834 65269) (62835 65270) (62836 65271) ( +62837 65272) (62838 65273) (62839 65274) (62840 65275) (62841 65276) (62842 1780) (62843 1780) (62844 +1781) (62845 1782) (62882 64606) (62883 64607) (62884 64608) (62885 64609) (62886 64610) (62887 64364) + (62888 64365) (62889 64363) (62890 1740) (62891 64562) (62956 64344) (62957 64345) (62958 64343) ( +62959 64380) (62960 64381) (62961 64379) (62962 64395) (62963 1705) (62964 64399) (62965 64404) (62966 + 64405) (62967 64403) (62968 64421))] + +[253 ((64812 1644) (64832 978) (64848 7425) (64849 630) (64859 1013) (64860 982) (64861 977) (64862 +1009) (64863 966) (64864 1008) (64865 7424) (64866 665) (64867 7428) (64868 7429) (64869 7431) (64870 +42800) (64871 610) (64872 668) (64873 618) (64874 7434) (64875 7435) (64876 671) (64877 7437) (64878 +628) (64879 7439) (64880 7448) (64881 42927) (64882 640) (64883 42801) (64884 7451) (64885 7452) ( +64886 7456) (64887 7457) (64888 120) (64889 655) (64890 7458) (64891 411) (64893 945) (64936 8319) ( +64942 8316) (64944 8304) (64945 185) (64946 178) (64947 179) (64948 8308) (64949 8309) (64950 8310) ( +64951 8311) (64952 8312) (64953 8313) (64958 8314) (64959 8315) (64992 8320) (64993 8321) (64994 8322) + (64995 8323) (64996 8324) (64997 8325) (64998 8326) (64999 8327) (65000 8328) (65001 8329) (65002 +8331) (65003 8330) (65004 8332))] + +STOP diff --git a/unicode/xerox/UNICODE-TO-MCCS-MAPPINGS.TXT b/unicode/xerox/UNICODE-TO-MCCS-MAPPINGS.TXT new file mode 100644 index 000000000..6e7a7cf3a --- /dev/null +++ b/unicode/xerox/UNICODE-TO-MCCS-MAPPINGS.TXT @@ -0,0 +1,1584 @@ +[0 ((0 0) (1 1) (2 2) (3 3) (4 4) (5 5) (6 6) (7 7) (8 8) (9 9) (10 10) (11 11) (12 12) (13 13) (14 14 +) (15 15) (16 16) (17 17) (18 18) (19 19) (20 20) (21 21) (22 22) (23 23) (24 24) (25 25) (26 26) (27 +27) (28 28) (29 29) (30 30) (31 31) (32 32 58273) (33 33 60981) (34 34) (35 35) (36 36 61350) (37 37) +(38 38) (39 39 8999 61223) (40 40) (41 41) (42 42 60464) (43 43) (44 44 57644) (45 45) (46 46) (47 47) + (48 48) (49 49) (50 50) (51 51) (52 52) (53 53) (54 54) (55 55) (56 56) (57 57) (58 58) (59 59 57659) + (60 60) (61 61) (62 62) (63 63) (64 64 60480 60496) (65 65) (66 66) (67 67) (68 68) (69 69) (70 70) ( +71 71) (72 72) (73 73) (74 74) (75 75) (76 76) (77 77) (78 78) (79 79) (80 80) (81 81) (82 82) (83 83) + (84 84) (85 85) (86 86) (87 87) (88 88) (89 89) (90 90) (91 91) (92 92) (93 93) (94 173 8896) (95 172 +) (96 96 9056) (97 97 57947) (98 98 58019) (99 99 58072) (100 100 58033) (101 101 57942) (102 102 +58028) (103 103) (104 104 58094) (105 105 57937) (106 106) (107 107 58078) (108 108 58045) (109 109 +58017) (110 110 58031) (111 111 57961) (112 112 58018) (113 113 58086) (114 114 58048) (115 115 58038) + (116 116 58032) (117 117 57957) (118 118 58029) (119 119 58024) (120 120 58080 64888) (121 121 57938) + (122 122 58039) (123 123) (124 124 8615 61045) (125 125) (126 126) (160 59109 61217) (161 161) (162 +162) (163 163) (164 164) (165 165) (166 61291) (167 167) (168 8994) (169 211) (170 227) (171 171) (172 + 61290) (173 61219) (174 210) (175 8996) (176 176) (177 177) (178 178 64946) (179 179 64947) (180 8995 +) (181 181) (182 182) (183 183 9008 61692) (184 9004) (185 209 64945) (186 235) (187 187) (188 188 +61552) (189 189 61553) (190 190 61554) (191 191) (192 61729) (193 61730) (194 61731) (195 61732) (196 +61735) (197 61736) (198 225) (199 61741) (200 61744) (201 61745) (202 61746) (203 61749) (204 61758) ( +206 61760) (207 61764) (208 226) (209 61772) (210 61775) (211 61776) (212 61777) (213 61778) (214 +61780) (215 180) (216 233) (217 61791) (218 61792) (219 61793) (220 61797) (221 61803) (222 236) (223 +251) (224 61857) (225 61858) (226 61859) (227 61860) (228 61863) (229 61864) (230 241 57946) (231 +58074 61869) (232 61872) (233 61873) (234 61874) (235 61877) (236 61886) (237 61887) (238 61888) (239 +61892) (240 243 58035) (241 61900) (242 61903) (243 61904) (244 61905) (245 61906) (246 61908) (247 +184) (248 249 57943) (249 61919) (250 61920) (251 61921) (252 61925) (253 61931) (254 252) (255 61933) +)] + +[1 ((256 61733) (257 61861) (258 61734) (259 61862) (260 61737) (261 61865) (262 61738) (263 61866) ( +264 61739) (265 61867) (266 61740) (267 61868) (268 61742) (269 61870) (270 61743) (271 61871) (273 +242) (274 61747) (275 61875) (276 61818) (277 61946) (278 61748) (279 61876) (280 61750) (281 61878) ( +282 61751) (283 61879) (284 61753) (285 61881) (286 61754) (287 61882) (288 61755) (289 61883) (290 +61756) (291 61884) (292 61757) (293 61885) (294 228) (295 244 58091) (296 61761) (297 61889) (298 +61762) (299 61890) (300 61822) (301 61950) (302 61765) (303 61893) (304 61763) (305 245) (306 230) ( +307 246) (308 61766) (309 61894) (310 61767) (311 61895) (312 240) (313 61768) (314 61896) (315 61769) + (316 61897) (317 61770) (318 61898) (319 231) (320 247) (321 232) (322 248) (323 61771) (324 61899) ( +325 61773) (326 61901) (327 61774) (328 61902) (329 239) (330 238) (331 254 58077) (332 61779) (333 +61907) (334 61990) (335 62118) (336 61781) (337 61909) (338 234) (339 250 57945) (340 61782) (341 +61910) (342 61783) (343 61911) (344 61784) (345 61912) (346 61785) (347 61913) (348 61786) (349 61914) + (350 61787) (351 61915) (352 61788) (353 61916) (354 61789) (355 61917) (356 61790) (357 61918) (358 +237) (359 253) (360 61794) (361 61922) (362 61795) (363 61923 62123) (364 61796) (365 61924) (366 +61798) (367 61926) (368 61799) (369 61927) (370 61800) (371 61928) (372 61801) (373 61929) (374 61804) + (375 61932) (376 61805) (377 61806) (378 61934) (379 61807) (380 61935) (381 61808) (382 61936) (384 +9129 61693) (385 9025) (390 9041) (391 9046) (392 9078) (394 9026) (397 58041) (398 9024) (399 9030) ( +400 9038) (401 9047) (402 9079 61012 61346) (403 9130) (404 9039) (405 9131) (406 9040) (408 9027) ( +409 9059) (410 9066) (411 64891) (413 9053) (414 58085) (415 9036) (416 9028) (417 9060) (418 9031) ( +419 9063) (420 9048) (421 9080) (425 9042) (426 58068) (428 9049) (429 9081) (431 9029) (432 9061) ( +434 9043) (435 9050) (436 9082) (437 9032 60985) (438 9064) (439 9044) (440 9045) (441 9077) (442 +58069) (443 58037) (446 58036) (447 9065) (448 9126) (449 9127) (450 9124) (451 9125) (461 61759 61817 +) (462 61945) (463 61986) (464 62114) (465 61989) (466 62117) (467 61994) (468 62122) (477 9062) (482 +61814) (483 61942) (486 61821) (487 61949) (490 61993) (491 62121) (500 61752) (501 61880))] + +[2 ((562 61813) (563 61941) (567 229) (592 57955) (593 57964) (594 57965) (595 9057 58025) (596 57963) + (597 58062) (598 58056) (599 9058 58050) (600 57966) (601 57951) (602 57952) (603 57944) (604 57954) +(605 57967) (606 57968) (607 58073) (608 57982 58083) (609 58079) (610 58087 64871) (611 58081) (612 +57960) (613 58022) (614 58095) (615 58070) (616 57949) (617 57939) (618 57940 64873) (619 57981) (620 +58043) (621 58060) (622 58044) (623 57956) (624 58082) (625 58027) (626 58071) (627 58054) (628 58084 +64878) (629 9068 57953) (630 57948 64849) (631 57958) (632 58020) (633 58042) (634 58047) (635 58059) +(636 58046) (637 58061) (638 58049) (639 57969) (640 58090 64882) (641 58089) (642 58057) (643 58064) +(644 57980) (645 57970) (646 58066) (647 58051) (648 58055) (649 57950) (650 57959) (651 58030) (652 +57962) (653 58023) (654 58076) (655 57941 64889) (656 58058) (657 58063) (658 58065 61355) (659 58067) + (660 58093) (661 58092) (662 58053) (663 58052) (664 58026) (665 58096 64866) (666 57971) (667 58097) + (668 58098 64872) (669 58075 58099) (670 58100) (671 58101 64876) (672 58102) (673 58103) (674 58104) + (675 58105) (676 58106) (677 58107) (678 58108) (679 58109) (680 58110) (697 9149) (698 9150) (699 +9137) (700 9136) (702 57930) (703 9121) (711 9003 9415) (712 57918) (713 9418) (714 9414) (715 9416) ( +716 57919) (720 57914) (721 57915) (724 57910) (725 57911) (728 8997) (729 8998 9417) (730 9000) (731 +9002) (733 9001))] + +[3 ((768 193 9157 9926 57924) (769 194 9158 9925 57922) (770 195 9011 9146 57926) (771 196 9012 9147 +57890) (772 197 9013 57920) (773 9155) (774 198 9014 57891) (775 199 9015 57892) (776 200 9016 9161 +9932 57889) (777 9152) (778 202 9018) (779 205 9021) (780 207 9023 57927) (781 9162) (782 9168) (783 +9186) (784 9201) (785 9151) (786 9164) (787 9765 57929) (788 9204 9766 57928) (789 9163) (790 9205 +57925) (791 9206 57923) (792 9207) (793 9208) (794 9209) (795 9166) (796 57906 57917) (797 57903) (798 + 57905) (799 57907) (800 57908) (801 57895) (802 57896) (803 9174 57904) (804 9175 57899) (805 9172 +57897) (806 9171) (807 203 9019 9170) (808 206 9022 9169) (809 9178 57902) (810 57900) (811 57901) ( +812 57898) (813 9179) (814 9173) (815 9210) (816 9176) (817 9180 57921) (818 204 60199) (819 9177) ( +820 57894) (821 9167) (822 9211) (823 9153) (824 9145) (825 9212 57916) (826 9213) (827 9214) (831 +9200) (832 9009) (833 9010) (834 9927) (835 9763) (836 9920) (837 9767) (860 57909) (865 9139 57893) ( +884 9780) (885 9781) (890 9778) (894 9762) (900 9764 9777) (901 9771 9933) (902 9936) (903 9787) (904 +9937) (905 9938) (906 9939) (908 9940) (910 9941) (911 9942) (912 9977) (913 9793) (914 9794) (915 +9796) (916 9797) (917 9798) (918 9801) (919 9802) (920 9803) (921 9804) (922 9805) (923 9806) (924 +9807) (925 9808) (926 9809) (927 9810) (928 9811) (929 9813) (931 9814) (932 9816) (933 9817) (934 +9818) (935 9819) (936 9820) (937 9821) (938 9943) (939 9944) (940 9968) (941 9969) (942 9970) (943 +9971) (944 9978) (945 9825 64893) (946 9826 58021) (947 9828) (948 9829) (949 9830) (950 9833) (951 +9834) (952 9835 58034) (953 9836) (954 9837) (955 9838) (956 9839) (957 9840) (958 9841) (959 9842) ( +960 9843) (961 9845) (962 9847) (963 9846 58040) (964 9848) (965 9849) (966 9850 64863) (967 9851 +58088) (968 9852) (969 9853) (970 9975) (971 9976) (972 9972) (973 9973) (974 9974) (976 9827) (977 +64861) (978 64832) (979 9952) (980 9953) (982 64860) (984 9812) (985 9844) (986 9799) (987 9831) (988 +9800) (989 9832) (990 9792) (991 9824) (992 9822) (993 9854) (994 9948) (995 9980) (996 9949) (997 +9981) (998 9950) (999 9982) (1001 9904) (1003 9905) (1005 9906) (1007 9907) (1008 64864) (1009 64862) +(1010 9776) (1011 9979) (1013 64859))] + +[4 ((1025 10023) (1026 10051) (1027 10052) (1028 10053) (1029 10054) (1030 10055) (1031 10056) (1032 +10057) (1033 10058) (1034 10059) (1035 10060) (1036 10061) (1038 10062) (1039 10145) (1040 10017) ( +1041 10018) (1042 10019) (1043 10020) (1044 10021) (1045 10022) (1046 10024) (1047 10025) (1048 10026) + (1049 10027) (1050 10028) (1051 10029) (1052 10030) (1053 10031) (1054 10032) (1055 10033) (1056 +10034) (1057 10035) (1058 10036) (1059 10037) (1060 10038) (1061 10039) (1062 10040) (1063 10041) ( +1064 10042) (1065 10043) (1066 10044) (1067 10045) (1068 10046) (1069 10047) (1070 10048) (1071 10049) + (1072 10065) (1073 10066) (1074 10067) (1075 10068) (1076 10069) (1077 10070) (1078 10072) (1079 +10073) (1080 10074) (1081 10075) (1082 10076) (1083 10077) (1084 10078) (1085 10079) (1086 10080) ( +1087 10081) (1088 10082) (1089 10083) (1090 10084) (1091 10085) (1092 10086) (1093 10087) (1094 10088) + (1095 10089) (1096 10090) (1097 10091) (1098 10092) (1099 10093) (1100 10094) (1101 10095) (1102 +10096) (1103 10097) (1105 10071) (1106 10099) (1107 10100) (1108 10101) (1109 10102) (1110 10103) ( +1111 10104) (1112 10105) (1113 10106) (1114 10107) (1115 10108) (1116 10109) (1118 10110) (1119 10193) + (1120 10920) (1121 10968) (1122 10146) (1123 10194) (1124 10924) (1125 10972) (1126 10927) (1127 +10975) (1128 10929) (1129 10977) (1130 10149) (1131 10197) (1132 10930) (1133 10978) (1134 10931) ( +1135 10979) (1136 10932) (1137 10980) (1138 10147) (1139 10195) (1140 10148) (1141 10196) (1142 10827) + (1143 10875) (1144 10951) (1145 10967) (1146 10914) (1147 10962) (1148 10944) (1149 10992) (1150 +10943) (1151 10991) (1152 10934) (1153 10982) (1154 10957) (1155 10999) (1156 10952) (1168 10050) ( +1169 10098) (1170 10157 10816) (1171 10205 10864) (1172 10158) (1173 10206) (1174 10162) (1175 10210) +(1176 10164) (1177 10212) (1178 10168) (1179 10216) (1180 10170) (1181 10218) (1182 10172) (1183 10220 +) (1184 10171) (1185 10219) (1186 10173) (1187 10221) (1188 10174) (1189 10222) (1190 10178) (1191 +10226) (1192 10801) (1193 10849) (1194 10179) (1195 10227) (1196 10181) (1197 10229) (1198 10152) ( +1199 10200) (1200 10803) (1201 10851) (1202 10188) (1203 10236) (1204 10182) (1205 10230) (1206 10785) + (1207 10833) (1208 10787) (1209 10835) (1210 10819) (1211 10867) (1212 10799) (1213 10847) (1214 +10800) (1215 10848) (1216 10191) (1217 10818) (1218 10866) (1219 10810) (1220 10858) (1223 10822) ( +1224 10870) (1227 10786) (1228 10834) (1232 10155) (1233 10203) (1234 10154) (1235 10202) (1236 10156) + (1237 10204) (1238 10160) (1239 10208) (1240 10798) (1241 10846) (1242 10808) (1243 10856) (1244 +10161) (1245 10209) (1246 10163) (1247 10211) (1248 10809) (1249 10857) (1250 10167) (1251 10215) ( +1252 10166) (1253 10214) (1254 10176) (1255 10224) (1256 10817) (1257 10865) (1258 10811) (1259 10859) + (1262 10187) (1263 10235) (1264 10184) (1265 10232) (1266 10185) (1267 10233) (1268 10190) (1269 +10238) (1272 10795) (1273 10843) (1276 10189) (1277 10237))] + +[5 ((1306 10150) (1307 10198) (1308 10151) (1309 10199) (1329 58529) (1330 58530) (1331 58531) (1332 +58532) (1333 58533) (1334 58534) (1335 58535) (1336 58536) (1337 58537) (1338 58538) (1339 58539) ( +1340 58540) (1341 58541) (1342 58542) (1343 58543) (1344 58544) (1345 58545) (1346 58546) (1347 58547) + (1348 58548) (1349 58549) (1350 58550) (1351 58551) (1352 58552) (1353 58553) (1354 58554) (1355 +58555) (1356 58556) (1357 58557) (1358 58558) (1359 58559) (1360 58560) (1361 58561) (1362 58562) ( +1363 58563) (1364 58564) (1365 58565) (1366 58566) (1369 58569) (1370 58571) (1371 58572) (1372 58573) + (1373 58574) (1374 58575) (1375 58576) (1377 58577) (1378 58578) (1379 58579) (1380 58580) (1381 +58581) (1382 58582) (1383 58583) (1384 58584) (1385 58585) (1386 58586) (1387 58587) (1388 58588) ( +1389 58589) (1390 58590) (1391 58591) (1392 58592) (1393 58593) (1394 58594) (1395 58595) (1396 58596) + (1397 58597) (1398 58598) (1399 58599) (1400 58600) (1401 58601) (1402 58602) (1403 58603) (1404 +58604) (1405 58605) (1406 58606) (1407 58607) (1408 58608) (1409 58609) (1410 58610) (1411 58611) ( +1412 58612) (1413 58613) (1414 58614) (1415 58622) (1417 58446 58570) (1436 57639) (1438 57634) (1456 +57799) (1457 57801) (1458 57800) (1459 57802) (1460 57793) (1461 57794) (1462 57795) (1463 57798) ( +1464 57797) (1465 57806) (1467 57796) (1468 57807) (1469 57839) (1471 57841) (1472 57842) (1473 57804) + (1474 57803) (1475 57658) (1488 57664) (1489 57665) (1490 57666) (1491 57667) (1492 57668) (1493 +57669) (1494 57670) (1495 57671) (1496 57672) (1497 57673) (1498 57674) (1499 57675) (1500 57676) ( +1501 57677) (1502 57678) (1503 57679) (1504 57680) (1505 57681) (1506 57682) (1507 57683) (1508 57684) + (1509 57685) (1510 57686) (1511 57687) (1512 57688) (1513 57689) (1514 57690) (1520 57716) (1521 +57717) (1522 57718))] + +[6 ((1548 57388) (1563 57403) (1567 57407) (1569 57409) (1570 57410) (1571 57411) (1572 57412) (1573 +57413) (1574 57414) (1575 57415) (1576 57416) (1577 57417) (1578 57418) (1579 57419) (1580 57420) ( +1581 57421) (1582 57422) (1583 57423) (1584 57424) (1585 57425) (1586 57426) (1587 57427) (1588 57428) + (1589 57429) (1590 57430) (1591 57431) (1592 57432) (1593 57433) (1594 57434) (1600 57440) (1601 +57441) (1602 57442) (1603 57443) (1604 57444) (1605 57445) (1606 57446) (1607 57447) (1608 57448) ( +1609 57449) (1610 57450) (1611 57451) (1612 57452) (1613 57453) (1614 57454) (1615 57455) (1616 57456) + (1617 57457) (1618 57458) (1632 57392) (1633 57393) (1634 57394) (1635 57395) (1636 57396) (1637 +57397) (1638 57398) (1639 57399) (1640 57400) (1641 57401) (1642 57381) (1643 57461 60974) (1644 57462 + 60972 64812) (1648 57459) (1649 57460) (1650 57531) (1651 57532) (1652 57543) (1653 57544) (1654 +57545) (1655 57547) (1656 57548) (1657 57511) (1658 57558) (1659 57556) (1660 57521) (1661 57549) ( +1662 57506) (1663 57559) (1664 57557) (1665 57522) (1666 57546) (1667 57562) (1668 57561) (1669 57523) + (1670 57507) (1671 57563) (1672 57512) (1673 57524) (1674 57550) (1675 57551) (1676 57565) (1677 +57564) (1678 57566) (1679 57553) (1680 57554) (1681 57513) (1682 57571) (1683 57525) (1684 57572) ( +1685 57573) (1686 57526) (1687 57574) (1688 57508) (1689 57575) (1690 57527) (1691 57576) (1692 57577) + (1693 57578) (1694 57579) (1695 57580) (1696 57581) (1697 57582) (1698 57583) (1699 57584) (1700 +57505) (1701 57585) (1702 57560) (1703 57586) (1704 57587) (1705 57567 62963) (1706 57588) (1707 57552 +) (1708 57589) (1709 57590) (1710 57592) (1711 57509) (1712 57593) (1713 57569) (1714 57594) (1715 +57568) (1716 57595) (1722 57514) (1723 57570) (1724 57528) (1726 57515) (1728 57510) (1729 57516) ( +1730 57518) (1731 57517) (1733 57541) (1734 57537) (1735 57536) (1736 57538) (1737 57542) (1739 57540) + (1740 57555 62890) (1741 57530) (1744 57529) (1746 57519) (1747 57533) (1748 57390) (1749 57534) ( +1780 62842 62843) (1781 62844) (1782 62845))] + +[9 ((2305 58785) (2306 58786) (2307 58787) (2309 58789) (2310 58790) (2311 58791) (2312 58792) (2313 +58793) (2314 58794) (2315 58795) (2316 58797) (2317 58788) (2319 58800) (2320 58801) (2321 58802) ( +2322 58803) (2323 58804) (2324 58805) (2325 58807) (2326 58809) (2327 58811) (2328 58813) (2329 58814) + (2330 58815) (2331 58816) (2332 58817) (2333 58819) (2334 58820) (2335 58821) (2336 58822) (2337 +58823) (2338 58825) (2339 58827) (2340 58828) (2341 58829) (2342 58830) (2343 58831) (2344 58832) ( +2345 58833) (2346 58834) (2347 58835) (2348 58837) (2349 58838) (2350 58839) (2351 58840) (2352 58842) + (2353 58843) (2354 58844) (2355 58845) (2356 58846) (2357 58847) (2358 58848) (2359 58849) (2360 +58850) (2361 58851) (2364 58863) (2365 58873) (2366 58854) (2367 58855) (2368 58856) (2369 58857) ( +2370 58858) (2371 58859) (2372 58860) (2373 58866) (2374 58870) (2375 58864) (2376 58865) (2377 58876) + (2378 58736) (2379 58868) (2380 58869) (2381 58871 58878) (2384 58874) (2385 58737) (2386 58738) ( +2387 58739) (2388 58740) (2392 58808) (2393 58810) (2394 58812) (2395 58818) (2396 58824) (2397 58826) + (2398 58836) (2399 58841) (2400 58796) (2401 58798) (2402 58861) (2403 58862) (2404 58875 59131) ( +2405 58741) (2406 58657) (2407 58658) (2408 58659) (2409 58660) (2410 58661) (2411 58662) (2412 58663) + (2413 58664) (2414 58665) (2415 58666) (2416 58872) (2433 59041) (2434 59042) (2435 59043) (2437 +59045) (2438 59046) (2439 59047) (2440 59048) (2441 59049) (2442 59050) (2443 59051) (2444 59053) ( +2447 59056) (2448 59057) (2451 59060) (2452 59061) (2453 59063) (2454 59065) (2455 59067) (2456 59069) + (2457 59070) (2458 59071) (2459 59072) (2460 59073) (2461 59075) (2462 59076) (2463 59077) (2464 +59078) (2465 59079) (2466 59081) (2467 59083) (2468 59084) (2469 59085) (2470 59086) (2471 59087) ( +2472 59088) (2474 59090) (2475 59091) (2476 59093) (2477 59094) (2478 59095) (2479 59096) (2480 59098) + (2482 59100) (2486 59104) (2487 59105) (2488 59106) (2489 59107) (2492 59108) (2494 59110) (2495 +59111) (2496 59112) (2497 59113) (2498 59114) (2499 59115) (2500 59116) (2503 59120) (2504 59121) ( +2507 59124) (2508 59125) (2509 59127) (2524 59080) (2525 59082) (2527 59097) (2528 59052) (2529 59054) + (2530 59117) (2531 59118) (2534 58913) (2535 58914) (2536 58915) (2537 58916) (2538 58917) (2539 +58918) (2540 58919) (2541 58920) (2542 58921) (2543 58922) (2544 59099) (2545 59103) (2546 58933) ( +2547 58928) (2548 58929) (2549 58930) (2550 58931) (2551 58935) (2552 58932) (2553 58934) (2554 59130) +)] + +[10 ((2562 59170) (2565 59173) (2566 59174) (2567 59175) (2568 59176) (2569 59177) (2570 59178) (2575 +59183) (2576 59184) (2579 59187) (2580 59188) (2581 59189) (2582 59190) (2583 59191) (2584 59192) ( +2585 59193) (2586 59194) (2587 59195) (2588 59196) (2589 59197) (2590 59198) (2591 59199) (2592 59200) + (2593 59201) (2594 59202) (2595 59203) (2596 59204) (2597 59205) (2598 59206) (2599 59207) (2600 +59208) (2602 59210) (2603 59211) (2604 59212) (2605 59213) (2606 59214) (2607 59215) (2608 59216) ( +2610 59218) (2611 59219) (2613 59221) (2614 59222) (2616 59224) (2617 59225) (2620 59228) (2622 59230) + (2623 59231) (2624 59232) (2625 59233) (2626 59234) (2631 59239) (2632 59240) (2635 59243) (2636 +59244) (2637 59245) (2649 59257) (2650 59258) (2651 59259) (2652 59260) (2654 59262))] + +[14 ((3585 59425) (3586 59426) (3587 59427) (3588 59428) (3589 59429) (3590 59430) (3591 59431) (3592 +59432) (3593 59433) (3594 59434) (3595 59435) (3596 59436) (3597 59437) (3598 59438) (3599 59439) ( +3600 59440) (3601 59441) (3602 59442) (3603 59443) (3604 59444) (3605 59445) (3606 59446) (3607 59447) + (3608 59448) (3609 59449) (3610 59450) (3611 59451) (3612 59452) (3613 59453) (3614 59454) (3615 +59455) (3616 59456) (3617 59457) (3618 59458) (3619 59459) (3620 59460) (3621 59461) (3622 59462) ( +3623 59463) (3624 59464) (3625 59465) (3626 59466) (3627 59467) (3628 59468) (3629 59469) (3630 59470) + (3631 59471) (3632 59472) (3633 59473) (3634 59474) (3635 59475) (3636 59476) (3637 59477) (3638 +59478) (3639 59479) (3640 59480) (3641 59481) (3642 59482) (3647 59487) (3648 59488) (3649 59489) ( +3650 59490) (3651 59491) (3652 59492) (3653 59493) (3654 59494) (3655 59495) (3656 59496) (3657 59497) + (3658 59498) (3659 59499) (3660 59500) (3661 59501) (3662 59502) (3663 59503) (3664 59504) (3665 +59505) (3666 59506) (3667 59507) (3668 59508) (3669 59509) (3670 59510) (3671 59511) (3672 59512) ( +3673 59513) (3674 59514) (3675 59515) (3713 59553) (3714 59554) (3716 59556) (3719 59559) (3720 59560) + (3722 59562) (3725 59565) (3732 59572) (3733 59573) (3734 59574) (3735 59575) (3737 59577) (3738 +59578) (3739 59579) (3740 59580) (3741 59581) (3742 59582) (3743 59583) (3745 59585) (3746 59586) ( +3747 59587) (3749 59589) (3751 59591) (3754 59594) (3755 59595) (3757 59597) (3758 59598) (3759 59599) + (3760 59600) (3761 59601) (3762 59602) (3763 59603) (3764 59604) (3765 59605) (3766 59606) (3767 +59607) (3768 59608) (3769 59609) (3771 59611) (3772 59612) (3773 59613 59621) (3776 59616) (3777 59617 +) (3778 59618) (3779 59619) (3780 59620) (3782 59622) (3784 59624) (3785 59625) (3786 59626) (3787 +59627) (3788 59628) (3789 59629) (3792 59632) (3793 59633) (3794 59634) (3795 59635) (3796 59636) ( +3797 59637) (3798 59638) (3799 59639) (3800 59640) (3801 59641) (3804 59644) (3805 59645))] + +[16 ((4256 58449) (4257 58450) (4258 58451) (4259 58452) (4260 58453) (4261 58454) (4262 58455) (4263 +58457) (4264 58458) (4265 58459) (4266 58460) (4267 58461) (4268 58462) (4269 58464) (4270 58465) ( +4271 58466) (4272 58467) (4273 58468) (4274 58469) (4275 58470) (4276 58472) (4277 58473) (4278 58474) + (4279 58475) (4280 58476) (4281 58477) (4282 58478) (4283 58479) (4284 58480) (4285 58481) (4286 +58482) (4287 58484) (4288 58485) (4289 58456) (4290 58463) (4291 58471) (4292 58483) (4293 58486) ( +4304 58401) (4305 58402) (4306 58403) (4307 58404) (4308 58405) (4309 58406) (4310 58407) (4311 58409) + (4312 58410) (4313 58411) (4314 58412) (4315 58413) (4316 58414) (4317 58416) (4318 58417) (4319 +58418) (4320 58419) (4321 58420) (4322 58421) (4323 58422) (4324 58424) (4325 58425) (4326 58426) ( +4327 58427) (4328 58428) (4329 58429) (4330 58430) (4331 58431) (4332 58432) (4333 58433) (4334 58434) + (4335 58436) (4336 58437) (4337 58408) (4338 58415) (4339 58423) (4340 58435) (4341 58438) (4342 +58439) (4347 58447))] + +[17 ((4352 58305) (4353 58306) (4354 58308) (4355 58311) (4356 58312) (4357 58313) (4358 58321) (4359 +58322) (4360 58323) (4361 58325) (4362 58326) (4363 58327) (4364 58328) (4365 58329) (4366 58330) ( +4367 58331) (4368 58332) (4369 58333) (4370 58334) (4449 58338) (4450 58339) (4451 58340) (4452 58341) + (4453 58342) (4454 58343) (4455 58346) (4456 58347) (4457 58348) (4458 58349) (4459 58350) (4460 +58351) (4461 58354) (4462 58355) (4463 58356) (4464 58357) (4465 58358) (4466 58359) (4467 58362) ( +4468 58363) (4469 58364) (4522 58307) (4524 58309) (4525 58310) (4528 58314) (4529 58315) (4530 58316) + (4531 58317) (4532 58318) (4533 58319) (4534 58320) (4537 58324))] + +[22 ((5792 10530) (5794 10532) (5795 10677) (5796 10674) (5798 10535) (5800 10539) (5801 10667) (5802 +10671) (5803 10673) (5805 10661) (5806 10662) (5807 10666) (5809 10546) (5810 10549) (5812 10551) ( +5813 10555) (5815 10554) (5817 10557) (5818 10559) (5819 10560) (5820 10564) (5822 10567) (5823 10570) + (5825 10571) (5827 10572) (5829 10665) (5831 10582) (5832 10585) (5839 10607) (5840 10608) (5841 +10664) (5842 10610) (5846 10615) (5847 10616) (5848 10618) (5849 10620) (5850 10622) (5852 10623) ( +5853 10658) (5854 10663) (5855 10659) (5856 10678) (5857 10680) (5873 10669))] + +[29 ((7424 64865) (7425 64848) (7428 64867) (7429 64868) (7431 64869) (7434 64874) (7435 64875) (7437 +64877) (7439 64879) (7448 64880) (7451 64884) (7452 64885) (7456 64886) (7457 64887) (7458 64890))] + +[30 ((7692 62001) (7693 62129) (7695 62127) (7716 62002) (7717 62130) (7778 62003) (7779 62131) (7788 +62004) (7789 62132) (7791 62128) (7884 61812) (7885 61940) (7922 61802) (7923 61930))] + +[31 ((7936 62243) (7937 62241) (7938 62259) (7939 62253) (7940 62257) (7941 62251) (7942 62261) (7943 +62255) (7944 62244) (7945 62242) (7946 62260) (7948 62258) (7949 62252 62254) (7950 62262) (7951 62256 +) (7952 62289) (7953 62287) (7954 62301) (7955 62297) (7956 62299) (7957 62295) (7960 62290) (7961 +62288) (7962 62302) (7963 62298) (7964 62300) (7965 62296) (7968 62305) (7969 62303) (7970 62321) ( +7971 62315) (7973 62313) (7974 62323) (7975 62317) (7976 62306) (7977 62304) (7978 62322) (7979 62316) + (7980 62320) (7981 62314) (7982 62324) (7983 62318) (7984 62385) (7985 62383) (7986 62401) (7987 +62395) (7988 62399) (7989 62393) (7990 62403) (7991 62397) (7992 62386) (7993 62384) (7994 62402) ( +7995 62396) (7996 62400) (7997 62394) (7998 62404) (7999 62398) (8000 62413) (8001 62411) (8002 62425) + (8003 62421) (8004 62423) (8005 62419) (8008 62414) (8009 62412) (8010 62426) (8011 62422) (8012 +62424) (8013 62420) (8016 62429) (8017 62427) (8018 62447) (8019 62439) (8020 62445) (8021 62437) ( +8022 62449) (8023 62441) (8025 62428) (8027 62440) (8029 62438) (8031 62442) (8032 62457) (8033 62455) + (8034 62507) (8035 62501) (8036 62505) (8037 62499) (8038 62509) (8039 62503) (8040 62458) (8041 +62456) (8042 62508) (8043 62502) (8044 62506) (8045 62500) (8046 62510) (8047 62504) (8048 62247) ( +8049 62245) (8050 62293) (8051 62291) (8052 62309) (8053 62307) (8054 62389) (8055 62387) (8056 62417) + (8057 62415) (8058 62433) (8059 62431) (8060 62461) (8061 62459) (8064 62267) (8065 62265) (8066 +62283) (8067 62277) (8068 62281) (8069 62275) (8070 62285) (8071 62279) (8072 62268) (8073 62266) ( +8074 62284) (8075 62278) (8076 62282) (8077 62276) (8078 62286) (8079 62280) (8080 62329) (8081 62327) + (8082 62379) (8083 62373) (8084 62319 62377) (8085 62371) (8086 62381) (8087 62375) (8088 62330) ( +8089 62328) (8090 62380) (8091 62374) (8092 62378) (8093 62372) (8094 62382) (8095 62376) (8096 62515) + (8097 62513) (8098 62531) (8099 62525) (8100 62529) (8101 62523) (8102 62533) (8103 62527) (8104 +62516) (8105 62514) (8106 62532) (8107 62524 62526) (8108 62530) (8110 62534) (8111 62528) (8114 62271 +) (8115 62263) (8116 62269) (8118 62249) (8119 62273) (8122 62248) (8123 62246) (8124 62264) (8125 +9779) (8127 9790) (8128 9773) (8129 9789 9935) (8130 62333) (8131 62325) (8132 62331) (8134 62311) ( +8135 62369) (8136 62294) (8137 62292) (8138 62310) (8139 62308) (8140 62326) (8141 9786 9931) (8142 +9785 9922 9930) (8143 9788 9924) (8150 62391) (8154 62390) (8155 62388) (8157 9770 9929) (8158 9769 +9921 9928) (8159 9772 9923) (8164 62537) (8165 62535) (8166 62435) (8170 62434) (8171 62432) (8172 +62536) (8173 9783 9934) (8174 9782) (8175 9775) (8178 62519) (8179 62511) (8180 62517) (8182 62497) ( +8183 62521) (8184 62418) (8185 62416) (8186 62462) (8187 62460) (8188 62512) (8189 9774) (8190 9791))] + +[32 ((8192 61228 61620) (8193 61229 61621) (8196 60961 61617) (8197 60962 61618) (8198 61619) (8199 +61230) (8200 60964 61622 61623) (8201 61231) (8202 60963) (8205 57598) (8206 57596) (8207 57597) (8208 + 8510) (8209 57645 61218) (8210 61222) (8211 61220) (8212 61221) (8213 208) (8215 61375) (8216 169 +8746 9122) (8217 185) (8218 9138) (8220 170 61225) (8221 186) (8222 61224) (8224 61232) (8225 61233) ( +8226 60270 61286) (8227 61635) (8228 61090) (8229 8517 61091) (8230 8516) (8231 60965) (8240 61249) ( +8241 8766) (8242 8556 8747 61035) (8243 8557 8748) (8244 8555) (8245 61051) (8248 60999) (8249 61226) +(8250 61227) (8251 8744) (8252 61050) (8253 60200) (8254 9086) (8258 8764) (8259 60220) (8304 64944) ( +8308 64948) (8309 64949) (8310 64950) (8311 64951) (8312 64952) (8313 64953) (8314 64958) (8315 64959) + (8316 64942) (8319 64936) (8320 64992) (8321 64993) (8322 64994) (8323 64995) (8324 64996) (8325 +64997) (8326 64998) (8327 64999) (8328 65000) (8329 65001) (8330 65003) (8331 65002) (8332 65004) ( +8352 61349) (8353 60223) (8354 61345) (8355 61347) (8356 8941) (8359 60285 61348) (8360 58671 58877) ( +8361 58274) (8362 57636) (8401 9184) (8402 60331) (8403 60332) (8404 60337) (8405 60338) (8406 9160) ( +8407 9144) (8408 60334) (8409 60336) (8410 60335) (8417 9154))] + +[33 ((8448 60977) (8450 61356) (8451 8558) (8452 61000) (8453 61248) (8454 60992) (8455 60198) (8456 +60226) (8459 60194) (8460 60203) (8461 8936) (8462 60348) (8463 60975 61288) (8464 60195) (8465 8873) +(8466 60996) (8467 61289) (8469 61357) (8470 61352) (8471 9134) (8472 8870 60273) (8473 60193) (8474 +8935) (8475 60995) (8476 8872) (8477 61358) (8478 61353) (8480 60330) (8481 61354) (8482 212 60275 +60276) (8484 61359) (8485 8765 9135) (8486 224) (8487 8828) (8488 60284) (8489 60368) (8493 60283) ( +8495 60271) (8499 60254) (8501 61351) (8524 60221) (8531 61437 61555) (8532 61438 61556) (8533 60240) +(8534 60241) (8535 60242) (8536 60243) (8537 60244) (8538 60245) (8539 220 61557) (8540 221 61558) ( +8541 222 61559) (8542 223 61560) (8543 61561) (8544 61377) (8545 61378) (8546 61379) (8547 61380) ( +8548 61381) (8549 61382) (8550 61383) (8551 61384) (8552 61385) (8553 61386) (8554 60369) (8555 60370) + (8592 95 61100 61628) (8593 94 61101) (8594 174 61102 61625) (8595 175 61103 61624) (8596 61266) ( +8597 61109) (8598 61244) (8599 61246) (8600 61245) (8601 61247) (8602 61175) (8603 61176) (8605 61267) + (8606 8774) (8608 8775) (8609 61627) (8610 8780) (8611 8781) (8614 8811) (8616 61110) (8617 8795) ( +8618 8794) (8619 8782) (8620 8783) (8621 8786) (8622 61177) (8624 8784) (8625 8785) (8626 8942) (8627 +8943) (8628 61626) (8629 61629) (8630 61170) (8631 61171) (8634 61172) (8635 61173) (8636 8790) (8637 +8791) (8638 8778) (8639 8776) (8640 8792) (8641 8793) (8642 8779) (8643 8777) (8644 61008) (8645 60206 +) (8646 61265) (8647 8768) (8648 8770) (8649 8769) (8650 8771) (8651 61174) (8652 61264) (8653 61178) +(8654 61180) (8655 61179) (8656 61261) (8657 8800) (8658 61263) (8659 8801) (8660 61262) (8661 61009) +(8666 8772) (8667 8773) (8668 60364) (8669 60363) (8674 60208) (8678 61097) (8679 61098) (8680 61096) +(8681 61099) (8693 60207))] + +[34 ((8704 61365) (8705 61033) (8706 61370) (8707 61364) (8708 61041) (8709 8871 61281) (8710 60997) ( +8711 61369) (8712 61258) (8713 61259) (8715 61260) (8716 60347) (8717 8889) (8718 61368) (8719 61307) +(8720 8621 8887) (8721 60262 61306) (8722 60973) (8723 61309) (8724 60971) (8726 60988) (8727 61053) ( +8728 61031 61287) (8729 8944) (8730 61308) (8733 8825 61297) (8734 8551) (8735 61149) (8736 61292) ( +8737 61293) (8738 8888) (8739 61052 61254) (8740 8629 61255) (8741 8514 8566 61256) (8742 8630 61257) +(8743 8882) (8744 8883) (8745 61270) (8746 61271) (8747 61301) (8748 8810) (8749 60249) (8750 61302) ( +8751 60214) (8752 60215) (8753 60355) (8754 60353) (8755 60354) (8756 8552) (8757 61295) (8758 60980) +(8759 61294) (8760 60987) (8762 61028) (8763 60359) (8764 8823 61054) (8765 8894) (8766 60358) (8768 +8829) (8769 8624 61182) (8770 61032) (8771 61303) (8772 8639) (8773 61304) (8774 60343) (8775 8652) ( +8776 8824 61305) (8777 8640) (8778 61048) (8779 60196) (8780 8651) (8781 8804) (8782 60994) (8783 +61049) (8784 61299) (8785 8616) (8786 8802) (8787 8803) (8788 8788) (8789 8789) (8790 8618) (8791 8617 +) (8793 60989) (8794 60990) (8796 8619) (8799 61300) (8800 8546) (8801 8866 61298) (8802 61042) (8803 +60209) (8804 8549) (8805 8550) (8806 8560) (8807 8561) (8808 8690 8692) (8809 8691 8693) (8810 8817 +61250) (8811 8818 61251) (8812 60976) (8813 8756) (8814 8649 61252) (8815 8650 61253) (8816 8672 8678 +8688) (8817 8673 8679 8689) (8818 61038) (8819 61039) (8820 8665) (8821 8666) (8822 61036) (8823 61037 +) (8824 60340) (8825 60339) (8826 8528) (8827 8529) (8828 8530) (8829 8531) (8830 8609) (8831 8610) ( +8832 8656) (8833 8657) (8834 61275) (8835 61274) (8836 61279) (8837 61278) (8838 61273) (8839 61272) ( +8840 8643 61277) (8841 8644 61276) (8842 8645) (8843 8646) (8845 60210) (8846 8875 8879) (8847 61010) +(8848 61011) (8849 8880) (8850 8881) (8851 8878) (8852 8877 8886) (8853 8819 8938 61282) (8854 8820 +61283) (8855 8821 8939 61284) (8856 8822 61285) (8857 8893 8940) (8858 8949) (8859 8568) (8860 60197) +(8861 8567) (8862 8751) (8863 8752) (8864 8753) (8865 8754) (8866 61238) (8867 61239) (8868 8874 61040 +) (8869 61296) (8870 60982) (8871 8876) (8872 61240) (8873 8515) (8874 8559) (8876 8631) (8877 8632) ( +8878 8633) (8879 8634) (8884 61163) (8885 61164) (8886 60357) (8887 60356) (8888 8787) (8890 61089) ( +8891 60282 61147) (8892 60344) (8893 60345) (8896 61366) (8897 61367) (8898 61014) (8899 61015) (8901 +61108) (8903 60991) (8904 8812) (8905 61142) (8906 61143) (8907 61144) (8908 61145) (8909 61181) (8910 + 61162) (8911 61161) (8912 8542) (8913 8543) (8914 61026) (8915 61027) (8916 8620) (8918 8512) (8919 +8513) (8920 8518) (8921 8519) (8922 8526 8564) (8923 8527 8565) (8926 8532) (8927 8533) (8928 8658 +8662) (8929 8659) (8930 8686) (8931 8687) (8934 8676) (8935 8677) (8936 8625) (8937 8626) (8938 8635) +(8939 8636) (8940 8637) (8941 8638) (8942 12075) (8951 8890))] + +[35 ((8962 60986) (8965 61130) (8966 61146) (8967 60365) (8968 61043 61360) (8969 61046 61361) (8970 +61044 61362) (8971 61047 61363) (8972 60968) (8973 60969) (8974 60966) (8975 60967) (8976 61034) (8977 + 60998) (8978 61004 61376) (8979 61005) (8981 60255) (8982 61007) (8984 60201) (8985 60235) (8987 +61021) (8988 8945) (8989 8946) (8990 8947) (8991 8948) (8992 61165) (8993 61166) (8994 8614) (8995 +8613 8815) (9001 61234) (9002 61235) (9005 61003) (9006 61006) (9007 60983) (9008 60984) (9014 61139) +(9015 61148) (9017 61127) (9019 61140) (9021 61123) (9023 61128) (9024 61129) (9026 61168) (9033 61124 +) (9035 61122) (9038 61136) (9042 61121) (9045 61137) (9049 8867) (9053 61138) (9054 61126) (9055 +61125) (9067 61120) (9073 61112) (9074 61111) (9079 8869) (9080 8868) (9122 8923) (9125 8924) (9127 +61156) (9128 61158) (9129 61157) (9130 61153 61167) (9131 61152) (9132 61154) (9133 61155) (9135 11810 +) (9136 61159) (9137 61160) (9188 61001) (9190 61374))] + +[36 ((9216 61616) (9225 61609) (9226 61610) (9227 61608) (9228 61611) (9229 61612) (9251 61694) (9252 +61613) (9280 61371) (9281 61373) (9282 61372) (9312 60600 61393) (9313 60601 61394) (9314 60602 61395) + (9315 60603 61396) (9316 60604 61397) (9317 60605 61398) (9318 60606 61399) (9319 60607 61400) (9320 +60608 61401) (9321 60609 61402) (9322 30299) (9323 30300) (9324 30301) (9325 30302) (9326 30303) (9327 + 30331) (9328 30332) (9329 30333) (9330 30334) (9331 30395) (9332 29808) (9333 29809) (9334 29810) ( +9335 29811) (9336 29812) (9337 29813) (9338 29814) (9339 29815) (9340 29816) (9341 29817) (9342 29818) + (9343 29947) (9344 29948) (9345 29949) (9346 29950) (9372 29921) (9373 29922) (9374 29923) (9375 +29924) (9376 29925) (9377 29926) (9378 29927) (9379 29928) (9380 29929) (9381 29930) (9382 29931) ( +9383 29932) (9384 29933) (9385 29934) (9386 29935) (9387 29936) (9388 29937) (9389 29938) (9390 29939) + (9391 29940) (9392 29941) (9393 29942) (9394 29943) (9395 29944) (9396 29945) (9397 29946) (9398 +30273) (9399 30274) (9400 30275) (9401 30276) (9402 30277) (9403 30278) (9404 30279) (9405 30280) ( +9406 30281) (9407 30282) (9408 30283) (9409 30284) (9410 30285) (9411 30286) (9412 30287) (9413 30288) + (9414 30289) (9415 30290) (9416 30291) (9417 30292) (9418 30293) (9419 30294) (9420 30295) (9421 +30296) (9422 30297) (9423 30298) (9424 30305) (9425 30306) (9426 30307) (9427 30308) (9428 30309) ( +9429 30310) (9430 30311) (9431 30312) (9432 30313) (9433 30314) (9434 30315) (9435 30316) (9436 30317) + (9437 30318) (9438 30319) (9439 30320) (9440 30321) (9441 30322) (9442 30323) (9443 30324) (9444 +30325) (9445 30326) (9446 30327) (9447 30328) (9448 30329) (9449 30330) (9450 30396))] + +[37 ((9472 10273 11809 61413) (9473 10284 11811 61410) (9474 10274 61412) (9475 10285 61409) (9476 +10448) (9477 10449) (9478 10450) (9479 10451) (9480 10452) (9481 10453) (9482 10454) (9483 10455) ( +9484 10275) (9485 10317) (9486 10313) (9487 10286) (9488 10276) (9489 10318) (9490 10314) (9491 10287) + (9492 10278) (9493 10363) (9494 10316) (9495 10289) (9496 10277) (9497 10319) (9498 10315) (9499 +10288) (9500 10279) (9501 10300) (9502 10444) (9503 10445) (9504 10295) (9505 10446) (9506 10447) ( +9507 10290) (9508 10281) (9509 10302) (9512 10297) (9515 10292) (9516 10280) (9519 10296) (9520 10301) + (9523 10291) (9524 10282) (9527 10298) (9528 10303) (9531 10293) (9532 10283 61414) (9535 10299) ( +9538 10304) (9543 10308) (9544 10309) (9545 10307) (9546 10310) (9547 10294 61411) (9548 10311) (9549 +10456) (9550 10305) (9551 10306) (9552 10337) (9553 10325) (9554 10345) (9555 10346) (9556 10333) ( +9557 10323) (9558 10322) (9559 10326) (9560 10344) (9561 10343) (9562 10332) (9563 10329) (9564 10328) + (9565 10327) (9566 10330) (9567 10331) (9568 10336) (9569 10320) (9570 10321) (9571 10324) (9572 +10341) (9573 10342) (9574 10335) (9575 10339) (9576 10340) (9577 10334) (9578 10348) (9579 10347) ( +9580 10338) (9581 10457) (9582 10458) (9583 10459) (9584 10460) (9585 10461) (9586 10462) (9600 61117) + (9604 61114) (9608 10463 60224 61113) (9612 61116) (9616 61115) (9617 61024) (9618 61310) (9619 61025 +) (9632 8739 60267) (9633 8738 60279) (9635 60219) (9642 60231) (9643 60280) (9644 61150) (9645 60327) + (9646 60970) (9647 8927) (9649 60328 61002) (9650 8741) (9651 8740) (9652 8884) (9653 8816) (9654 +61104) (9655 61106) (9656 60268) (9657 8891) (9658 61119) (9660 8743) (9661 8742) (9662 8885) (9663 +8827) (9664 61105) (9665 61107) (9666 60269) (9667 8892) (9668 61118) (9670 8737) (9671 8574 8623) ( +9675 8571 60645) (9676 60326) (9678 8573) (9679 8572 60640 61636) (9680 60661) (9681 60643) (9682 +60642) (9683 60662) (9684 60644) (9685 60641) (9686 60497) (9687 60783) (9688 60993) (9689 61013) ( +9692 60386) (9693 60384) (9694 60383) (9695 60385) (9698 60238) (9699 60239) (9700 60236) (9701 60237) + (9702 60250 60281) (9711 8830))] + +[38 ((9733 8570 60462) (9734 8569 60463) (9737 61415) (9742 60455 60709 61436) (9743 60491 60979) ( +9746 61280) (9747 60351) (9754 60451 60535) (9755 60450 60714) (9756 61237) (9758 60715 61236) (9760 +61408) (9764 60225) (9769 60350) (9774 61406) (9775 60228) (9785 60229) (9786 61407) (9787 61151) ( +9789 61416) (9790 61417) (9791 61418) (9792 8554) (9794 8553) (9795 61419) (9796 61420) (9797 61421) ( +9798 61422) (9799 61423) (9800 61426) (9801 61427) (9802 61428) (9803 61429) (9804 61430) (9805 61431) + (9806 61432) (9807 61433) (9808 61434) (9809 61435) (9810 61424) (9811 61425) (9824 61387) (9825 +61388) (9826 61389) (9827 61390) (9828 61131) (9829 61132) (9830 61133) (9831 61134) (9833 60246) ( +9834 213) (9835 61141) (9837 9132) (9838 8814) (9839 9148) (9855 60230) (9878 60222))] + +[39 ((9985 60705) (9986 60453 60706) (9987 60707) (9988 60454 60490 60708) (9989 60494) (9990 60710) ( +9991 60711) (9992 60712) (9993 60713) (9996 60716) (9997 60717) (9998 60718) (9999 60719) (10000 60720 +) (10001 60492 60721) (10002 60456 60722) (10003 60458 61391) (10004 60723) (10005 60724) (10006 60725 +) (10007 61392) (10008 60486 60727) (10009 60728) (10010 60729) (10011 60730) (10012 60731) (10013 +60732) (10014 60733) (10015 60734) (10016 8622) (10017 60735) (10018 60736) (10019 60737) (10020 60738 +) (10021 60739) (10022 60740) (10023 60741) (10025 60742) (10026 60743) (10027 60744) (10028 60745) ( +10029 60746) (10030 60747) (10031 60748) (10032 60749) (10033 60750) (10034 60751) (10035 60752) ( +10036 60753) (10037 60754) (10038 60755) (10039 60756) (10040 60757) (10041 60758) (10042 60759) ( +10043 60760) (10044 60761) (10045 60762) (10046 60763) (10047 60764) (10048 60765) (10049 60766) ( +10050 60767) (10051 60768) (10052 60769) (10053 60770) (10054 60771) (10055 60772) (10056 60773) ( +10057 60774) (10058 60775) (10059 60776) (10061 60777) (10063 60778) (10064 60779) (10065 60780) ( +10066 60781) (10070 60782) (10072 60665) (10073 60784) (10074 60785) (10075 60899) (10076 60900) ( +10077 60663) (10078 60664) (10081 60786) (10082 60787) (10083 60788) (10084 60789) (10085 60790) ( +10086 60791) (10087 60792) (10102 60793) (10103 60794) (10104 60795) (10105 60796) (10106 60797) ( +10107 60798) (10108 60833) (10109 60834) (10110 60835) (10111 60836) (10112 60610) (10113 60611) ( +10114 60612) (10115 60613) (10116 60614) (10117 60615) (10118 60616) (10119 60617) (10120 60618) ( +10121 60619) (10122 60620) (10123 60621) (10124 60622) (10125 60623) (10126 60624) (10127 60625) ( +10128 60626) (10129 60627) (10130 60628) (10131 60629) (10132 60837) (10133 60531) (10136 60838) ( +10137 60839) (10138 60840) (10139 60841) (10140 60842) (10141 60843) (10142 60844) (10143 60845) ( +10144 60846) (10146 60847) (10147 60848) (10148 60849) (10149 60850) (10150 60851) (10151 60852) ( +10152 60853) (10153 60854) (10154 60855) (10155 60856) (10156 60857) (10157 60858) (10158 60859) ( +10159 60860) (10161 60861) (10162 60862) (10163 60863) (10164 60864) (10165 60865) (10166 60866) ( +10167 60867) (10168 60868) (10169 60869) (10170 60870) (10171 60871) (10172 60872) (10173 60873) ( +10174 60874) (10214 8522) (10215 8523) (10220 8520) (10221 8521) (10229 8796) (10230 8797) (10231 8807 +) (10232 8798) (10233 8799) (10234 8808 8809))] + +[41 ((10550 61630) (10692 61666))] + +[42 ((10773 60212) (10774 60213) (10877 8562) (10878 8563) (10885 8547) (10886 8548) (10887 8674) ( +10888 8675) (10901 8544) (10902 8545) (10927 8805) (10928 8806) (10933 8660) (10934 8661) (10935 8611) + (10936 8612) (10937 8627) (10938 8628) (10941 60211) (10949 8540) (10950 8541) (10955 8641 8647) ( +10956 8642 8648) (10980 61241))] + +[43 ((11013 61093) (11014 61094) (11015 61095) (11089 8813) (11157 61092))] + +[48 ((12288 8481) (12289 8482) (12290 8483) (12291 8503) (12292 29819) (12293 8505) (12294 8506) ( +12298 8760) (12299 8761) (12300 8534) (12301 8535) (12302 8536) (12303 8537) (12304 8538) (12305 8539) + (12306 8745) (12307 8750 12130) (12308 8524) (12309 8525) (12310 61242) (12311 61243) (12337 12257) ( +12338 12258) (12339 12273) (12340 12274) (12341 12275) (12353 9249 12096) (12354 9250) (12355 9251) ( +12356 9252) (12357 9253 12097 12098) (12358 9254) (12359 9255 12099) (12360 9256) (12361 9257 12100) ( +12362 9258) (12363 9259) (12364 9260) (12365 9261) (12366 9262) (12367 9263) (12368 9264) (12369 9265) + (12370 9266) (12371 9267) (12372 9268) (12373 9269) (12374 9270) (12375 9271) (12376 9272) (12377 +9273) (12378 9274) (12379 9275) (12380 9276) (12381 9277) (12382 9278) (12383 9279) (12384 9280) ( +12385 9281) (12386 9282) (12387 9283 12101) (12388 9284) (12389 9285) (12390 9286) (12391 9287) (12392 + 9288) (12393 9289) (12394 9290) (12395 9291) (12396 9292) (12397 9293) (12398 9294) (12399 9295) ( +12400 9296) (12401 9297) (12402 9298) (12403 9299) (12404 9300) (12405 9301) (12406 9302) (12407 9303) + (12408 9304) (12409 9305) (12410 9306) (12411 9307) (12412 9308) (12413 9309) (12414 9310) (12415 +9311) (12416 9312) (12417 9313) (12418 9314) (12419 9315 12102) (12420 9316) (12421 9317 12103) (12422 + 9318) (12423 9319 12104) (12424 9320) (12425 9321) (12426 9322) (12427 9323) (12428 9324) (12429 9325 +) (12430 9326 12105) (12431 9327) (12432 9328) (12433 9329) (12434 9330) (12435 9331) (12441 8491) ( +12442 8492) (12445 8501) (12446 8502) (12449 9505 12106) (12450 9506) (12451 9507 12107) (12452 9508) +(12453 9509 12108) (12454 9510) (12455 9511 12109) (12456 9512) (12457 9513 12110) (12458 9514) (12459 + 9515) (12460 9516) (12461 9517) (12462 9518) (12463 9519) (12464 9520) (12465 9521) (12466 9522) ( +12467 9523) (12468 9524) (12469 9525) (12470 9526) (12471 9527) (12472 9528) (12473 9529) (12474 9530) + (12475 9531) (12476 9532) (12477 9533) (12478 9534) (12479 9535) (12480 9536) (12481 9537) (12482 +9538) (12483 9539 12111) (12484 9540) (12485 9541) (12486 9542) (12487 9543) (12488 9544) (12489 9545) + (12490 9546) (12491 9547) (12492 9548) (12493 9549) (12494 9550) (12495 9551) (12496 9552) (12497 +9553) (12498 9554) (12499 9555) (12500 9556) (12501 9557) (12502 9558) (12503 9559) (12504 9560) ( +12505 9561) (12506 9562) (12507 9563) (12508 9564) (12509 9565) (12510 9566) (12511 9567) (12512 9568) + (12513 9569) (12514 9570) (12515 9571 12112) (12516 9572) (12517 9573 12113) (12518 9574) (12519 9575 + 12114) (12520 9576) (12521 9577) (12522 9578) (12523 9579) (12524 9580) (12525 9581) (12526 9582 +12115) (12527 9583) (12528 9584) (12529 9585) (12530 9586) (12531 9587) (12532 9588) (12533 9589 12116 +) (12534 9590 12117) (12535 9591) (12536 9592) (12537 9593) (12538 9594) (12539 9595) (12540 8508) ( +12541 8499) (12542 8500))] + +[49 ((12549 9377) (12550 9378) (12551 9379) (12552 9380) (12553 9381) (12554 9382) (12555 9383) (12556 + 9384) (12557 9385) (12558 9386) (12559 9387) (12560 9388) (12561 9389) (12562 9390) (12563 9391) ( +12564 9392) (12565 9393) (12566 9394) (12567 9395) (12568 9396) (12569 9397) (12570 9398) (12571 9399) + (12572 9400) (12573 9401) (12574 9402) (12575 9403) (12576 9404) (12577 9405) (12578 9406) (12579 +9407) (12580 9408) (12581 9409) (12582 9410) (12583 9411) (12584 9412) (12585 9413) (12586 9420) ( +12587 9419) (12588 9421) (12645 58146) (12646 58147) (12647 58148) (12648 58149) (12649 58150) (12650 +58151) (12651 58152) (12652 58153) (12653 58154) (12654 58155) (12655 58156) (12656 58157) (12657 +58158) (12658 58159) (12659 58160) (12660 58161) (12661 58162) (12662 58163) (12663 58164) (12664 +58165) (12665 58166) (12666 58167) (12667 58168) (12668 58169) (12669 58170) (12670 58171) (12671 +58172) (12672 58173) (12673 58174) (12674 58175) (12675 58176) (12676 58177) (12677 58178) (12678 +58179) (12679 58180) (12680 58181) (12681 58182) (12682 58183) (12683 58184) (12684 58185) (12685 +58186) (12686 58187))] + +[50 ((12800 29888) (12801 29889) (12802 29890) (12803 29891) (12804 29892) (12805 29893) (12806 29894) + (12807 29895) (12808 29896) (12809 29897) (12810 29898) (12811 29899) (12812 29900) (12813 29901) ( +12814 29902) (12815 29903) (12816 29904) (12817 29905) (12818 29906) (12819 29907) (12820 29908) ( +12821 29909) (12822 29910) (12823 29911) (12824 29912) (12825 29913) (12826 29914) (12827 29915) ( +12828 29916) (12832 12224) (12833 12225) (12834 12226) (12835 12227) (12836 12228) (12837 12229) ( +12838 12230) (12839 12231) (12840 12232) (12841 12233) (12842 29761) (12843 29762) (12844 29763) ( +12845 29764) (12846 29765) (12847 29766) (12848 29760) (12850 29769) (12851 29770) (12852 29771) ( +12853 29772) (12854 29773) (12855 29768) (12856 29774) (12857 29775) (12864 29767) (12896 29857) ( +12897 29858) (12898 29859) (12899 29860) (12900 29861) (12901 29862) (12902 29863) (12903 29864) ( +12904 29865) (12905 29866) (12906 29867) (12907 29868) (12908 29869) (12909 29870) (12910 29871) ( +12911 29872) (12912 29873) (12913 29874) (12914 29875) (12915 29876) (12916 29877) (12917 29878) ( +12918 29879) (12919 29880) (12920 29881) (12921 29882) (12922 29883) (12923 29884) (12938 29756) ( +12939 29757) (12940 29758) (12941 29759) (12949 29747) (12950 29753) (12953 29754) (12956 29744) ( +12957 29745 29752) (12958 29755) (12960 29746) (13024 29741) (13027 29740) (13030 29743) (13047 29742) +)] + +[51 ((13179 29779) (13180 29778) (13181 29777) (13182 29776))] + +[78 ((19968 12396) (19969 17274) (19971 15415) (19975 19324) (19976 15974) (19977 15152) (19978 15973) + (19979 12860) (19981 18772) (19982 19775) (19984 20514) (19985 12591) (19988 13166 30066) (19989 +20515) (19990 16420 30028) (19991 21058) (19992 13654) (19993 19002) (19998 15975) (20001 20030) ( +20006 19010 30002) (20010 20516) (20013 17254) (20017 20517) (20018 13946) (20022 20518) (20024 13405) + (20025 17200) (20027 15463) (20028 20519) (20031 20520) (20034 20521) (20035 18229) (20037 13655) ( +20043 18231) (20045 18019) (20046 14403) (20047 19251) (20053 26953) (20054 20522) (20055 15976) ( +20056 20523) (20057 12853) (20061 13925) (20062 14448) (20063 19561) (20066 22054) (20081 19824) ( +20083 18045) (20094 13349) (20096 13621) (20098 20524) (20101 20525) (20102 20027) (20104 19773) ( +20105 16744) (20106 20527) (20107 15222) (20108 18035) (20110 20530) (20113 12606) (20114 14431) ( +20116 14430) (20117 12390) (20120 20299) (20121 20298) (20123 14899) (20124 12321) (20126 20531) ( +20127 20532) (20128 20533) (20129 19252) (20130 20534) (20132 14450 30124) (20133 12391) (20134 19314) + (20136 13692) (20139 13693) (20140 13694) (20141 17506) (20142 20028) (20144 20535) (20147 20536) ( +20150 20537) (20154 16205) (20160 15674) (20161 16206) (20162 20542) (20164 20540) (20166 20541) ( +20167 13656) (20170 14883) (20171 12912) (20173 20539) (20174 20538) (20175 18985) (20180 15174) ( +20181 15173) (20182 16958) (20183 20543) (20184 18773) (20185 16487) (20189 8504) (20190 20544) (20191 + 20546) (20195 16997 30068) (20196 20065) (20197 12362) (20205 20545) (20206 12862) (20208 13892) ( +20210 17255) (20214 14191) (20215 20547) (20219 18212))] + +[79 ((20225 13419) (20233 20548) (20234 12363) (20237 14432) (20238 13420) (20239 18810) (20240 18482) + (20241 13657) (20250 12913) (20252 20583) (20253 17729) (20271 18284) (20272 20550) (20276 18492) ( +20278 20066) (20280 16173) (20282 15175) (20284 15223) (20285 12864) (20291 17489) (20294 17186) ( +20295 20554) (20301 12364) (20302 17507) (20303 15675 30014) (20304 14900) (20305 19748) (20307 16974) + (20309 12863 30067) (20311 20553) (20313 19774) (20314 20549) (20315 20551) (20316 14958) (20317 +20552) (20318 21796) (20329 20560) (20335 20563) (20336 20561) (20339 12866) (20341 19003) (20342 +20555) (20347 20559) (20348 14451) (20351 15176) (20355 13350) (20358 20564) (20360 20556) (20363 +20067) (20365 15224) (20367 20557) (20369 20562) (20374 20565) (20376 20558) (20379 13857) (20381 +12365) (20384 13858) (20385 12865) (20395 21797) (20397 19321) (20398 18798) (20399 14452) (20405 +16175) (20406 20023) (20415 19032) (20418 14136) (20419 16933) (20420 12900) (20426 15699) (20430 +20569) (20432 20574) (20433 20572) (20436 20567) (20439 16943) (20440 20570) (20442 20573) (20443 +20571) (20445 19037) (20447 20568) (20449 16174 30076) (20451 19315) (20452 20575) (20453 20576) ( +20462 15652) (20463 20589) (20467 18256) (20469 18742) (20470 20584) (20472 19056) (20474 12854) ( +20478 20588))] + +[80 ((20485 20582) (20486 20591) (20489 16722) (20491 14404) (20493 18268) (20495 24647) (20497 20590) + (20498 17757) (20500 20579) (20502 14454) (20505 14453) (20506 20577) (20511 15450) (20513 20585) ( +20515 19055) (20516 17229) (20517 20581) (20518 14193) (20520 20578) (20521 20586) (20522 20580) ( +20523 20049) (20524 20587) (20525 20289) (20534 13926) (20537 14192) (20547 20592) (20551 20593) ( +20552 20597) (20553 12366) (20559 19024) (20560 20596) (20565 20595) (20566 20599) (20570 20598) ( +20572 17508) (20581 14194) (20588 20600) (20594 15429) (20596 16934) (20597 17509) (20598 13942) ( +20600 20601) (20605 13622) (20608 20602) (20613 20604) (20621 19253) (20625 14182) (20632 15153) ( +20633 18551) (20634 20603) (20652 14917) (20653 19779) (20658 20606) (20659 20771) (20660 20605) ( +20661 14916) (20663 15741) (20670 14137) (20674 20772) (20677 13903) (20681 20769) (20682 20770) ( +20685 17967) (20687 16764 30035) (20689 13859) (20693 19277) (20694 20773) (20698 20029) (20702 20774) + (20707 20777) (20709 20775) (20711 16718) (20717 20776) (20718 20778) (20725 20780) (20729 20779) ( +20731 19016))] + +[81 ((20736 13623) (20737 20782) (20738 20783) (20740 12847) (20745 20781) (20754 15476) (20756 20786) + (20757 20785) (20758 20784) (20760 20566) (20762 20787) (20767 15742) (20769 20788) (20778 19749) ( +20786 19545) (20791 20790) (20794 20789) (20795 20792) (20796 20791) (20799 20793) (20800 20794) ( +20801 12404) (20803 14389 30123) (20804 14139) (20805 15676) (20806 17275) (20807 13860) (20808 16488) + (20809 14455 30043) (20811 14702) (20812 20796) (20813 19528) (20814 17734) (20816 15225) (20818 +20795) (20820 20797) (20826 17758) (20828 13173) (20834 20798) (20837 18046 30001) (20839 30032) ( +20840 16692) (20841 20800) (20842 20801) (20843 18476) (20844 14456) (20845 20283) (20846 20802) ( +20849 13862 30069) (20853 19004 30161) (20854 16950) (20855 13937) (20856 17717) (20860 14195) (20864 +20803) (20866 20804) (20869 18018) (20870 12639) (20873 20807) (20874 14973) (20876 20806) (20877 +14918) (20879 20808) (20880 26222) (20881 20809) (20882 19265) (20883 20810) (20885 20811) (20886 +20812) (20887 15977) (20889 15436) (20896 13351) (20898 20815) (20900 20813) (20901 19517) (20902 +20814) (20904 18778) (20905 20816) (20906 20817) (20907 20818) (20908 17759) (20912 20822) (20913 +20820) (20914 20821) (20915 20819) (20916 14947) (20917 20823) (20918 19562) (20919 20068) (20925 +20824) (20932 16424) (20933 20825) (20934 15706) (20937 20826) (20939 17276) (20940 20031) (20941 +17760) (20950 21061) (20955 20827) (20956 29989) (20957 13893) (20960 20828) (20961 19294) (20966 +15720) (20967 17020) (20969 20830) (20970 18020) (20973 20831) (20976 20832) (20977 13102) (20981 +20833) (20982 13863) (20984 17996) (20985 12666) (20986 15696) (20989 18465) (20990 20834))] + +[82 ((20992 17761) (20995 16207) (20996 20835) (20998 18988) (20999 16474) (21000 13346) (21002 13353) + (21003 20836) (21006 20838) (21009 14138) (21012 20837) (21015 20083) (21021 15721) (21028 18493) ( +21029 19020 30040) (21031 20839) (21033 19832 30034) (21034 20840) (21038 20841) (21040 17790) (21043 +20842) (21046 16425) (21047 14974) (21048 14196) (21049 20843) (21050 15177) (21051 14703) (21059 +17510) (21060 20845) (21063 16935 30182) (21066 14959) (21067 20846) (21068 20847) (21069 16688) ( +21071 20844) (21076 20849) (21078 19254) (21083 14692) (21086 20848) (21091 14197) (21092 14942) ( +21093 18285) (21097 20852) (21098 20850) (21103 18811) (21104 15978) (21105 20859) (21106 13156) ( +21107 20853) (21108 20851) (21109 16719) (21117 20855) (21119 20854) (21123 13124) (21127 14176) ( +21128 20860) (21129 20013) (21133 20856) (21137 20861) (21138 20858) (21140 20857) (21147 20047) ( +21151 14457 30193) (21152 12867 30019) (21155 20084) (21161 15733) (21162 17752) (21163 14693) (21164 +21026) (21165 21027) (21169 20069) (21172 20267) (21173 21029) (21177 14458) (21180 21028) (21182 +13103) (21185 21030) (21187 19286) (21189 17468) (21191 19750) (21193 19033) (21197 21031) (21202 +28757) (21205 17968) (21207 21032) (21208 13354) (21209 19507) (21213 15905) (21214 21033 30156) ( +21215 19047) (21216 21037) (21218 16426) (21219 21034) (21220 13904) (21222 21035) (21223 13355) ( +21234 14126) (21235 21038) (21237 21039) (21240 21040) (21241 21041) (21242 15451) (21246 14459) ( +21247 19550))] + +[83 ((21249 19560) (21250 18039) (21253 19057) (21254 21042) (21256 21043) (21261 21045) (21263 21047) + (21264 21046) (21269 21048) (21270 12861) (21271 19276) (21273 14972) (21274 21049) (21277 16729) ( +21280 15906) (21281 13865) (21283 21050) (21290 18523) (21295 21051) (21297 21052) (21299 21053) ( +21304 21054) (21305 18724) (21306 13928) (21307 12389) (21311 17983) (21312 21055) (21313 15677) ( +21315 16489 30186) (21317 21057) (21318 21056) (21319 15907) (21320 14433) (21321 21059) (21322 18494 +30172) (21325 21060) (21329 18524) (21330 16948) (21331 17006) (21332 13864) (21335 18030) (21336 +17201) (21338 18286) (21340 19278) (21342 21062) (21344 16490) (21350 14133) (21353 21063) (21358 +21064) (21359 12588) (21360 12405) (21361 13421) (21363 16936) (21364 13649) (21365 19825) (21367 +21067) (21368 12855) (21371 21066) (21375 13866) (21378 21068) (21380 19569) (21398 21069) (21400 +20050) (21402 14460) (21407 14390 29998) (21408 21070) (21413 21072) (21414 21071) (21416 16223) ( +21417 12601) (21421 12638) (21422 21073) (21424 21074) (21427 14391) (21430 21075) (21435 13678) ( +21442 15154) (21443 21076) (21448 19316) (21449 14901) (21450 13658 30119) (21451 19751 30140) (21452 +16720) (21453 18495) (21454 15485) (21460 15687) (21462 15464 30158) (21463 15477 30070) (21465 15734) + (21467 18496) (21471 21079) (21473 12611) (21474 16721) (21475 14461) (21476 14405 30205) (21477 +13927) (21480 21083) (21481 17185) (21482 17022) (21483 13867) (21484 15908) (21485 21084) (21486 +21082) (21487 12868) (21488 16998 30062) (21489 15416) (21490 15179) (21491 12582) (21494 13168) ( +21495 14694) (21496 15178) (21498 21085))] + +[84 ((21505 21086) (21507 13641) (21508 13126) (21512 14695 29999) (21513 13640) (21514 17503) (21515 +12581) (21516 17969) (21517 19518) (21518 14625) (21519 19833) (21520 17735) (21521 14462) (21531 +14127 30200) (21533 21095) (21535 13923) (21536 19274) (21542 18525) (21545 21094) (21547 13406) ( +21548 21089) (21549 21090) (21550 21092) (21558 21093) (21560 13659) (21561 16225) (21563 18989) ( +21564 21091) (21565 21087) (21566 14435) (21568 21088) (21570 20260) (21574 19058) (21576 17512) ( +21577 14434) (21578 14704 30153) (21582 21096) (21585 18013) (21599 21100) (21608 15486) (21610 15478) + (21616 21103) (21617 21101) (21619 19491) (21621 21098) (21622 21107) (21623 21102) (21627 21105) ( +21628 14406) (21629 19519 30133) (21632 21106) (21636 21108) (21638 21110) (21643 14960) (21644 20290) + (21646 21099) (21647 21097) (21648 21109) (21650 21104) (21666 21112) (21668 21283) (21669 21114) ( +21672 21118) (21675 21281) (21676 21115) (21679 21310) (21682 14953) (21683 13105) (21688 21113) ( +21692 21285) (21693 12406) (21694 21284) (21696 12325) (21697 18762) (21698 21282) (21700 21116) ( +21703 21111) (21704 21117) (21705 14920) (21720 21286) (21729 12407 30135) (21730 21295) (21733 21287 +30154) (21734 21288) (21736 15909) (21737 19305) (21741 21293) (21742 21292) (21746 17711) (21754 +21294) (21757 21291))] + +[85 ((21764 12596) (21766 14902) (21767 16176) (21775 21289) (21776 17762) (21780 21290) (21782 12322) + (21806 21300) (21807 19747) (21809 15911) (21811 21306) (21816 21305) (21817 21296) (21822 16963) ( +21824 21297) (21828 17007) (21829 21302) (21830 15910) (21836 21299) (21839 19556) (21843 14140) ( +21846 21303) (21847 21304) (21852 21301) (21853 21307) (21859 21298) (21883 21313) (21884 21318) ( +21886 21314) (21888 21309) (21891 21319) (21892 16689) (21895 21321) (21897 14626) (21898 21311) ( +21899 17277) (21912 21315) (21913 21308) (21914 13357) (21916 13422 30141) (21917 13157) (21918 21316) + (21919 21312) (21927 14198) (21928 21322) (21929 21320) (21930 16723) (21931 13642) (21932 13868) ( +21934 21317) (21936 13940) (21942 12612) (21956 21326) (21957 21324) (21959 21543) (21966 30151) ( +21972 21329) (21978 21323) (21980 21327) (21983 21325) (21987 15180) (21988 21328) (22007 21331) ( +22009 21336) (22013 21334) (22014 21333))] + +[86 ((22022 17202) (22025 12869) (22036 21330) (22038 21332) (22039 15912) (22040 12595) (22043 21335) + (22057 12894) (22063 21346) (22065 15996) (22066 21342) (22068 21340) (22070 21341) (22072 21343) ( +22082 12605) (22092 16697) (22094 21337) (22096 21338) (22107 13178) (22116 21345) (22120 13423) ( +22122 21348) (22123 21344) (22124 21347) (22132 18990) (22136 18005) (22138 18488) (22144 21350) ( +22150 21349) (22151 13125) (22154 21351) (22159 21354) (22164 21353) (22176 21352) (22178 18233) ( +22181 21355) (22190 21356) (22196 21358) (22198 21357) (22204 21360) (22208 21363) (22209 21361) ( +22210 21359) (22211 21362) (22216 21364) (22222 21365) (22225 21366) (22227 21367) (22231 21368) ( +22232 20805) (22234 15484) (22235 15181) (22238 12915) (22240 12408) (22243 17220) (22254 21369) ( +22256 14884) (22258 12367) (22259 16222) (22265 21370) (22266 14407) (22269 14705) (22271 21372))] + +[87 ((22272 21371) (22275 19040) (22276 21373) (22280 21537) (22281 21374) (22283 21538) (22285 21539) + (22287 14199) (22290 12640) (22291 21540) (22294 21542 30020) (22296 21541) (22300 21544) (22303 +17754) (22310 21545) (22311 12341) (22312 14943) (22317 14141) (22320 17231) (22327 21546) (22328 +21547) (22331 21549) (22336 21550) (22338 14948) (22343 13905) (22346 19255) (22350 21548) (22351 +21551) (22352 14913) (22353 14627) (22369 21555) (22372 14885) (22374 17203) (22377 21552) (22378 +17498) (22399 21556) (22402 16226) (22408 21554) (22409 21557) (22411 14143) (22419 21558) (22432 +21559) (22434 14628) (22435 13120) (22436 21561) (22442 21562) (22448 21563) (22451 21560) (22464 +21553) (22467 21564) (22470 21565) (22475 19300) (22478 15979) (22482 21567) (22483 21568) (22484 +21566) (22486 21570) (22492 18232) (22495 12392) (22496 18774) (22499 21571) (22516 15997) (22519 +15417) (22521 18269) (22522 13424) (22524 14955))] + +[88 ((22528 19289) (22530 17970) (22533 14200) (22534 16975) (22538 21569) (22539 21572) (22549 16964) + (22553 21573) (22557 21574) (22561 21576) (22564 17513) (22570 13358) (22575 29985) (22576 12641) ( +22577 19059 30005) (22580 15980) (22581 17736) (22586 14950) (22589 21582) (22592 19005) (22593 20061) + (22602 12916) (22603 21578) (22609 16698) (22610 21581) (22612 17763) (22615 17737) (22616 17764) ( +22617 18489) (22618 17485) (22622 14921) (22626 21577) (22633 12662) (22635 17718) (22640 21579) ( +22642 21575) (22645 16208) (22649 21583) (22654 15694) (22659 13869) (22661 21584) (22675 19048) ( +22679 16765) (22684 17478) (22687 21586) (22696 19279) (22699 21587) (22702 21592) (22707 18991) ( +22712 21591) (22713 21585) (22714 21588) (22715 21590) (22718 14886) (22721 19017) (22725 21593) ( +22727 17221) (22730 12917) (22732 15981) (22737 21595) (22739 21594) (22741 14696) (22743 21596) ( +22744 21598) (22745 21597) (22748 21600) (22750 21589) (22751 21602) (22756 21601) (22757 21599) ( +22763 15182) (22764 16209) (22766 16724) (22767 21603) (22768 16444) (22769 12397) (22770 18276) ( +22775 17499) (22777 21605) (22778 21604) (22779 21606) (22780 21607) (22781 21608))] + +[89 ((22786 21609) (22793 19025) (22794 21610) (22799 12870) (22800 21611) (22805 19772) (22806 13104) + (22808 21065) (22809 15688) (22810 16959) (22811 21612) (22812 19563) (22818 19508) (22821 21614) ( +22823 16999) (22825 17719) (22826 16960) (22827 18775 30041) (22828 21615) (22829 21616) (22830 12667) + (22833 15418 30166) (22834 21617) (22839 12368) (22840 21618) (22846 21619) (22852 12642) (22855 +13425) (22856 18016) (22857 19060) (22862 21623) (22863 16725) (22864 21622) (22865 14144) (22868 +19291) (22869 21621) (22871 17765) (22872 21625) (22874 21624) (22880 21627) (22882 21626) (22885 +12668) (22887 21628) (22888 15913) (22889 21630) (22890 17189) (22892 21629) (22894 18995) (22899 +15735) (22900 17755) (22904 21793) (22909 14629) (22913 21794) (22914 18209) (22915 18526) (22916 +19537) (22922 18213) (22925 21803) (22931 13624) (22934 19781) (22937 19503) (22939 22060) (22941 +21795) (22947 21798) (22949 16965) (22952 19256) (22956 17738) (22962 21799) (22969 19301) (22971 +14922) (22974 15914) (22982 21800) (22985 15184) (22987 15183) (22992 12345 30180) (22993 14408) ( +22995 16427) (22996 12369) (23001 21804) (23002 21805) (23004 21802) (23013 12600) (23014 13359) ( +23016 21801) (23018 19525) (23019 18737) (23030 12328) (23035 12409) (23039 15185))] + +[90 ((23041 12370) (23043 12323) (23049 21810) (23057 21808) (23064 19516) (23066 21811) (23068 21809) + (23071 21807) (23072 16177) (23077 21806) (23081 19034) (23087 14436) (23093 21815) (23094 21816) ( +23100 15915) (23104 21812) (23105 20268) (23110 18252) (23113 21814) (23130 14887 30145) (23138 21817) + (23142 18776) (23146 21818) (23148 21813) (23167 19515) (23186 18270) (23194 21819) (23195 18738) ( +23228 21820) (23229 21824 30051) (23230 21821) (23233 12871) (23234 21823) (23241 15419) (23243 21822) + (23244 14201) (23248 21836) (23254 21829) (23255 21826) (23265 17252) (23267 21825) (23270 21827) ( +23273 21828) (23290 21830) (23291 21831))] + +[91 ((23305 13426) (23307 21833) (23308 21832) (23318 21834) (23330 15982) (23338 21837) (23340 17500) + (23344 12613) (23346 21835) (23350 21838) (23358 21839) (23360 21842) (23363 21840) (23365 21841) ( +23376 15186) (23377 21843) (23380 14630) (23381 21844) (23383 15226 29985) (23384 16952) (23386 21845) + (23387 21846) (23388 15194) (23389 14631) (23391 19538) (23395 13608) (23396 14409) (23397 21847) ( +23398 13144) (23401 21848 30027) (23403 16953) (23408 21849) (23409 22051) (23411 21850) (23413 21851) + (23416 21852) (23418 21854) (23424 21855) (23427 21856) (23429 17008) (23431 12583) (23432 15465) ( +23433 12354 30029) (23435 16727) (23436 13360 30129) (23437 15413) (23439 14632) (23445 17766) (23447 +15649) (23448 13361) (23449 17256) (23450 17514) (23451 12344) (23452 13625) (23453 19061) (23455 +15426) (23458 13650) (23459 16491) (23460 15420) (23461 19752) (23462 21857) (23470 13660) (23472 +14923) (23475 13106) (23476 12643) (23477 15916) (23478 12872) (23480 21858) (23481 19782) (23487 +15689) (23490 15460) (23491 21859) (23492 13427) (23493 18002) (23494 19497) (23495 21860) (23497 +21861) (23500 18777) (23504 21863) (23506 13352) (23507 13943) (23508 21862) (23515 13362) (23517 +16178) (23518 21867) (23519 15137) (23521 12873) (23522 21866) (23524 21864) (23525 21868) (23526 +21865) (23527 18219) (23528 23629) (23529 16179) (23531 21869 30057) (23534 20032) (23536 21870) ( +23539 21872) (23541 17278) (23542 21871) (23544 16419) (23546 15227) (23550 16976) (23551 15479))] + +[92 ((23553 18805) (23554 16492) (23556 15437) (23557 21873) (23558 15917) (23559 21874) (23560 21875) + (23561 12371) (23562 16954) (23563 16210) (23565 21876) (23566 17971) (23567 15918) (23569 15919 +30011) (23571 21877) (23574 16493) (23578 15920) (23584 21878) (23586 21879) (23588 19552) (23592 +21880) (23597 13894) (23601 15650) (23608 21881) (23609 21882) (23610 15452) (23611 16172) (23612 +18036) (23613 16212) (23614 18552) (23615 18210) (23616 13897 30139) (23617 21883) (23621 13679) ( +23622 21884) (23624 13950) (23626 17999) (23627 12848) (23629 15187) (23630 21885) (23631 22050) ( +23632 22049) (23633 13949) (23635 21886) (23637 17720) (23646 16944) (23648 17739) (23649 15432) ( +23652 16728) (23653 19834) (23660 22052) (23662 22053) (23663 18006) (23665 15155) (23670 22055) ( +23673 22056) (23692 22057) (23696 13428) (23697 22058) (23700 22059) (23713 12844) (23720 16699) ( +23721 13412) (23723 22061) (23724 19496) (23729 16978) (23731 13145) (23734 22063) (23735 22065) ( +23736 13407) (23739 22062) (23740 22064) (23742 22067) (23749 22066) (23751 22068) (23769 22069) ( +23776 17981) (23777 13870) (23784 12901) (23785 22070) (23786 22075) (23789 22073) (23791 19063) ( +23792 19062) (23798 17767) (23802 22072) (23803 15700) (23805 22071))] + +[93 ((23815 16242) (23819 22076) (23822 14954) (23825 22082) (23828 22083) (23829 22077) (23830 13107) + (23831 22078) (23832 22087) (23833 22086) (23834 22085) (23835 22081) (23839 22080) (23842 22084) ( +23849 19064) (23883 22091) (23884 22088) (23886 22090) (23888 19826) (23890 22089) (23900 22079) ( +23913 16243) (23916 22092) (23919 14903) (23923 22093) (23926 22094) (23938 22097) (23940 22096) ( +23943 22095) (23947 17768) (23948 22074) (23952 22103) (23965 22099) (23970 22098) (23980 22100) ( +23982 22101) (23991 22104) (23994 20070) (23996 22105) (23997 22102) (24009 22106) (24012 13408) ( +24013 22107) (24018 22109) (24019 22108) (24022 22110) (24027 22111) (24029 16494) (24030 15651) ( +24033 15716) (24035 16739) (24037 14633) (24038 14904) (24039 14634) (24040 13680) (24043 22112) ( +24046 14905) (24049 14410 30058) (24050 22113) (24051 19494) (24052 18243) (24053 22114) (24055 14635) + (24059 13356) (24061 17191) (24062 13906))] + +[94 ((24066 15188 30007) (24067 18779 30148) (24070 18497) (24075 22115) (24076 13429) (24081 22118) ( +24086 17441) (24089 22117) (24090 22116) (24091 22119) (24093 17515) (24101 16227) (24107 15189 29988) + (24109 16458) (24111 16979) (24112 13602) (24115 17442) (24118 22120 30122) (24119 22121) (24120 +15983) (24125 19257) (24128 22124) (24131 22123) (24132 22122) (24133 18813) (24135 22131) (24140 +19290) (24142 22125) (24148 22127) (24149 19307) (24151 22126) (24159 22128) (24161 18472) (24162 +22129) (24163 19006) (24164 22130) (24178 13363) (24179 19007 30003) (24180 18223) (24181 22132) ( +24182 22133) (24184 14636) (24185 13364) (24186 22134) (24187 14392) (24188 19780) (24189 19753) ( +24190 13430) (24191 22136) (24193 17443) (24195 14637) (24196 15921) (24199 18527) (24202 15922) ( +24207 15736) (24213 17516) (24214 19065) (24215 17721) (24218 14638) (24220 18780 30128) (24224 22137) + (24230 17753 30171) (24231 14914) (24235 14411) (24237 17517) (24245 12355) (24246 15726) (24247 +14639) (24248 19783) (24257 22138) (24258 22139) (24259 18257) (24264 22140) (24265 20087) (24266 +20269) (24271 22142) (24272 22141) (24275 13127) (24278 22305) (24282 22308) (24283 22309) (24285 +22307) (24287 18752) (24288 15923) (24289 22311) (24290 22310) (24291 22306) (24296 22312) (24297 +22313) (24300 22314) (24304 22317) (24305 22315) (24307 22316) (24308 22318) (24310 12644) (24311 +17518) (24312 22319) (24314 14202) (24315 12918) (24316 18230) (24318 22320) (24319 18043))] + +[95 ((24321 19035) (24323 22321) (24324 20270) (24329 22322) (24330 19008) (24331 22325) (24332 20513) + (24333 20529) (24335 15408) (24336 18037) (24337 22326) (24339 13661) (24340 17444) (24341 12410) ( +24342 22327) (24343 18982) (24344 14640) (24347 17232) (24351 17519 30052) (24357 19567) (24358 14393) + (24359 14412) (24361 22328) (24365 22329) (24367 22335) (24369 15461) (24373 17445 30134) (24375 +13871) (24376 22330) (24380 18731) (24382 17222) (24385 22331) (24392 22332) (24394 13872) (24396 +22333) (24398 22334) (24401 22336) (24403 17782) (24406 22337) (24407 22338) (24409 22339) (24412 +22324) (24413 22323) (24417 22340) (24418 14145 30168) (24422 18727) (24425 14924) (24426 18743) ( +24427 17446) (24428 18763) (24429 22341) (24432 15924) (24433 12614) (24435 22342) (24439 22343) ( +24441 19570) (24444 18528) (24447 22346) (24448 12669 30187) (24449 16428) (24450 22345) (24451 22344) + (24452 14146) (24453 16980) (24455 22350) (24456 22348) (24458 22347) (24459 20007) (24460 14437) ( +24464 15737) (24465 22349) (24466 17740) (24467 15678) (24471 17984) (24472 22353) (24473 22352) ( +24478 22351) (24480 22354) (24481 14438) (24488 22355) (24489 18812) (24490 15707) (24493 22356) ( +24494 18553) (24499 17985) (24500 17447) (24505 17712) (24508 22357) (24509 13611) (24515 16180) ( +24517 18732 30049) (24524 13431) (24525 18214) (24534 22358) (24535 15190) (24536 19258) (24537 19259) + (24540 12670) (24541 22363) (24544 17257) (24548 22360) (24555 12919 29987) (24560 22573) (24561 +22362) (24565 18224) (24568 22361) (24571 22359) (24573 14714) (24575 22365))] + +[96 ((24590 22371 29986) (24591 22377) (24592 22369) (24594 17756) (24597 22374) (24598 18781) (24601 +22368) (24603 22373) (24604 20071) (24605 15191) (24608 16981) (24609 22366) (24613 13662) (24614 +22376) (24615 16429) (24616 12645) (24617 22370) (24618 12920) (24619 22375) (24623 13873) (24625 +22372) (24634 22378) (24641 22380) (24642 22390) (24643 22388) (24646 22385) (24650 22384) (24651 +20088) (24653 22386) (24656 13874) (24658 14641) (24661 15738) (24665 22393) (24666 22379) (24671 +22383) (24672 22367) (24674 12922) (24675 22387) (24676 22389) (24677 17233) (24680 14888) (24681 +12856) (24682 22381) (24683 22392) (24684 22391) (24685 13875) (24687 16937) (24688 13158) (24693 +14147) (24695 22382) (24705 22394) (24707 22397) (24708 22561) (24713 15421) (24715 22567) (24716 +17520) (24717 22395) (24722 22565) (24724 12921) (24726 22563) (24727 22564) (24730 22398) (24731 +22562) (24735 14439) (24736 19754) (24739 13365) (24742 12633) (24743 22566) (24745 18234) (24746 +12333) (24754 18529) (24755 22364) (24756 22572) (24757 22576) (24758 19557) (24760 22569) (24764 +17769) (24765 22574) (24773 15984) (24774 22575) (24775 18007) (24785 20295) (24787 22571) (24792 +22577) (24794 14715) (24796 16459) (24799 12372) (24800 22570) (24801 22568) (24803 16730) (24807 +22396) (24808 15156) (24816 16966) (24817 22589) (24819 16731) (24820 22584) (24822 22581) (24823 +22582) (24825 15462) (24826 22585) (24827 22588))] + +[97 ((24832 22583) (24833 15653) (24835 22586) (24838 22580) (24840 19580) (24841 19579) (24845 22590) + (24846 22591) (24847 12373) (24853 22579) (24858 13938) (24859 12326 30038) (24863 13366) (24865 +22587) (24871 22595) (24872 22594) (24876 22599) (24884 22600) (24892 22598) (24893 22601) (24894 +22593) (24895 22597) (24898 22602) (24900 22603) (24903 22592) (24904 15228) (24906 22596) (24907 +16982) (24908 14642) (24909 22578) (24910 16181) (24915 22616) (24917 19049) (24920 22606) (24921 +22607) (24922 22608) (24925 22615) (24927 22614) (24930 19325) (24931 13367) (24933 22612) (24935 +14149) (24936 13108) (24939 22609) (24942 20024) (24943 22611) (24944 12374) (24945 22613) (24947 +22604) (24948 22610) (24949 22617) (24950 14148) (24951 22605) (24958 19805) (24962 19755) (24967 +22620) (24970 22624) (24974 16766) (24976 20089) (24977 22625) (24980 22622) (24982 22619) (24985 +22618) (24986 22623) (24996 18992) (24999 17972) (25001 14150) (25003 22626) (25004 22621) (25006 +22627) (25010 14203) (25014 12849) (25018 22635) (25022 13368) (25027 22633) (25030 22634) (25031 +14889) (25032 22632) (25033 22630) (25034 22629) (25035 22636) (25036 22628) (25037 22638) (25040 +12923) (25059 22640) (25062 22639) (25074 17448) (25076 22643) (25078 22641) (25079 22631) (25080 +14204) (25082 22642) (25084 22646) (25085 22645) (25086 22647) (25087 22644))] + +[98 ((25088 22648) (25096 22649) (25097 22650) (25098 19050) (25100 22652) (25101 22651) (25102 15679) + (25104 16430) (25105 12902) (25106 12924) (25108 22653) (25110 12351 30021) (25114 16460) (25115 +22654) (25117 27715) (25118 22817) (25119 14177) (25121 22818) (25126 16495) (25130 22819) (25134 +22820) (25135 13626) (25136 22821 30190) (25138 22822) (25139 22823) (25140 16983) (25144 14413) ( +25147 19553) (25151 19260) (25152 15722) (25153 22824) (25159 16496) (25160 28221) (25161 18530) ( +25163 15466) (25165 14925 30059) (25166 22825) (25171 16967) (25173 18983) (25176 17009) (25179 22828) + (25182 22826) (25184 22829) (25187 22827) (25192 22830) (25198 18993) (25201 12343) (25206 18782) ( +25209 18531) (25212 22831) (25214 22834 30164) (25215 15925) (25216 13627) (25218 22832) (25219 22839) + (25220 15926) (25225 22833) (25226 18244) (25233 19806) (25234 22835) (25235 22836) (25236 22840) ( +25237 17770) (25238 22837) (25239 14643) (25240 16478) (25243 22854) (25244 18484) (25246 17010) ( +25259 18532) (25260 23085) (25265 19066) (25269 17521) (25273 19317) (25275 22843) (25276 12833) ( +25277 17258) (25282 22852) (25285 17204) (25286 22846) (25287 22853) (25288 22848) (25289 22855) ( +25290 22851) (25292 22850) (25293 18287) (25295 22844) (25296 12925) (25297 22842) (25298 13681) ( +25299 17011) (25300 22838) (25303 22841) (25304 14644) (25305 16475) (25307 15927) (25308 22849) ( +25309 18258) (25312 13682) (25313 13128) (25324 13159) (25325 16161) (25326 22857) (25327 22862) ( +25329 22858) (25331 14205) (25333 22863) (25334 15138) (25335 14697) (25342 15654) (25343 22845 30073) +)] + +[99 ((25345 15229) (25346 22860) (25351 15192) (25352 22861) (25353 12356) (25356 22856) (25361 17449) + (25369 13683) (25375 13876) (25383 22859) (25384 12327) (25387 14915) (25391 16182) (25402 17522) ( +25405 18516) (25406 22865) (25407 16734) (25417 16938) (25420 15147) (25421 22866) (25423 22868) ( +25424 22864) (25429 19041) (25431 17469) (25436 16732) (25447 19067) (25448 15438) (25449 22880) ( +25451 22879) (25454 16248) (25458 14206) (25462 22873) (25463 15929) (25466 18024) (25467 18225) ( +25472 22871) (25475 16733) (25480 15480) (25481 22876) (25484 15928) (25486 22870) (25487 22875) ( +25490 18259) (25494 22869) (25496 14113) (25499 13149) (25503 22877) (25504 20011) (25505 14926) ( +25506 17205) (25507 22874) (25509 16476 30138) (25511 14645) (25512 16228) (25513 12646) (25514 16700) + (25515 22872) (25516 13637) (25522 14151) (25524 17487) (25525 22878) (25531 16735) (25534 22881) ( +25536 22883) (25539 16951) (25540 22889) (25542 22884) (25545 22886) (25551 18753) (25552 17523) ( +25554 22887) (25558 19756) (25562 19784) (25563 13369) (25569 12334) (25571 22885) (25577 22882) ( +25582 13432) (25588 12647) (25590 22888) (25594 19785))] + +[100 ((25606 22892) (25613 16955) (25615 22899) (25619 22893) (25622 22890) (25623 22897) (25628 22867 +) (25638 22894) (25640 22898) (25644 18498) (25645 17771) (25652 22891) (25654 22895) (25658 14152) ( +25662 14961) (25666 16477) (25678 22903) (25688 17702) (25703 22900) (25705 19296) (25711 22901) ( +25718 22902) (25720 19534) (25722 16418) (25731 14178) (25736 22909) (25746 15157) (25747 22906) ( +25749 22905) (25754 18226) (25758 17973) (25764 17713) (25765 22907) (25769 22908) (25771 18799) ( +25773 18245) (25774 15139) (25776 16497) (25778 19280) (25785 13129) (25787 23077) (25788 22910) ( +25793 19786) (25794 23079) (25797 23075) (25799 23076) (25805 16736) (25810 23074) (25812 22847) ( +25816 23078) (25818 23073) (25824 23083) (25825 23084) (25826 17703) (25827 23086) (25830 15140) ( +25831 23081) (25836 13628) (25839 23087) (25841 23080) (25842 23091) (25844 23090) (25846 23089) ( +25850 23092) (25853 23094) (25854 15985))] + +[101 ((25856 23093) (25861 23097) (25880 23095) (25884 23096) (25885 22896) (25891 23099) (25892 23098 +) (25898 22904) (25899 23100) (25900 23088) (25903 15193) (25908 23101) (25909 23102) (25910 23104 +30064) (25911 23103) (25912 23105) (25913 12926) (25915 14646) (25918 19068 30030) (25919 16431) ( +25925 14414 30048) (25928 23107) (25933 23110) (25935 18770) (25937 13663) (25941 23109) (25942 23108) + (25943 18260) (25944 23111) (25945 13877) (25949 23113) (25950 23112) (25954 13370) (25955 15158) ( +25958 18008) (25964 14153) (25968 16244) (25970 23114) (25972 16432) (25973 17704) (25975 18783) ( +25976 23115 30136) (25986 23116) (25987 23117) (25991 19000 30026) (25992 21853) (25993 16454) (25996 +18764) (25998 14936) (26000 18533) (26001 18499) (26007 17741) (26009 20033) (26011 23119) (26012 +15440) (26015 23120) (26017 12342) (26020 13908) (26021 16461) (26023 18784) (26027 23121) (26028 +15170) (26029 17223) (26031 15195) (26032 16183) (26039 23122) (26041 19069) (26044 12663) (26045 +15196) (26049 23125) (26051 23123) (26052 23126) (26053 20025) (26054 23124) (26059 16507) (26060 +23127) (26063 16946) (26066 23128) (26071 13434) (26073 23130) (26075 23129) (26080 23131) (26081 +23132) (26082 13435) (26085 18044) (26086 17206) (26087 13676) (26088 15197) (26089 16737 30147) ( +26092 15708) (26093 12336) (26097 23133) (26106 12834) (26107 23137))] + +[102 ((26114 14647) (26115 23136) (26118 14891) (26119 15930) (26122 23135) (26124 15931) (26126 19520 +) (26127 14890) (26131 12375 30169) (26132 16462) (26140 23142) (26143 16433) (26144 12615) (26149 +15701) (26151 19302) (26152 14962) (26157 15932) (26159 16423) (26164 23141) (26165 23139) (26166 +23140) (26172 17259) (26175 23334) (26177 23146) (26178 15230) (26179 14648) (26180 23144) (26185 +23145) (26187 16184) (26191 23143) (26194 15151) (26205 23148) (26206 23147) (26207 23152) (26210 +23153) (26212 23149) (26214 13090) (26215 23150) (26216 23151) (26217 18517) (26222 18785) (26223 +14154) (26224 23154) (26228 16434) (26230 15933) (26234 17234) (26241 13895) (26243 23155) (26244 +23159) (26247 12875) (26248 23156) (26249 23158) (26254 23157) (26257 15723) (26262 17224) (26263 +12357) (26264 23160) (26269 23161) (26274 17450) (26278 20081) (26283 15171) (26286 19051) (26292 +19261) (26296 23330) (26297 23163) (26300 23166) (26302 23165) (26305 23162) (26308 23329) (26311 +18014) (26313 23164) (26326 23331) (26329 15724) (26330 23332) (26332 19787) (26333 18296) (26336 +23333) (26342 23335) (26345 23336) (26352 23337) (26354 13898) (26355 12616) (26356 14649 30160) ( +26357 23338) (26359 23339) (26360 15729 30000) (26361 16738) (26364 21080) (26365 16702) (26366 16701) + (26367 16984))] + +[103 ((26368 14919) (26371 20594) (26376 14190) (26377 19757) (26379 19070) (26381 18814 30181) (26383 + 23340) (26388 14963) (26389 17471) (26390 23341) (26391 20271) (26395 19262 30077) (26397 17451) ( +26398 23342) (26399 13436 30116) (26406 23343) (26407 23344) (26408 19546 30191) (26410 19492 30126) ( +26411 19318) (26412 19292) (26413 15141) (26414 23346) (26417 15467) (26420 19281) (26422 23348) ( +26423 23351) (26424 23350) (26426 13433) (26429 13664) (26431 23347) (26433 23349) (26438 23352) ( +26441 16249) (26446 19835) (26447 12361) (26448 14944) (26449 16956) (26451 15453) (26454 15987) ( +26457 23355) (26460 17742) (26462 23353) (26463 16939) (26464 23354) (26465 15986) (26466 19549) ( +26467 23356) (26468 23357) (26469 19816) (26474 23362) (26477 14650) (26479 18261) (26480 23359) ( +26481 17772) (26482 23134) (26483 23138) (26485 13647) (26487 18247) (26492 23361) (26494 15934) ( +26495 18500) (26501 23367) (26503 18554) (26505 23358) (26507 23364) (26508 23363) (26512 16463) ( +26517 19309) (26519 20051 30137) (26522 19303) (26524 12876 29996) (26525 15198) (26528 20296) (26529 +23366) (26530 16245) (26534 23365) (26537 23360) (26543 14415) (26547 23372) (26548 23370) (26550 +12877) (26551 23368) (26552 23374) (26553 23380) (26561 16968) (26564 19009) (26566 23382) (26570 +18722) (26574 23381) (26575 18288) (26576 19263) (26577 13371) (26579 16503) (26580 15680) (26584 +17491) (26586 19758) (26589 23377) (26590 23376) (26594 23378) (26596 23375) (26599 23383) (26601 +23373) (26604 23371) (26606 23379) (26607 23369) (26609 17260) (26611 19576) (26612 15430) (26613 +14964) (26619 14906) (26622 19311) (26623 13121))] + +[104 ((26626 17486) (26627 17994) (26628 12617) (26643 16498) (26646 16436) (26647 14122) (26654 23385 +) (26657 14651) (26658 13180) (26665 23387) (26666 13172) (26667 23393) (26674 23390) (26676 16499) ( +26680 13131) (26681 14892) (26684 13130) (26685 14927) (26688 23388) (26689 14181) (26690 14155) ( +26691 17773) (26694 23386) (26696 12358) (26701 23389) (26702 23391) (26704 13901) (26705 14124) ( +26707 13372) (26708 13643) (26713 23394) (26716 14969) (26717 19313) (26719 15159) (26723 23395) ( +26727 18736) (26740 23407) (26742 12851) (26743 23396) (26750 23413) (26751 23397) (26753 20034) ( +26755 23404) (26757 18271) (26765 23412) (26767 23399) (26771 12340) (26772 23401) (26775 14652) ( +26779 23403) (26781 23402 30050) (26783 23398) (26784 23409) (26786 15935) (26790 21613) (26791 14440) + (26792 19836) (26797 23400) (26799 17524) (26800 13091) (26801 14893) (26803 23392) (26805 23408) ( +26806 13153) (26809 23406) (26810 23410) (26812 17774) (26820 13438) (26822 23602) (26825 19529) ( +26826 23415) (26827 13437) (26829 23422) (26834 19264) (26836 23585) (26837 23587) (26839 23591) ( +26840 23417) (26842 17194) (26847 17775) (26848 23595) (26849 23420) (26851 23592) (26855 23586) ( +26862 16185) (26863 23596) (26866 16435) (26873 23594) (26874 13373))] + +[105 ((26880 20304) (26881 23414) (26884 23590) (26885 12376) (26888 23416) (26891 19514) (26892 23421 +) (26893 16162) (26894 17479) (26895 23411) (26898 23589) (26905 16250) (26906 23599) (26907 13169) ( +26908 14369) (26913 23601) (26914 23418) (26915 23600) (26917 23593) (26918 23419) (26920 23597) ( +26922 23598) (26928 23615) (26932 17998) (26934 23588) (26937 23611) (26941 23613) (26943 17496) ( +26954 19788) (26963 18806) (26964 23608) (26965 16970) (26969 23614) (26970 16703) (26972 23605) ( +26973 23618) (26974 23617) (26976 18031) (26977 23616) (26978 18026) (26986 23620) (26987 23607) ( +26989 13896 30004) (26990 23610) (26991 15709) (26995 18272) (26996 23612) (26997 13899 30149) (26999 +23604) (27000 23606) (27001 23603) (27004 20272) (27005 13146) (27006 23609) (27009 23619) (27010 +13109) (27018 14951) (27022 12637) (27025 23636) (27028 20273) (27029 23639) (27035 16186) (27036 +23638) (27040 23637) (27047 23634) (27054 23622) (27057 23651) (27058 23621) (27060 23640) (27067 +23632) (27070 23627) (27071 23624) (27073 23625) (27075 23633) (27079 29986) (27082 23630) (27083 +14653) (27084 17480) (27085 16740) (27086 23628) (27088 23623) (27091 23626) (27096 19789) (27097 +19306) (27101 23631) (27102 23641) (27111 23649) (27112 23642) (27115 23655) (27117 23653) (27122 +23648) (27129 23647) (27131 17488) (27133 16741) (27135 23645))] + +[106 ((27138 23643 30144) (27141 23650) (27146 23656) (27147 18549) (27148 23662) (27154 23657) (27155 + 23660) (27156 23654) (27159 17268) (27161 18744) (27163 23644) (27166 23652) (27167 15936) (27169 +19535) (27170 23672) (27171 23659) (27177 14370) (27178 12835) (27179 13151) (27182 23635) (27189 +15937) (27190 23664) (27192 23671) (27193 15481 30118) (27194 13170) (27197 17198) (27204 23661) ( +27207 23666) (27208 23670) (27211 13878) (27224 13644) (27225 23668) (27231 13601 30031) (27233 17995) + (27234 23667) (27238 23669) (27250 23663) (27256 23665) (27263 13152) (27264 17225) (27268 23676) ( +27277 23674) (27278 14441) (27280 23673) (27287 23841) (27292 23384) (27296 23675) (27298 23677) ( +27299 23678) (27306 23852) (27308 23848) (27310 23405) (27315 23847) (27320 23846) (27323 23843) ( +27329 23658) (27330 23845) (27331 23844) (27345 23850) (27347 20262) (27354 23853) (27355 13947) ( +27358 23849) (27359 23851) (27368 18471) (27370 23854) (27386 23858) (27387 23855))] + +[107 ((27396 19827) (27397 23856) (27402 23646) (27410 23859) (27414 23860) (27421 12597) (27423 23862 +) (27424 14183) (27425 15393 30022) (27427 13909) (27431 12836) (27442 19807) (27447 23864) (27448 +23863) (27449 23866) (27450 13629) (27453 13910) (27454 13374) (27459 23869) (27463 23868) (27465 +23870) (27468 12878) (27470 17207) (27472 23871) (27475 13375) (27476 23873) (27481 23872) (27483 +23874) (27487 23875) (27489 23876) (27490 15199) (27491 16437) (27492 14881) (27494 18800) (27497 +19042) (27498 20292) (27503 15221) (27507 14928) (27508 20082) (27512 23877) (27513 23878) (27515 +15200 30113) (27519 23879) (27520 23880) (27523 23882) (27524 23881) (27526 19288) (27529 15710) ( +27530 15468) (27531 15172) (27533 23883) (27541 23885) (27542 16163) (27544 23884) (27550 23886) ( +27556 23887) (27562 23888) (27563 23889) (27567 23890) (27569 23892) (27570 23891) (27571 23893) ( +27572 12837) (27573 17226) (27575 23894) (27578 15142) (27579 13132) (27580 23895) (27583 17730) ( +27584 21580) (27589 13603) (27590 23896) (27595 23897) (27597 19052 29995) (27598 19304) (27599 30023) + (27602 17991) (27603 23898) (27604 18534 30037) (27608 18555) (27611 19539) (27615 23899) (27627 +23901) (27628 23900) (27631 23903) (27635 23902))] + +[108 ((27656 23905) (27663 15201) (27665 19505) (27667 23906) (27668 23907) (27671 13604) (27675 23908 +) (27683 23910) (27684 23909) (27700 16229) (27703 18745) (27704 12618) (27710 18501) (27712 17525) ( +27713 15681) (27714 13665 30063) (27726 18502) (27728 15406) (27733 23912) (27735 13376) (27738 12664) + (27741 18034) (27742 23911) (27743 14654 30072) (27744 17235) (27746 23913) (27752 23921) (27754 +23914) (27760 16961) (27762 13666) (27763 23922) (27770 14184 30197) (27773 13605) (27774 23920) ( +27777 23918) (27778 23915) (27779 19808) (27784 17472) (27788 18009) (27789 23916) (27792 23924) ( +27794 23923) (27795 14115) (27798 12845) (27801 14907) (27802 23917) (27803 23919) (27809 19287) ( +27810 17012) (27819 19319) (27822 23932) (27825 23933) (27827 12879 30060) (27832 18984) (27833 19581) + (27834 24097) (27835 15395) (27836 15938) (27837 23928) (27838 23934) (27839 12648) (27841 13879) ( +27844 23925) (27845 23930) (27849 16500) (27850 18289) (27852 18535) (27859 23927) (27861 19233) ( +27863 23929) (27865 24100) (27867 24098) (27869 23931) (27873 19234) (27874 18248) (27875 13667) ( +27877 17701) (27880 17261) (27882 24101) (27887 24099) (27888 16985) (27889 23926) (27891 12619))] + +[109 ((27915 19790 30143) (27916 24112) (27922 24111) (27927 16502) (27929 24108) (27931 19820) (27934 + 17974) (27935 24102) (27941 17477) (27945 12620) (27946 14655) (27947 24105) (27954 15655) (27955 +24110) (27957 24109) (27958 24104) (27960 24107) (27963 13160 29991) (27965 24106) (27966 18249) ( +27969 20014 30198) (27972 15988) (27973 16501) (27993 24118) (27994 24116) (27996 18765) (28003 24113) + (28004 24115) (28006 12602) (28009 14656) (28010 20274) (28012 13117) (28014 18786) (28020 19809) ( +28023 13092 29993) (28024 16187) (28025 24117) (28037 24122) (28040 15939) (28044 19760) (28046 24119) + (28051 24114) (28053 24120) (28057 20062) (28059 17779) (28060 17986) (28079 13110) (28082 12629) ( +28085 24126) (28088 24129) (28092 20035) (28096 19812) (28101 24136) (28102 24130) (28103 24127) ( +28107 20052) (28108 24133) (28113 15690) (28114 24135) (28117 24140) (28120 17777) (28121 24138) ( +28126 24132) (28129 17208) (28132 24139) (28134 24128) (28136 24134) (28138 24141) (28139 12412) ( +28140 24131) (28142 24142) (28145 16188) (28147 15711) (28149 18981) (28151 14894) (28153 24123) ( +28154 24137) (28155 17722))] + +[110 ((28165 16438 30142) (28167 13161) (28168 14929) (28169 15940) (28170 24125) (28171 15682) (28179 + 14156) (28181 24124) (28185 24146) (28186 15725) (28187 14394) (28189 24161) (28191 24155) (28192 +13684) (28193 17743) (28195 24150) (28196 24159) (28197 12335) (28198 12594) (28201 12857) (28203 +24152) (28204 16940) (28205 24143) (28206 24145) (28207 14657) (28216 24162) (28218 24157) (28222 +24149) (28227 24156) (28234 19499) (28237 24154) (28238 24158) (28246 14416) (28248 15941) (28251 +17209) (28255 24148) (28263 19759) (28267 24151) (28270 24144) (28271 17778) (28274 24147) (28278 +24153) (28286 20305) (28287 15422) (28288 19326) (28290 24163) (28300 18478) (28303 24175) (28304 +14395) (28310 15712) (28312 24165) (28316 20015) (28317 14658) (28319 24178) (28322 12398) (28325 +24176) (28330 24164) (28335 24170) (28338 24172) (28342 19791) (28343 24167) (28346 17710) (28349 +24169) (28354 24177) (28356 24171) (28357 19527) (28361 24166) (28363 15394) (28364 24190) (28369 +13162) (28371 24168) (28372 24173) (28373 24174) (28381 17004) (28382 16986) (28396 24182) (28399 +24188) (28402 24186) (28404 17705) (28407 24355) (28408 24183) (28414 24184) (28415 24160))] + +[111 ((28417 13689) (28418 18746) (28422 15423) (28425 14711) (28431 20275) (28433 24180) (28435 24354 +) (28436 12649) (28437 16742) (28448 18297) (28450 13377) (28451 20090) (28459 19489) (28460 17490) ( +28465 24187) (28466 24189) (28472 16690) (28478 24353) (28479 24185) (28481 24179) (28485 13379) ( +28500 14185) (28504 24367) (28507 24362) (28508 16504) (28511 13155) (28516 15713) (28518 24371) ( +28525 24364) (28526 17452) (28527 24361) (28528 17497) (28532 24396) (28536 24358) (28538 24357) ( +28540 24366) (28544 24360) (28545 24359) (28546 24365) (28548 16417) (28550 24356) (28558 24368) ( +28561 24369) (28567 13378) (28577 24374) (28579 24373) (28580 24375) (28586 24378) (28593 17731) ( +28595 24372) (28601 24376) (28608 14179) (28609 17017) (28610 24370) (28611 18235) (28614 24377) ( +28628 24382) (28629 24380) (28632 24383) (28635 24386) (28639 24379) (28640 14698) (28641 18216) ( +28644 24121) (28651 19828) (28652 24381) (28654 24385) (28655 17013) (28657 24384) (28659 24363) ( +28662 28521) (28666 24389) (28670 24393))] + +[112 ((28673 24391) (28681 24387) (28683 24388) (28687 24392) (28689 24390) (28693 18766) (28696 24398 +) (28698 24395) (28699 24394) (28701 24397) (28702 18004) (28703 24399) (28710 17269) (28711 17005) ( +28716 16421) (28720 24400) (28722 24402) (28734 24401) (28748 24181) (28753 24403) (28760 18023) ( +28771 24404) (28779 12880 30025) (28783 17780) (28784 13093) (28792 13668) (28796 15454) (28797 14930) + (28809 20263) (28810 16230) (28814 12650) (28818 24406) (28825 24405) (28844 24409) (28845 17210) ( +28846 24412) (28847 24407) (28851 24411) (28856 24410) (28857 17728) (28858 12377) (28872 20085) ( +28875 24414) (28879 12584) (28889 24416) (28893 24415) (28895 24413) (28913 24408) (28921 19235) ( +28925 24418))] + +[113 ((28937 24417) (28948 12651) (28953 24420) (28954 18994) (28956 24419) (28961 19509) (28966 15943 +) (28982 16691) (28988 15942) (29001 20091) (29004 24426) (29006 16505) (29013 24422) (29014 24427) ( +29017 12652) (29026 24425) (29028 18273) (29029 24421) (29030 24424) (29031 15944 30178) (29033 18513) + (29036 24428) (29038 15441) (29053 16506) (29060 24431) (29064 24423) (29066 14119) (29071 24429) ( +29076 19792) (29077 24432) (29081 29990) (29087 15695) (29096 24433) (29100 24434) (29105 18222 30199) + (29113 24436) (29118 24437) (29123 18227) (29128 17781) (29129 24439) (29134 24441) (29136 20053) ( +29138 24438) (29140 24440) (29141 12653) (29143 24435) (29151 21339) (29152 24442) (29157 16743) ( +29158 15160) (29159 24444) (29164 24443) (29165 16164) (29166 21081) (29173 24445) (29177 24609) ( +29179 24430) (29180 24446) (29183 24610))] + +[114 ((29190 18298) (29197 24611) (29200 24612) (29211 24613) (29224 24614) (29226 17502) (29228 24616 +) (29229 24615) (29232 24617) (29234 24618) (29237 15455) (29238 18787 30053) (29242 19564) (29243 +24619) (29244 24620) (29245 16726) (29246 15396) (29247 24621) (29248 24622) (29254 24623) (29255 +19026) (29256 18503) (29259 24624) (29260 18263) (29266 17453) (29272 24625) (29273 12903) (29275 +13677) (29277 19526) (29279 19510) (29281 12852) (29282 20276) (29287 19282) (29289 18986) (29298 +16439) (29300 24626) (29305 17987) (29309 14371) (29310 24627) (29312 14932) (29313 24629) (29314 +24628) (29319 24630) (29330 24631) (29334 24632) (29344 13630) (29346 24633) (29351 24634) (29356 +14372) (29359 18504) (29362 24636) (29366 15989) (29369 24635) (29378 13880) (29379 24637) (29380 +24639) (29382 24638) (29390 24640) (29392 14417) (29394 24641) (29399 13929) (29401 16704) (29403 +14717) (29408 24643) (29409 24644) (29410 24642) (29417 15469) (29420 17992) (29421 13881) (29431 +24646) (29432 17196) (29433 24645) (29436 20277) (29437 18274))] + +[115 ((29450 24649) (29462 24651) (29463 24648) (29467 19540) (29468 24650) (29469 24652) (29471 20036 +) (29477 24656) (29481 24655) (29482 17270) (29483 18221) (29486 14373) (29487 24654) (29492 24653) ( +29494 19761) (29495 19762) (29502 24657) (29503 12654) (29508 14710) (29509 15202) (29518 24658) ( +29519 24659) (29527 24661) (29539 15683) (29544 24663) (29546 24662) (29552 24664) (29554 13133) ( +29557 24666) (29560 24665) (29562 24668) (29563 24667) (29572 14396) (29575 20008) (29577 13900) ( +29579 12838 30039) (29590 13930) (29609 13409) (29618 20072) (29619 24670) (29627 24672) (29632 24673) + (29634 12881) (29640 24669) (29642 15161) (29645 17473) (29646 24671) (29662 24676) (29664 15470) ( +29669 24674) (29674 14142) (29677 18505 30114) (29678 24675) (29681 24702) (29688 24681) (29694 14397) +)] + +[116 ((29699 13669 30185) (29701 24678) (29702 19837 30036) (29705 20016) (29730 17014) (29733 24680) +(29746 24682) (29747 20054) (29748 13911) (29749 18556) (29750 18250) (29754 24683) (29759 24685) ( +29761 24688) (29781 24684) (29785 24687) (29786 14442) (29787 12621) (29788 24689) (29790 16240) ( +29791 24686) (29792 20060) (29795 24692) (29796 29988) (29801 24690) (29802 24693) (29807 24679) ( +29808 24691) (29811 14908) (29814 24694) (29822 24695) (29827 19838) (29835 24696) (29854 24697) ( +29858 24677) (29863 24698) (29872 13380) (29885 15397) (29898 24699) (29903 24700) (29908 24701) ( +29916 12603) (29920 24865) (29922 18747) (29923 24866) (29926 13348) (29927 24867) (29929 24868) ( +29934 24869) (29936 24871) (29937 24872) (29938 24870) (29942 18771) (29943 24874) (29944 24873))] + +[117 ((29955 24876) (29956 24875) (29957 24877) (29964 24878) (29965 24880) (29966 24879) (29969 14713 +) (29971 24882) (29973 24881) (29976 13381) (29978 16211) (29980 17724) (29982 24883) (29983 16440) ( +29986 30152) (29987 15162) (29989 12665) (29990 24884) (29992 19793) (29995 19043) (29996 24885) ( +30000 17732) (30001 19763) (30002 14659) (30003 16189) (30007 17227) (30008 21044) (30010 17454) ( +30011 12904) (30012 24886) (30020 24887) (30022 24892) (30025 24890) (30026 24889) (30027 23106) ( +30028 13094 30075) (30029 24888) (30031 12378) (30033 18474) (30036 18506) (30041 20017) (30042 24893) + (30043 24891) (30044 17244) (30045 16422) (30048 18475) (30050 18733) (30052 24895) (30053 20012) ( +30054 14157) (30055 24896) (30057 24894) (30058 18518) (30059 24897) (30061 24898) (30064 12379) ( +30067 15990) (30068 24903) (30070 24900) (30071 18029) (30072 24899) (30079 13606) (30082 24906) ( +30086 24901) (30087 24902) (30089 24905) (30090 24904) (30091 18725) (30094 16706) (30095 16705) ( +30097 13631) (30100 24907) (30106 24908) (30109 24909) (30115 24911) (30117 24910) (30123 12630) ( +30129 24919) (30130 18536) (30131 24913) (30133 24915) (30136 24917) (30137 16190) (30140 24918) ( +30141 24916) (30142 15424) (30146 24912) (30147 24914) (30149 18754) (30151 15945) (30154 24921) ( +30157 24920) (30162 24922) (30164 15398) (30165 14895) (30168 17783) (30169 24923) (30171 17483) ( +30174 24925) (30178 20001) (30179 24924) (30185 16745) (30192 24930) (30194 24932) (30195 24933) ( +30196 17236) (30202 24931) (30204 24928) (30206 24926) (30207 24927))] + +[118 ((30209 24929) (30217 24936) (30219 24934) (30221 24935) (30239 24937) (30240 24939) (30241 24940 +) (30242 24941) (30244 24942) (30247 24938) (30256 24944) (30260 24943) (30267 24945) (30274 20037) ( +30278 24948) (30279 24946) (30280 24947) (30284 13410) (30290 19582) (30294 19018) (30296 24950) ( +30300 24949) (30305 24951) (30306 24952) (30311 24956) (30312 24953) (30313 24954) (30314 24955) ( +30316 24957) (30320 24958) (30322 25121) (30326 25122) (30328 25123) (30330 18479) (30331 17744) ( +30332 25124) (30333 18290) (30334 18740) (30336 25125) (30339 25126) (30340 17706) (30342 13095) ( +30343 14660) (30344 25127) (30347 25128) (30350 25129) (30352 15145) (30355 25131) (30358 25130) ( +30361 25132) (30362 25133) (30382 18537) (30384 25134) (30388 25135) (30391 29545) (30392 25136) ( +30393 25137) (30394 25138) (30399 15150) (30402 25139) (30403 18262) (30406 19295) (30408 12622) ( +30410 12631) (30413 25140) (30418 25142) (30422 25141) (30423 17776) (30427 16441) (30428 23865) ( +30430 25143) (30431 19521) (30433 25144) (30435 13382) (30436 18519) (30437 25145) (30439 25146) ( +30442 25147) (30446 19548) (30450 19541) (30452 17470 30204) (30456 16746 29990) (30459 25149) (30462 +15714))] + +[119 ((30465 15946 30061) (30468 25152) (30471 25151) (30472 25150) (30473 18557) (30475 13383) (30476 + 14377) (30491 25158) (30494 25155) (30495 16191) (30496 19506) (30500 25154) (30501 25156) (30502 +25157) (30505 25153) (30519 25159) (30520 25160) (30522 17455) (30524 13411 30150) (30528 17253) ( +30535 25161) (30554 25162) (30555 25165) (30561 16231) (30563 17988) (30565 25166) (30566 19283) ( +30568 25163) (30571 25164) (30585 25169) (30590 25168) (30591 25167) (30603 25171) (30606 25170) ( +30609 25172) (30622 25174) (30624 25173) (30629 19021) (30636 15702) (30637 20038) (30640 25175) ( +30643 17975) (30646 25176) (30649 25177) (30651 25181) (30652 25179) (30653 25180) (30655 25178) ( +30663 25182) (30669 25183) (30679 25184) (30682 25185) (30683 19511) (30684 25186) (30690 19568) ( +30691 25187) (30693 17230) (30695 18282) (30697 13931) (30701 17211) (30702 25188) (30703 13882) ( +30707 16464) (30716 25189))] + +[120 ((30722 14909) (30732 25190) (30738 25191) (30740 14374) (30741 14933) (30752 25193) (30757 17750 +) (30758 14934) (30759 13646) (30770 19236) (30772 18251) (30778 17751) (30783 14684) (30789 25195) ( +30813 15947) (30827 20018) (30828 14661) (30831 14375) (30834 18467) (30836 25197) (30844 25199) ( +30849 14443) (30854 25198) (30855 17526) (30860 25201) (30861 13111) (30862 25196) (30865 18538) ( +30867 12592) (30869 14956) (30871 20306) (30874 25200) (30883 25202) (30887 19019) (30889 16473) ( +30890 25204) (30895 25205) (30901 25203) (30906 13134) (30908 25211) (30910 25210) (30913 15399) ( +30917 25212) (30918 25207) (30922 25213) (30923 25208) (30928 18520) (30929 25206) (30932 25209) ( +30938 25378) (30951 25377) (30952 19297) (30956 25214) (30959 12395) (30964 25380) (30973 25379))] + +[121 ((30977 15948) (30983 25381) (30990 16707) (30993 25383) (30994 25382) (31001 25384) (31014 25192 +) (31018 25194) (31019 25386) (31020 25385) (31034 15400) (31036 20073) (31038 15442 30146) (31040 +25387) (31041 14135) (31047 13632) (31048 13607) (31049 15203) (31056 19764) (31059 25393) (31061 +25392) (31062 16708) (31063 25389) (31066 25391) (31069 15691) (31070 16192 30196) (31071 25390) ( +31072 25388) (31074 18218) (31077 15949) (31080 18748) (31085 14935) (31095 17784) (31098 25394) ( +31103 25395) (31104 25417) (31105 13912) (31108 20285) (31109 16693) (31114 25396) (31117 12882) ( +31118 17527) (31119 18977) (31133 25397) (31142 13690) (31143 25398) (31146 25400) (31150 25401) ( +31152 18217) (31155 25402) (31161 25403) (31162 25404) (31165 13913) (31166 12883) (31167 17989) ( +31168 15656) (31169 15204) (31177 25405) (31179 15657) (31185 12874) (31186 18755) (31189 25406) ( +31192 18539) (31199 16709) (31201 25409) (31203 25410) (31204 18281) (31206 16193) (31207 25407) ( +31209 17249) (31212 25408) (31216 15950) (31227 12380))] + +[122 ((31232 13609) (31240 25411) (31243 17528) (31245 25412) (31246 16455) (31252 19501) (31255 18723 +) (31256 25413) (31257 25414) (31258 17237) (31260 20039) (31263 25416) (31264 25415) (31278 15471) ( +31281 25418) (31282 12400) (31287 25421) (31291 25419) (31292 12884) (31293 14158) (31294 25420) ( +31295 14662) (31296 14706) (31298 19046) (31299 25422) (31302 19284) (31305 25424) (31309 16465) ( +31310 12623) (31311 12858) (31312 12332) (31319 25423) (31329 25425) (31330 25426) (31331 15991) ( +31337 25427) (31339 13135) (31344 25429) (31348 14186) (31350 13670 30201) (31353 25430) (31354 13941 +30078) (31357 25431) (31359 16508) (31361 17997) (31363 16480) (31364 14965) (31368 25432) (31378 +17250) (31379 16747) (31381 25434) (31382 25436) (31383 25433) (31384 25435) (31391 14114) (31401 +25437) (31402 14118) (31406 13671) (31407 19794) (31408 25439) (31414 25440) (31418 12590) (31423 +25443) (31427 13174) (31428 25442) (31429 25441) (31431 25445) (31432 25438) (31434 25446) (31435 +20009 29997) (31437 25447) (31439 25448) (31442 21620) (31443 25450) (31445 25449) (31449 25451) ( +31450 25452) (31452 20021) (31453 25453) (31455 28783) (31456 15951) (31457 25454) (31458 25455) ( +31459 15703) (31461 17976) (31462 25456) (31466 17192) (31469 25457) (31471 17212) (31472 25458) ( +31478 13861) (31480 20799) (31481 17245) (31482 15411) (31487 13384))] + +[123 ((31490 25459) (31492 25634) (31494 25462) (31496 13672) (31498 25461) (31499 25636) (31503 25460 +) (31505 15952 30192) (31512 25464) (31513 25465) (31515 17707) (31518 25466) (31520 13150) (31525 +16218) (31526 18788) (31528 25468) (31532 17000) (31539 25463) (31541 25467) (31542 25469) (31545 +14971) (31557 25638) (31558 18734) (31560 18470) (31561 17785) (31563 13914) (31564 25637) (31565 +25635) (31567 18485) (31568 25470) (31569 17246) (31570 17787) (31572 17786 30163) (31574 14966) ( +31581 25656) (31589 25640) (31591 25642) (31596 25645) (31598 25646) (31600 25643) (31601 25644) ( +31604 25641) (31605 25639) (31610 25633) (31622 19023) (31623 12885) (31627 25653) (31629 25650) ( +31631 25655) (31634 25654) (31636 18291) (31637 19495) (31639 15163 30159) (31640 25648) (31641 25657) + (31642 25652) (31644 25651) (31645 25647) (31647 25649) (31649 13385) (31658 17213) (31661 16509) ( +31665 18466) (31668 25662) (31672 18468) (31680 16481) (31681 25659) (31684 18511) (31686 25663) ( +31687 19027) (31689 17243) (31691 25658) (31692 25660) (31695 25661) (31709 25664) (31712 15428) ( +31716 17990) (31717 25669) (31718 25668) (31721 25665) (31725 20278) (31731 25674) (31734 25678) ( +31735 25675))] + +[124 ((31744 25671) (31751 25672) (31757 25677) (31761 25666) (31762 21077) (31763 25673) (31764 25667 +) (31767 25676) (31775 25682) (31777 13386) (31779 25679) (31783 25680) (31786 25681) (31787 25684) ( +31799 25683) (31800 18550) (31805 25685) (31806 20092) (31807 19053) (31808 25690) (31811 25687) ( +31820 25686) (31821 16466) (31823 25689) (31824 25691) (31828 25688) (31830 25695) (31832 25692) ( +31839 25693) (31840 25670) (31844 25694) (31845 25696) (31852 25697) (31859 19014) (31861 25698) ( +31870 19554) (31873 13902) (31874 14121) (31875 25699) (31881 18996) (31883 16232) (31885 19504) ( +31888 25700) (31890 20019) (31893 18292) (31895 16710) (31896 18228) (31899 15693) (31903 12352) ( +31905 25705) (31906 25703) (31908 25701) (31909 13345) (31911 15953) (31912 25706) (31915 25704) ( +31917 25702) (31918 25710) (31921 25709) (31922 25708) (31923 25707) (31929 25711) (31933 25712) ( +31934 16442) (31936 25713) (31938 25715) (31941 25714) (31946 14418) (31950 16696) (31954 25717) ( +31958 17788) (31960 25716) (31964 25718) (31966 18997) (31967 16748) (31968 14663) (31970 25719) ( +31975 20040) (31983 25721) (31986 25722) (31988 25723) (31990 25724) (31992 15205) (31994 25725) ( +31995 14159) (31998 13674))] + +[125 ((32000 13610) (32002 25889) (32004 19571 30202) (32005 14664) (32006 25726) (32010 25892) (32011 + 19558) (32013 18236) (32016 18739) (32020 15715) (32021 25891) (32023 15443) (32024 14665) (32025 +15206) (32026 13673) (32027 18998) (32028 25890) (32032 16711) (32033 19266) (32034 14967) (32043 +15207) (32044 17501) (32046 25895) (32047 20063) (32048 14937) (32050 25896) (32051 16194) (32053 +25898) (32057 15954) (32058 14896) (32063 25897) (32066 15658) (32067 14398) (32068 16712) (32069 +25893) (32070 25899) (32075 25894) (32076 14160) (32078 25902) (32079 25906) (32080 14187 30120) ( +32086 25901) (32091 25910) (32094 14666) (32097 19821) (32098 12348) (32099 25907) (32102 13675) ( +32104 25904) (32110 25905) (32113 17789) (32114 25903) (32115 25900) (32117 13096) (32118 16484) ( +32121 14376) (32125 25912) (32137 25909) (32143 25911) (32147 25908) (32153 14161) (32154 16947) ( +32155 25913) (32156 16750) (32159 25926) (32162 25922) (32163 25916) (32171 25920) (32172 15482) ( +32173 12381) (32174 25915) (32175 25923) (32176 25927) (32177 14667) (32178 19542) (32180 17494) ( +32181 25917) (32184 25925) (32186 25914) (32187 17214) (32189 25919) (32190 12349) (32191 19530) ( +32199 25918) (32202 13915) (32203 18540) (32207 16749) (32209 20048) (32210 15727) (32213 25966) ( +32216 25928) (32218 16510) (32220 25924) (32221 25929) (32222 25931) (32224 17529) (32225 25934) ( +32228 25930) (32232 19028) (32233 13387) (32236 19531) (32239 12382) (32242 25933) (32244 20093) ( +32251 25932))] + +[126 ((32257 12655) (32260 18028) (32261 25935) (32265 25942) (32266 25936) (32267 25943) (32274 25939 +) (32283 18299) (32286 15434) (32287 25941) (32289 25938) (32290 25944) (32291 25937) (32294 15684) ( +32299 19237) (32302 15692) (32305 25940) (32306 25952) (32309 25948) (32311 25951) (32313 25949) ( +32314 25953) (32315 25947) (32317 25921 30024) (32318 16467) (32321 18507) (32323 25950) (32326 25945) + (32330 16673) (32331 14162) (32333 15659) (32340 16165) (32341 16694) (32342 25956) (32345 25958) ( +32346 25959) (32349 25955) (32350 25957) (32358 25946) (32359 25954) (32361 25962) (32362 25961) ( +32365 19322) (32368 14123) (32377 25960) (32379 25964) (32380 25963) (32381 25967) (32383 25969) ( +32386 15164) (32387 25965) (32392 25970) (32393 25971) (32396 25972) (32398 25978) (32399 17723) ( +32400 25974) (32402 25973) (32403 25975) (32404 25976) (32406 25977) (32411 25979) (32412 25980))] + +[127 ((32566 13388) (32568 25981) (32570 25982) (32581 26145) (32588 26146) (32589 26147) (32590 26148 +) (32592 26149) (32593 26150) (32596 26152) (32597 26151) (32600 26153) (32607 26154) (32608 26155) ( +32615 26158) (32616 26156) (32617 26157) (32618 14945) (32619 14163) (32622 17238) (32624 18483) ( +32626 15728) (32629 18253) (32631 18541 30165) (32632 26159) (32633 22637) (32642 26160) (32643 26162) + (32645 19813) (32646 26161) (32647 26164) (32648 26163) (32650 19795) (32652 26165) (32654 18558) ( +32660 26166) (32666 26169) (32669 26168) (32670 26167) (32675 26170 30170) (32676 14130) (32680 16674) + (32681 13633 30127) (32686 26174) (32687 26171) (32690 26172) (32694 26175) (32696 26176) (32697 +26173) (32701 12585) (32705 12839) (32709 26178) (32710 26179) (32714 26180) (32716 19810) (32722 +15660) (32724 26182) (32725 26181) (32736 16233) (32737 26183) (32742 26184) (32745 26185) (32747 +13413) (32752 13389) (32755 26186) (32761 26187) (32763 19293) (32764 19811))] + +[128 ((32768 19796) (32769 20279) (32771 14669) (32772 26190) (32773 15444) (32774 26189) (32779 26191 +) (32780 15401) (32784 16977) (32786 26192) (32789 14668) (32791 19543) (32792 26193) (32793 26194) ( +32796 26195) (32801 26196) (32808 26197) (32819 15402) (32822 19565) (32827 26199) (32829 17215) ( +32831 26198) (32838 26201) (32842 26200) (32850 26202) (32854 16443) (32856 26203) (32858 26204) ( +32862 19001) (32863 26205) (32865 16751) (32866 26206) (32872 26207) (32879 20094) (32880 26210) ( +32882 26209) (32883 26208) (32884 17456) (32886 26211) (32887 16166) (32889 26212) (32893 26213) ( +32894 20280) (32895 26214) (32900 26215) (32901 26217) (32902 26216) (32903 18469) (32905 18041) ( +32907 20286) (32908 18473) (32915 26219) (32918 15955) (32920 18730) (32922 26220) (32923 26218) ( +32925 13390) (32929 14420) (32930 15208) (32933 18542) (32937 14378) (32938 19267) (32940 26223) ( +32941 26221) (32943 14670) (32945 14671) (32946 12393 30047) (32948 14952) (32954 18265) (32963 12383) + (32964 26228) (32966 17216) (32972 18264) (32974 16987) (32982 26230) (32985 26226) (32986 26229) ( +32987 26224) (32989 26227) (32990 19238) (32993 14421) (32996 12413) (32997 26225) (33007 26232) ( +33009 26233) (33012 17977) (33016 13883) (33020 26406) (33021 18237))] + +[129 ((33026 15209) (33029 13884) (33030 16456) (33031 20294) (33032 19502) (33033 26231) (33034 16468 +) (33050 13651) (33051 26234) (33059 26236) (33065 26235) (33071 26237) (33073 17190) (33075 18238) ( +33081 17457) (33086 26403) (33094 26402) (33099 26238) (33102 16213) (33104 18789) (33105 26405) ( +33107 26404) (33108 14672) (33109 20307) (33119 26421) (33125 26409) (33126 26410) (33131 15472) ( +33134 26408) (33136 14712) (33137 26407) (33140 26411) (33144 17458) (33145 18978) (33146 16675) ( +33151 16988) (33152 26415) (33154 26416) (33155 26412) (33160 26413) (33162 26414) (33167 14673) ( +33171 26422) (33173 26418) (33178 18790) (33180 19308) (33181 18728) (33184 26417) (33187 26420) ( +33188 26419) (33192 19268) (33193 26423) (33200 26424) (33203 16695) (33205 26425) (33208 26427) ( +33210 26431) (33213 26428) (33214 26426) (33215 18239) (33216 26429) (33218 26430) (33222 12850) ( +33224 26437) (33225 26432) (33229 26433) (33233 26434) (33235 16929) (33240 26436) (33241 26435) ( +33242 26438) (33247 26439) (33248 26440) (33251 16195) (33253 12905) (33255 26441) (33256 20055) ( +33258 15403) (33261 15661) (33267 15210 30175) (33268 17239) (33274 26442) (33275 26443) (33276 12593) + (33278 26444))] + +[130 ((33281 26445) (33282 26446) (33285 26447) (33287 26448 30042) (33288 13885 30155) (33289 23082 +30194) (33290 26449) (33292 16485) (33293 26450) (33294 15435) (33296 26451) (33298 20528) (33302 +26452) (33303 19038) (33304 13404) (33307 16676) (33308 15704) (33310 18801) (33311 15662) (33321 +26453) (33322 14674) (33323 26454) (33324 18508) (33326 26468) (33331 26456) (33333 16969) (33334 +18293) (33335 14399) (33336 26455) (33337 16677) (33344 26457) (33351 17530) (33368 26459) (33369 +26458) (33370 26461) (33373 26460) (33375 26462) (33378 26464) (33380 26463) (33382 13391) (33384 +26465) (33386 26466) (33387 26467) (33390 14897) (33391 20041) (33393 26469) (33394 16167) (33398 +12656) (33399 26470) (33400 26471) (33406 26472) (33419 12402) (33421 26473) (33426 26474) (33433 +18791) (33437 15431) (33439 26476) (33445 13097) (33446 12338) (33451 26475) (33452 26478) (33453 +18254) (33455 16196) (33457 12886 30044) (33459 19239) (33464 14173) (33465 13916) (33467 26477) ( +33469 12906) (33477 13347) (33489 12657) (33490 26482) (33491 20074) (33492 16989) (33495 18756) ( +33497 26494) (33499 12887) (33500 26492) (33502 26490) (33503 26481) (33505 26479) (33507 26480) ( +33509 15459 30174) (33510 13932) (33511 17271) (33515 18001) (33521 12625 30184) (33523 26484) (33524 +26483) (33529 26489) (33530 26485) (33531 26488))] + +[131 ((33538 19536) (33539 26487) (33540 12888) (33541 13181) (33542 26491) (33545 26493) (33550 14164 +) (33558 26659) (33559 26668) (33560 26669) (33564 12331) (33571 26676) (33576 12401) (33579 26667) ( +33583 26666) (33585 26661) (33586 26660) (33588 26658) (33589 26657) (33590 17251) (33592 17019) ( +33593 26663) (33600 26662) (33605 26665) (33609 16752) (33610 14165) (33615 12609) (33616 26664) ( +33618 14675) (33624 16753) (33651 26682) (33653 26683) (33655 12889) (33659 12846) (33660 26680) ( +33669 26670) (33671 26678) (33673 26685) (33674 26679) (33678 26677) (33683 26486) (33686 26675) ( +33690 26671) (33694 13392) (33695 26673) (33696 26684) (33698 26674) (33704 26686) (33706 26672) ( +33707 18300) (33713 19817) (33717 26681) (33725 26703) (33729 26695) (33733 16251) (33738 13638) ( +33740 13917) (33742 26690) (33747 12891) (33750 15956) (33752 26693) (33756 14938) (33759 17745) ( +33760 26698) (33769 19054) (33771 26689) (33775 12890 30045) (33776 14422) (33777 18729) (33778 26699) + (33780 26687) (33783 26696) (33787 26706) (33789 26691))] + +[132 ((33795 26692) (33796 17978) (33799 26697) (33803 26694) (33804 19240) (33805 26700) (33806 12384 +) (33811 26688) (33824 26702) (33826 26701) (33833 18283) (33834 26708) (33836 26719 30065) (33841 +13182) (33845 26722) (33848 26704) (33852 26709) (33853 19822) (33862 26718) (33865 19797) (33870 +20010) (33879 17272) (33883 13163) (33889 18802) (33890 26724) (33891 17953) (33894 12337) (33897 +26717) (33899 26713) (33900 16754) (33901 26707) (33902 26715) (33903 26720) (33905 18220) (33909 +12330) (33911 26712) (33913 26721) (33914 18808) (33922 26716) (33924 26711) (33931 15957) (33936 +15663) (33940 15404) (33945 19544) (33948 18759) (33951 26727) (33953 26736) (33965 26714) (33970 +13175) (33976 15992) (33977 26725) (33979 26730) (33980 16755) (33983 26726) (33985 26733) (33988 +17247) (33990 26734) (33993 19798) (33994 26723) (33995 13112) (33997 26729) (34000 26732) (34001 +19500) (34006 26735) (34009 26728) (34010 26731) (34028 19241) (34030 20257) (34036 26739) (34044 +26746) (34047 26738))] + +[133 ((34048 15427) (34054 26705) (34065 19022) (34067 19490) (34068 26745) (34069 26744) (34071 26740 +) (34072 26741) (34074 12598) (34079 26743) (34081 26737) (34086 17493) (34092 26742) (34093 12414) ( +34101 16930) (34109 19011) (34112 26747) (34113 26913) (34115 18521) (34120 26750) (34121 15958) ( +34122 15433) (34123 26915) (34126 13886) (34133 26916) (34135 18809) (34136 26749) (34138 26710) ( +34147 26748) (34152 20303) (34153 17954) (34154 18803) (34157 26923) (34167 26929) (34174 26930) ( +34176 26917) (34180 18294) (34183 26927) (34184 26919) (34186 26921) (34192 26931) (34193 26920) ( +34196 26924) (34199 12658) (34201 18021) (34203 26925) (34204 26928) (34212 26918) (34214 16678) ( +34216 26922) (34217 15143) (34218 16197) (34219 14128) (34220 19572) (34222 19577) (34223 15730) ( +34233 26935) (34234 26933) (34241 20302) (34249 26932) (34253 19829) (34255 26934) (34256 26936) ( +34261 26937) (34268 26940) (34269 26938) (34276 17955) (34277 26939) (34281 18509) (34282 26926) ( +34295 15731) (34297 26941) (34298 26946) (34299 16756) (34302 26945))] + +[134 ((34306 26914) (34310 26947) (34311 16713) (34314 26942) (34315 26944) (34323 26943) (34326 23857 +) (34327 23842) (34330 26949) (34338 26948) (34349 19830) (34351 25148) (34352 26950) (34367 26951) ( +34381 26952) (34382 14423) (34384 13652) (34388 26954) (34389 20829 29989) (34394 13685) (34396 20026) + (34398 13939) (34399 26955 30121) (34407 26956) (34411 17262) (34417 26957) (34425 18042) (34427 +12346) (34442 12899) (34443 26962) (34444 26963) (34451 26958) (34453 15165) (34467 26959) (34468 +18242) (34473 26960) (34474 26961) (34475 26971) (34479 26965) (34480 26968) (34486 26964) (34500 +26966) (34502 26967) (34503 15448) (34505 26969) (34507 17217) (34509 14166) (34510 13122) (34516 +26972) (34521 13119) (34523 26977) (34526 26973) (34527 26976) (34532 18490) (34537 26974) (34540 +26975) (34541 18760) (34542 18522) (34543 26978) (34552 17021) (34553 26988) (34555 26984) (34558 +12907))] + +[135 ((34560 26982) (34562 19242) (34563 26983) (34566 26980) (34568 26981) (34569 26986) (34570 26989 +) (34573 26987) (34577 26985) (34578 26979) (34584 17240) (34586 26996) (34588 19498) (34597 26994) ( +34601 26995) (34612 26990) (34615 26992) (34619 26993) (34623 26991) (34633 16486) (34635 20281) ( +34636 27000) (34638 27001) (34643 27169) (34645 16170) (34647 27003) (34649 27006) (34655 26998) ( +34656 26997) (34659 27170) (34662 12892) (34664 27004) (34666 27171) (34670 27005) (34676 27002) ( +34678 17459) (34680 26999) (34687 18280) (34690 27175) (34701 19771) (34719 27174) (34722 27173) ( +34731 27182) (34735 27176) (34739 27184) (34746 19814) (34747 27187) (34749 27178) (34752 27179) ( +34756 27183) (34758 27186) (34759 27185) (34763 27177) (34768 27180) (34770 27197) (34784 27190) ( +34799 27188) (34802 27189) (34806 27194) (34807 27195) (34809 13098) (34811 13634) (34814 27193))] + +[136 ((34821 27172) (34829 27192) (34830 27196) (34831 27191) (34833 27198) (34837 27200) (34838 27199 +) (34849 27202) (34850 27201) (34851 26970) (34855 27206) (34865 27203) (34870 27204) (34873 27205) ( +34875 27207) (34880 14188) (34882 27209) (34884 27208) (34886 15664) (34892 14676) (34893 24103) ( +34898 27210) (34899 15697) (34903 13113) (34905 27211) (34907 12626) (34909 15959) (34910 27212) ( +34913 14677) (34914 27213) (34915 12385 30173) (34920 18749 30055) (34923 27214) (34928 16234) (34930 +27221) (34933 27218) (34935 17263) (34941 27219) (34942 27216) (34943 13918) (34945 27215) (34946 +27222) (34952 14134) (34955 16990) (34957 27228) (34962 27224) (34966 16949) (34967 27223) (34969 +27226) (34974 27217) (34978 27227) (34980 27229) (34987 18543 30008) (34990 27225) (34992 27230) ( +34993 27232) (34996 14419) (34997 27220) (34999 12353) (35007 27231) (35009 14939) (35010 20086) ( +35011 27233) (35012 27234) (35013 16757) (35023 20002) (35028 27235) (35029 19765) (35032 27236) ( +35033 27237) (35036 19044) (35037 27238) (35039 14912) (35041 20003) (35048 27243) (35058 27244) ( +35059 15960) (35060 27242) (35064 19815) (35065 27239) (35068 27241) (35069 16445) (35070 16254))] + +[137 ((35074 27240) (35076 27245) (35079 18979) (35082 27247) (35084 27246) (35088 13164) (35090 19243 +) (35091 27248) (35101 27260) (35102 27250) (35109 27251) (35114 27252) (35115 27253) (35126 27257) ( +35128 27258) (35131 27256) (35137 27254) (35139 27249) (35140 27255) (35148 27259) (35149 28727) ( +35158 12840) (35166 27262) (35167 13919) (35168 27261) (35172 27426) (35174 27425) (35178 27428) ( +35181 27427) (35183 27429) (35186 15665) (35188 27430) (35191 27431) (35198 27432) (35199 16446) ( +35201 19799) (35203 27433) (35206 18980) (35207 18246) (35208 27434) (35210 27435) (35211 14379) ( +35215 13612) (35219 27436) (35222 15211) (35223 18241) (35224 27437) (35226 13136) (35233 27438) ( +35238 27440) (35239 19831) (35241 27439) (35242 16198 29992) (35244 27441) (35247 27442) (35250 27443) + (35251 13393) (35258 27444) (35261 27445) (35263 27446) (35264 27447) (35282 13137) (35290 27448) ( +35292 27449) (35293 27450) (35299 12914) (35302 16168) (35303 27451) (35316 27452) (35320 27453))] + +[138 ((35328 14400) (35330 17531) (35331 27454) (35336 14167 30189) (35338 16214) (35340 27457) (35342 + 17956) (35344 27456) (35347 14129) (35350 27455) (35351 17015) (35352 13613) (35355 27458) (35357 +27459) (35359 15961) (35363 14189) (35365 27460) (35370 19244) (35373 16479) (35377 13686 30009) ( +35379 19573) (35380 16714) (35382 27461) (35386 16199) (35387 17264) (35388 15962) (35393 27462) ( +35398 27465) (35400 27466) (35408 14910) (35409 16962) (35410 27464) (35412 15963) (35413 18750) ( +35419 27463) (35422 15212) (35424 12627) (35426 27470) (35427 14168) (35430 15214) (35433 15213) ( +35435 20301) (35436 27469) (35437 27468) (35438 16679) (35440 13645) (35441 20291) (35442 13114 30125) + (35443 15964) (35452 27467) (35458 27472) (35460 27473) (35461 27471) (35463 14424) (35465 19776) ( +35468 15215) (35469 18215) (35473 27476) (35475 16448) (35477 17218) (35480 19766) (35482 27479) ( +35486 14444) (35488 16447) (35489 27475) (35491 27480) (35492 14445) (35493 27477) (35494 27478) ( +35496 27474) (35500 16482) (35501 17993) (35504 17199) (35506 12893 30046) (35513 18544) (35516 13635) + (35519 17460) (35522 27483) (35524 27481) (35527 17228) (35531 16449 30010) (35532 13394) (35533 +27482) (35535 16219) (35538 20042) (35542 20288 30130) (35546 27484) (35547 27495) (35548 17461) ( +35550 27494) (35552 27491) (35553 27499) (35554 27492) (35556 27488) (35558 17532) (35559 27487) ( +35563 27485) (35565 19745) (35566 15216) (35569 27489) (35571 27486) (35575 27493) (35576 15732) ( +35578 14401) (35582 17018))] + +[139 ((35584 19269) (35585 12634) (35586 12386) (35588 17957) (35591 27497) (35596 27496) (35598 18022 +) (35600 27501) (35604 27490) (35606 27500) (35607 27502) (35609 14380) (35610 27498) (35611 14678 +30188) (35613 15445) (35616 27503) (35617 19800) (35622 27506) (35624 27509) (35627 27507) (35628 +18741) (35635 27504) (35641 13920) (35646 27508) (35649 27510) (35657 27514) (35660 27511) (35662 +27513) (35663 27512) (35670 27515) (35672 15409) (35674 27517) (35675 27516) (35676 18792) (35679 +27681) (35686 14169) (35691 27518) (35692 27682) (35695 27683) (35696 13636 30176) (35697 26177) ( +35698 15993) (35700 27684) (35703 14446) (35709 27685) (35712 27686) (35715 15166) (35722 23118 30179) + (35724 27687) (35726 27688) (35728 15666) (35730 27689) (35731 27690) (35734 27691) (35737 27692) ( +35738 27693))] + +[140 ((35895 17195) (35898 27694) (35903 27696) (35905 27695) (35910 17958) (35912 27697) (35914 19245 +) (35916 27698) (35918 27699) (35920 27700) (35925 27701) (35930 18010) (35937 15965) (35938 27702) ( +35946 14699) (35947 20526) (35948 27703) (35960 27704) (35961 18751) (35962 27705) (35964 27713) ( +35970 27706) (35973 27708) (35977 27707) (35978 27709) (35980 19270) (35981 27710) (35982 27711) ( +35988 27712) (35992 27714) (35997 13101) (35998 17511) (36000 18793) (36001 14946) (36002 14679) ( +36007 18767) (36008 12895) (36009 18510) (36010 27717) (36011 13395) (36012 16469) (36013 27716) ( +36014 27721) (36015 17273) (36016 19555) (36018 27719) (36019 27720) (36020 13614) (36022 27722) ( +36023 18275) (36024 16991) (36027 18545) (36028 17725) (36029 27718) (36031 19271) (36032 12908) ( +36033 27724) (36034 20264) (36035 17474) (36036 20293) (36039 15217) (36040 27723) (36042 16945) ( +36045 27740) (36046 16680) (36049 18040) (36051 18768) (36058 27727) (36059 15167) (36060 15218) ( +36062 15966) (36064 18277) (36066 14381) (36067 27726) (36068 27725) (36070 18794) (36074 15425) ( +36077 17746) (36090 27729) (36091 27730) (36092 14680) (36093 27728))] + +[141 ((36100 27731) (36101 27732) (36103 27734) (36104 16931) (36106 27733) (36107 13414) (36109 27736 +) (36111 27735) (36112 27737) (36115 27739) (36116 27741) (36118 27742) (36196 16470) (36198 15439) ( +36199 27743) (36203 13138) (36205 27744) (36208 16758) (36209 27745) (36211 27746) (36212 18795) ( +36215 13615) (36225 27747) (36229 17462) (36234 12635) (36249 27748) (36259 15473) (36264 16246) ( +36275 16941) (36282 27751) (36286 27750) (36290 27749) (36299 27757) (36300 27755) (36303 27752) ( +36310 27754) (36314 27753) (36315 27756) (36317 13687) (36319 27760 30195) (36321 16471) (36323 27761) + (36328 14425) (36330 27758) (36331 27759) (36335 20265) (36339 17463) (36341 16681) (36348 27762) ( +36351 27765))] + +[142 ((36360 27763) (36361 27764) (36362 19801) (36367 17959) (36368 27768) (36381 27766) (36382 27767 +) (36383 27769) (36394 27945) (36400 27772) (36404 27773) (36405 27771) (36418 27770) (36420 17533) ( +36423 27937) (36424 27941) (36425 27938) (36426 27774) (36428 27939) (36432 27940) (36437 27947) ( +36441 27942) (36447 16472) (36448 27944) (36451 27946) (36452 27943) (36466 27949) (36468 15667) ( +36470 27948) (36476 27950) (36481 27951) (36484 27954) (36485 27953) (36487 27952) (36490 27956) ( +36491 27955) (36493 19574) (36497 27958) (36499 27957) (36500 27959) (36505 27960) (36513 27962) ( +36522 27961) (36523 16200 30006) (36524 27963) (36527 13933) (36528 27964) (36529 27966) (36542 27967) + (36549 27968) (36550 27965) (36552 27969) (36554 15446 30015) (36555 27970) (36556 13616) (36557 +14131 30016) (36562 14382) (36571 27971) (36575 18032) (36578 17726) (36579 27972) (36587 27975) ( +36600 15412) (36603 27974) (36604 27973) (36605 14170) (36606 27976))] + +[143 ((36611 13139) (36613 27978) (36617 14940) (36618 27977) (36620 27986) (36626 27980) (36627 27982 +) (36628 19045) (36629 27979) (36633 27981) (36635 27985) (36636 27983) (36637 13617) (36639 27984) ( +36646 27987) (36649 18266) (36650 20056) (36655 15668) (36659 27988) (36664 19746) (36665 27990) ( +36667 27989) (36670 27993) (36671 19777) (36674 27992) (36676 13165) (36677 27991) (36678 27996) ( +36681 27995) (36684 27994) (36685 17714) (36686 27997) (36695 27998) (36700 27999) (36703 14700) ( +36705 14117) (36706 28000) (36707 28001) (36708 28002) (36763 16201) (36764 28003) (36766 15405) ( +36767 28004) (36771 28005) (36775 21025) (36776 20862) (36781 28006) (36782 25968) (36783 28007) ( +36784 17188) (36785 16171) (36786 18240) (36791 28008) (36794 19029) (36795 17492) (36796 14718) ( +36799 17193) (36802 12586) (36804 19320) (36805 16215) (36814 14174) (36817 13921 30177) (36820 19030) + (36826 28009) (36834 28011) (36837 28010) (36838 12896) (36841 18038) (36842 28012) (36843 18295) ( +36845 17715) (36847 28013) (36848 15698) (36852 28015) (36855 19522) (36856 28030) (36857 28017) ( +36858 28018) (36861 17481))] + +[144 ((36864 16992) (36865 16759) (36867 17960) (36869 28016) (36870 13653) (36875 28025) (36877 28022 +) (36878 28197) (36879 17961) (36880 17248) (36881 28019) (36883 17534) (36884 17747) (36885 28020) ( +36886 28024) (36887 16224) (36889 18279) (36890 17484 30054) (36893 16450) (36894 28023) (36895 16942) + (36896 16932 30162) (36897 28021) (36898 12329) (36899 20258) (36903 28026) (36910 16993) (36913 +15669) (36914 16202) (36917 28028) (36918 28027) (36920 12399) (36921 28029) (36924 18735) (36926 +28199) (36929 18011) (36930 16235) (36933 17241) (36935 13944) (36937 28198) (36938 19767) (36939 +12607 30167) (36941 19031) (36942 12897) (36943 28193) (36944 28194) (36945 28195) (36946 28196) ( +36947 17979) (36948 17187) (36949 12387) (36950 28200) (36952 28201) (36953 29987) (36956 16957) ( +36958 28202) (36960 12659) (36961 16716) (36963 14383) (36965 19802) (36968 28203) (36969 17708) ( +36973 16760) (36974 15447) (36975 28204) (36978 28207) (36981 15717) (36982 28205) (36983 16683) ( +36984 16682) (36986 12388) (36988 20043) (36989 28209) (36991 18546) (36992 28211) (36993 28210) ( +36994 28208) (36995 25444) (36996 13396) (36999 28014) (37001 28213) (37002 28212 30017) (37007 28214) + (37009 19768) (37027 18017) (37030 19246) (37032 28215) (37034 15449) (37039 28216) (37041 28217) ( +37045 28218) (37048 17697) (37057 12394) (37066 14681) (37070 20282) (37083 28222) (37089 14132) ( +37090 28219) (37092 28220) (37096 18804) (37101 13140) (37109 19769) (37111 13887) (37117 17748))] + +[145 ((37122 28223) (37138 28224) (37145 28225) (37165 17698) (37168 28227) (37170 28226) (37193 18003 +) (37194 28228) (37195 15670) (37196 15456) (37197 18267) (37198 17265) (37202 15474) (37204 16236) ( +37206 28229) (37208 28230) (37218 16221) (37219 28231) (37221 28232) (37225 28233) (37226 19823) ( +37228 15671) (37234 28235) (37235 28234) (37237 14682) (37239 14707) (37240 15168) (37250 28238) ( +37255 15718) (37257 28237) (37259 28236) (37261 17001) (37264 14447) (37266 16451) (37271 18480) ( +37276 15673) (37282 28239) (37284 15967) (37290 28242) (37291 28240) (37295 28241) (37300 28244) ( +37301 28243) (37304 15994) (37306 28245) (37312 28246) (37313 28247) (37318 18512) (37319 14931) ( +37320 15457) (37321 28248) (37323 28249) (37324 20004) (37325 15685 30018) (37326 19566) (37327 20044) + (37328 28250) (37329 13922 30056) (37334 28251) (37336 17699) (37339 28254) (37340 13176) (37341 +16203) (37343 28252) (37345 28253) (37347 17504) (37350 19285) (37351 13948) (37365 28256) (37366 +28257) (37372 28255) (37375 28259))] + +[146 ((37389 18015) (37390 13123) (37393 28263) (37396 28260) (37397 28262) (37406 28258) (37417 28495 +) (37420 28261) (37428 20075) (37431 14426) (37439 28271) (37444 17716) (37445 28266) (37448 28269) ( +37449 28267) (37451 28272) (37456 28273) (37463 28265) (37466 28278) (37467 12660) (37470 28264) ( +37474 18477) (37476 28268) (37478 15968) (37489 14683) (37502 19272) (37504 13924) (37507 15686) ( +37509 17980) (37521 16685) (37523 28276) (37525 28270) (37526 28275) (37528 19523) (37530 17464) ( +37531 28277) (37532 28274) (37549 16684) (37559 28281) (37561 28280) (37583 28279) (37586 19247) ( +37604 15739) (37609 28282) (37610 19039) (37613 12628) (37618 18758) (37619 17266) (37624 13688) ( +37626 28284) (37628 14685))] + +[147 ((37638 15148) (37647 28283) (37648 16237) (37656 16238) (37657 28449) (37658 28451) (37664 15995 +) (37666 28450 30131) (37667 28452) (37670 13907) (37672 18757) (37675 15458) (37676 20259) (37678 +28286) (37679 14968) (37682 20287) (37685 28454) (37690 28453) (37691 28455) (37700 28285) (37707 +18025) (37709 17749) (37716 17495) (37718 28460) (37723 17219) (37724 28456) (37728 28457) (37740 +14125) (37742 28459) (37749 14384) (37756 28458) (37758 15969) (37772 13177) (37780 28464) (37782 +14911) (37783 16761) (37786 17482) (37799 13115) (37804 28462) (37805 28463) (37806 17475) (37808 +28461) (37817 28465) (37827 28471) (37832 28474) (37840 28473) (37841 17709) (37846 28466) (37847 +28467) (37848 28470) (37853 28472) (37857 13888) (37860 28475) (37861 28469) (37864 28468))] + +[148 ((37891 28479) (37895 28480) (37904 28481) (37907 28478) (37908 28477) (37912 15970) (37913 17962 +) (37914 28476) (37921 28485) (37931 28483) (37941 28484 30157) (37942 28482) (37944 17016) (37946 +28486) (37953 28487) (37956 28489) (37969 13397) (37970 28488) (37971 19578) (37978 28500) (37979 +28490) (37982 28493) (37984 28491) (37986 28492) (37994 28494) (38000 28496) (38005 28497) (38007 +28498) (38012 28501) (38013 28499) (38014 28502) (38015 28504) (38017 28503))] + +[149 ((38263 17465) (38272 19559) (38274 28505) (38275 16686) (38279 28506) (38281 19012) (38282 28507 +) (38283 13099) (38287 12604) (38289 13399) (38291 13398 30012) (38292 28508) (38294 28509) (38296 +28510) (38297 28511) (38304 28512) (38306 13400) (38307 13141) (38308 14686) (38309 18486) (38311 +28514) (38312 28513) (38317 28515) (38322 12636) (38329 28518) (38331 28517) (38332 28516) (38334 +28519) (38339 28522) (38343 12359) (38346 28520) (38348 28524) (38349 28523) (38356 28526) (38357 +28525) (38358 28527) (38360 17966) (38364 28528 30033) (38369 28529) (38370 28531) (38373 28530))] + +[150 ((38428 18796) (38433 28532) (38440 28533) (38442 14949) (38446 28534) (38447 28535) (38450 19273 +) (38459 16715) (38463 12324) (38464 16971) (38466 28536) (38468 18797) (38475 28539) (38476 28537) ( +38477 14687) (38479 28538) (38480 14402) (38491 19013) (38492 28541) (38493 28705) (38494 28542) ( +38495 28706) (38498 12577) (38499 16216) (38500 15740) (38501 13401) (38502 28707) (38506 18278) ( +38508 28709) (38512 12578) (38514 28708) (38515 17476) (38517 20045) (38518 17963) (38519 28540) ( +38520 20006) (38522 14385) (38525 19803) (38533 13945) (38534 20020) (38536 14120) (38538 16994) ( +38539 26401) (38541 28710) (38542 13100) (38543 16239) (38548 13142) (38549 28712) (38551 28713) ( +38552 28711) (38553 14180) (38555 14941) (38556 15971) (38560 12579) (38563 20057) (38567 28715) ( +38568 28206) (38570 28714) (38576 28718) (38577 28716) (38578 28717) (38580 28719) (38582 28720) ( +38583 20076) (38584 28721) (38585 28722) (38587 16457 30203) (38588 18491) (38592 16253) (38593 13415) + (38596 19770) (38597 12909) (38598 15672) (38599 14427) (38601 28725) (38603 28724) (38604 15219) ( +38605 28726) (38606 28723) (38609 15144) (38613 28730) (38614 27181) (38617 21078) (38619 16247) ( +38620 28728) (38626 20005) (38627 18033 30074) (38632 12587) (38634 16483) (38635 15414) (38640 18999) + (38642 12608) (38646 20077) (38647 19819) (38649 28731) (38651 17733 29994))] + +[151 ((38656 15483) (38660 28732) (38662 28733) (38663 16204) (38664 28734) (38666 20078) (38669 28729 +) (38670 28736) (38671 28738) (38673 28737) (38675 28735) (38678 28739) (38681 28740) (38684 16762) ( +38686 12898) (38692 28741) (38695 19512) (38698 28742) (38704 28743) (38706 20266) (38712 23345) ( +38713 28744) (38717 28745) (38718 28746) (38722 28750) (38724 28747) (38726 28748) (38728 28749) ( +38729 28751) (38738 16452) (38742 19575) (38745 16453) (38748 28752) (38750 18547 30117) (38752 28753) + (38753 29523) (38754 19532) (38756 28754) (38758 28755) (38760 28756) (38761 13143) (38763 28758) ( +38765 16217) (38769 28759) (38772 14116) (38777 28760) (38778 28764) (38780 28762) (38785 28763) ( +38788 13171) (38789 28761) (38790 28765) (38795 28766) (38797 12360) (38799 28767) (38800 28768) ( +38808 15972) (38812 28769) (38816 13639) (38819 28772) (38822 28771) (38824 28770) (38827 27505) ( +38829 19036) (38835 28773) (38836 28774) (38851 28775) (38854 28776) (38856 28777) (38859 28778) ( +38867 13402) (38876 28779) (38893 28780) (38894 18211) (38898 28782) (38899 12859) (38901 28785) ( +38902 28784) (38907 12580) (38911 13889))] + +[152 ((38913 19015) (38914 17466) (38915 14882) (38917 14688) (38918 15719) (38920 16220) (38924 28787 +) (38927 28786) (38928 19778) (38929 13416) (38930 18514) (38931 18012) (38935 16252) (38936 20046) ( +38938 14171) (38945 28790) (38948 28789) (38956 19275) (38957 17964) (38964 12624) (38967 28791) ( +38968 28788) (38971 18769) (38972 19818) (38973 28792) (38982 28793) (38987 28795) (38988 17002) ( +38989 13147) (38990 13148) (38991 28794) (38996 13417) (38997 14386) (39000 13418) (39003 17727) ( +39006 20064 30183) (39015 14428) (39019 28796) (39023 28797) (39024 28798) (39025 28961) (39027 28963) + (39028 28962) (39080 18807 30071) (39082 28964) (39087 28965) (39089 28966) (39094 28967) (39107 +28969) (39108 28968) (39110 28970) (39131 18548 30132) (39132 26188) (39135 16169) (39138 13618) ( +39145 28971) (39147 28972) (39149 21036) (39150 23867) (39151 18515) (39154 12411) (39156 12347) ( +39164 15220) (39165 19248) (39166 15998))] + +[153 ((39171 28973) (39173 19551) (39177 28974) (39178 19804) (39180 12610) (39184 15169) (39186 28975 +) (39187 12910) (39188 28976) (39192 28977) (39197 28979) (39198 28980) (39200 28982) (39201 28978) ( +39204 28981) (39208 13403) (39212 28983) (39214 28984) (39229 28985) (39230 28986) (39234 28987) ( +39237 28989) (39241 28988) (39243 28991) (39244 28994) (39248 28990) (39249 28992) (39250 28993) ( +39253 28995) (39255 13890) (39318 15475) (39319 28996) (39320 28997) (39321 14689) (39333 28998) ( +39336 13118) (39340 18255 30115) (39341 28999) (39342 29000) (39347 17242) (39348 18027) (39356 29001) + (39361 18301) (39364 16972) (39365 12632) (39366 13934) (39368 13935) (39376 17267) (39377 29006) ( +39378 13936) (39381 12911) (39384 29005) (39387 29003) (39389 29004) (39391 29002) (39394 29016) ( +39405 29007) (39406 29008) (39409 29009) (39410 29010) (39416 29012) (39419 29011) (39423 15705))] + +[154 ((39425 29013) (39429 29015) (39438 13619) (39439 29014) (39442 16763) (39443 14387) (39449 29017 +) (39464 16973) (39467 29018) (39472 17965) (39479 29019) (39486 29024) (39488 29022) (39490 29021) ( +39491 29023) (39493 29020) (39501 29026) (39509 29025) (39511 29028) (39514 13891) (39515 29027) ( +39519 29029) (39522 29030) (39524 29032) (39525 29031) (39529 29033) (39530 29035) (39531 29034) ( +39592 14716) (39597 29036) (39600 29037) (39608 13116) (39612 29038) (39616 29039) (39620 16241) ( +39631 29040) (39633 29041) (39635 29042) (39636 29043 30013) (39640 14690) (39646 29044) (39647 29045) + (39650 29046) (39651 29047) (39654 29048) (39658 18481) (39659 29050) (39661 18726) (39662 29051) ( +39663 29049) (39665 29053) (39668 29052) (39671 29054) (39675 29217))] + +[155 ((39686 29218) (39704 29219) (39706 29220) (39711 29221) (39714 29222) (39715 29223) (39717 29224 +) (39719 29225) (39720 29226) (39721 29227) (39722 29228) (39726 29229) (39727 29230) (39729 23861) ( +39730 29231) (39739 25720) (39740 13620) (39745 13089) (39746 14898) (39747 29233) (39748 29232) ( +39749 19493) (39757 29235) (39758 29236) (39759 29234) (39761 29237) (39764 19298) (39768 29238) ( +39770 13691) (39791 20261) (39796 29239) (39811 29241) (39822 12350) (39825 29242) (39826 18987) ( +39827 29240) (39830 29243) (39831 29244) (39839 29245) (39840 29246) (39848 29247) (39850 19310) ( +39851 15149) (39853 14970) (39854 16687) (39860 29248) (39865 29251) (39872 29249) (39878 29252) ( +39881 14449) (39882 29250) (39887 29253) (39889 29254) (39890 29255) (39892 29259) (39894 15146) ( +39899 16996) (39905 29260) (39906 29257) (39907 29256) (39908 29258) (39912 14175) (39920 29264) ( +39921 29263) (39922 29262) (39925 12339))] + +[156 ((39940 29274) (39942 29270) (39944 29271) (39945 29267) (39946 29273) (39948 29269) (39949 13154 +) (39952 20300) (39954 29272) (39955 29268) (39956 29266) (39957 29265) (39963 29276) (39969 29279) ( +39972 29278) (39973 29277) (39981 18761) (39982 29275) (39983 12403) (39984 29280) (39986 29282) ( +39993 13167) (39994 29261) (39995 12599) (39998 29284) (40006 29283) (40007 29281) (40008 17197) ( +40018 19312) (40023 20058) (40026 29285) (40032 29286) (40039 29287) (40054 29288) (40056 29289) ( +40165 17467) (40167 29290) (40169 18487) (40171 29295) (40172 29291) (40176 29292) (40179 19249) ( +40180 19524) (40182 18000))] + +[157 ((40195 29296) (40198 29297) (40199 17982) (40200 29294) (40201 29293) (40206 12842) (40210 29305 +) (40213 29304) (40219 12661) (40223 29302) (40227 29301) (40230 29299) (40232 13179) (40234 29298) ( +40235 15410) (40236 12841) (40251 14691) (40254 29308) (40255 29307) (40257 29306) (40260 29303) ( +40262 29309) (40264 29310) (40272 29477) (40273 29476) (40281 29478) (40284 12589) (40285 29473) ( +40286 29474) (40288 14708) (40289 19513) (40292 29475) (40300 19250) (40303 29483) (40306 29479) ( +40314 29484) (40327 29481) (40329 29480) (40335 14172) (40346 29485) (40356 29486) (40361 29487) ( +40363 29482) (40367 29300) (40370 29488) (40372 17505) (40376 29492) (40378 29493) (40379 29491) ( +40385 29490) (40386 29496) (40388 29489) (40390 29494) (40399 29495) (40403 29498) (40409 29497) ( +40422 29500) (40429 29501) (40431 29502) (40434 20297) (40440 29499) (40441 17003) (40442 14957) ( +40445 29503))] + +[158 ((40474 29504) (40475 29505) (40478 29506) (40565 29507) (40568 14388) (40569 29508) (40573 29509 +) (40575 15407) (40577 29510) (40584 29511) (40587 29512) (40588 29513) (40593 29516) (40594 29514) ( +40595 20284) (40597 29515) (40599 20079) (40605 29517) (40607 20059) (40613 29518) (40614 18302) ( +40617 29519) (40618 29521) (40621 29522) (40632 29520) (40633 14701) (40634 19533) (40635 19299) ( +40636 22135) (40638 23904) (40639 19323) (40643 30206) (40644 12843) (40652 29524) (40653 13648) ( +40654 29525) (40655 29526) (40656 29527) (40658 14709) (40660 29528) (40664 24660) (40665 19547) ( +40667 16995) (40668 29529) (40669 29531) (40670 29530) (40672 29532) (40677 29533) (40680 29534) ( +40687 29535) (40692 29536) (40694 29537) (40695 29538) (40697 29539) (40699 29540) (40700 29541) ( +40701 29542))] + +[159 ((40711 29543) (40712 29544) (40718 17700) (40723 14429) (40725 29546) (40736 16717) (40737 29547 +) (40748 29548) (40763 18721) (40766 29549) (40778 29550) (40779 25399) (40782 27738) (40783 28781) ( +40786 29551) (40788 29552) (40799 29554) (40800 29555) (40801 29556) (40802 20080) (40803 29553) ( +40806 29557) (40807 29558) (40810 29560) (40812 29559) (40818 29562) (40822 29563) (40823 29561) ( +40845 20022) (40853 29564) (40860 29565) (40861 25428) (40864 29566))] + +[167 ((42800 64870) (42801 64883) (42927 64881))] + +[169 ((43472 8507))] + +[251 ((64256 61473) (64257 61476) (64258 61477) (64259 61474) (64260 61475) (64261 61478) (64262 61481 +) (64275 58616) (64276 58617) (64277 58618) (64278 58619) (64279 58620) (64286 57840) (64287 57705) ( +64288 57706) (64289 57707) (64290 57708) (64291 57709) (64292 57710) (64293 57711) (64294 57712) ( +64295 57713) (64296 57714) (64297 57715) (64298 57694) (64299 57695) (64300 57696) (64301 57697) ( +64302 57698) (64303 57699) (64304 57719) (64305 57691) (64306 57720) (64307 57721) (64308 57722) ( +64309 57723) (64310 57724) (64312 57725) (64313 57726) (64314 57761) (64315 57692) (64316 57762) ( +64318 57763) (64320 57764) (64321 57765) (64323 57766) (64324 57693) (64326 57767) (64327 57768) ( +64328 57769) (64329 57770) (64330 57771) (64331 57700) (64332 57701) (64333 57702) (64334 57703) ( +64335 57704) (64343 62958) (64344 62956) (64345 62957) (64363 62889) (64364 62887) (64365 62888) ( +64379 62961) (64380 62959) (64381 62960) (64395 62962) (64399 62964) (64403 62967) (64404 62965) ( +64405 62966) (64421 62968) (64467 57535) (64477 57539))] + +[252 ((64562 62891) (64606 62882) (64607 62883) (64608 62884) (64609 62885) (64610 62886))] + +[254 ((65056 9181) (65057 9182) (65059 9183) (65072 12076) (65073 12070) (65075 12068) (65076 12216) ( +65077 12077) (65078 12078) (65079 11827 12081) (65080 11828 12082) (65081 12079) (65082 12080) (65083 +12093) (65084 12094) (65085 12264) (65086 12265) (65087 12193) (65088 12194) (65089 12089) (65090 +12090) (65091 12091) (65092 12092) (65154 62753) (65156 62754) (65158 62755) (65160 62756) (65162 +62759) (65163 62757) (65164 62758) (65166 62760) (65168 62763) (65169 62761) (65170 62762) (65172 +62764) (65174 62767) (65175 62765) (65176 62766) (65178 62770) (65179 62768) (65180 62769) (65182 +62773) (65183 62771) (65184 62772) (65186 62776) (65187 62774) (65188 62775) (65190 62779) (65191 +62777) (65192 62778) (65194 62780) (65196 62781) (65198 62782) (65200 62783) (65202 62786) (65203 +62784) (65204 62785) (65206 62789) (65207 62787) (65208 62788) (65210 62792) (65211 62790) (65212 +62791) (65214 62795) (65215 62793) (65216 62794) (65218 62798) (65219 62796) (65220 62797) (65222 +62801) (65223 62799) (65224 62800) (65226 62804) (65227 62802) (65228 62803) (65230 62807) (65231 +62805) (65232 62806) (65234 62810) (65235 62808) (65236 62809) (65238 62813) (65239 62811) (65240 +62812) (65242 62816) (65243 62814) (65244 62815) (65246 62819) (65247 62817) (65248 62818) (65250 +62822) (65251 62820) (65252 62821) (65254 62825) (65255 62823) (65256 62824) (65258 62828) (65259 +62826) (65260 62827) (65262 62829) (65264 62830) (65266 62833) (65267 62831) (65268 62832) (65269 +62834) (65270 62835) (65271 62836) (65272 62837) (65273 62838) (65274 62839) (65275 62840) (65276 +62841))] + +[255 ((65291 60459) (65292 8484) (65294 8485) (65533 61639))] + +[259 ((66352 10721) (66353 10722) (66354 10723) (66355 10724) (66356 10725) (66357 10726) (66358 10727 +) (66359 10728) (66360 10729) (66361 10731) (66362 10732) (66363 10733) (66364 10734) (66365 10735) ( +66366 10736) (66367 10737) (66368 10738) (66369 10739) (66370 10740) (66371 10741) (66372 10742) ( +66373 10743) (66374 10744) (66375 10745) (66376 10746) (66377 10747) (66378 10748))] + +[469 ((120125 60205))] + +STOP diff --git a/unicode/xerox/XCCS-0=LATIN.TXT b/unicode/xerox/XCCS-0=LATIN.TXT index 7a6babe81..af4d15e03 100644 --- a/unicode/xerox/XCCS-0=LATIN.TXT +++ b/unicode/xerox/XCCS-0=LATIN.TXT @@ -43,20 +43,20 @@ # "0" LATIN -0x0000 0x0000 # ^@ +0x0000 0x0000 # ^@ NULL 0x0001 0x0001 # ^A 0x0002 0x0002 # ^B 0x0003 0x0003 # ^C 0x0004 0x0004 # ^D 0x0005 0x0005 # ^E 0x0006 0x0006 # ^F -0x0007 0x0007 # ^G -0x0008 0x0008 # ^H -0x0009 0x0009 # ^I -0x000A 0x000A # ^J -0x000B 0x000B # ^K -0x000C 0x000C # ^L -0x000D 0x000D # ^M +0x0007 0x0007 # ^G BELL +0x0008 0x0008 # ^H BS +0x0009 0x0009 # ^I TAB +0x000A 0x000A # ^J LF +0x000B 0x000B # ^K VTAB +0x000C 0x000C # ^L FORM +0x000D 0x000D # ^M CR 0x000E 0x000E # ^N 0x000F 0x000F # ^O 0x0010 0x0010 # ^P @@ -70,7 +70,7 @@ 0x0018 0x0018 # ^X 0x0019 0x0019 # ^Y 0x001A 0x001A # ^Z -0x001B 0x001B # ^[ +0x001B 0x001B # ^[ ESCAPE 0x001C 0x001C # ^\ 0x001D 0x001D # ^] 0x001E 0x001E # ^^ @@ -79,8 +79,7 @@ 0x0021 0x0021 # ! EXCLAMATION MARK 0x0022 0x0022 # " QUOTATION MARK 0x0023 0x0023 # # NUMBER SIGN -# 0x0024 0x00A4 # ¤ CURRENCY SIGN -0x0024 0x0024 # $ DOLLAR SIGN +0x0024 0x00A4 # ¤ CURRENCY SIGN 0x0025 0x0025 # % PERCENT SIGN 0x0026 0x0026 # & AMPERSAND 0x0027 0x0027 # ' APOSTROPHE