(FILECREATED "24-May-84 11:24:29" {DSK}IMAGEOBJ.;3 18096  

      changes to:  (FNS GET.OBJ.FROM.USER)

      previous date: "21-May-84 17:38:54" {DSK}IMAGEOBJ.;2)


(* Copyright (c) 1984 by Xerox Corporation)

(PRETTYCOMPRINT IMAGEOBJCOMS)

(RPAQQ IMAGEOBJCOMS [(FILES TEDITCOMMAND)
		     (COMS (* Main IMAGEOBJ Support)
			   (RECORDS IMAGEOBJ IMAGEFNS IMAGEBOX)
			   (FNS DEVICENAMEFROMSTREAM IMAGEBOX IMAGEFNSCREATE IMAGEFNSP IMAGEOBJCREATE 
				IMAGEOBJP IMAGEOBJPROP \IMAGEUSERPROP)
			   *)
		     (COMS (* An example: Bitmaps)
			   (FNS BITMAPTEDITOBJ COERCETOBITMAP PROMPTFOREVALED WINDOWTITLEFONT)
			   (* fns for the bitmap tedit object.)
			   (FNS BMOBJ.BUTTONEVENTINFN BMOBJ.COPYFN BMOBJ.DISPLAYFN BMOBJ.GETFN 
				BMOBJ.IMAGEBOXFN BMOBJ.PUTFN)
			   (RECORDS BITMAPOBJ)
			   (* make ↑O be a character that inserts an object read from the user. and 
			      ↑P be the character to edit them.)
			   (FNS GET.OBJ.FROM.USER)
			   (DECLARE: DONTEVAL@LOAD DOCOPY (P (TEDIT.SETFUNCTION
							       15
							       (FUNCTION GET.OBJ.FROM.USER)
							       TEDIT.READTABLE)
							     (TEDIT.SETFUNCTION
							       16
							       (FUNCTION TEDIT.EDIT.OBJECT)
							       TEDIT.READTABLE)))
			   (FILES EDITBITMAP))
		     (DECLARE: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS
			       (ADDVARS (NLAMA)
					(NLAML)
					(LAMA IMAGEOBJPROP])
(FILESLOAD TEDITCOMMAND)



(* Main IMAGEOBJ Support)

[DECLARE: EVAL@COMPILE 

(DATATYPE IMAGEOBJ (OBJECTDATUM IMAGEOBJPLIST IMAGEOBJFNS))

(DATATYPE IMAGEFNS (DISPLAYFN IMAGEBOXFN PUTFN GETFN COPYFN BUTTONEVENTINFN COPYBUTTONEVENTINFN 
			      WHENMOVEDFN WHENINSERTEDFN WHENDELETEDFN WHENCOPIEDFN WHENOPERATEDONFN 
			      PREPRINTFN))

(RECORD IMAGEBOX (XSIZE YSIZE YDESC XKERN))
]
(/DECLAREDATATYPE (QUOTE IMAGEOBJ)
		  (QUOTE (POINTER POINTER POINTER)))
(/DECLAREDATATYPE (QUOTE IMAGEFNS)
		  (QUOTE (POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER 
				  POINTER POINTER POINTER POINTER)))
(DEFINEQ

(DEVICENAMEFROMSTREAM
  [LAMBDA (STRM)                                             (* jds "22-Feb-84 15:15")
                                                             (* returns the name of the device of a stream)
    (COND
      ((type? INTERPRESSDATA (fetch IMAGEDATA of STRM))
	(QUOTE INTERPRESS))
      (T (fetch (FDEV DEVICENAME) of (fetch (STREAM DEVICE) of STRM])

(IMAGEBOX
  [LAMBDA (OBJ STREAM MODE)                                  (* jds " 8-Feb-84 10:48")
    (APPLY* (IMAGEOBJPROP OBJ (QUOTE IMAGEBOXFN))
	    OBJ STREAM MODE])

(IMAGEFNSCREATE
  [LAMBDA (DISPLAYFN IMAGEBOXFN PUTFN GETFN COPYFN BUTTONEVENTINFN COPYBUTTONEVENTINFN WHENMOVEDFN 
		     WHENINSERTEDFN WHENDELETEDFN WHENCOPIEDFN WHENOPERATEDONFN PREPRINTFN)
                                                             (* jds " 1-Mar-84 16:06")
                                                             (* returns a structure which contains the image 
							     functions for a type of image object.)
    (create IMAGEFNS
	    DISPLAYFN ← DISPLAYFN
	    IMAGEBOXFN ← IMAGEBOXFN
	    PUTFN ← PUTFN
	    GETFN ← GETFN
	    COPYFN ← COPYFN
	    BUTTONEVENTINFN ← BUTTONEVENTINFN
	    COPYBUTTONEVENTINFN ← COPYBUTTONEVENTINFN
	    WHENMOVEDFN ← WHENMOVEDFN
	    WHENINSERTEDFN ← WHENINSERTEDFN
	    WHENDELETEDFN ← WHENDELETEDFN
	    WHENCOPIEDFN ← WHENCOPIEDFN
	    WHENOPERATEDONFN ← WHENOPERATEDONFN
	    PREPRINTFN ← PREPRINTFN])

(IMAGEFNSP
(LAMBDA (X) (* rrb " 1-Feb-84 11:13") (* is X an IMAGEFNS?) (AND (type? IMAGEFNS X) X)))

(IMAGEOBJCREATE
  [LAMBDA (OBJECTDATUM IMAGEFNS)                             (* jds " 8-Feb-84 10:20")
                                                             (* returns an image object)
    (OR (IMAGEFNSP IMAGEFNS)
	(\ILLEGAL.ARG IMAGEFNS))                             (* Make sure he handed us a valid set of fn references)
    (create IMAGEOBJ
	    OBJECTDATUM ← OBJECTDATUM
	    IMAGEOBJPLIST ← NIL
	    IMAGEOBJFNS ← IMAGEFNS])

(IMAGEOBJP
  [LAMBDA (X)                                                (* rrb " 1-Feb-84 16:22")
                                                             (* is X an IMAGEOBJ?)
    (AND (type? IMAGEOBJ X)
	 X])

(IMAGEOBJPROP
  [LAMBDA NARGS                                              (* jds " 1-Mar-84 16:06")
                                                             (* accesses and sets properties of an IMAGEOBJ.)
    (SELECTQ NARGS
	     ((0 1)
	       (\ILLEGAL.ARG NIL))
	     (PROG ((IMAGEOBJ (ARG NARGS 1))
		    (PROP (ARG NARGS 2))
		    (VAL (ARG NARGS 3))
		    (SET? (NEQ NARGS 2))
		    IMAGEFNS)
	           (COND
		     ((NOT (IMAGEOBJP IMAGEOBJ))
		       (\ILLEGAL.ARG IMAGEOBJ)))
	           (SETQ IMAGEFNS (fetch (IMAGEOBJ IMAGEOBJFNS) of IMAGEOBJ))
	           (RETURN (SELECTQ PROP
				    [OBJECTDATUM (PROG1 (fetch (IMAGEOBJ OBJECTDATUM) of IMAGEOBJ)
							(COND
							  (SET? (replace (IMAGEOBJ OBJECTDATUM)
								   of IMAGEOBJ with VAL]
				    [DISPLAYFN (PROG1 (fetch (IMAGEFNS DISPLAYFN) of IMAGEFNS)
						      (COND
							(SET? (replace (IMAGEFNS DISPLAYFN)
								 of IMAGEFNS with VAL]
				    [IMAGEBOXFN (PROG1 (fetch (IMAGEFNS IMAGEBOXFN) of IMAGEFNS)
						       (COND
							 (SET? (replace (IMAGEFNS IMAGEBOXFN)
								  of IMAGEFNS with VAL]
				    [PUTFN (PROG1 (fetch (IMAGEFNS PUTFN) of IMAGEFNS)
						  (COND
						    (SET? (replace (IMAGEFNS PUTFN) of IMAGEFNS
							     with VAL]
				    [GETFN (PROG1 (fetch (IMAGEFNS GETFN) of IMAGEFNS)
						  (COND
						    (SET? (replace (IMAGEFNS GETFN) of IMAGEFNS
							     with VAL]
				    [COPYFN (PROG1 (fetch (IMAGEFNS COPYFN) of IMAGEFNS)
						   (COND
						     (SET? (replace (IMAGEFNS COPYFN) of IMAGEFNS
							      with VAL]
				    [BUTTONEVENTINFN (PROG1 (fetch (IMAGEFNS BUTTONEVENTINFN)
							       of IMAGEFNS)
							    (COND
							      (SET? (replace (IMAGEFNS 
										  BUTTONEVENTINFN)
								       of IMAGEFNS with VAL]
				    [COPYBUTTONEVENTINFN (PROG1 (fetch (IMAGEFNS COPYBUTTONEVENTINFN)
								   of IMAGEFNS)
								(COND
								  (SET? (replace (IMAGEFNS 
									      COPYBUTTONEVENTINFN)
									   of IMAGEFNS with VAL]
				    [WHENMOVEDFN (PROG1 (fetch (IMAGEFNS WHENMOVEDFN) of IMAGEFNS)
							(COND
							  (SET? (replace (IMAGEFNS WHENMOVEDFN)
								   of IMAGEFNS with VAL]
				    [WHENINSERTEDFN (PROG1 (fetch (IMAGEFNS WHENINSERTEDFN)
							      of IMAGEFNS)
							   (COND
							     (SET? (replace (IMAGEFNS WHENINSERTEDFN)
								      of IMAGEFNS with VAL]
				    [WHENDELETEDFN (PROG1 (fetch (IMAGEFNS WHENDELETEDFN)
							     of IMAGEFNS)
							  (COND
							    (SET? (replace (IMAGEFNS WHENDELETEDFN)
								     of IMAGEFNS with VAL]
				    [WHENCOPIEDFN (PROG1 (fetch (IMAGEFNS WHENCOPIEDFN) of IMAGEFNS)
							 (COND
							   (SET? (replace (IMAGEFNS WHENCOPIEDFN)
								    of IMAGEFNS with VAL]
				    [WHENOPERATEDONFN (PROG1 (fetch (IMAGEFNS WHENOPERATEDONFN)
								of IMAGEFNS)
							     (COND
							       (SET? (replace (IMAGEFNS 
										 WHENOPERATEDONFN)
									of IMAGEFNS with VAL]
				    [PREPRINTFN (PROG1 (fetch (IMAGEFNS PREPRINTFN) of IMAGEFNS)
						       (COND
							 (SET? (replace (IMAGEFNS PREPRINTFN)
								  of IMAGEFNS with VAL]
				    (\IMAGEUSERPROP IMAGEOBJ PROP VAL SET?])

(\IMAGEUSERPROP
(LAMBDA (IMAGEOBJ PROP VAL SET?) (* rrb " 1-Feb-84 11:44") (* reads and sets the values of properties 
on an IMAGEOBJ) (PROG ((PLIST (fetch (IMAGEOBJ IMAGEOBJPLIST) of IMAGEOBJ))) (RETURN (PROG1 (LISTGET 
PLIST PROP) (COND (SET? (COND (PLIST (LISTPUT PLIST PROP VAL)) (T (replace (IMAGEOBJ IMAGEOBJPLIST) of
 IMAGEOBJ with (LIST PROP VAL)))))))))))
)

(RPAQQ * NOBIND)



(* An example: Bitmaps)

(DEFINEQ

(BITMAPTEDITOBJ
  [LAMBDA (BITMAP SCALEFACTOR ROTATION)                      (* jds " 1-Mar-84 16:22")
                                                             (* returns the tedit obj which gives the functional 
							     information for a bitmap object in a tedit file.)
    (IMAGEOBJCREATE (create BITMAPOBJ
			    BITMAP ← BITMAP
			    BMOBJSCALEFACTOR ←(OR SCALEFACTOR 1)
			    BMOBJROTATION ←(OR ROTATION 0))
		    (COND
		      ((IMAGEFNSP BITMAPIMAGEFNS))
		      (T (SETQ BITMAPIMAGEFNS (IMAGEFNSCREATE (FUNCTION BMOBJ.DISPLAYFN)
							      (FUNCTION BMOBJ.IMAGEBOXFN)
							      (FUNCTION BMOBJ.PUTFN)
							      (FUNCTION BMOBJ.GETFN)
							      (FUNCTION BMOBJ.COPYFN)
							      (FUNCTION BMOBJ.BUTTONEVENTINFN)
							      (FUNCTION NILL)
							      (FUNCTION NILL)
							      (FUNCTION NILL)
							      (FUNCTION NILL)
							      (FUNCTION NILL)
							      (FUNCTION NILL)
							      (FUNCTION NILL])

(COERCETOBITMAP
  [LAMBDA (BMSPEC)                                           (* rrb "26-AUG-83 12:55")
                                                             (* tries to interpret X as a spec for a bitmap.)
    (PROG (BM CR)
          (RETURN (COND
		    ((BITMAPP BMSPEC)
		      BMSPEC)
		    [(LITATOM BMSPEC)                        (* use value.)
		      (COND
			((BITMAPP (EVALV BMSPEC (QUOTE COERCETOBITMAP]
		    ((REGIONP BMSPEC)                        (* if BMSPEC is a region, treat it as a region of the 
							     screen.)
		      [SETQ BM (BITMAPCREATE (fetch (REGION WIDTH) of BMSPEC)
					     (fetch (REGION HEIGHT) of BMSPEC)
					     (BITSPERPIXEL (SCREENBITMAP]
		      (BITBLT (SCREENBITMAP)
			      (fetch (REGION LEFT) of BMSPEC)
			      (fetch (REGION BOTTOM) of BMSPEC)
			      BM 0 0 NIL NIL (QUOTE INPUT)
			      (QUOTE REPLACE))
		      BM)
		    ((WINDOWP BMSPEC)
		      [SETQ BM (BITMAPCREATE (WINDOWPROP BMSPEC (QUOTE WIDTH))
					     (WINDOWPROP BMSPEC (QUOTE HEIGHT]
                                                             (* open the window and bring it to the top.)
		      (TOTOPW BMSPEC)
		      (SETQ CR (DSPCLIPPINGREGION NIL BMSPEC))
		      (BITBLT BMSPEC (fetch LEFT of CR)
			      (fetch BOTTOM of CR)
			      BM 0 0 (fetch WIDTH of CR)
			      (fetch HEIGHT of CR))
		      BM])

(PROMPTFOREVALED
  [LAMBDA (MSG WHERE FONT MINWIDTH MINHEIGHT)                (* rrb "17-AUG-83 18:20")

          (* opens a window with MSG in the title and returns the result of evaluating a READ from that window.
	  (PROMPTFOREVALED "HOW'S THIS?" (QUOTE (600 . 600)) NIL 100))


    (PROG [NEWVALUE WIN (FONT (OR FONT (FONTCREATE (QUOTE HELVETICA)
						   12
						   (QUOTE BOLD]
          (RESETFORM (WINDOWTITLEFONT FONT)
		     (SETQ WIN
		       (CREATEW [COND
				  ((REGIONP WHERE)
				    WHERE)
				  (T (CREATEREGION (COND
						     (WHERE (fetch (POSITION XCOORD) of WHERE))
						     (T LASTMOUSEX))
						   (COND
						     (WHERE (fetch (POSITION YCOORD) of WHERE))
						     (T LASTMOUSEY))
						   (WIDTHIFWINDOW (MAX (STRINGWIDTH MSG FONT)
								       (OR MINWIDTH 0))
								  8)
						   (HEIGHTIFWINDOW
						     (MAX (ITIMES (FONTPROP (DEFAULTFONT
									      (QUOTE DISPLAY))
									    (QUOTE HEIGHT))
								  3)
							  (OR MINHEIGHT 0))
						     T 8]
				MSG 8))
		     (CLEARW WIN))
          [RESETFORM (TTYDISPLAYSTREAM WIN)
		     (SETQ NEWVALUE (CAR (ERSETQ (LISPX (LISPXREAD T T)
							(QUOTE >]
          (CLOSEW WIN)
          (RETURN NEWVALUE])

(WINDOWTITLEFONT
  [LAMBDA (FONT)                                             (* rrb " 1-Feb-84 15:26")
                                                             (* reset type of function that changes the title font)
    (DSPFONT FONT WindowTitleDisplayStream])
)



(* fns for the bitmap tedit object.)

(DEFINEQ

(BMOBJ.BUTTONEVENTINFN
  [LAMBDA (IMAGEOBJ WINDOW)                                  (* rrb " 1-Feb-84 16:11")
                                                             (* the user has pressed a button inside the bitmap 
							     object IMAGEOBJ. Call the bitmap editor.)
                                                             (* FOR NOW always creates a new bitmap)
    (PROG [(OBJ (IMAGEOBJPROP IMAGEOBJ (QUOTE OBJECTDATUM]
          (RETURN (replace (BITMAPOBJ BITMAP) of OBJ with (EDIT.BITMAP.REAL (fetch (BITMAPOBJ BITMAP)
									       of OBJ])

(BMOBJ.COPYFN
  [LAMBDA (IMAGEOBJ)                                         (* rrb " 1-Feb-84 16:00")
                                                             (* makes a copy of a bitmap image object.)
    (PROG [(BMOBJ (IMAGEOBJPROP IMAGEOBJ (QUOTE OBJECTDATUM]
          (RETURN (BITMAPTEDITOBJ (BITMAPCOPY (fetch (BITMAPOBJ BITMAP) of BMOBJ))
				  (fetch (BITMAPOBJ BMOBJSCALEFACTOR) of BMOBJ)
				  (fetch (BITMAPOBJ BMOBJROTATION) of BMOBJ])

(BMOBJ.DISPLAYFN
  [LAMBDA (BMOBJ STREAM)                                     (* jds "22-Feb-84 17:41")
                                                             (* display function for a bitmap image object)
    (SELECTQ (IMAGESTREAMTYPE STREAM)
	     (DISPLAY                                        (* This is being displayed on the screen)
		      (BITBLT (fetch (BITMAPOBJ BITMAP) of (IMAGEOBJPROP BMOBJ (QUOTE OBJECTDATUM)))
			      0 0 STREAM (DSPXPOSITION NIL STREAM)
			      (DSPYPOSITION NIL STREAM)))
	     [INTERPRESS (SHOWBITMAP.IP STREAM (fetch (BITMAPOBJ BITMAP) of (IMAGEOBJPROP
									      BMOBJ
									      (QUOTE OBJECTDATUM)))
					NIL
					(fetch (BITMAPOBJ BMOBJSCALEFACTOR)
					   of (IMAGEOBJPROP BMOBJ (QUOTE OBJECTDATUM)))
					(fetch (BITMAPOBJ BMOBJROTATION) of (IMAGEOBJPROP
									      BMOBJ
									      (QUOTE OBJECTDATUM]
	     (PRESS                                          (* It's being displayed on a press file)
		    (PROMPTPRINT "Not implemented yet to PRESS bitmaps"))
	     NIL])

(BMOBJ.GETFN
  [LAMBDA (STREAM)                                           (* rrb "26-AUG-83 11:16")
                                                             (* Get a description of a bitmap object from the file.)
    (RESETFORM (INPUT STREAM)
	       (PROG ((FIELDS (READ STREAM))
		      (BITMAP (READBITMAP)))
		     (RETURN (BITMAPTEDITOBJ BITMAP (CAR FIELDS)
					     (CADR FIELDS])

(BMOBJ.IMAGEBOXFN
  [LAMBDA (IMAGEOBJ STREAM)                                  (* jds "22-Feb-84 17:42")
                                                             (* size function for a tedit bitmap object.)
    (PROG ((BMOBJ (IMAGEOBJPROP IMAGEOBJ (QUOTE OBJECTDATUM)))
	   BMW BMH SCALEFACTOR (POINTSTOMICASFACTOR 35))
          [SETQ BMW (BITMAPWIDTH (SETQ BMH (fetch (BITMAPOBJ BITMAP) of BMOBJ]
          (SETQ BMH (BITMAPHEIGHT BMH))
          (RETURN (SELECTQ (IMAGESTREAMTYPE STREAM)
			   (DISPLAY (create IMAGEBOX
					    XSIZE ← BMW
					    YSIZE ← BMH
					    YDESC ← 0
					    XKERN ← 0))
			   ((INTERPRESS PRESS)               (* do scaling and simple rotation)
			     [COND
			       ((MEMB (fetch (BITMAPOBJ BMOBJROTATION) of BMOBJ)
				      (QUOTE (90 270)))      (* rotated on edge, switch width and height.)
				 (SETQ BMW (PROG1 BMH (SETQ BMH BMW]
			     (create IMAGEBOX
				     XSIZE ←(TIMES POINTSTOMICASFACTOR (SETQ SCALEFACTOR
						     (fetch (BITMAPOBJ BMOBJSCALEFACTOR)
							of BMOBJ))
						   BMW)
				     YSIZE ←(TIMES POINTSTOMICASFACTOR SCALEFACTOR BMH)
				     YDESC ← 0
				     XKERN ← 0))
			   NIL])

(BMOBJ.PUTFN
  [LAMBDA (BMOBJ STREAM)                                     (* jds "22-Feb-84 14:37")
                                                             (* Put a description of a bitmap object into the file.)
    (RESETFORM (OUTPUT STREAM)
	       (PRINT [LIST (fetch (BITMAPOBJ BMOBJSCALEFACTOR) of (IMAGEOBJPROP BMOBJ (QUOTE 
										      OBJECTDATUM)))
			    (fetch (BITMAPOBJ BMOBJROTATION) of (IMAGEOBJPROP BMOBJ (QUOTE 
										      OBJECTDATUM]
		      STREAM)
	       (PRINTBITMAP (fetch (BITMAPOBJ BITMAP) of (IMAGEOBJPROP BMOBJ (QUOTE OBJECTDATUM])
)
[DECLARE: EVAL@COMPILE 

(RECORD BITMAPOBJ (BITMAP BMOBJSCALEFACTOR BMOBJROTATION))
]



(* make ↑O be a character that inserts an object read from the user. and ↑P be the character to
 edit them.)

(DEFINEQ

(GET.OBJ.FROM.USER
  [LAMBDA (TEXTSTREAM TEXTOBJ)                               (* jds "21-May-84 16:53")
                                                             (* reads an expression from the user and puts the result
							     into the textstream.)
    (ERSETQ (PROG ((VAL (PROMPTFOREVALED "Form to eval:"))
		   (SEL (fetch (TEXTOBJ SEL) of TEXTOBJ))
		   BM)
	          (SELECTQ (TYPENAME VAL)
			   ((LITATOM STRING)
			     (AND VAL (TEDIT.INSERT TEXTSTREAM VAL SEL)))
			   (COND
			     ((SETQ BM (COERCETOBITMAP VAL))
			       (TEDIT.INSERT.OBJECT (BITMAPTEDITOBJ BM 1 0)
						    TEXTSTREAM
						    (fetch (SELECTION CH#) of SEL)))
			     (T (TEDIT.PROMPTPRINT TEXTOBJ (CONCAT "Not implemented to have " VAL 
								   " in documents yet.")
						   T])
)
(DECLARE: DONTEVAL@LOAD DOCOPY 
(TEDIT.SETFUNCTION 15 (FUNCTION GET.OBJ.FROM.USER)
		   TEDIT.READTABLE)
(TEDIT.SETFUNCTION 16 (FUNCTION TEDIT.EDIT.OBJECT)
		   TEDIT.READTABLE)
)
(FILESLOAD EDITBITMAP)
(DECLARE: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS 

(ADDTOVAR NLAMA )

(ADDTOVAR NLAML )

(ADDTOVAR LAMA IMAGEOBJPROP)
)
(PUTPROPS IMAGEOBJ COPYRIGHT ("Xerox Corporation" 1984))
(DECLARE: DONTCOPY
  (FILEMAP (NIL (2024 8114 (DEVICENAMEFROMSTREAM 2034 . 2447) (IMAGEBOX 2449 . 2630) (IMAGEFNSCREATE 
2632 . 3523) (IMAGEFNSP 3525 . 3628) (IMAGEOBJCREATE 3630 . 4091) (IMAGEOBJP 4093 . 4323) (
IMAGEOBJPROP 4325 . 7742) (\IMAGEUSERPROP 7744 . 8112)) (8169 12118 (BITMAPTEDITOBJ 8179 . 9157) (
COERCETOBITMAP 9159 . 10596) (PROMPTFOREVALED 10598 . 11838) (WINDOWTITLEFONT 11840 . 12116)) (12164 
16630 (BMOBJ.BUTTONEVENTINFN 12174 . 12781) (BMOBJ.COPYFN 12783 . 13277) (BMOBJ.DISPLAYFN 13279 . 
14384) (BMOBJ.GETFN 14386 . 14793) (BMOBJ.IMAGEBOXFN 14795 . 16005) (BMOBJ.PUTFN 16007 . 16628)) (
16838 17670 (GET.OBJ.FROM.USER 16848 . 17668)))))
STOP