(FILECREATED " 8-Jun-87 15:04:00" {QV}<NOTECARDS>1.3K>NEXT>RHTPATCH276.;1 24112  

      changes to:  (VARS RHTPATCH276COMS)
		   (FNS NC.OpenNoteFile NCLocalDevice.OpenNoteFile 
			NCLocalDevice.CheckForPlausibleNoteFileHeader))


(* Copyright (c) 1987 by Xerox Corporation. All rights reserved.)

(PRETTYCOMPRINT RHTPATCH276COMS)

(RPAQQ RHTPATCH276COMS ((* * Fixes a nasty bug whereby the result of the call to 
			     NCLocalDevice.PlausibleNoteFileHeaderP, now renamed, was being ignored!)
			  (* * Change to NCDATABASE)
			  (FNS NC.OpenNoteFile)
			  (* * Change for NCLOCALDEVICE)
			  (FNS NCLocalDevice.OpenNoteFile)
			  (* * New function for NCLOCALDEVICE)
			  (FNS NCLocalDevice.CheckForPlausibleNoteFileHeader)
			  (* * Please delete NCLocalDevice.PlausibleNoteFileHeaderP from 
			     NCLOCALDEVICE coms.)))
(* * Fixes a nasty bug whereby the result of the call to 
NCLocalDevice.PlausibleNoteFileHeaderP, now renamed, was being ignored!)

(* * Change to NCDATABASE)

(DEFINEQ

(NC.OpenNoteFile
  (LAMBDA (NoteFileOrFileName Don'tCacheTypesAndTitlesFlg Don'tCreateFlg ConvertNoConfirmFlg 
			      Don'tCreateArrayFlg Can'tTruncateFlg Don'tCreateInterfaceFlg 
			      Don'tGetSpecialCardsFlg InterestedWindow PublicOrPrivate MenuPosition 
			      QuietFlg ReadOnlyFlg Don'tCheckForTruncationFlg)
                                                             (* rht: " 8-Jun-87 14:59")

          (* * fgh 5/23/86 Renamed to NC.OpenNoteFile from NC.OpenDatabaseFile. Total revamp to implement device vector.)



          (* * kef 7/18/86: Inserted a call to stuff the UID into the NoteFile because BuildHashArray needed it.)



          (* * kef 7/21/86: Moved up the install of the NoteFile into the NoteFileHashArray to before the building of the 
	  NoteFile's hash array. The reason is that the remote multi client build hash array function needs to get a list of 
	  UIDs, and in order to do this, it needs to grab a Courier stream for the NoteFile given only the UID.
	  It can only do this if the UID is registered in the NoteFilesHashArray.)



          (* * fgh 8/31/86 Updated to account for changes made to system since 5/23/86 revamp. Changes reimplemented include:
	  (fgh 6/8/86 Added code to insure that two files with SameUIDP would never be open at once.) 
	  (fgh 6/25/86 Added contention locks -- NC.ProtectedNoteFileOperation, Don'tCheckOperationInProgressFlg etc.) 
	  (fgh 6/27/86 Added MenuPsotion arg to pass to SetUpNoteFileInterface) (kirk 15Jul86 Added call to 
	  NC.SetUpNoteFileInterface if already open))



          (* * fgh 9/1/86 Reimplemented ReadOnly NoteFile open.)



          (* * fgh 9/4/86 Put in default for NoteFilesHashArray which is NC.NoteFilesHashArray)



          (* * kirk/rht 8/29/86: Now resets Name after conversion from version 2 to version3.)



          (* * rht 10/29/86: Changed "aborted" to "canceled" in message.)



          (* * rht 10/31/86: Added Don'tCheckForTruncationFlg arg.)



          (* * rht&pmi 11/21/86: Took away the protection from around the AFTER call to open events fns.)



          (* * pmi 12/12/86: Added InterestedWindow argument to NC.SetUpNoteFileInterface so that it can print a prompt to 
	  the user about placing the NoteFile menu.)



          (* * rg 3/4/87 Added NC.ProtectedSessionOperation wrapper, removed Don'tCheckOperationsInProgressFlg)



          (* * rht 3/25/87: Now calls NC.CoerceToInterestedWindow.)



          (* * pmi 3/31/87: Moved line of code which sets the ReadOnlyFlg to just after the test for an open notefile.
	  Otherwise, a notefile opened read-only could be changed to one opened normally.)



          (* * rht 4/2/87: Now passes InterestedWindow to opennotefilefns.)



          (* * rg 4/2/87 enlarged scope of NC.ProtectedNoteFileOperation)



          (* * RG 4/3/87 replaced missing InterestedWindow arg to OpenNoteFileFn)



          (* * pmi 5/19/87: Removed NoteFilesHashArray argument. Replaced call to NC.StoreNoteFileInHashArray with 
	  NC.NoticeNoteFile in general cleanup.)



          (* * pmi 5/20/87: Moved the open test up to almost the beginning of the function.)



          (* * pmi 5/29/87: Deleted extra InterestedWindow argument to NC.ProtectedNoteFileOperation.
	  Added call to NC.RemoveAccessToNoteFile to "unnotice" this notefile if the file does not exist, and remove its 
	  icon, if it has one. If InterestedWindow is the window for this NoteFile's interface, then change it to 
	  NC.NoteCardsIconWindow.)



          (* * pmi 6/3/87: Added check and warning for filenames which do not have the .notefile extension and which have not
	  yet been noticed (operated on) by NoteCards.)



          (* * rht&pmi 6/4/87: Added TempInterestedWindow var to use until real InterestedWindow can be computed.)



          (* * rht 6/8/87: Fixed what happens for notefiles with bad headers.)


    (DECLARE (GLOBALVARS NC.OpenNoteFileFns NC.LastNoteFileOpened))

          (* * NOTE: Session lock turns into NoteFile lock after NoteFile is created)


    (PROG ((TempInterestedWindow (OR InterestedWindow (NC.CoerceToInterestedWindow 
									       NoteFileOrFileName)))
	     NoteFile FileName NewerFileName OldVersion NewVersion NoteFileMenu ReturnValue 
	     CriticalUIDs)

          (* * Figure out the name of the file containing the NoteFile)


	    (if (NULL (SETQ FileName (if (type? NoteFile NoteFileOrFileName)
					       then (fetch (NoteFile FullFileName) of 
									       NoteFileOrFileName)
					     elseif NoteFileOrFileName
					     else (NC.DatabaseFileName 
								      "Name of NoteFile to open:"
									   " -- " T NIL NIL 
									   TempInterestedWindow))))
		then (RETURN NIL))

          (* * Check for the .NoteFile extension if this notefile has not been noticed by NoteCards.)


	    (if (AND (NEQ (U-CASE (FILENAMEFIELD FileName (QUOTE EXTENSION)))
				(QUOTE NOTEFILE))
			 (NOT (NC.NoteFileNoticedP FileName)))
		then (NC.PrintMsg InterestedWindow T FileName 
				      " does not have a .NOTEFILE extension."
				      (CHARACTER 13))
		       (if (NULL (NC.AskYesOrNo (CONCAT "Are you sure you want to open " 
								FileName " as a NoteFile?")
						      " -- " "No" NIL InterestedWindow T NIL))
			   then (NC.ClearMsg InterestedWindow T)
				  (RETURN NIL)))

          (* * If this is an open NoteFIle, just bring up its menu.)


	    (if (NC.NoteFileOpenP FileName)
		then (OR Don'tCreateInterfaceFlg (NC.SetUpNoteFileInterface (
									  NC.NoteFileFromFileName
										    FileName)
										  MenuPosition 
									     TempInterestedWindow))
		       (NC.ClearMsg TempInterestedWindow T) 
                                                             (* bring up or create notefile icon if needed)
		       (RETURN NIL))

          (* * Check for higher version of same notefile)


	    (if (AND (SETQ OldVersion (FILENAMEFIELD FileName (QUOTE VERSION)))
			 (SETQ NewVersion (FILENAMEFIELD (SETQ NewerFileName
							       (FULLNAME (PACKFILENAME
									     (QUOTE VERSION)
									     NIL
									     (QUOTE BODY)
									     FileName)))
							     (QUOTE VERSION)))
			 (LESSP OldVersion NewVersion))
		then 

          (* * Notify user)


		       (NC.PrintMsg TempInterestedWindow T "A higher version of " FileName 
				      " exists."
				      (CHARACTER 13))

          (* * Open the version the user requests.)


		       (if (NC.AskYesOrNo (CONCAT "Open " NewerFileName " instead?")
					      " -- " "No" NIL TempInterestedWindow T NIL)
			   then (SETQ FileName NewerFileName)
				  (SETQ NoteFileOrFileName (NC.NoteFileFromFileName FileName))
				  (if (SETQ NoteFileMenu (NC.GetNoteFileMenu FileName))
				      then (NC.SetNoteFileMenu NoteFileOrFileName NoteFileMenu))))

          (* * Create a NoteFile object or use existing notefile object if there is one for this file name.)


	    (SETQ NoteFile (if (type? NoteFile NoteFileOrFileName)
				 then NoteFileOrFileName
			       else (OR (NC.NoteFileFromFileName FileName)
					    (create NoteFile))))
	    (replace (NoteFile FullFileName) of NoteFile with FileName)
	    (OR InterestedWindow (SETQ InterestedWindow (NC.CoerceToInterestedWindow NoteFile)))
	    (RETURN
	      (NC.ProtectedNoteFileOperation
		NoteFile "Open NoteFile" InterestedWindow
		(PROG NIL

          (* * Figure out the appropriate device vector from the file name.)


		        (NC.InstallDeviceVectorInNoteFile NoteFile PublicOrPrivate)

          (* * Moved this replace to after test for open notefile. Otherwise, if notefile is open read-only, it well be 
	  changed to regular open.)


		        (replace (NoteFile ReadOnlyFlg) of NoteFile with ReadOnlyFlg)

          (* * Notify user.)


		        (OR QuietFlg (NC.PrintMsg InterestedWindow T "Opening NoteFile: " 
						      FileName " ..." (CHARACTER 13)))
		        (SETQ ReturnValue
			  (PROG NIL

          (* * Run through OpenNoteFileFns with param of BEFORE. Exit if any returns DON'T)


			          (if (for Function in NC.OpenNoteFileFns
					   thereis (OR (EQ Function (QUOTE DON'T))
							   (EQ (QUOTE DON'T)
								 (APPLY* Function FileName NoteFile
									   (QUOTE BEFORE)
									   InterestedWindow))))
				      then (if (WINDOWP InterestedWindow)
						 then (NC.PrintMsg InterestedWindow NIL 
								    "Open canceled for NoteFile "
								       FileName "." (CHARACTER
									 13))
							(DISMISS NC.MsgDelay)
							(NC.ClearMsg InterestedWindow T))
					     (RETURN))

          (* * Call the device specific OpenNoteFileFn, which returns a list of special UIDs)


			          (if (NULL (ERSETQ (SETQ ReturnValue
							    (APPLY* (fetch (NoteFile 
										   OpenNoteFileFn)
									 of NoteFile)
								      NoteFile InterestedWindow 
								      Don'tCheckForTruncationFlg))))
				      then (SETQ ReturnValue (QUOTE NoteFileOpenFailed)))

          (* * Process error returns from the OpenNoteFileFn)


			          (if (NOT (LITATOM ReturnValue))
				      then 

          (* * OpenNoteFileFn returned correctly)


					     (SETQ CriticalUIDs ReturnValue)
				    else

          (* * Error, process it.)


				     (SETQ ReturnValue
				       (OR (SELECTQ
					       ReturnValue
					       (NoteFileNotFound (NC.RemoveAccessToNoteFile 
											 NoteFile)
								 (SETQ InterestedWindow
								   (NC.CoerceToInterestedWindow
								     InterestedWindow))
								 (NC.ProcessNoteFileNotFoundError
								   NoteFile 
								   Don'tCacheTypesAndTitlesFlg 
								   Don'tCreateFlg ConvertNoConfirmFlg 
								   Don'tCreateArrayFlg 
								   Can'tTruncateFlg 
								   Don'tCreateInterfaceFlg 
								   Don'tGetSpecialCardsFlg 
								   InterestedWindow PublicOrPrivate 
								   MenuPosition QuietFlg ReadOnlyFlg 
								   Don'tCheckForTruncationFlg))
					       (NoteFileNeedsConversion (
							   NC.ProcessNoteFileNeedsConversionError
									  NoteFile 
								      Don'tCacheTypesAndTitlesFlg 
									  Don'tCreateFlg 
									  ConvertNoConfirmFlg 
									  Don'tCreateArrayFlg 
									  Can'tTruncateFlg 
									  Don'tCreateInterfaceFlg 
									  Don'tGetSpecialCardsFlg 
									  InterestedWindow 
									  PublicOrPrivate 
									  MenuPosition QuietFlg 
									  ReadOnlyFlg 
								       Don'tCheckForTruncationFlg))
					       (NoteFileNeedsTruncation (
							   NC.ProcessNoteFileNeedsTruncationError
									  NoteFile 
								      Don'tCacheTypesAndTitlesFlg 
									  Don'tCreateFlg 
									  ConvertNoConfirmFlg 
									  Don'tCreateArrayFlg 
									  Can'tTruncateFlg 
									  Don'tCreateInterfaceFlg 
									  Don'tGetSpecialCardsFlg 
									  InterestedWindow 
									  PublicOrPrivate 
									  MenuPosition QuietFlg 
									  ReadOnlyFlg 
								       Don'tCheckForTruncationFlg))
					       (NoteFileAlreadyOpen
						 (ERSETQ (NC.ReportError
							     NIL
							     (CONCAT (fetch (NoteFile 
										     FullFileName)
									  of NoteFile)
								       
					    " is already open for exclusive access. Open failed."))))
					       (NoteFileOpenFailed
						 (ERSETQ (NC.ReportError
							     NIL
							     (CONCAT "Open of "
								       (fetch (NoteFile 
										     FullFileName)
									  of NoteFile)
								       " failed for unknown reason."))
							   ))
					       ((NoteFileHeaderBad BadNextIndexNum BadHashArraySize 
								   BadCheckptPtr BadNextLinkNum)
						 (ERSETQ (NC.ReportError
							     NIL
							     (CONCAT "Header of NoteFile "
								       (fetch (NoteFile 
										     FullFileName)
									  of NoteFile)
								       " is bad: " ReturnValue 
								 ".  Contact a NoteCards wizard."))))
					       (PROGN (ERSETQ (NC.ReportError NIL
										    (CONCAT 
									   "Unknown error code ("
											      
										      ReturnValue 
						     ") returned by OpenNoteFileFn for NoteFile "
											      
											 FileName)))))
					     ReturnValue))

          (* * notify the user. if there's been a problem)


				     (if (AND (NOT (type? NoteFile ReturnValue))
						  (WINDOWP InterestedWindow))
					 then (NC.PrintMsg InterestedWindow NIL 
							       "Open canceled for NoteFile "
							       FileName "." (CHARACTER 13))
						(DISMISS NC.MsgDelay)
						(NC.ClearMsg InterestedWindow T))

          (* * return whatever the error processing returned.)


				     (RETURN ReturnValue))
			          (SETQ ReturnValue)

          (* * Make sure there is no other open NF with this UID.)


			          (LET (NF)
				       (if (AND (SETQ NF (GETHASH (fetch (
NoteFileCriticalUIDs NoteFile) of CriticalUIDs)
									  NC.NoteFilesHashArray))
						    (NEQ (fetch (NoteFile FullFileName)
							      of NoteFile)
							   (fetch (NoteFile FullFileName)
							      of NF))
						    (NC.NoteFileOpenP NF))
					   then (FLASHW PROMPTWINDOW)
						  (NC.PrintMsg PROMPTWINDOW T "Couldn't open " 
								 FileName (CHARACTER 13)
								 "because "
								 (fetch (NoteFile FullFileName)
								    of NF)
								 " is already open "
								 (CHARACTER 13)
								 "and has the same UID.")
						  (NC.CloseNoteFile NoteFile InterestedWindow T)
						  (RETURN NIL)))

          (* * If needed, build a hash array by calling the device specific BuilHashArrayFn.)


			          (replace (NoteFile UID) of NoteFile with (fetch
										   (
NoteFileCriticalUIDs NoteFile) of CriticalUIDs))

          (* * Store this NoteFile object in the appropriate NoteFile hash array)


			          (NC.NoticeNoteFile NoteFile)
			          (if (NOT Don'tCreateArrayFlg)
				      then
				       (OR QuietFlg (NC.PrintMsg InterestedWindow T 
								     "Opening NoteFile: "
								     FileName
								     (CHARACTER 13)
								     "Building index array ..."
								     (CHARACTER 13)))
				       (if
					 (OR (NULL (ERSETQ (SETQ ReturnValue
								   (APPLY*
								     (fetch (NoteFile 
										 BuildHashArrayFn)
									of NoteFile)
								     NoteFile QuietFlg 
								     InterestedWindow
								     (CONCAT "Opening NoteFile "
									       (fetch (NoteFile
											  
										     FullFileName)
										  of NoteFile)
									       (CHARACTER 13))))))
					       (NOT (type? NoteFile ReturnValue)))
					   then 

          (* * Error during building of hash array)


						  (ERSETQ (NC.ReportError
							      NIL
							      (CONCAT 
							  "Build Hash Array failed for NoteFile "
									(fetch (NoteFile 
										     FullFileName)
									   of NoteFile)
									" because " ReturnValue)))
						  (RETURN)))

          (* * Set up critical UIDs in NoteFile object using the values returned from OpenNoteFileFn.)


			          (NC.InstallCriticalUIDsInNoteFile NoteFile CriticalUIDs)

          (* * if needed, cache the special cards)


			          (if (NOT Don'tGetSpecialCardsFlg)
				      then (NC.GetSpecialCards NoteFile QuietFlg InterestedWindow
								   (CONCAT "Opening NoteFile: "
									     (fetch (NoteFile
											FullFileName)
										of NoteFile)
									     (CHARACTER 13))))

          (* * If needed, start the titles and types caching process)


			          (if (NOT Don'tCacheTypesAndTitlesFlg)
				      then (replace (NoteFile CachingProcess) of NoteFile
						with (ADD.PROCESS (LIST (FUNCTION 
									   NC.CacheTypesAndTitles)
									      NoteFile))))

          (* * If needed, open up a NoteFile interface.)


			          (if (NOT Don'tCreateInterfaceFlg)
				      then (NC.SetUpNoteFileInterface NoteFile MenuPosition 
									  InterestedWindow))

          (* * Record this as the last NF opened.)


			          (SETQ NC.LastNoteFileOpened NoteFile)
			          (RETURN NoteFile)))
		        (if (type? NoteFile ReturnValue)
			    then 

          (* * Run through OpenNoteFIleFns with param of AFTER. Stop if any returns DON'T)


				   (for Function in NC.OpenNoteFileFns
				      thereis (EQ (QUOTE DON'T)
						      (APPLY* Function FileName NoteFile
								(QUOTE AFTER)
								InterestedWindow)))

          (* * Go home, returning NoteFile)


				   (if (NULL QuietFlg)
				       then (NC.PrintMsg InterestedWindow T "Opening NoteFile: " 
							     FileName (CHARACTER 13)
							     "Done."
							     (CHARACTER 13))
					      (NC.ClearMsg InterestedWindow T))
				   (RETURN NoteFile)
			  else 

          (* * Bail out if open was unsuccessful.)


				 (RETURN NIL))))))))
)
(* * Change for NCLOCALDEVICE)

(DEFINEQ

(NCLocalDevice.OpenNoteFile
  (LAMBDA (NoteFile PromptWindow Don'tCheckForTruncationFlg)
                                                             (* rht: " 8-Jun-87 14:56")

          (* * OpenNoteFileFn for the local, single user device.)



          (* * fgh 5/22/86 First created.)



          (* * fgh 9/1/86 Reimplemented ReadOnly notefile.)



          (* * rht 10/31/86: Added Don'tCheckForTruncationFlg arg.)



          (* * rht 6/8/87: Switched order of checks of version num and plausibility. It was also ignoring the error value 
	  returned by NCLocalDevice.CheckForPlausibleNoteFileHeader.)


    (OR (CAR (ERSETQ (PROG ((FullName (INFILEP (fetch (NoteFile FullFileName)
							    of NoteFile)))
				    EofPtr CriticalUIDs Stream ReturnVal)

          (* * First check for possible errors.)


			           (if (NULL FullName)
				       then 

          (* * Error: NoteFileNotFound, Return)


					      (RETURN (QUOTE NoteFileNotFound))
				     elseif (OPENP FullName)
				       then 

          (* * Error: NoteFile already open, Return)


					      (RETURN (QUOTE NoteFileAlreadyOpen))
				     elseif (NULL (ERSETQ (SETQ Stream
								  (OPENSTREAM
								    FullName
								    (if (fetch (NoteFile 
										      ReadOnlyFlg)
									     of NoteFile)
									then (QUOTE INPUT)
								      else (QUOTE BOTH))
								    (QUOTE OLD)
								    (QUOTE ((TYPE BINARY)))))))
				       then 

          (* * Error: File won't open)


					      (RETURN (QUOTE NoteFileOpenFailed)))

          (* * All is okay for now, create fill in the NoteFile object a bit.)


			           (replace (NoteFile Stream) of NoteFile with Stream)
			           (replace (NoteFile FullFileName) of NoteFile with FullName)
			           (NC.SetMonitor NoteFile (CREATE.MONITORLOCK FullName))

          (* * Make sure stream is not closed by CLOSEALLs)


			           (WHENCLOSE Stream (QUOTE CLOSEALL)
						(QUOTE NO))

          (* * Get the header and check for correct version, correct checkpoint, & plausibility.)


			           (NCLocalDevice.GetNoteFileHeader NoteFile)
			           (SETQ EofPtr (GETEOFPTR (fetch (NoteFile Stream)
								  of NoteFile)))
			           (COND
				     ((NOT (type? NoteFile (SETQ ReturnVal (
						    NCLocalDevice.CheckForPlausibleNoteFileHeader
							  NoteFile EofPtr))))
				       (RETURN (NCLocalDevice.OpenFailed NoteFile ReturnVal)))
				     ((NOT (NCLocalDevice.NoteFileVersionOkayP NoteFile))
				       (RETURN (NCLocalDevice.OpenFailed NoteFile (QUOTE 
									  NoteFileNeedsConversion))))
				     ((AND (NULL Don'tCheckForTruncationFlg)
					     (NCLocalDevice.NoteFileNeedsTruncationP NoteFile 
										       EofPtr))
				       (RETURN (NCLocalDevice.OpenFailed NoteFile (QUOTE 
									  NoteFileNeedsTruncation)))))

          (* * Go get the first six card UIDs on the file.)


			           (SETQ CriticalUIDs (NCLocalDevice.GetSpecialCardUIDs NoteFile))
			           (replace (NoteFileCriticalUIDs NoteFile) of CriticalUIDs
				      with (fetch (NoteFile UID) of NoteFile))

          (* * Return with list of special uids and NF-UID.)


			           (RETURN CriticalUIDs))))
	  (PROGN 

          (* * Open must have failed. Return a message to that effect.)


		   (NCLocalDevice.OpenFailed NoteFile)))))
)
(* * New function for NCLOCALDEVICE)

(DEFINEQ

(NCLocalDevice.CheckForPlausibleNoteFileHeader
  (LAMBDA (NoteFile EOFPtr)                                  (* rht: " 8-Jun-87 14:48")

          (* * Return non-nil if notefile's header information seems reasonable.)



          (* * Changed to allow Checkpt = EOFPtr)



          (* * fgh 5/23/86 Changed to conform to Local Device NoteFile needs.)


    (LET ((NextIndexNum (fetch (NoteFile NextIndexNum) of NoteFile))
	  (HashArraySize (fetch (NoteFile HashArraySize) of NoteFile))
	  (CheckptPtr (fetch (NoteFile CheckptPtr) of NoteFile))
	  (NextLinkNum (fetch (NoteFile NextLinkNum) of NoteFile))
	  (IndexWidth (CONSTANT (fetch (NoteFileVersion NoteFileIndexWidth) of (
								     NCLocalDevice.CurrentVersion)))
		      ))
         (COND
	   ((OR (LEQ NextIndexNum 0)
		  (GEQ (TIMES IndexWidth NextIndexNum)
			 EOFPtr))
	     (QUOTE BadNextIndexNum))
	   ((OR (LEQ HashArraySize 0)
		  (GEQ (TIMES IndexWidth HashArraySize)
			 EOFPtr))
	     (QUOTE BadHashArraySize))
	   ((OR (LEQ CheckptPtr 0)
		  (IGREATERP CheckptPtr EOFPtr))
	     (QUOTE BadCheckptPtr))
	   ((LESSP NextLinkNum 0)
	     (QUOTE BadNextLinkNum))
	   (T NoteFile)))))
)
(* * Please delete NCLocalDevice.PlausibleNoteFileHeaderP from NCLOCALDEVICE coms.)

(PUTPROPS RHTPATCH276 COPYRIGHT ("Xerox Corporation" 1987))
(DECLARE: DONTCOPY
  (FILEMAP (NIL (1008 18843 (NC.OpenNoteFile 1018 . 18841)) (18881 22591 (NCLocalDevice.OpenNoteFile 
18891 . 22589)) (22635 23940 (NCLocalDevice.CheckForPlausibleNoteFileHeader 22645 . 23938)))))
STOP