LEXWUP ;ISL/KER - Lexicon Keywords - Update (Purge) ;05/23/2017
 ;;2.0;LEXICON UTILITY;**103**;Sep 23, 1996;Build 2
 ;               
 ; Global Variables
 ;    ^ICD0(              ICR   4486
 ;    ^ICD9(              ICR   4485
 ;    ^LEX(757,           SACC 1.3
 ;    ^LEX(757.01,        SACC 1.3
 ;    ^LEX(757.02,        SACC 1.3
 ;    ^LEX(757.03,        SACC 1.3
 ;    ^LEX(757.071,       SACC 1.3
 ;    ^TMP("LEXWU",$J)    SACC 2.3.2.5.1
 ;               
 ; External References
 ;    HOME^%ZIS           ICR  10086
 ;    ^%ZTLOAD            ICR  10063
 ;    ^DIK                ICR  10013
 ;    $$GET1^DIQ          ICR   2056
 ;    $$DT^XLFDT          ICR  10103
 ;    $$FMDIFF^XLFDT      ICR  10103
 ;    $$FMTE^XLFDT        ICR  10103
 ;    $$NOW^XLFDT         ICR  10103
 ;               
 ; Local Variables NEWed or KILLed Elsewhere
 ;   Control Variables
 ;     LEXTEST            For testing only
 ;     LEXAFT             Purge keywords inactive after date
 ;     LEXCOM             Commit Flag
 ;     LEXPUR             Purge some or all (LEXPUR="ALL")
 ;               
 ; Call STOP^LEXWUS to stop the task.  It sets the following
 ; global node:
 ; 
 ;     ^TMP("LEXWU",$J,"STOP")
 ;               
 Q
EN ; Main Entry Point (tasked)
 N ZT,ZTKEY,ZTUCI,ZTSK,ZTDESC,ZTDTH,ZTIO,ZTRTN,ZTSAVE,ZTQUEUED,ZTREQ,LEXRUN,LEXCOM,LEXCHK,LEXNAM,I,X,Y
 S (LEXNAM,ZTDESC)="Keyword Update Utility (Purge Inactive)",LEXCHK=""
 I '$D(LEXTEST) S LEXRUN=$$RUN2^LEXWUM I LEXRUN>0 W:$L($P(LEXRUN,"^",2)) !,?4,$P(LEXRUN,"^",2),! Q
 S (LEXNAM,ZTDESC)="Keyword Update Utility (Purge Inactive)",LEXCHK=""
 S ZTRTN="PUR^LEXWUP" S LEXCHK="",LEXPUR="",ZTSAVE("LEXPUR")=""
 S:'$D(LEXCOM) LEXCOM=1,ZTSAVE("LEXCOM")=""
 I $D(LEXTEST) S ZTSAVE("LEXTEST")="" K LEXCOM,ZTSAVE("LEXCOM")
 S:$G(LEXAFT)?7N ZTSAVE("LEXAFT")="" K ^TMP("LEXWU",$J,"STOP") S ZTIO="",ZTDTH=$H
 D:'$D(LEXTEST) ^%ZTLOAD D:$D(LEXTEST) @ZTRTN
 I +($G(ZTSK))>0 W !!,?4,$G(LEXNAM)," tasked (#",+($G(ZTSK)),")",!
 D HOME^%ZIS K LEXTEST,LEXAFT,LEXCOM,LEXPUR
 Q
EN2 ; Entry Point (tasked - purge selected keyword - LEXKEY)
 ; 
 ;   Needs   LEXKEY             One Keyword 
 ;            <or>
 ;           LEXKEY(LEXKEY1)    Selected Keywords
 ;           LEXKEY(LEXKEY2)
 ;           LEXKEY(LEXKEYn)
 ;           
 N ZT,ZTKEY,ZTUCI,ZTSK,ZTDESC,ZTDTH,ZTIO,ZTRTN,ZTSAVE,ZTQUEUED,ZTREQ,LEXRUN,LEXCOM,LEXCHK,LEXNAM,I,X,Y
 I '$L($G(LEXKEY))&('$L($O(LEXKEY("")))) W !," LEXKEY keyword variable not defined",! Q 
 I '$D(LEXTEST) S LEXRUN=$$RUN2^LEXWUM I LEXRUN>0 W:$L($P(LEXRUN,"^",2)) !,?4,$P(LEXRUN,"^",2),! Q
 S (LEXNAM,ZTDESC)="Keyword Update Utility (Purge Selected Keyword)",LEXCHK=""
 S ZTRTN="SEL^LEXWUP" S LEXPUR=$G(LEXPUR),ZTSAVE("LEXPUR")=""
 S:$L($G(LEXKEY)) ZTSAVE("LEXKEY")="" S:$L($O(LEXKEY(""))) ZTSAVE("LEXKEY(")=""
 S:'$D(LEXCOM) LEXCOM=1,ZTSAVE("LEXCOM")="" I $D(LEXTEST) S ZTSAVE("LEXTEST")="" K LEXCOM,ZTSAVE("LEXCOM")
 S:$G(LEXAFT)?7N ZTSAVE("LEXAFT")="" K ^TMP("LEXWU",$J,"STOP")
 S ZTIO="",ZTDTH=$H D:'$D(LEXTEST) ^%ZTLOAD D:$D(LEXTEST) @ZTRTN
 I +($G(ZTSK))>0 W !!,?4,$G(LEXNAM)," tasked (#",+($G(ZTSK)),")",!
 D HOME^%ZIS K LEXTEST,LEXAFT,LEXCOM,LEXPUR
 Q
PUR ; Purge Keywords
 S:$D(ZTQUEUED) ZTREQ="@"
 K ^TMP("LEXWU",$J) S LEXENV=$$ENV Q:'LEXENV
 N LEXBEG,LEXCTR,LEXEFF,LEXENV,LEXEXC,LEXICDC,LEXICPC,LEXINA,LEXINC,LEXKEY,LEXKIEN,LEXLEXC,LEXSF,LEXTD,DIC,DIK,I,X
 N LEXL01C,LEXL02C,LEXL03C,LEXL04C,LEXL17C,LEXL30C,LEXL31C,LEXL56C,LEXI01C,LEXI02C,LEXI30C,LEXI31C
 S (LEXL01C,LEXL02C,LEXL03C,LEXL04C,LEXL17C,LEXL30C,LEXL31C,LEXL56C,LEXI01C,LEXI02C,LEXI30C,LEXI31C)=0
 S (LEXCTR,LEXICDC,LEXICPC,LEXLEXC)=0
 K:$D(LEXTEST) LEXCOM S LEXTD=$$DT^XLFDT,LEXKEY="",LEXBEG=$$NOW^XLFDT S LEXAFT=$G(LEXAFT) K LEXSF
 F  S LEXKEY=$O(^LEX(757.071,"B",LEXKEY)) Q:'$L(LEXKEY)  Q:$$ABT  D  Q:$$ABT
 . N LEXKIEN S LEXKIEN=0
 . F  S LEXKIEN=$O(^LEX(757.071,"B",LEXKEY,LEXKIEN)) Q:+LEXKIEN'>0  Q:$$ABT  D  Q:$$ABT
 . . N LEXSTA,LEXEFF,LEXINA,LEXINC,LEXEXC S LEXSTA=$$INA(LEXKIEN) Q:($G(LEXPUR)'="ALL")&(LEXSTA'>0)
 . . S LEXEFF=$P($G(^LEX(757.071,+LEXKIEN,0)),"^",2),LEXINA=$P($G(^LEX(757.071,+LEXKIEN,0)),"^",3)
 . . S LEXINC=$P($G(^LEX(757.071,+LEXKIEN,0)),"^",4),LEXEXC=$P($G(^LEX(757.071,+LEXKIEN,0)),"^",5)
 . . D DINA,ICD,LEX
 D DEND K ^TMP("LEXWU",$J)
 Q
SEL ; Selected Keywords (For Post-Install)
 S:$D(ZTQUEUED) ZTREQ="@"
 D:'$L($G(LEXKEY))&('$L($O(LEXKEY("")))) CLR D:$D(^TMP("LEXWU",$J,"STOP")) CLR Q:'$L($G(LEXKEY))&('$L($O(LEXKEY(""))))
 N LEXBEG,LEXEND,LEXELP,LEXSF,LEXKIEN,LEXTD,DIC,DIK,I,X
 N LEXL01C,LEXL02C,LEXL03C,LEXL04C,LEXL17C,LEXL30C,LEXL31C,LEXL56C,LEXI01C,LEXI02C,LEXI30C,LEXI31C
 S (LEXL01C,LEXL02C,LEXL03C,LEXL04C,LEXL17C,LEXL30C,LEXL31C,LEXL56C,LEXI01C,LEXI02C,LEXI30C,LEXI31C)=0
 S (LEXCTR,LEXICDC,LEXICPC,LEXLEXC)=0
 K:$D(LEXTEST) LEXCOM S LEXTD=$$DT^XLFDT,LEXBEG=$$NOW^XLFDT S LEXAFT=$G(LEXAFT) K LEXSF
 I $L($G(LEXKEY)) D
 . S LEXKIEN=0 F  S LEXKIEN=$O(^LEX(757.071,"B",LEXKEY,LEXKIEN)) Q:+LEXKIEN'>0  Q:$$ABT  D  Q:$$ABT
 . . N LEXSTA,LEXEFF,LEXINA,LEXINC,LEXEXC S LEXSTA=$$INA(LEXKIEN)
 . . Q:($G(LEXPUR)'="ALL")&(LEXSTA'>0)
 . . S LEXEFF=$P($G(^LEX(757.071,+LEXKIEN,0)),"^",2),LEXINA=$P($G(^LEX(757.071,+LEXKIEN,0)),"^",3)
 . . S LEXINC=$P($G(^LEX(757.071,+LEXKIEN,0)),"^",4),LEXEXC=$P($G(^LEX(757.071,+LEXKIEN,0)),"^",5)
 . . D DINA D ICD,LEX
 I $L($O(LEXKEY(""))) D
 . N LEXTKEY S LEXTKEY="" F  S LEXTKEY=$O(LEXKEY(LEXTKEY)) Q:'$L(LEXTKEY)  D
 . . N LEXKIEN,LEXKEY S LEXKEY=LEXTKEY,LEXKIEN=0
 . . F  S LEXKIEN=$O(^LEX(757.071,"B",LEXKEY,LEXKIEN)) Q:+LEXKIEN'>0  Q:$$ABT  D  Q:$$ABT
 . . . N LEXSTA,LEXEFF,LEXINA,LEXINC,LEXEXC S LEXSTA=$$INA(LEXKIEN)
 . . . Q:($G(LEXPUR)'="ALL")&(LEXSTA'>0)
 . . . S LEXEFF=$P($G(^LEX(757.071,+LEXKIEN,0)),"^",2),LEXINA=$P($G(^LEX(757.071,+LEXKIEN,0)),"^",3)
 . . . S LEXINC=$P($G(^LEX(757.071,+LEXKIEN,0)),"^",4),LEXEXC=$P($G(^LEX(757.071,+LEXKIEN,0)),"^",5)
 . . . D DINA D ICD,LEX
 D DEND K ^TMP("LEXWU",$J) D CLR
 Q
 ;
ICD ; ICD Diagnosis/Procedures
 N DA,DIK,DICI,LEXCHK,LEXDIEN,LEXEFF,LEXEXP,LEXI,LEXIIEN,LEXND,LEXOK,LEXRT,LEXSIEN,LEXSRC,LEXSUP
 Q:$G(LEXTD)'?7N  Q:'$L($G(LEXKEY))  Q:'$L($G(LEXINC))
 N LEXRT,LEXIIEN F LEXRT="^ICD9(","^ICD0("  S LEXIIEN=0 D
 . F  S LEXIIEN=$O(@(LEXRT_"""D"","""_LEXKEY_""","_+LEXIIEN_")")) Q:+LEXIIEN'>0  D
 . . N LEXEFF,LEXSRC,LEXTYPE,LEXSYS S LEXSRC=$P($G(@(LEXRT_+LEXIIEN_",1)")),"^",1),LEXEFF=0
 . . S LEXSYS="" S:LEXSRC=1 LEXSYS="ICD-9-CM" S:LEXSRC=2 LEXSYS="ICD-9 Proc"
 . . S:LEXSRC=30 LEXSYS="ICD-10-CM" S:LEXSRC=31 LEXSYS="ICD-10-PCS"
 . . S:LEXSRC=1!(LEXSRC=30) LEXTYPE="ICD Grouper Diagnosis (80)" S:LEXSRC=2!(LEXSRC=31) LEXTYPE="ICD Grouper Procedure (80.1)"
 . . F  S LEXEFF=$O(@(LEXRT_"""D"","""_LEXKEY_""","_+LEXIIEN_","_+LEXEFF_")")) Q:+LEXEFF'>0  D
 . . . Q:LEXEFF'?7N  N LEXDIEN S LEXDIEN=0
 . . . F  S LEXDIEN=$O(@(LEXRT_"""D"","""_LEXKEY_""","_+LEXIIEN_","_+LEXEFF_","_+LEXDIEN_")")) Q:+LEXDIEN'>0  D
 . . . . N LEXSIEN S LEXSIEN=0
 . . . . F  S LEXSIEN=$O(@(LEXRT_"""D"","""_LEXKEY_""","_+LEXIIEN_","_+LEXEFF_","_+LEXDIEN_","_+LEXSIEN_")")) Q:+LEXSIEN'>0  D
 . . . . . N DA,DIK,LEXCHK,LEXEXP,LEXI,LEXND,LEXOK,LEXSUP,LEXOIEN
 . . . . . S LEXND=LEXRT_"""D"","""_LEXKEY_""","_+LEXIIEN_","_+LEXEFF_","_+LEXDIEN_","_+LEXSIEN_")"
 . . . . . S LEXND=LEXRT_+LEXIIEN_",68,"_+LEXDIEN_",1)",LEXEXP=@LEXND,LEXOK=1
 . . . . . F LEXI=1:1 S LEXCHK=$P($G(LEXINC),";",LEXI) Q:'$L(LEXCHK)  S:LEXEXP'[LEXCHK LEXOK=0
 . . . . . Q:'LEXOK  S LEXND=LEXRT_+LEXIIEN_",68,"_+LEXDIEN_",2,"_+LEXSIEN_",0)",LEXOIEN=LEXIIEN
 . . . . . S LEXSUP=@LEXND Q:'$L(LEXSUP)  Q:LEXSUP'=LEXKEY  Q:'$D(@(LEXRT_+LEXIIEN_",68,"_+LEXDIEN_",2,""B"","""_LEXSUP_""")"))
 . . . . . D DEXP I $D(LEXCOM) S DA=+LEXSIEN,DA(1)=+LEXDIEN,DA(2)=+LEXIIEN,DIK=LEXRT_DA(2)_",68,"_DA(1)_",2," D ^DIK
 . . . . . S LEXSDOC=+($G(LEXSDOC))+1 S:LEXSRC=1!(LEXSRC=30) LEXICDC=+($G(LEXICDC))+1
 . . . . . S:LEXSRC=2!(LEXSRC=31) LEXICPC=+($G(LEXICPC))+1 S:LEXSRC=1 LEXI01C=+($G(LEXI01C))+1 S:LEXSRC=2 LEXI02C=+($G(LEXI02C))+1
 . . . . . S:LEXSRC=30 LEXI30C=+($G(LEXI30C))+1 S:LEXSRC=31 LEXI31C=+($G(LEXI31C))+1
 Q
LEX ; Lexicon
 Q:$G(LEXTD)'?7N  Q:'$L($G(LEXKEY))  Q:'$L($G(LEXINC))
 N DA,DIK,DIC,I,LEXRT,LEXASRC,LEXSS,LEXMIEN S LEXRT="^LEX(757.01,",LEXASRC="^1^2^3^4^17^30^31^56^",LEXMIEN=0
 F  S LEXMIEN=$O(^LEX(757.01,"AWRD",LEXKEY,LEXMIEN)) Q:+LEXMIEN'>0  D
 . N LEXEIEN S LEXEIEN=0 F  S LEXEIEN=$O(^LEX(757.01,"AWRD",LEXKEY,LEXMIEN,LEXEIEN)) Q:'$L(LEXEIEN)  D
 . . N LEXSUP S LEXSUP=0 F  S LEXSUP=$O(^LEX(757.01,"AWRD",LEXKEY,LEXMIEN,LEXEIEN,LEXSUP)) Q:+LEXSUP'>0  D
 . . . K LEXSF N LEXTIEN,LEXIENA,LEXOK,LEXFND,LEXSYS S (LEXOK,LEXFND)=0,LEXSYS="" F LEXTIEN=LEXMIEN,LEXEIEN D
 . . . . N LEXSIEN S LEXSIEN=0 F  S LEXSIEN=$O(^LEX(757.02,"B",LEXTIEN,LEXSIEN)) Q:+LEXSIEN'>0  D
 . . . . . N LEXSRC S LEXSRC=$P($G(^LEX(757.02,+LEXSIEN,0)),"^",3)
 . . . . . Q:LEXASRC'[("^"_LEXSRC_"^")  S LEXOK=1,LEXFND=LEXFND+1
 . . . . . S:'$L(LEXSYS)&(LEXSRC=1) LEXSYS="ICD-9-CM" S:'$L(LEXSYS)&(LEXSRC=2) LEXSYS="ICD-9 Proc"
 . . . . . S:'$L(LEXSYS)&(LEXSRC=3) LEXSYS="CPT-4" S:'$L(LEXSYS)&(LEXSRC=4) LEXSYS="HCPCS"
 . . . . . S:'$L(LEXSYS)&(LEXSRC=30) LEXSYS="ICD-10-CM" S:'$L(LEXSYS)&(LEXSRC=31) LEXSYS="ICD-10-PCS"
 . . . . . S:'$L(LEXSYS)&(LEXSRC=56) LEXSYS="SNOMED CT" S:'$L(LEXSYS)&(LEXSRC=17) LEXSYS="Title 38"
 . . . . . S LEXTYPE="Lexicon Expression (757.01)"
 . . . . . S LEXSF(+LEXSRC)=+($G(LEXSF(+LEXSRC)))+1
 . . . K LEXIENA S LEXIENA(+($G(LEXMIEN)))="",LEXIENA(+($G(LEXEIEN)))=""
 . . . S LEXTIEN=0 F  S LEXTIEN=$O(LEXIENA(LEXTIEN)) Q:+LEXTIEN'>0  D
 . . . . N LEXKIEN S LEXKIEN=0 F  S LEXKIEN=$O(^LEX(757.01,+LEXTIEN,5,"B",LEXKEY,LEXKIEN)) Q:+LEXKIEN'>0  D
 . . . . . N DA,DIK,LEXEXP,LEXOIEN S LEXOIEN=LEXTIEN,LEXEXP=$G(^LEX(757.01,+LEXTIEN,0))
 . . . . . Q:'$D(^LEX(757.01,+LEXTIEN,5,"B",LEXKEY))  D DEXP I $O(LEXSF(0))>0 D
 . . . . . . N LEXS S LEXS=0 F  S LEXS=$O(LEXSF(LEXS)) Q:+LEXS'>0  D
 . . . . . . . S:LEXS=56 LEXL56C=+($G(LEXL56C))+1 S:LEXS=17 LEXL17C=+($G(LEXL17C))+1
 . . . . . . . S:LEXS=3 LEXL03C=+($G(LEXL03C))+1 S:LEXS=4 LEXL04C=+($G(LEXL04C))+1
 . . . . . . . S:LEXS=1 LEXL01C=+($G(LEXL01C))+1 S:LEXS=30 LEXL30C=+($G(LEXL30C))+1
 . . . . . . . S:LEXS=2 LEXL02C=+($G(LEXL02C))+1 S:LEXS=31 LEXL31C=+($G(LEXL31C))+1
 . . . . . I $D(LEXCOM) S DA(1)=LEXTIEN,DA=LEXKIEN,DIK="^LEX(757.01,"_DA(1)_",5," D ^DIK
 Q
 ;
 ; Displays
DEND ;   Display End Totals
 Q:$D(LEXQUIET)  Q:$D(ZTQUEUED)  H 2 S LEXEND=$$NOW^XLFDT,LEXELP=$$FMDIFF^XLFDT($G(LEXEND),$G(LEXBEG),3)
 S:$L($G(LEXEND))&($L($G(LEXBEG)))&('$L(LEXELP)) LEXELP="00:00:00" N LEXII,LEXTT S LEXII="",LEXTT=0
 N LEXLEXC,LEXSDOC,LEXICDC,LEXTTT
 ;     Lexicon
 S LEXLEXC=+($G(LEXL56C))+($G(LEXL17C))+($G(LEXL03C))+($G(LEXL04C))+($G(LEXL01C))+($G(LEXL02C))+($G(LEXL30C))+($G(LEXL31C))
 I +($G(LEXLEXC))>0 D
 . W !,?3,"Lexicon Changes ",?35,$J(LEXLEXC,8)
 . I +($G(LEXL01C))>0 W !,?5,"ICD-9 Diagnosis Changes ",?35,$J(LEXL01C,8)
 . I +($G(LEXL02C))>0 W !,?5,"ICD-9 Procedure Changes ",?35,$J(LEXL02C,8)
 . I +($G(LEXL30C))>0 W !,?5,"ICD-10 Diagnosis Changes ",?35,$J(LEXL30C,8)
 . I +($G(LEXL31C))>0 W !,?5,"ICD-10 Procedure Changes ",?35,$J(LEXL31C,8)
 . I +($G(LEXL56C))>0 W !,?5,"SNOMED CT Changes ",?35,$J(LEXL56C,8)
 . I +($G(LEXL17C))>0 W !,?5,"TITLE 38 Changes ",?35,$J(LEXL17C,8)
 . I +($G(LEXL03C))>0 W !,?5,"CPT-4 Procedure Changes ",?35,$J(LEXL03C,8)
 . I +($G(LEXL04C))>0 W !,?5,"HCPCS Procedure Changes ",?35,$J(LEXL04C,8)
 ;     ICD files
 S LEXSDOC=+($G(LEXI01C))+($G(LEXI30C))+($G(LEXI02C))+($G(LEXI31C))
 S LEXICDC=+($G(LEXI01C))+($G(LEXI30C)),LEXICPC=+($G(LEXI02C))+($G(LEXI31C))
 I +($G(LEXSDOC))>0 D
 . N LEXTAB W:+($G(LEXLEXC))>0 ! W !,?3,"ICD* File Changes",?35,$J(LEXSDOC,8)
 . S LEXTAB="",LEXICDC=+($G(LEXI01C))+($G(LEXI30C))
 . I +($G(LEXI01C))>0&(+($G(LEXI30C))>0) W:LEXICDC>0 !,?5,"ICD Diagnosis File #80",?35,$J(LEXICDC,8) S LEXTAB="  "
 . I +($G(LEXI01C))>0 W !,?5,LEXTAB,"ICD-9 Diagnosis Changes ",?35,$J(LEXI01C,8)
 . I +($G(LEXI30C))>0 W !,?5,LEXTAB,"ICD-10 Diagnosis Changes ",?35,$J(LEXI30C,8)
 . S LEXTAB="",LEXICPC=+($G(LEXI02C))+($G(LEXI31C))
 . I +($G(LEXI02C))>0&(+($G(LEXI31C))>0) W:LEXICPC>0 !,?5,"ICD Procedures File #80.1",?35,$J(LEXICPC,8) S LEXTAB="  "
 . I +($G(LEXI02C))>0 W !,?5,LEXTAB,"ICD-9 Procedure Changes ",?35,$J(LEXI02C,8)
 . I +($G(LEXI31C))>0 W !,?5,LEXTAB,"ICD-10 Procedure Changes ",?35,$J(LEXI31C,8)
 S LEXTTT=+($G(LEXLEXC))+($G(LEXSDOC)) I LEXTTT>0 D
 . W:+($G(LEXLEXC))>0!(+($G(LEXSDOC))>0) !
 . I +($G(LEXLEXC))>0 W !,?3,"Total Changes ",?35,$J(LEXTTT,8)
 W ! I $L($G(LEXBEG)) W !,?3,"Start:   ",?14,$TR($$FMTE^XLFDT(LEXBEG,"5Z"),"@"," ")
 I $L($G(LEXEND)) W !,?3,"Finish:  ",?14,$TR($$FMTE^XLFDT(LEXEND,"5Z"),"@"," ")
 I $L($G(LEXELP)) W !,?3,"Elapsed: ",?14,$TR(LEXELP," ","0"),!
 Q
DEXP ;   Display Expression
 Q:$D(LEXQUIET)  Q:$D(ZTQUEUED)  Q:'$L(LEXEXP)  Q:'$L(LEXINC)  Q:'$L(LEXKEY)
 W:$L($G(LEXTYPE)) !,"Type:            ",LEXTYPE W:$D(LEXSYS) !,"System:          ",LEXSYS
 W !,"Expression:      ",LEXEXP,!,"Include/Keyword: ",LEXINC,"/",LEXKEY
 I +($G(LEXOIEN))>0,$L($G(LEXRT)) W !,"IEN:             ",LEXRT,LEXOIEN,","
 W !
 Q
DINA ;   Display Inactive Keyword
 Q:$D(LEXQUIET)  Q:$D(ZTQUEUED)  Q:'$L($G(LEXKEY))  Q:$G(LEXEFF)'?7N  Q:$G(LEXINA)'?7N  Q
 W !,"Keyword:         ",LEXKEY,!,"Effective:       ",$$FMTE^XLFDT(LEXEFF,"5Z"),!,"Inactive:        ",$$FMTE^XLFDT(LEXINA,"5Z"),!
 Q
 ; 
 ; Miscellaneous
ABT(X) ;   Abort
 Q:$D(^TMP("LEXWU",$J,"STOP")) 1
 Q 0
INA(X) ;   Inactive before Today or after LEXAFT (optional)
 N LEXI,LEX1,LEX2,LEXA,LEXT,LEXO S LEXT=$$DT^XLFDT,LEXI=+($G(X)),LEX1=+($P($P($G(^LEX(757.071,+LEXI,0)),"^",2),".",1)) Q:LEX1'?7N "0^1"
 S LEX2=+($P($P($G(^LEX(757.071,+LEXI,0)),"^",3),".",1)) Q:LEX2'?7N "0^2"  S LEXA=$G(LEXAFT),LEXO=0
 ;     If Inactive after LEXAFT and not later Active        1
 Q:($G(LEXA)?7N)&((LEX2+.001)>LEXA)&((LEX2+.001)>LEX1) "1^3"
 ;     If Inactive after LEXAFT and later Active            0
 Q:($G(LEXA)?7N)&((LEX2+.001)>LEXA)&((LEX1+.001)>LEX2) "0^4"
 ;     If Inactive before LEXAFT and not later Active       0
 Q:($G(LEXA)?7N)&((LEXA+.001)>LEX2)&((LEX2+.001)>LEX1) "0^5"
 ;     If Inactive                                          1
 Q:(LEX2+.001)>LEX1 "1^6"
 ;     Else Active                                          0
 Q "0^7"
ACT(X) ;   Active before Today or after LEXAFT (optional)
 N LEXI,LEX1,LEX2,LEXA,LEXT,LEXO S LEXT=$$DT^XLFDT,LEXI=+($G(X)),LEX1=+($P($P($G(^LEX(757.071,+LEXI,0)),"^",2),".",1)) Q:LEX1'?7N "0^1"
 S LEX2=+($P($P($G(^LEX(757.071,+LEXI,0)),"^",3),".",1)),LEXA=$G(LEXAFT),LEXO=0
 ;     If Active after LEXAFT and not later Inctive         1
 Q:($G(LEXA)?7N)&((LEX1+.001)>LEXA)&((LEX1+.001)>LEX2) "1^2"
 ;     If Active after LEXAFT and later Inactive            0
 Q:($G(LEXA)?7N)&((LEX1+.001)>LEXA)&((LEX2+.001)>LEX1) "0^3"
 ;     If Active before LEXAFT and not later Inactive       0
 Q:($G(LEXA)?7N)&((LEXA+.001)>LEX1)&((LEX1+.001)>LEX2) "0^4"
 ;     If Active                                            1
 Q:(LEX1+.001)>LEX2 "1^5"
 ;     Else Inactive                                        0
 Q "0^6"
DT ;   Display ^TMP
 D DT^LEXWUM
 Q
STOP ;   Stop Task
 D STOP^LEXWUM
 Q
GO ;   Remove Stop
 K ^TMP("LEXWU",$J,"STOP")
 Q
CLR ;   Clear
 K ^TMP("LEXWU",$J,"STOP") K DA,DIC,DICI,DIK,I,LEX1,LEXL17C,LEX2,LEX3,LEXA,LEXAFT,LEXBEG,LEXC,LEXCAP,LEXCDT,LEXCHK,LEXCT
 K LEXCTR,LEXD,LEXDIEN,LEXEFF,LEXEIEN,LEXELP,LEXEND,LEXENV,LEXEXC,LEXEXP,LEXFND,LEXI,LEXI01C,LEXI02C,LEXI30C,LEXI31C,LEXICDC,LEXICPC
 K LEXIEN,LEXII,LEXIIEN,LEXINA,LEXINC,LEXKEY,LEXKIEN,LEXL01C,LEXL02C,LEXL03C,LEXL04C,LEXL17C,LEXL30C,LEXL31C,LEXL56C,LEXLEXC,LEXM
 K LEXMIEN,LEXNAM,LEXND,LEXNM,LEXO,LEXOIEN,LEXOK,LEXORD,LEXQUIET,LEXRT,LEXRUN,LEXS,LEXSDOC,LEXSF,LEXSIEN,LEXSRC,LEXSS,LEXSTA
 K LEXSUP,LEXSYS,LEXT,LEXTD,LEXTIEN,LEXTKEY,LEXTT,LEXTTT,LEXTYPE,LEXY,NEXKEY,POP,X,Y,ZT,ZTDESC,ZTDTH,ZTIO,ZTKEY,ZTQUEUED
 K ZTREQ,ZTRTN,ZTSAVE,ZTSK,ZTUCI
 Q
ENV(X) ;   Environment
 D HOME^%ZIS S U="^",DT=$$DT^XLFDT,DTIME=300 K POP
 N LEXNM S LEXNM=$$GET1^DIQ(200,(DUZ_","),.01)
 I '$L(LEXNM) W !!,?5,"Invalid/Missing DUZ" Q 0
 Q 1
 
--- Routine Detail   --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HLEXWUP   16065     printed  Sep 23, 2025@19:45:54                                                                                                                                                                                                     Page 2
LEXWUP    ;ISL/KER - Lexicon Keywords - Update (Purge) ;05/23/2017
 +1       ;;2.0;LEXICON UTILITY;**103**;Sep 23, 1996;Build 2
 +2       ;               
 +3       ; Global Variables
 +4       ;    ^ICD0(              ICR   4486
 +5       ;    ^ICD9(              ICR   4485
 +6       ;    ^LEX(757,           SACC 1.3
 +7       ;    ^LEX(757.01,        SACC 1.3
 +8       ;    ^LEX(757.02,        SACC 1.3
 +9       ;    ^LEX(757.03,        SACC 1.3
 +10      ;    ^LEX(757.071,       SACC 1.3
 +11      ;    ^TMP("LEXWU",$J)    SACC 2.3.2.5.1
 +12      ;               
 +13      ; External References
 +14      ;    HOME^%ZIS           ICR  10086
 +15      ;    ^%ZTLOAD            ICR  10063
 +16      ;    ^DIK                ICR  10013
 +17      ;    $$GET1^DIQ          ICR   2056
 +18      ;    $$DT^XLFDT          ICR  10103
 +19      ;    $$FMDIFF^XLFDT      ICR  10103
 +20      ;    $$FMTE^XLFDT        ICR  10103
 +21      ;    $$NOW^XLFDT         ICR  10103
 +22      ;               
 +23      ; Local Variables NEWed or KILLed Elsewhere
 +24      ;   Control Variables
 +25      ;     LEXTEST            For testing only
 +26      ;     LEXAFT             Purge keywords inactive after date
 +27      ;     LEXCOM             Commit Flag
 +28      ;     LEXPUR             Purge some or all (LEXPUR="ALL")
 +29      ;               
 +30      ; Call STOP^LEXWUS to stop the task.  It sets the following
 +31      ; global node:
 +32      ; 
 +33      ;     ^TMP("LEXWU",$J,"STOP")
 +34      ;               
 +35       QUIT 
EN        ; Main Entry Point (tasked)
 +1        NEW ZT,ZTKEY,ZTUCI,ZTSK,ZTDESC,ZTDTH,ZTIO,ZTRTN,ZTSAVE,ZTQUEUED,ZTREQ,LEXRUN,LEXCOM,LEXCHK,LEXNAM,I,X,Y
 +2        SET (LEXNAM,ZTDESC)="Keyword Update Utility (Purge Inactive)"
           SET LEXCHK=""
 +3        IF '$DATA(LEXTEST)
               SET LEXRUN=$$RUN2^LEXWUM
               IF LEXRUN>0
                   if $LENGTH($PIECE(LEXRUN,"^",2))
                       WRITE !,?4,$PIECE(LEXRUN,"^",2),!
                   QUIT 
 +4        SET (LEXNAM,ZTDESC)="Keyword Update Utility (Purge Inactive)"
           SET LEXCHK=""
 +5        SET ZTRTN="PUR^LEXWUP"
           SET LEXCHK=""
           SET LEXPUR=""
           SET ZTSAVE("LEXPUR")=""
 +6        if '$DATA(LEXCOM)
               SET LEXCOM=1
               SET ZTSAVE("LEXCOM")=""
 +7        IF $DATA(LEXTEST)
               SET ZTSAVE("LEXTEST")=""
               KILL LEXCOM,ZTSAVE("LEXCOM")
 +8        if $GET(LEXAFT)?7N
               SET ZTSAVE("LEXAFT")=""
           KILL ^TMP("LEXWU",$JOB,"STOP")
           SET ZTIO=""
           SET ZTDTH=$HOROLOG
 +9        if '$DATA(LEXTEST)
               DO ^%ZTLOAD
           if $DATA(LEXTEST)
               DO @ZTRTN
 +10       IF +($GET(ZTSK))>0
               WRITE !!,?4,$GET(LEXNAM)," tasked (#",+($GET(ZTSK)),")",!
 +11       DO HOME^%ZIS
           KILL LEXTEST,LEXAFT,LEXCOM,LEXPUR
 +12       QUIT 
EN2       ; Entry Point (tasked - purge selected keyword - LEXKEY)
 +1       ; 
 +2       ;   Needs   LEXKEY             One Keyword 
 +3       ;            <or>
 +4       ;           LEXKEY(LEXKEY1)    Selected Keywords
 +5       ;           LEXKEY(LEXKEY2)
 +6       ;           LEXKEY(LEXKEYn)
 +7       ;           
 +8        NEW ZT,ZTKEY,ZTUCI,ZTSK,ZTDESC,ZTDTH,ZTIO,ZTRTN,ZTSAVE,ZTQUEUED,ZTREQ,LEXRUN,LEXCOM,LEXCHK,LEXNAM,I,X,Y
 +9        IF '$LENGTH($GET(LEXKEY))&('$LENGTH($ORDER(LEXKEY(""))))
               WRITE !," LEXKEY keyword variable not defined",!
               QUIT 
 +10       IF '$DATA(LEXTEST)
               SET LEXRUN=$$RUN2^LEXWUM
               IF LEXRUN>0
                   if $LENGTH($PIECE(LEXRUN,"^",2))
                       WRITE !,?4,$PIECE(LEXRUN,"^",2),!
                   QUIT 
 +11       SET (LEXNAM,ZTDESC)="Keyword Update Utility (Purge Selected Keyword)"
           SET LEXCHK=""
 +12       SET ZTRTN="SEL^LEXWUP"
           SET LEXPUR=$GET(LEXPUR)
           SET ZTSAVE("LEXPUR")=""
 +13       if $LENGTH($GET(LEXKEY))
               SET ZTSAVE("LEXKEY")=""
           if $LENGTH($ORDER(LEXKEY("")))
               SET ZTSAVE("LEXKEY(")=""
 +14       if '$DATA(LEXCOM)
               SET LEXCOM=1
               SET ZTSAVE("LEXCOM")=""
           IF $DATA(LEXTEST)
               SET ZTSAVE("LEXTEST")=""
               KILL LEXCOM,ZTSAVE("LEXCOM")
 +15       if $GET(LEXAFT)?7N
               SET ZTSAVE("LEXAFT")=""
           KILL ^TMP("LEXWU",$JOB,"STOP")
 +16       SET ZTIO=""
           SET ZTDTH=$HOROLOG
           if '$DATA(LEXTEST)
               DO ^%ZTLOAD
           if $DATA(LEXTEST)
               DO @ZTRTN
 +17       IF +($GET(ZTSK))>0
               WRITE !!,?4,$GET(LEXNAM)," tasked (#",+($GET(ZTSK)),")",!
 +18       DO HOME^%ZIS
           KILL LEXTEST,LEXAFT,LEXCOM,LEXPUR
 +19       QUIT 
PUR       ; Purge Keywords
 +1        if $DATA(ZTQUEUED)
               SET ZTREQ="@"
 +2        KILL ^TMP("LEXWU",$JOB)
           SET LEXENV=$$ENV
           if 'LEXENV
               QUIT 
 +3        NEW LEXBEG,LEXCTR,LEXEFF,LEXENV,LEXEXC,LEXICDC,LEXICPC,LEXINA,LEXINC,LEXKEY,LEXKIEN,LEXLEXC,LEXSF,LEXTD,DIC,DIK,I,X
 +4        NEW LEXL01C,LEXL02C,LEXL03C,LEXL04C,LEXL17C,LEXL30C,LEXL31C,LEXL56C,LEXI01C,LEXI02C,LEXI30C,LEXI31C
 +5        SET (LEXL01C,LEXL02C,LEXL03C,LEXL04C,LEXL17C,LEXL30C,LEXL31C,LEXL56C,LEXI01C,LEXI02C,LEXI30C,LEXI31C)=0
 +6        SET (LEXCTR,LEXICDC,LEXICPC,LEXLEXC)=0
 +7        if $DATA(LEXTEST)
               KILL LEXCOM
           SET LEXTD=$$DT^XLFDT
           SET LEXKEY=""
           SET LEXBEG=$$NOW^XLFDT
           SET LEXAFT=$GET(LEXAFT)
           KILL LEXSF
 +8        FOR 
               SET LEXKEY=$ORDER(^LEX(757.071,"B",LEXKEY))
               if '$LENGTH(LEXKEY)
                   QUIT 
               if $$ABT
                   QUIT 
               Begin DoDot:1
 +9                NEW LEXKIEN
                   SET LEXKIEN=0
 +10               FOR 
                       SET LEXKIEN=$ORDER(^LEX(757.071,"B",LEXKEY,LEXKIEN))
                       if +LEXKIEN'>0
                           QUIT 
                       if $$ABT
                           QUIT 
                       Begin DoDot:2
 +11                       NEW LEXSTA,LEXEFF,LEXINA,LEXINC,LEXEXC
                           SET LEXSTA=$$INA(LEXKIEN)
                           if ($GET(LEXPUR)'="ALL")&(LEXSTA'>0)
                               QUIT 
 +12                       SET LEXEFF=$PIECE($GET(^LEX(757.071,+LEXKIEN,0)),"^",2)
                           SET LEXINA=$PIECE($GET(^LEX(757.071,+LEXKIEN,0)),"^",3)
 +13                       SET LEXINC=$PIECE($GET(^LEX(757.071,+LEXKIEN,0)),"^",4)
                           SET LEXEXC=$PIECE($GET(^LEX(757.071,+LEXKIEN,0)),"^",5)
 +14                       DO DINA
                           DO ICD
                           DO LEX
                       End DoDot:2
                       if $$ABT
                           QUIT 
               End DoDot:1
               if $$ABT
                   QUIT 
 +15       DO DEND
           KILL ^TMP("LEXWU",$JOB)
 +16       QUIT 
SEL       ; Selected Keywords (For Post-Install)
 +1        if $DATA(ZTQUEUED)
               SET ZTREQ="@"
 +2        if '$LENGTH($GET(LEXKEY))&('$LENGTH($ORDER(LEXKEY(""))))
               DO CLR
           if $DATA(^TMP("LEXWU",$JOB,"STOP"))
               DO CLR
           if '$LENGTH($GET(LEXKEY))&('$LENGTH($ORDER(LEXKEY(""))))
               QUIT 
 +3        NEW LEXBEG,LEXEND,LEXELP,LEXSF,LEXKIEN,LEXTD,DIC,DIK,I,X
 +4        NEW LEXL01C,LEXL02C,LEXL03C,LEXL04C,LEXL17C,LEXL30C,LEXL31C,LEXL56C,LEXI01C,LEXI02C,LEXI30C,LEXI31C
 +5        SET (LEXL01C,LEXL02C,LEXL03C,LEXL04C,LEXL17C,LEXL30C,LEXL31C,LEXL56C,LEXI01C,LEXI02C,LEXI30C,LEXI31C)=0
 +6        SET (LEXCTR,LEXICDC,LEXICPC,LEXLEXC)=0
 +7        if $DATA(LEXTEST)
               KILL LEXCOM
           SET LEXTD=$$DT^XLFDT
           SET LEXBEG=$$NOW^XLFDT
           SET LEXAFT=$GET(LEXAFT)
           KILL LEXSF
 +8        IF $LENGTH($GET(LEXKEY))
               Begin DoDot:1
 +9                SET LEXKIEN=0
                   FOR 
                       SET LEXKIEN=$ORDER(^LEX(757.071,"B",LEXKEY,LEXKIEN))
                       if +LEXKIEN'>0
                           QUIT 
                       if $$ABT
                           QUIT 
                       Begin DoDot:2
 +10                       NEW LEXSTA,LEXEFF,LEXINA,LEXINC,LEXEXC
                           SET LEXSTA=$$INA(LEXKIEN)
 +11                       if ($GET(LEXPUR)'="ALL")&(LEXSTA'>0)
                               QUIT 
 +12                       SET LEXEFF=$PIECE($GET(^LEX(757.071,+LEXKIEN,0)),"^",2)
                           SET LEXINA=$PIECE($GET(^LEX(757.071,+LEXKIEN,0)),"^",3)
 +13                       SET LEXINC=$PIECE($GET(^LEX(757.071,+LEXKIEN,0)),"^",4)
                           SET LEXEXC=$PIECE($GET(^LEX(757.071,+LEXKIEN,0)),"^",5)
 +14                       DO DINA
                           DO ICD
                           DO LEX
                       End DoDot:2
                       if $$ABT
                           QUIT 
               End DoDot:1
 +15       IF $LENGTH($ORDER(LEXKEY("")))
               Begin DoDot:1
 +16               NEW LEXTKEY
                   SET LEXTKEY=""
                   FOR 
                       SET LEXTKEY=$ORDER(LEXKEY(LEXTKEY))
                       if '$LENGTH(LEXTKEY)
                           QUIT 
                       Begin DoDot:2
 +17                       NEW LEXKIEN,LEXKEY
                           SET LEXKEY=LEXTKEY
                           SET LEXKIEN=0
 +18                       FOR 
                               SET LEXKIEN=$ORDER(^LEX(757.071,"B",LEXKEY,LEXKIEN))
                               if +LEXKIEN'>0
                                   QUIT 
                               if $$ABT
                                   QUIT 
                               Begin DoDot:3
 +19                               NEW LEXSTA,LEXEFF,LEXINA,LEXINC,LEXEXC
                                   SET LEXSTA=$$INA(LEXKIEN)
 +20                               if ($GET(LEXPUR)'="ALL")&(LEXSTA'>0)
                                       QUIT 
 +21                               SET LEXEFF=$PIECE($GET(^LEX(757.071,+LEXKIEN,0)),"^",2)
                                   SET LEXINA=$PIECE($GET(^LEX(757.071,+LEXKIEN,0)),"^",3)
 +22                               SET LEXINC=$PIECE($GET(^LEX(757.071,+LEXKIEN,0)),"^",4)
                                   SET LEXEXC=$PIECE($GET(^LEX(757.071,+LEXKIEN,0)),"^",5)
 +23                               DO DINA
                                   DO ICD
                                   DO LEX
                               End DoDot:3
                               if $$ABT
                                   QUIT 
                       End DoDot:2
               End DoDot:1
 +24       DO DEND
           KILL ^TMP("LEXWU",$JOB)
           DO CLR
 +25       QUIT 
 +26      ;
ICD       ; ICD Diagnosis/Procedures
 +1        NEW DA,DIK,DICI,LEXCHK,LEXDIEN,LEXEFF,LEXEXP,LEXI,LEXIIEN,LEXND,LEXOK,LEXRT,LEXSIEN,LEXSRC,LEXSUP
 +2        if $GET(LEXTD)'?7N
               QUIT 
           if '$LENGTH($GET(LEXKEY))
               QUIT 
           if '$LENGTH($GET(LEXINC))
               QUIT 
 +3        NEW LEXRT,LEXIIEN
           FOR LEXRT="^ICD9(","^ICD0("
               SET LEXIIEN=0
               Begin DoDot:1
 +4                FOR 
                       SET LEXIIEN=$ORDER(@(LEXRT_"""D"","""_LEXKEY_""","_+LEXIIEN_")"))
                       if +LEXIIEN'>0
                           QUIT 
                       Begin DoDot:2
 +5                        NEW LEXEFF,LEXSRC,LEXTYPE,LEXSYS
                           SET LEXSRC=$PIECE($GET(@(LEXRT_+LEXIIEN_",1)")),"^",1)
                           SET LEXEFF=0
 +6                        SET LEXSYS=""
                           if LEXSRC=1
                               SET LEXSYS="ICD-9-CM"
                           if LEXSRC=2
                               SET LEXSYS="ICD-9 Proc"
 +7                        if LEXSRC=30
                               SET LEXSYS="ICD-10-CM"
                           if LEXSRC=31
                               SET LEXSYS="ICD-10-PCS"
 +8                        if LEXSRC=1!(LEXSRC=30)
                               SET LEXTYPE="ICD Grouper Diagnosis (80)"
                           if LEXSRC=2!(LEXSRC=31)
                               SET LEXTYPE="ICD Grouper Procedure (80.1)"
 +9                        FOR 
                               SET LEXEFF=$ORDER(@(LEXRT_"""D"","""_LEXKEY_""","_+LEXIIEN_","_+LEXEFF_")"))
                               if +LEXEFF'>0
                                   QUIT 
                               Begin DoDot:3
 +10                               if LEXEFF'?7N
                                       QUIT 
                                   NEW LEXDIEN
                                   SET LEXDIEN=0
 +11                               FOR 
                                       SET LEXDIEN=$ORDER(@(LEXRT_"""D"","""_LEXKEY_""","_+LEXIIEN_","_+LEXEFF_","_+LEXDIEN_")"))
                                       if +LEXDIEN'>0
                                           QUIT 
                                       Begin DoDot:4
 +12                                       NEW LEXSIEN
                                           SET LEXSIEN=0
 +13                                       FOR 
                                               SET LEXSIEN=$ORDER(@(LEXRT_"""D"","""_LEXKEY_""","_+LEXIIEN_","_+LEXEFF_","_+LEXDIEN_","_+LEXSIEN_")"))
                                               if +LEXSIEN'>0
                                                   QUIT 
                                               Begin DoDot:5
 +14                                               NEW DA,DIK,LEXCHK,LEXEXP,LEXI,LEXND,LEXOK,LEXSUP,LEXOIEN
 +15                                               SET LEXND=LEXRT_"""D"","""_LEXKEY_""","_+LEXIIEN_","_+LEXEFF_","_+LEXDIEN_","_+LEXSIEN_")"
 +16                                               SET LEXND=LEXRT_+LEXIIEN_",68,"_+LEXDIEN_",1)"
                                                   SET LEXEXP=@LEXND
                                                   SET LEXOK=1
 +17                                               FOR LEXI=1:1
                                                       SET LEXCHK=$PIECE($GET(LEXINC),";",LEXI)
                                                       if '$LENGTH(LEXCHK)
                                                           QUIT 
                                                       if LEXEXP'[LEXCHK
                                                           SET LEXOK=0
 +18                                               if 'LEXOK
                                                       QUIT 
                                                   SET LEXND=LEXRT_+LEXIIEN_",68,"_+LEXDIEN_",2,"_+LEXSIEN_",0)"
                                                   SET LEXOIEN=LEXIIEN
 +19                                               SET LEXSUP=@LEXND
                                                   if '$LENGTH(LEXSUP)
                                                       QUIT 
                                                   if LEXSUP'=LEXKEY
                                                       QUIT 
                                                   if '$DATA(@(LEXRT_+LEXIIEN_",68,"_+LEXDIEN_",2,""B"","""_LEXSUP_""")"))
                                                       QUIT 
 +20                                               DO DEXP
                                                   IF $DATA(LEXCOM)
                                                       SET DA=+LEXSIEN
                                                       SET DA(1)=+LEXDIEN
                                                       SET DA(2)=+LEXIIEN
                                                       SET DIK=LEXRT_DA(2)_",68,"_DA(1)_",2,"
                                                       DO ^DIK
 +21                                               SET LEXSDOC=+($GET(LEXSDOC))+1
                                                   if LEXSRC=1!(LEXSRC=30)
                                                       SET LEXICDC=+($GET(LEXICDC))+1
 +22                                               if LEXSRC=2!(LEXSRC=31)
                                                       SET LEXICPC=+($GET(LEXICPC))+1
                                                   if LEXSRC=1
                                                       SET LEXI01C=+($GET(LEXI01C))+1
                                                   if LEXSRC=2
                                                       SET LEXI02C=+($GET(LEXI02C))+1
 +23                                               if LEXSRC=30
                                                       SET LEXI30C=+($GET(LEXI30C))+1
                                                   if LEXSRC=31
                                                       SET LEXI31C=+($GET(LEXI31C))+1
                                               End DoDot:5
                                       End DoDot:4
                               End DoDot:3
                       End DoDot:2
               End DoDot:1
 +24       QUIT 
LEX       ; Lexicon
 +1        if $GET(LEXTD)'?7N
               QUIT 
           if '$LENGTH($GET(LEXKEY))
               QUIT 
           if '$LENGTH($GET(LEXINC))
               QUIT 
 +2        NEW DA,DIK,DIC,I,LEXRT,LEXASRC,LEXSS,LEXMIEN
           SET LEXRT="^LEX(757.01,"
           SET LEXASRC="^1^2^3^4^17^30^31^56^"
           SET LEXMIEN=0
 +3        FOR 
               SET LEXMIEN=$ORDER(^LEX(757.01,"AWRD",LEXKEY,LEXMIEN))
               if +LEXMIEN'>0
                   QUIT 
               Begin DoDot:1
 +4                NEW LEXEIEN
                   SET LEXEIEN=0
                   FOR 
                       SET LEXEIEN=$ORDER(^LEX(757.01,"AWRD",LEXKEY,LEXMIEN,LEXEIEN))
                       if '$LENGTH(LEXEIEN)
                           QUIT 
                       Begin DoDot:2
 +5                        NEW LEXSUP
                           SET LEXSUP=0
                           FOR 
                               SET LEXSUP=$ORDER(^LEX(757.01,"AWRD",LEXKEY,LEXMIEN,LEXEIEN,LEXSUP))
                               if +LEXSUP'>0
                                   QUIT 
                               Begin DoDot:3
 +6                                KILL LEXSF
                                   NEW LEXTIEN,LEXIENA,LEXOK,LEXFND,LEXSYS
                                   SET (LEXOK,LEXFND)=0
                                   SET LEXSYS=""
                                   FOR LEXTIEN=LEXMIEN,LEXEIEN
                                       Begin DoDot:4
 +7                                        NEW LEXSIEN
                                           SET LEXSIEN=0
                                           FOR 
                                               SET LEXSIEN=$ORDER(^LEX(757.02,"B",LEXTIEN,LEXSIEN))
                                               if +LEXSIEN'>0
                                                   QUIT 
                                               Begin DoDot:5
 +8                                                NEW LEXSRC
                                                   SET LEXSRC=$PIECE($GET(^LEX(757.02,+LEXSIEN,0)),"^",3)
 +9                                                if LEXASRC'[("^"_LEXSRC_"^")
                                                       QUIT 
                                                   SET LEXOK=1
                                                   SET LEXFND=LEXFND+1
 +10                                               if '$LENGTH(LEXSYS)&(LEXSRC=1)
                                                       SET LEXSYS="ICD-9-CM"
                                                   if '$LENGTH(LEXSYS)&(LEXSRC=2)
                                                       SET LEXSYS="ICD-9 Proc"
 +11                                               if '$LENGTH(LEXSYS)&(LEXSRC=3)
                                                       SET LEXSYS="CPT-4"
                                                   if '$LENGTH(LEXSYS)&(LEXSRC=4)
                                                       SET LEXSYS="HCPCS"
 +12                                               if '$LENGTH(LEXSYS)&(LEXSRC=30)
                                                       SET LEXSYS="ICD-10-CM"
                                                   if '$LENGTH(LEXSYS)&(LEXSRC=31)
                                                       SET LEXSYS="ICD-10-PCS"
 +13                                               if '$LENGTH(LEXSYS)&(LEXSRC=56)
                                                       SET LEXSYS="SNOMED CT"
                                                   if '$LENGTH(LEXSYS)&(LEXSRC=17)
                                                       SET LEXSYS="Title 38"
 +14                                               SET LEXTYPE="Lexicon Expression (757.01)"
 +15                                               SET LEXSF(+LEXSRC)=+($GET(LEXSF(+LEXSRC)))+1
                                               End DoDot:5
                                       End DoDot:4
 +16                               KILL LEXIENA
                                   SET LEXIENA(+($GET(LEXMIEN)))=""
                                   SET LEXIENA(+($GET(LEXEIEN)))=""
 +17                               SET LEXTIEN=0
                                   FOR 
                                       SET LEXTIEN=$ORDER(LEXIENA(LEXTIEN))
                                       if +LEXTIEN'>0
                                           QUIT 
                                       Begin DoDot:4
 +18                                       NEW LEXKIEN
                                           SET LEXKIEN=0
                                           FOR 
                                               SET LEXKIEN=$ORDER(^LEX(757.01,+LEXTIEN,5,"B",LEXKEY,LEXKIEN))
                                               if +LEXKIEN'>0
                                                   QUIT 
                                               Begin DoDot:5
 +19                                               NEW DA,DIK,LEXEXP,LEXOIEN
                                                   SET LEXOIEN=LEXTIEN
                                                   SET LEXEXP=$GET(^LEX(757.01,+LEXTIEN,0))
 +20                                               if '$DATA(^LEX(757.01,+LEXTIEN,5,"B",LEXKEY))
                                                       QUIT 
                                                   DO DEXP
                                                   IF $ORDER(LEXSF(0))>0
                                                       Begin DoDot:6
 +21                                                       NEW LEXS
                                                           SET LEXS=0
                                                           FOR 
                                                               SET LEXS=$ORDER(LEXSF(LEXS))
                                                               if +LEXS'>0
                                                                   QUIT 
                                                               Begin DoDot:7
 +22                                                               if LEXS=56
                                                                       SET LEXL56C=+($GET(LEXL56C))+1
                                                                   if LEXS=17
                                                                       SET LEXL17C=+($GET(LEXL17C))+1
 +23                                                               if LEXS=3
                                                                       SET LEXL03C=+($GET(LEXL03C))+1
                                                                   if LEXS=4
                                                                       SET LEXL04C=+($GET(LEXL04C))+1
 +24                                                               if LEXS=1
                                                                       SET LEXL01C=+($GET(LEXL01C))+1
                                                                   if LEXS=30
                                                                       SET LEXL30C=+($GET(LEXL30C))+1
 +25                                                               if LEXS=2
                                                                       SET LEXL02C=+($GET(LEXL02C))+1
                                                                   if LEXS=31
                                                                       SET LEXL31C=+($GET(LEXL31C))+1
                                                               End DoDot:7
                                                       End DoDot:6
 +26                                               IF $DATA(LEXCOM)
                                                       SET DA(1)=LEXTIEN
                                                       SET DA=LEXKIEN
                                                       SET DIK="^LEX(757.01,"_DA(1)_",5,"
                                                       DO ^DIK
                                               End DoDot:5
                                       End DoDot:4
                               End DoDot:3
                       End DoDot:2
               End DoDot:1
 +27       QUIT 
 +28      ;
 +29      ; Displays
DEND      ;   Display End Totals
 +1        if $DATA(LEXQUIET)
               QUIT 
           if $DATA(ZTQUEUED)
               QUIT 
           HANG 2
           SET LEXEND=$$NOW^XLFDT
           SET LEXELP=$$FMDIFF^XLFDT($GET(LEXEND),$GET(LEXBEG),3)
 +2        if $LENGTH($GET(LEXEND))&($LENGTH($GET(LEXBEG)))&('$LENGTH(LEXELP))
               SET LEXELP="00:00:00"
           NEW LEXII,LEXTT
           SET LEXII=""
           SET LEXTT=0
 +3        NEW LEXLEXC,LEXSDOC,LEXICDC,LEXTTT
 +4       ;     Lexicon
 +5        SET LEXLEXC=+($GET(LEXL56C))+($GET(LEXL17C))+($GET(LEXL03C))+($GET(LEXL04C))+($GET(LEXL01C))+($GET(LEXL02C))+($GET(LEXL30C))+($GET(LEXL31C))
 +6        IF +($GET(LEXLEXC))>0
               Begin DoDot:1
 +7                WRITE !,?3,"Lexicon Changes ",?35,$JUSTIFY(LEXLEXC,8)
 +8                IF +($GET(LEXL01C))>0
                       WRITE !,?5,"ICD-9 Diagnosis Changes ",?35,$JUSTIFY(LEXL01C,8)
 +9                IF +($GET(LEXL02C))>0
                       WRITE !,?5,"ICD-9 Procedure Changes ",?35,$JUSTIFY(LEXL02C,8)
 +10               IF +($GET(LEXL30C))>0
                       WRITE !,?5,"ICD-10 Diagnosis Changes ",?35,$JUSTIFY(LEXL30C,8)
 +11               IF +($GET(LEXL31C))>0
                       WRITE !,?5,"ICD-10 Procedure Changes ",?35,$JUSTIFY(LEXL31C,8)
 +12               IF +($GET(LEXL56C))>0
                       WRITE !,?5,"SNOMED CT Changes ",?35,$JUSTIFY(LEXL56C,8)
 +13               IF +($GET(LEXL17C))>0
                       WRITE !,?5,"TITLE 38 Changes ",?35,$JUSTIFY(LEXL17C,8)
 +14               IF +($GET(LEXL03C))>0
                       WRITE !,?5,"CPT-4 Procedure Changes ",?35,$JUSTIFY(LEXL03C,8)
 +15               IF +($GET(LEXL04C))>0
                       WRITE !,?5,"HCPCS Procedure Changes ",?35,$JUSTIFY(LEXL04C,8)
               End DoDot:1
 +16      ;     ICD files
 +17       SET LEXSDOC=+($GET(LEXI01C))+($GET(LEXI30C))+($GET(LEXI02C))+($GET(LEXI31C))
 +18       SET LEXICDC=+($GET(LEXI01C))+($GET(LEXI30C))
           SET LEXICPC=+($GET(LEXI02C))+($GET(LEXI31C))
 +19       IF +($GET(LEXSDOC))>0
               Begin DoDot:1
 +20               NEW LEXTAB
                   if +($GET(LEXLEXC))>0
                       WRITE !
                   WRITE !,?3,"ICD* File Changes",?35,$JUSTIFY(LEXSDOC,8)
 +21               SET LEXTAB=""
                   SET LEXICDC=+($GET(LEXI01C))+($GET(LEXI30C))
 +22               IF +($GET(LEXI01C))>0&(+($GET(LEXI30C))>0)
                       if LEXICDC>0
                           WRITE !,?5,"ICD Diagnosis File #80",?35,$JUSTIFY(LEXICDC,8)
                       SET LEXTAB="  "
 +23               IF +($GET(LEXI01C))>0
                       WRITE !,?5,LEXTAB,"ICD-9 Diagnosis Changes ",?35,$JUSTIFY(LEXI01C,8)
 +24               IF +($GET(LEXI30C))>0
                       WRITE !,?5,LEXTAB,"ICD-10 Diagnosis Changes ",?35,$JUSTIFY(LEXI30C,8)
 +25               SET LEXTAB=""
                   SET LEXICPC=+($GET(LEXI02C))+($GET(LEXI31C))
 +26               IF +($GET(LEXI02C))>0&(+($GET(LEXI31C))>0)
                       if LEXICPC>0
                           WRITE !,?5,"ICD Procedures File #80.1",?35,$JUSTIFY(LEXICPC,8)
                       SET LEXTAB="  "
 +27               IF +($GET(LEXI02C))>0
                       WRITE !,?5,LEXTAB,"ICD-9 Procedure Changes ",?35,$JUSTIFY(LEXI02C,8)
 +28               IF +($GET(LEXI31C))>0
                       WRITE !,?5,LEXTAB,"ICD-10 Procedure Changes ",?35,$JUSTIFY(LEXI31C,8)
               End DoDot:1
 +29       SET LEXTTT=+($GET(LEXLEXC))+($GET(LEXSDOC))
           IF LEXTTT>0
               Begin DoDot:1
 +30               if +($GET(LEXLEXC))>0!(+($GET(LEXSDOC))>0)
                       WRITE !
 +31               IF +($GET(LEXLEXC))>0
                       WRITE !,?3,"Total Changes ",?35,$JUSTIFY(LEXTTT,8)
               End DoDot:1
 +32       WRITE !
           IF $LENGTH($GET(LEXBEG))
               WRITE !,?3,"Start:   ",?14,$TRANSLATE($$FMTE^XLFDT(LEXBEG,"5Z"),"@"," ")
 +33       IF $LENGTH($GET(LEXEND))
               WRITE !,?3,"Finish:  ",?14,$TRANSLATE($$FMTE^XLFDT(LEXEND,"5Z"),"@"," ")
 +34       IF $LENGTH($GET(LEXELP))
               WRITE !,?3,"Elapsed: ",?14,$TRANSLATE(LEXELP," ","0"),!
 +35       QUIT 
DEXP      ;   Display Expression
 +1        if $DATA(LEXQUIET)
               QUIT 
           if $DATA(ZTQUEUED)
               QUIT 
           if '$LENGTH(LEXEXP)
               QUIT 
           if '$LENGTH(LEXINC)
               QUIT 
           if '$LENGTH(LEXKEY)
               QUIT 
 +2        if $LENGTH($GET(LEXTYPE))
               WRITE !,"Type:            ",LEXTYPE
           if $DATA(LEXSYS)
               WRITE !,"System:          ",LEXSYS
 +3        WRITE !,"Expression:      ",LEXEXP,!,"Include/Keyword: ",LEXINC,"/",LEXKEY
 +4        IF +($GET(LEXOIEN))>0
               IF $LENGTH($GET(LEXRT))
                   WRITE !,"IEN:             ",LEXRT,LEXOIEN,","
 +5        WRITE !
 +6        QUIT 
DINA      ;   Display Inactive Keyword
 +1        if $DATA(LEXQUIET)
               QUIT 
           if $DATA(ZTQUEUED)
               QUIT 
           if '$LENGTH($GET(LEXKEY))
               QUIT 
           if $GET(LEXEFF)'?7N
               QUIT 
           if $GET(LEXINA)'?7N
               QUIT 
           QUIT 
 +2        WRITE !,"Keyword:         ",LEXKEY,!,"Effective:       ",$$FMTE^XLFDT(LEXEFF,"5Z"),!,"Inactive:        ",$$FMTE^XLFDT(LEXINA,"5Z"),!
 +3        QUIT 
 +4       ; 
 +5       ; Miscellaneous
ABT(X)    ;   Abort
 +1        if $DATA(^TMP("LEXWU",$JOB,"STOP"))
               QUIT 1
 +2        QUIT 0
INA(X)    ;   Inactive before Today or after LEXAFT (optional)
 +1        NEW LEXI,LEX1,LEX2,LEXA,LEXT,LEXO
           SET LEXT=$$DT^XLFDT
           SET LEXI=+($GET(X))
           SET LEX1=+($PIECE($PIECE($GET(^LEX(757.071,+LEXI,0)),"^",2),".",1))
           if LEX1'?7N
               QUIT "0^1"
 +2        SET LEX2=+($PIECE($PIECE($GET(^LEX(757.071,+LEXI,0)),"^",3),".",1))
           if LEX2'?7N
               QUIT "0^2"
           SET LEXA=$GET(LEXAFT)
           SET LEXO=0
 +3       ;     If Inactive after LEXAFT and not later Active        1
 +4        if ($GET(LEXA)?7N)&((LEX2+.001)>LEXA)&((LEX2+.001)>LEX1)
               QUIT "1^3"
 +5       ;     If Inactive after LEXAFT and later Active            0
 +6        if ($GET(LEXA)?7N)&((LEX2+.001)>LEXA)&((LEX1+.001)>LEX2)
               QUIT "0^4"
 +7       ;     If Inactive before LEXAFT and not later Active       0
 +8        if ($GET(LEXA)?7N)&((LEXA+.001)>LEX2)&((LEX2+.001)>LEX1)
               QUIT "0^5"
 +9       ;     If Inactive                                          1
 +10       if (LEX2+.001)>LEX1
               QUIT "1^6"
 +11      ;     Else Active                                          0
 +12       QUIT "0^7"
ACT(X)    ;   Active before Today or after LEXAFT (optional)
 +1        NEW LEXI,LEX1,LEX2,LEXA,LEXT,LEXO
           SET LEXT=$$DT^XLFDT
           SET LEXI=+($GET(X))
           SET LEX1=+($PIECE($PIECE($GET(^LEX(757.071,+LEXI,0)),"^",2),".",1))
           if LEX1'?7N
               QUIT "0^1"
 +2        SET LEX2=+($PIECE($PIECE($GET(^LEX(757.071,+LEXI,0)),"^",3),".",1))
           SET LEXA=$GET(LEXAFT)
           SET LEXO=0
 +3       ;     If Active after LEXAFT and not later Inctive         1
 +4        if ($GET(LEXA)?7N)&((LEX1+.001)>LEXA)&((LEX1+.001)>LEX2)
               QUIT "1^2"
 +5       ;     If Active after LEXAFT and later Inactive            0
 +6        if ($GET(LEXA)?7N)&((LEX1+.001)>LEXA)&((LEX2+.001)>LEX1)
               QUIT "0^3"
 +7       ;     If Active before LEXAFT and not later Inactive       0
 +8        if ($GET(LEXA)?7N)&((LEXA+.001)>LEX1)&((LEX1+.001)>LEX2)
               QUIT "0^4"
 +9       ;     If Active                                            1
 +10       if (LEX1+.001)>LEX2
               QUIT "1^5"
 +11      ;     Else Inactive                                        0
 +12       QUIT "0^6"
DT        ;   Display ^TMP
 +1        DO DT^LEXWUM
 +2        QUIT 
STOP      ;   Stop Task
 +1        DO STOP^LEXWUM
 +2        QUIT 
GO        ;   Remove Stop
 +1        KILL ^TMP("LEXWU",$JOB,"STOP")
 +2        QUIT 
CLR       ;   Clear
 +1        KILL ^TMP("LEXWU",$JOB,"STOP")
           KILL DA,DIC,DICI,DIK,I,LEX1,LEXL17C,LEX2,LEX3,LEXA,LEXAFT,LEXBEG,LEXC,LEXCAP,LEXCDT,LEXCHK,LEXCT
 +2        KILL LEXCTR,LEXD,LEXDIEN,LEXEFF,LEXEIEN,LEXELP,LEXEND,LEXENV,LEXEXC,LEXEXP,LEXFND,LEXI,LEXI01C,LEXI02C,LEXI30C,LEXI31C,LEXICDC,LEXICPC
 +3        KILL LEXIEN,LEXII,LEXIIEN,LEXINA,LEXINC,LEXKEY,LEXKIEN,LEXL01C,LEXL02C,LEXL03C,LEXL04C,LEXL17C,LEXL30C,LEXL31C,LEXL56C,LEXLEXC,LEXM
 +4        KILL LEXMIEN,LEXNAM,LEXND,LEXNM,LEXO,LEXOIEN,LEXOK,LEXORD,LEXQUIET,LEXRT,LEXRUN,LEXS,LEXSDOC,LEXSF,LEXSIEN,LEXSRC,LEXSS,LEXSTA
 +5        KILL LEXSUP,LEXSYS,LEXT,LEXTD,LEXTIEN,LEXTKEY,LEXTT,LEXTTT,LEXTYPE,LEXY,NEXKEY,POP,X,Y,ZT,ZTDESC,ZTDTH,ZTIO,ZTKEY,ZTQUEUED
 +6        KILL ZTREQ,ZTRTN,ZTSAVE,ZTSK,ZTUCI
 +7        QUIT 
ENV(X)    ;   Environment
 +1        DO HOME^%ZIS
           SET U="^"
           SET DT=$$DT^XLFDT
           SET DTIME=300
           KILL POP
 +2        NEW LEXNM
           SET LEXNM=$$GET1^DIQ(200,(DUZ_","),.01)
 +3        IF '$LENGTH(LEXNM)
               WRITE !!,?5,"Invalid/Missing DUZ"
               QUIT 0
 +4        QUIT 1