XQCHK3 ; OAK-BY/BDT - This routine for XQCHK; Feb 17, 2022@07:03:39
 ;;8.0;KERNEL;**503,766**;Jul 10, 1995;Build 4
 ;;"Per VHA Directive 2004-038, this routine should not be modified".
 ;
 Q
OPACCES ;Entry point for the option that checks to see if a user has
 ;access to a particular option by calling the above function.
 N DIC,X,Y,XQANS,XQOPN,XQUSER,XQUSN,XQOPT
 ;get user
 S DIC(0)="AEMNQ",DIC="^VA(200,",DIC("A")="Please enter the user's name: " D ^DIC
 I $D(DUOUT)!($D(DTOUT)) D KILLFM Q
 I Y=-1 W !!?5,"Sorry we couldn't find that user in the New Person File.",! D KILLFM Q
 S XQUSN=+Y,XQUSER=$P(Y,U,2) D KILLFM
 ;get option
 S DIC(0)="AEMNQ",DIC="^DIC(19,",DIC("A")="Please enter the name of the option: " D ^DIC
 I $D(DUOUT)!($D(DTOUT)) D KILLFM Q
 I Y=-1 W !!?5,"Sorry we couldn't find that option.",! D KILLFM Q
 S XQOPN=+Y,XQOPT=$P(Y,U,2) D KILLFM
 ;check keys
 S XQANS=$$ACCESS(XQUSN,XQOPN)
 ;print out
 D PRINT(XQANS)
 Q
 ;
ACCESS(%XQUSR,%XQOP) ;Find out if a user has access to a particular option
 ;;W $$ACCESS(DUZ,Option IEN) returns:
 ;;
 ;;-1:no such user in the New Person File
 ;;-2: User terminated or has no access code
 ;;-3: no such option in the Option File
 ;;0: no access found in any menu tree the user owns
 ;;
 ;;All other cases return a 4-piece string stating
 ;;access ^ menu tree IEN ^ a set of codes ^ key
 ;;
 ;;O^tree^codes^key: No access because of locks (see XQCODES below)
 ;;where 'tree' is the menu where access WOULD be allowed
 ;;and 'key' is the key preventing access
 ;;
 ;;1^OpIEN^^: Access allowed through the Primary Menu
 ;;2^OpIEN^codes^: Access found in the Common Options
 ;;3^OpIEN^codes^: Access found in the top level of secondary option
 ;;4^OpIEN^codes^: Access through the secondary menu tree OpIEN.
 ;;
 ;;XQCODES can contain:
 ;;N=No Primary Menu in the User File (warning only)
 ;;L=Locked and the user does not have the key (forces 0 in first piece)
 ;;R=Reverse lock and user has the key (forces 0 in first piece)
 ;
 N XQUSR,U S U="^"
 S XQUSR=$$ACTIVE^XUSER(%XQUSR)
 I XQUSR="" Q -1
 I +XQUSR=0 Q -2
 ;
 ;Convert %XQOP to its IEN if the name is passed
 I %XQOP'=+$G(%XQOP) D
 .I $D(^DIC(19,"B",%XQOP))<1 S %XQOP=0 Q
 .E  S %XQOP=$O(^DIC(19,"B",%XQOP,0))
 .Q
 I '%XQOP Q -3
 I '$D(^DIC(19,%XQOP,0)) Q -3
 ;checking
 N XQRT,XQRT1 S XQRT="",XQRT1=""
 S XQRT=$$CKPM(%XQUSR,%XQOP) ;primary menu and sub-menu in the primary menu
 I $P(XQRT,U)=1 Q XQRT
 I $P(XQRT,U)="N" Q XQRT
 S XQRT1=XQRT
 S XQRT=$$CKCM(%XQUSR,%XQOP) ;common menu
 I $P(XQRT,U)=2 Q XQRT
 I $P(XQRT,U)=0 S XQRT1=XQRT
 S XQRT=$$CKTSM(%XQUSR,%XQOP) ;top level of secondary menus
 I $P(XQRT,U)=3 Q XQRT
 I $P(XQRT,U)=0 S XQRT1=XQRT
 S XQRT=$$CKTESM(%XQUSR,%XQOP) ;sub-menu in secondary menus
 I $P(XQRT,U)=4 Q XQRT
 I $P(XQRT,U)=0 S XQRT1=XQRT
 I XQRT1="" S XQRT1=0
 Q XQRT1
 ;
CKPM(XQUSR,XQIEN) ; Access allowed through the Primary Menu
 ;Look in the user's primary menu tree
 ;take in XQUSR = IEN in New Person file; XQIEN = IEN in the Option file
 ;Return = access ^ menu tree IEN ^ a set of codes ^ key
 N XQPM,XQDIC,XQTL,XQRT
 S XQPM=$P($G(^VA(200,XQUSR,201)),"^")
 I 'XQPM Q "N"
 ; check Lock on the Primary menu
 S XQRT=$$KEYSTOP(XQIEN,XQUSR)
 I XQRT'="OK" Q "0^"_XQPM_"^"_XQRT
 ; 
 S XQDIC="P"_XQPM
 I '$D(^XUTL("XQO",XQDIC,"^",XQIEN)) Q ""
 S XQTL=$P($G(^XUTL("XQO",XQDIC,"^",XQIEN)),"^",2,99)
 I XQTL="" Q ""
 S XQRT=$$KEYS(XQTL,XQUSR)
 I XQRT="OK" Q "1^"_XQPM
 Q "0^"_XQPM_"^"_XQRT
 ;
CKCM(XQUSR,XQIEN) ; Access found in the Common Options
 ;take in XQUSR = IEN in New Person file; XQIEN = IEN in the Option file
 ;Return = access ^ menu tree IEN ^ a set of codes ^ key
 N XQTL,XQDIC,XQCOM,XQRT
 S XQCOM=$O(^DIC(19,"B","XUCOMMAND",0))
 S XQDIC="PXU"
 I '$D(^XUTL("XQO",XQDIC,"^",XQIEN)) Q "N"
 S XQTL=$P($G(^XUTL("XQO",XQDIC,"^",%XQOP)),"^",2,99)
 I XQTL="" Q ""
 S XQRT=$$KEYS(XQTL,XQUSR)
 I XQRT="OK" Q "2^"_"^^^"_XQCOM
 Q "0^"_"^"_XQRT_"^"_XQCOM
 ;
CKTSM(XQUSR,XQIEN) ; Access found in the top level of secondary option
 ;take in XQUSR = IEN in New Person file; XQIEN = IEN in the Option file
 ;Return = access ^ menu tree IEN ^ a set of codes ^ key
 N XQDIC,XQRT,XQTL
 S XQDIC="U"_XQUSR
 I '$D(^VA(200,XQUSR,203,"B",XQIEN)) Q "N"
 S XQTL=$P($G(^XUTL("XQO",XQDIC,"^",XQIEN)),"^",2,99)
 I XQTL="" D SET^XQSET S XQTL=$P($G(^DIC(19,XQIEN,0)),"^") ;P766 rebuilds the secondary menu
 I XQTL="" Q "N"
 S XQRT=$$KEYS(XQTL,XQUSR)
 I XQRT="OK" Q "3^"_XQIEN
 Q "0^"_XQIEN_"^"_XQRT
 ;
CKTESM(XQUSR,XQIEN) ; Access through the secondary menu tree OpIEN
 ;take in XQUSR = IEN in New Person file; XQIEN = IEN in the Option file
 ;Return = access ^ menu tree IEN ^ a set of codes ^ key
 N XQI,XQY,XQRT,XQDIC,XQTL S XQI=0,XQRT="",XQY=""
 F  S XQI=$O(^VA(200,XQUSR,203,"B",XQI)) Q:XQI'>0  D
 .S XQDIC="P"_XQI
 .S XQTL=$G(^XUTL("XQO",XQDIC,"^",XQIEN)) I XQTL="" Q
 .S XQTL=$P(XQTL,"^",2,99) I XQTL="" Q
 .S XQRT=$$KEYSTOP(XQI,XQUSR)
 .I XQRT="OK" S XQRT=$$KEYS(XQTL,XQUSR)
 .S XQY=XQI
 .I XQRT="OK" S XQI="ZZZ" Q
 I XQRT="OK" Q "4^"_XQY
 I XQRT="" Q XQRT
 Q "0^"_XQY_"^"_XQRT
 ;
KEYS(XQA,XQUSR) ;Check for keys, reverse keys...
 ;XQA         = ^XUTL("XQO",XQDIC,"^",%XQOP) or U_^DIC(19,%XQOP,0)
 ;XQUSR       = IEN user in the New Person #200 file
 ;Return XQRT = Null or Lock/ReLock if found
 ;
 N XQL,XQRL,XQRT S XQRT="OK"
 S XQL=$$CHCKL^XQCHK2(XQA,XQUSR) ;check for keys
 I +XQL>0 S XQRT="L^"_$P(XQL,"^",2)
 S XQRL=$$CHCKRL^XQCHK2(XQA,XQUSR) ;check for reverse keys
 I +XQRL>0 S XQRT="R^"_$P(XQRL,"^",2)
 Q XQRT
 ;
KEYSTOP(XQIEN,XQUSR) ;check Lock and Reversed Lock on the top level menu
 ;;XQIEN       = IEN option in the Option #19 file 
 ;;XQUSR       = IEN use in the New Person #200 file
 ;;Return XQRT = Null or Lock/ReLock if found
 N XQL,XQRL,XQRT S XQRT="OK"
 S XQL=$$CHKTOPL^XQCHK2(XQIEN,XQUSR) ;check for keys on top level
 I +XQL>0 S XQRT="L^"_$P(XQL,"^",2)
 S XQRL=$$CHKTOPRL^XQCHK2(XQIEN,XQUSR) ;check for reverse keys on top level
 I +XQRL>0 S XQRT="R^"_$P(XQRL,"^",2)
 Q XQRT
 ;
PRINT(XQANS) ; print out the result
 N XQRSLT,XQTREE,XQPTR,XQCODES,XQKEY
 S XQRSLT=+XQANS,XQTREE=""
 S XQPTR=$P(XQANS,U,2)
 I XQPTR>0 S XQTREE=$P(^DIC(19,$P(XQANS,U,2),0),U)
 S XQCODES=$P(XQANS,U,3),XQKEY=$P(XQANS,U,4)
 ;-------------------------------------------------------------------------------
 I XQRSLT=-1 W !!?5,"User ",XQUSER," is not in the New Person File."
 I XQRSLT=-2 W !!?5,"User ",XQUSER," has an active termination date,",!?5,"or no verify code."
 I XQRSLT=-3 W !!?5,"Option ",XQOPT," is not in the Option File."
 I XQRSLT=0 D
 .W !!?5,"User ",XQUSER," does not have access to the option",!?5,XQOPT,"."
 .I XQCODES["L" W !!?5,"There is a lock somewhere in the menu tree "_XQTREE,!?5,"and the user does not hold the key "_XQKEY_"."
 .I XQCODES["R" W !!?5,"There is a reverse lock somewhere in the menu tree "_XQTREE,!?5,"and the user holds the key "_XQKEY_"."
 .Q
 I XQRSLT=1 W !!?5,"User ",XQUSER," has access to the option ",XQOPT,!?5,"through the primary menu ",XQTREE," (",$P(^DIC(19,XQPTR,0),U,2),")."
 I XQRSLT=2 W !!?5,"User ",XQUSER," has access to the option ",XQOPT,!?5,"through the Common Options (XUCOMMAND)."
 I XQRSLT=3 W !!?5,"User ",XQUSER," has access to the option ",XQOPT,!?5,"as a top-level secondary menu option."
 I XQRSLT=4 W !!?5,"User ",XQUSER," has access to the option ",XQOPT,!?5,"through the secondary menu tree ",XQTREE," (",$P(^DIC(19,XQPTR,0),U,2),")."
 W !
 Q
 ;
KILLFM ;Kill off the FileMan variables
 K D0,DI,DIC,DIE,DISYS,DQ,DR,DUOUT,DTOUT,X,Y
 Q
 
--- Routine Detail   --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HXQCHK3   7607     printed  Sep 23, 2025@19:41:42                                                                                                                                                                                                      Page 2
XQCHK3    ; OAK-BY/BDT - This routine for XQCHK; Feb 17, 2022@07:03:39
 +1       ;;8.0;KERNEL;**503,766**;Jul 10, 1995;Build 4
 +2       ;;"Per VHA Directive 2004-038, this routine should not be modified".
 +3       ;
 +4        QUIT 
OPACCES   ;Entry point for the option that checks to see if a user has
 +1       ;access to a particular option by calling the above function.
 +2        NEW DIC,X,Y,XQANS,XQOPN,XQUSER,XQUSN,XQOPT
 +3       ;get user
 +4        SET DIC(0)="AEMNQ"
           SET DIC="^VA(200,"
           SET DIC("A")="Please enter the user's name: "
           DO ^DIC
 +5        IF $DATA(DUOUT)!($DATA(DTOUT))
               DO KILLFM
               QUIT 
 +6        IF Y=-1
               WRITE !!?5,"Sorry we couldn't find that user in the New Person File.",!
               DO KILLFM
               QUIT 
 +7        SET XQUSN=+Y
           SET XQUSER=$PIECE(Y,U,2)
           DO KILLFM
 +8       ;get option
 +9        SET DIC(0)="AEMNQ"
           SET DIC="^DIC(19,"
           SET DIC("A")="Please enter the name of the option: "
           DO ^DIC
 +10       IF $DATA(DUOUT)!($DATA(DTOUT))
               DO KILLFM
               QUIT 
 +11       IF Y=-1
               WRITE !!?5,"Sorry we couldn't find that option.",!
               DO KILLFM
               QUIT 
 +12       SET XQOPN=+Y
           SET XQOPT=$PIECE(Y,U,2)
           DO KILLFM
 +13      ;check keys
 +14       SET XQANS=$$ACCESS(XQUSN,XQOPN)
 +15      ;print out
 +16       DO PRINT(XQANS)
 +17       QUIT 
 +18      ;
ACCESS(%XQUSR,%XQOP) ;Find out if a user has access to a particular option
 +1       ;;W $$ACCESS(DUZ,Option IEN) returns:
 +2       ;;
 +3       ;;-1:no such user in the New Person File
 +4       ;;-2: User terminated or has no access code
 +5       ;;-3: no such option in the Option File
 +6       ;;0: no access found in any menu tree the user owns
 +7       ;;
 +8       ;;All other cases return a 4-piece string stating
 +9       ;;access ^ menu tree IEN ^ a set of codes ^ key
 +10      ;;
 +11      ;;O^tree^codes^key: No access because of locks (see XQCODES below)
 +12      ;;where 'tree' is the menu where access WOULD be allowed
 +13      ;;and 'key' is the key preventing access
 +14      ;;
 +15      ;;1^OpIEN^^: Access allowed through the Primary Menu
 +16      ;;2^OpIEN^codes^: Access found in the Common Options
 +17      ;;3^OpIEN^codes^: Access found in the top level of secondary option
 +18      ;;4^OpIEN^codes^: Access through the secondary menu tree OpIEN.
 +19      ;;
 +20      ;;XQCODES can contain:
 +21      ;;N=No Primary Menu in the User File (warning only)
 +22      ;;L=Locked and the user does not have the key (forces 0 in first piece)
 +23      ;;R=Reverse lock and user has the key (forces 0 in first piece)
 +24      ;
 +25       NEW XQUSR,U
           SET U="^"
 +26       SET XQUSR=$$ACTIVE^XUSER(%XQUSR)
 +27       IF XQUSR=""
               QUIT -1
 +28       IF +XQUSR=0
               QUIT -2
 +29      ;
 +30      ;Convert %XQOP to its IEN if the name is passed
 +31       IF %XQOP'=+$GET(%XQOP)
               Begin DoDot:1
 +32               IF $DATA(^DIC(19,"B",%XQOP))<1
                       SET %XQOP=0
                       QUIT 
 +33              IF '$TEST
                       SET %XQOP=$ORDER(^DIC(19,"B",%XQOP,0))
 +34               QUIT 
               End DoDot:1
 +35       IF '%XQOP
               QUIT -3
 +36       IF '$DATA(^DIC(19,%XQOP,0))
               QUIT -3
 +37      ;checking
 +38       NEW XQRT,XQRT1
           SET XQRT=""
           SET XQRT1=""
 +39      ;primary menu and sub-menu in the primary menu
           SET XQRT=$$CKPM(%XQUSR,%XQOP)
 +40       IF $PIECE(XQRT,U)=1
               QUIT XQRT
 +41       IF $PIECE(XQRT,U)="N"
               QUIT XQRT
 +42       SET XQRT1=XQRT
 +43      ;common menu
           SET XQRT=$$CKCM(%XQUSR,%XQOP)
 +44       IF $PIECE(XQRT,U)=2
               QUIT XQRT
 +45       IF $PIECE(XQRT,U)=0
               SET XQRT1=XQRT
 +46      ;top level of secondary menus
           SET XQRT=$$CKTSM(%XQUSR,%XQOP)
 +47       IF $PIECE(XQRT,U)=3
               QUIT XQRT
 +48       IF $PIECE(XQRT,U)=0
               SET XQRT1=XQRT
 +49      ;sub-menu in secondary menus
           SET XQRT=$$CKTESM(%XQUSR,%XQOP)
 +50       IF $PIECE(XQRT,U)=4
               QUIT XQRT
 +51       IF $PIECE(XQRT,U)=0
               SET XQRT1=XQRT
 +52       IF XQRT1=""
               SET XQRT1=0
 +53       QUIT XQRT1
 +54      ;
CKPM(XQUSR,XQIEN) ; Access allowed through the Primary Menu
 +1       ;Look in the user's primary menu tree
 +2       ;take in XQUSR = IEN in New Person file; XQIEN = IEN in the Option file
 +3       ;Return = access ^ menu tree IEN ^ a set of codes ^ key
 +4        NEW XQPM,XQDIC,XQTL,XQRT
 +5        SET XQPM=$PIECE($GET(^VA(200,XQUSR,201)),"^")
 +6        IF 'XQPM
               QUIT "N"
 +7       ; check Lock on the Primary menu
 +8        SET XQRT=$$KEYSTOP(XQIEN,XQUSR)
 +9        IF XQRT'="OK"
               QUIT "0^"_XQPM_"^"_XQRT
 +10      ; 
 +11       SET XQDIC="P"_XQPM
 +12       IF '$DATA(^XUTL("XQO",XQDIC,"^",XQIEN))
               QUIT ""
 +13       SET XQTL=$PIECE($GET(^XUTL("XQO",XQDIC,"^",XQIEN)),"^",2,99)
 +14       IF XQTL=""
               QUIT ""
 +15       SET XQRT=$$KEYS(XQTL,XQUSR)
 +16       IF XQRT="OK"
               QUIT "1^"_XQPM
 +17       QUIT "0^"_XQPM_"^"_XQRT
 +18      ;
CKCM(XQUSR,XQIEN) ; Access found in the Common Options
 +1       ;take in XQUSR = IEN in New Person file; XQIEN = IEN in the Option file
 +2       ;Return = access ^ menu tree IEN ^ a set of codes ^ key
 +3        NEW XQTL,XQDIC,XQCOM,XQRT
 +4        SET XQCOM=$ORDER(^DIC(19,"B","XUCOMMAND",0))
 +5        SET XQDIC="PXU"
 +6        IF '$DATA(^XUTL("XQO",XQDIC,"^",XQIEN))
               QUIT "N"
 +7        SET XQTL=$PIECE($GET(^XUTL("XQO",XQDIC,"^",%XQOP)),"^",2,99)
 +8        IF XQTL=""
               QUIT ""
 +9        SET XQRT=$$KEYS(XQTL,XQUSR)
 +10       IF XQRT="OK"
               QUIT "2^"_"^^^"_XQCOM
 +11       QUIT "0^"_"^"_XQRT_"^"_XQCOM
 +12      ;
CKTSM(XQUSR,XQIEN) ; Access found in the top level of secondary option
 +1       ;take in XQUSR = IEN in New Person file; XQIEN = IEN in the Option file
 +2       ;Return = access ^ menu tree IEN ^ a set of codes ^ key
 +3        NEW XQDIC,XQRT,XQTL
 +4        SET XQDIC="U"_XQUSR
 +5        IF '$DATA(^VA(200,XQUSR,203,"B",XQIEN))
               QUIT "N"
 +6        SET XQTL=$PIECE($GET(^XUTL("XQO",XQDIC,"^",XQIEN)),"^",2,99)
 +7       ;P766 rebuilds the secondary menu
           IF XQTL=""
               DO SET^XQSET
               SET XQTL=$PIECE($GET(^DIC(19,XQIEN,0)),"^")
 +8        IF XQTL=""
               QUIT "N"
 +9        SET XQRT=$$KEYS(XQTL,XQUSR)
 +10       IF XQRT="OK"
               QUIT "3^"_XQIEN
 +11       QUIT "0^"_XQIEN_"^"_XQRT
 +12      ;
CKTESM(XQUSR,XQIEN) ; Access through the secondary menu tree OpIEN
 +1       ;take in XQUSR = IEN in New Person file; XQIEN = IEN in the Option file
 +2       ;Return = access ^ menu tree IEN ^ a set of codes ^ key
 +3        NEW XQI,XQY,XQRT,XQDIC,XQTL
           SET XQI=0
           SET XQRT=""
           SET XQY=""
 +4        FOR 
               SET XQI=$ORDER(^VA(200,XQUSR,203,"B",XQI))
               if XQI'>0
                   QUIT 
               Begin DoDot:1
 +5                SET XQDIC="P"_XQI
 +6                SET XQTL=$GET(^XUTL("XQO",XQDIC,"^",XQIEN))
                   IF XQTL=""
                       QUIT 
 +7                SET XQTL=$PIECE(XQTL,"^",2,99)
                   IF XQTL=""
                       QUIT 
 +8                SET XQRT=$$KEYSTOP(XQI,XQUSR)
 +9                IF XQRT="OK"
                       SET XQRT=$$KEYS(XQTL,XQUSR)
 +10               SET XQY=XQI
 +11               IF XQRT="OK"
                       SET XQI="ZZZ"
                       QUIT 
               End DoDot:1
 +12       IF XQRT="OK"
               QUIT "4^"_XQY
 +13       IF XQRT=""
               QUIT XQRT
 +14       QUIT "0^"_XQY_"^"_XQRT
 +15      ;
KEYS(XQA,XQUSR) ;Check for keys, reverse keys...
 +1       ;XQA         = ^XUTL("XQO",XQDIC,"^",%XQOP) or U_^DIC(19,%XQOP,0)
 +2       ;XQUSR       = IEN user in the New Person #200 file
 +3       ;Return XQRT = Null or Lock/ReLock if found
 +4       ;
 +5        NEW XQL,XQRL,XQRT
           SET XQRT="OK"
 +6       ;check for keys
           SET XQL=$$CHCKL^XQCHK2(XQA,XQUSR)
 +7        IF +XQL>0
               SET XQRT="L^"_$PIECE(XQL,"^",2)
 +8       ;check for reverse keys
           SET XQRL=$$CHCKRL^XQCHK2(XQA,XQUSR)
 +9        IF +XQRL>0
               SET XQRT="R^"_$PIECE(XQRL,"^",2)
 +10       QUIT XQRT
 +11      ;
KEYSTOP(XQIEN,XQUSR) ;check Lock and Reversed Lock on the top level menu
 +1       ;;XQIEN       = IEN option in the Option #19 file 
 +2       ;;XQUSR       = IEN use in the New Person #200 file
 +3       ;;Return XQRT = Null or Lock/ReLock if found
 +4        NEW XQL,XQRL,XQRT
           SET XQRT="OK"
 +5       ;check for keys on top level
           SET XQL=$$CHKTOPL^XQCHK2(XQIEN,XQUSR)
 +6        IF +XQL>0
               SET XQRT="L^"_$PIECE(XQL,"^",2)
 +7       ;check for reverse keys on top level
           SET XQRL=$$CHKTOPRL^XQCHK2(XQIEN,XQUSR)
 +8        IF +XQRL>0
               SET XQRT="R^"_$PIECE(XQRL,"^",2)
 +9        QUIT XQRT
 +10      ;
PRINT(XQANS) ; print out the result
 +1        NEW XQRSLT,XQTREE,XQPTR,XQCODES,XQKEY
 +2        SET XQRSLT=+XQANS
           SET XQTREE=""
 +3        SET XQPTR=$PIECE(XQANS,U,2)
 +4        IF XQPTR>0
               SET XQTREE=$PIECE(^DIC(19,$PIECE(XQANS,U,2),0),U)
 +5        SET XQCODES=$PIECE(XQANS,U,3)
           SET XQKEY=$PIECE(XQANS,U,4)
 +6       ;-------------------------------------------------------------------------------
 +7        IF XQRSLT=-1
               WRITE !!?5,"User ",XQUSER," is not in the New Person File."
 +8        IF XQRSLT=-2
               WRITE !!?5,"User ",XQUSER," has an active termination date,",!?5,"or no verify code."
 +9        IF XQRSLT=-3
               WRITE !!?5,"Option ",XQOPT," is not in the Option File."
 +10       IF XQRSLT=0
               Begin DoDot:1
 +11               WRITE !!?5,"User ",XQUSER," does not have access to the option",!?5,XQOPT,"."
 +12               IF XQCODES["L"
                       WRITE !!?5,"There is a lock somewhere in the menu tree "_XQTREE,!?5,"and the user does not hold the key "_XQKEY_"."
 +13               IF XQCODES["R"
                       WRITE !!?5,"There is a reverse lock somewhere in the menu tree "_XQTREE,!?5,"and the user holds the key "_XQKEY_"."
 +14               QUIT 
               End DoDot:1
 +15       IF XQRSLT=1
               WRITE !!?5,"User ",XQUSER," has access to the option ",XQOPT,!?5,"through the primary menu ",XQTREE," (",$PIECE(^DIC(19,XQPTR,0),U,2),")."
 +16       IF XQRSLT=2
               WRITE !!?5,"User ",XQUSER," has access to the option ",XQOPT,!?5,"through the Common Options (XUCOMMAND)."
 +17       IF XQRSLT=3
               WRITE !!?5,"User ",XQUSER," has access to the option ",XQOPT,!?5,"as a top-level secondary menu option."
 +18       IF XQRSLT=4
               WRITE !!?5,"User ",XQUSER," has access to the option ",XQOPT,!?5,"through the secondary menu tree ",XQTREE," (",$PIECE(^DIC(19,XQPTR,0),U,2),")."
 +19       WRITE !
 +20       QUIT 
 +21      ;
KILLFM    ;Kill off the FileMan variables
 +1        KILL D0,DI,DIC,DIE,DISYS,DQ,DR,DUOUT,DTOUT,X,Y
 +2        QUIT