| 1 | XMR3 ;ISC-SF/GMB-SMTP Receiver (RFC 822) ;07/01/2002  14:11
 | 
|---|
| 2 |  ;;8.0;MailMan;;Jun 28, 2002
 | 
|---|
| 3 | DATA ; TEXT / ASSUMES VALID RECIPIENT
 | 
|---|
| 4 |  ; Incoming Variables:
 | 
|---|
| 5 |  ; XMINSTR("FWD BY")=""
 | 
|---|
| 6 |  ; XMZ        message number of new message
 | 
|---|
| 7 |  ; XMZFDA     FM FDA for new message
 | 
|---|
| 8 |  ; XMZIENS    IENS for new message
 | 
|---|
| 9 |  ; $D(XMC("DX"))  means Test mode: Messages will not be delivered
 | 
|---|
| 10 |  ; If the msg is from a VA site, the following may be set:
 | 
|---|
| 11 |  ; XMREMID    always set if the msg is from a VA site
 | 
|---|
| 12 |  ; $G(XMRXMZ) message number of message we already have.
 | 
|---|
| 13 |  ;            Set if new message is a duplicate of one we already have.
 | 
|---|
| 14 |  N XMLIN,XMINCR,XMHDR,XMREJECT,XMSUBJ,XMFROM,XMDATE,XMENCR,XMZO,XMSENDER,XMREPLTO
 | 
|---|
| 15 |  D GETDATA Q:ER
 | 
|---|
| 16 |  I '$G(XMRXMZ),'$D(XMC("DX")) D HDRPROC Q:ER
 | 
|---|
| 17 |  I '$G(XMREJECT),'$D(XMC("DX")) D SET
 | 
|---|
| 18 |  S XMSTATE="^HELO^MAIL^"
 | 
|---|
| 19 |  K ^TMP("XMY",$J),^TMP("XMY0",$J)
 | 
|---|
| 20 |  D ZAPIT^XMXMSGS2(.5,.95,XMZ)
 | 
|---|
| 21 |  I '$G(XMREJECT) D
 | 
|---|
| 22 |  . S XMSG="250 'data' accepted" X XMSEN
 | 
|---|
| 23 |  . D XMTHIST^XMTDR(XMINST,"R",$P($G(^XMB(3.9,XMZ,2,0)),U,4))
 | 
|---|
| 24 |  K XMNVFROM,XMINSTR,XMREMID,XMRXMZ,XMZ,XMZIENS,XMZFDA
 | 
|---|
| 25 |  Q
 | 
|---|
| 26 | GETDATA ;
 | 
|---|
| 27 |  N XMH
 | 
|---|
| 28 |  S XMSG="354 Enter data" X XMSEN Q:ER
 | 
|---|
| 29 |  S XMLIN=.001,XMINCR=.001,XMH=""
 | 
|---|
| 30 |  F  X XMREC Q:ER  Q:XMRG="."  D
 | 
|---|
| 31 |  . I $E(XMRG)="." S XMRG=$E(XMRG,2,999)
 | 
|---|
| 32 |  . S XMLIN=XMLIN+XMINCR
 | 
|---|
| 33 |  . S ^XMB(3.9,XMZ,2,XMLIN,0)=XMRG
 | 
|---|
| 34 |  . Q:XMINCR=1
 | 
|---|
| 35 |  . I XMRG="" S XMINCR=1,XMLIN=0 Q
 | 
|---|
| 36 |  . I XMLIN=.99 S XMINCR=.000001
 | 
|---|
| 37 |  . I $E(XMRG,1)=" "!($E(XMRG,1)=$C(9)) Q:XMH=""  D NEXT(XMH,.XMHDR,XMRG) Q
 | 
|---|
| 38 |  . ;I $E(XMRG,1)=" " Q:XMH=""  D NEXT(XMH,.XMHDR,XMRG)
 | 
|---|
| 39 |  . S XMH=$$UP^XLFSTR($P(XMRG,":"))
 | 
|---|
| 40 |  . I "^DATE^FROM^IMPORTANCE^IN-REPLY-TO^MESSAGE-ID^SUBJECT^"[(U_XMH_U) S XMH=$E($TR(XMH,"-"),1,4),XMHDR(XMH)=$$SCRUB($P(XMRG,":",2,99)) Q
 | 
|---|
| 41 |  . I "^ENCRYPTED^EXPIRY-DATE^REFERENCES^REPLY-TO^RETURN-RECEIPT-TO^SENDER^SENSITIVITY^"[(U_XMH_U) S XMH=$E($TR(XMH,"-"),1,4),XMHDR(XMH)=$$SCRUB($P(XMRG,":",2,99)) Q
 | 
|---|
| 42 |  . I "^X-PRIORITY^"[(U_XMH_U) S XMH=$E($P(XMH,"-",2),1,4),XMHDR(XMH)=$$SCRUB($P(XMRG,":",2,99)) Q
 | 
|---|
| 43 |  . I "^X-MM-BASKET^X-MM-CLOSED^X-MM-INFO-ONLY^X-MM-TYPE^"[(U_XMH_U) S XMH=$E($P(XMH,"-",3),1,4),XMHDR(XMH)=$$SCRUB($P(XMRG,":",2,99)) Q
 | 
|---|
| 44 |  . S XMH=""
 | 
|---|
| 45 |  Q:ER
 | 
|---|
| 46 |  Q
 | 
|---|
| 47 | NEXT(XMH,XMHDR,XMDATA) ;
 | 
|---|
| 48 |  N I
 | 
|---|
| 49 |  S XMDATA=$$SCRUB(XMDATA) Q:XMDATA=""
 | 
|---|
| 50 |  I XMHDR(XMH)="" S XMHDR(XMH)=XMDATA Q
 | 
|---|
| 51 |  I $L(XMHDR(XMH))+$L(XMDATA)<255 S XMHDR(XMH)=XMHDR(XMH)_" "_XMDATA Q
 | 
|---|
| 52 |  S I=$O(^XMHDR(XMH,":"),-1)+1
 | 
|---|
| 53 |  I $G(XMHDR(XMH,I))'="",$L(XMHDR(XMH,I))+$L(XMDATA)<255 S XMHDR(XMH,I)=$G(XMHDR(XMH,I))_" "_XMDATA Q
 | 
|---|
| 54 |  S XMHDR(XMH,I+1)=XMDATA
 | 
|---|
| 55 |  Q
 | 
|---|
| 56 | HDRPROC ; Process header commands
 | 
|---|
| 57 |  N XMH,XMP,XMRINFO
 | 
|---|
| 58 |  I XMLIN,$O(^XMB(3.9,XMZ,2,XMLIN)) D  Q
 | 
|---|
| 59 |  . S XMREJECT=1
 | 
|---|
| 60 |  . S XMSG="500 Synchronization Lost.  Msg rejected." X XMSEN
 | 
|---|
| 61 |  . D KILLIT^XMR3A
 | 
|---|
| 62 |  ;I '$D(XMHDR("FROM")) D  Q
 | 
|---|
| 63 |  ;. S XMREJECT=1
 | 
|---|
| 64 |  ;. S XMSG="501 Missing FROM Header.  Msg rejected." X XMSEN
 | 
|---|
| 65 |  ;. D KILLIT^XMR3A
 | 
|---|
| 66 |  I $$TOOLONG D  Q
 | 
|---|
| 67 |  . S XMREJECT=1
 | 
|---|
| 68 |  . S XMSG="551 Too many lines.  Msg rejected." X XMSEN
 | 
|---|
| 69 |  . D KILLIT^XMR3A
 | 
|---|
| 70 |  I '$D(XMREMID) S XMREMID=""
 | 
|---|
| 71 |  S (XMH,XMZO,XMFROM,XMENCR,XMSENDER,XMDATE,XMSUBJ)=""
 | 
|---|
| 72 |  F  S XMH=$O(XMHDR(XMH)) Q:XMH=""  D
 | 
|---|
| 73 |  . S XMP=XMHDR(XMH)
 | 
|---|
| 74 |  . D @XMH
 | 
|---|
| 75 |  I '$O(^XMB(3.9,XMZ,2,.999999)),'$D(XMZFDA(3.9,XMZIENS,.01)) D  Q
 | 
|---|
| 76 |  . S XMSG="552 No subject or text.  Msg rejected." X XMSEN
 | 
|---|
| 77 |  . D KILLIT^XMR3A
 | 
|---|
| 78 |  . S XMREJECT=1
 | 
|---|
| 79 |  I $G(XMRINFO) D  Q
 | 
|---|
| 80 |  . S XMSG="555 Reply to 'Info Only'.  Msg rejected." X XMSEN
 | 
|---|
| 81 |  . D KILLIT^XMR3A
 | 
|---|
| 82 |  . S XMREJECT=1
 | 
|---|
| 83 |  ;I $G(XMZFDA(3.9,XMZIENS,9))="" D  Q
 | 
|---|
| 84 |  ;. S XMSG="501 No MESSAGE-ID.  Msg rejected." X XMSEN
 | 
|---|
| 85 |  ;. D KILLIT^XMR3A
 | 
|---|
| 86 |  ;. S XMREJECT=1
 | 
|---|
| 87 |  ;I '$O(^XMB(3.9,XMZ,2,.999999)) S ^XMB(3.9,XMZ,2,1,0)=" "
 | 
|---|
| 88 |  S ^XMB(3.9,XMZ,2,0)="^^"_XMLIN_U_XMLIN
 | 
|---|
| 89 |  Q
 | 
|---|
| 90 | TOOLONG() ;
 | 
|---|
| 91 |  N XMLIMIT
 | 
|---|
| 92 |  S XMLIMIT=$P($G(^XMB(1,1,"NETWORK-LIMIT")),U,2)
 | 
|---|
| 93 |  Q:'XMLIMIT 0
 | 
|---|
| 94 |  Q:$G(XM2LONG) 1
 | 
|---|
| 95 |  Q:XMLIN'>XMLIMIT 0
 | 
|---|
| 96 |  I $G(XMHDR("TYPE"))["X"!($G(XMHDR("TYPE"))["K") Q 0
 | 
|---|
| 97 |  Q 1
 | 
|---|
| 98 | SCRUB(X) ; Strip ctrl chars and leading/trailing blanks
 | 
|---|
| 99 |  S:X?.E1C.E X=$$CTRL^XMXUTIL1(X)
 | 
|---|
| 100 |  S:$E(X,1)=" "!($E(X,$L(X))=" ") X=$$STRIP^XMXUTIL1(X)
 | 
|---|
| 101 |  Q X
 | 
|---|
| 102 | BASK ; "X-MM-BASKET:" (Delivery Basket)
 | 
|---|
| 103 |  S:$D(XMZIENS) XMZFDA(3.9,XMZIENS,21)=XMP
 | 
|---|
| 104 |  Q
 | 
|---|
| 105 | CLOS ; "X-MM-CLOSED:YES"
 | 
|---|
| 106 |  S:$D(XMZIENS) XMZFDA(3.9,XMZIENS,1.95)="y"
 | 
|---|
| 107 |  Q
 | 
|---|
| 108 | DATE ; "DATE:"
 | 
|---|
| 109 |  S XMDATE=XMP
 | 
|---|
| 110 |  S:$D(XMZIENS) XMZFDA(3.9,XMZIENS,1.4)=XMDATE
 | 
|---|
| 111 |  Q
 | 
|---|
| 112 | ENCR ; "ENCRYPT:"
 | 
|---|
| 113 |  S XMENCR=XMP
 | 
|---|
| 114 |  Q:'$D(XMZIENS)
 | 
|---|
| 115 |  S XMZFDA(3.9,XMZIENS,1.8)=$P(XMENCR,U,1)        ; scramble hint
 | 
|---|
| 116 |  S XMZFDA(3.9,XMZIENS,1.85)=$P(XMENCR,U,2,999)   ; scramble key
 | 
|---|
| 117 |  Q
 | 
|---|
| 118 | EXPI ; "EXPIRY-DATE:" (vaporize date)
 | 
|---|
| 119 |  N XMVAPOR
 | 
|---|
| 120 |  S XMVAPOR=$$CONVERT^XMXUTIL1(XMP,1) Q:XMVAPOR=-1
 | 
|---|
| 121 |  S:$D(XMZIENS) XMZFDA(3.9,XMZIENS,1.6)=XMVAPOR
 | 
|---|
| 122 |  Q
 | 
|---|
| 123 | FROM ; "FROM:"
 | 
|---|
| 124 |  S XMFROM=XMP
 | 
|---|
| 125 |  Q:'$D(XMZIENS)
 | 
|---|
| 126 |  ;I $D(XMHDR("FROM",1)) D CONTINU(.XMFROM,"FROM",.XMHDR)
 | 
|---|
| 127 |  S XMZFDA(3.9,XMZIENS,1)=XMFROM
 | 
|---|
| 128 |  Q
 | 
|---|
| 129 | CONTINU(XMVBL,XMH,XMHDR) ;
 | 
|---|
| 130 |  N I
 | 
|---|
| 131 |  S I=0
 | 
|---|
| 132 |  F  S I=$O(XMHDR(XMH,I)) Q:'I  S XMVBL=XMVBL_" "_XMHDR(XMH,I)
 | 
|---|
| 133 |  Q
 | 
|---|
| 134 | IMPO ; "IMPORTANCE:HIGH" (Priority)
 | 
|---|
| 135 |  I $$UP^XLFSTR(XMP)'="HIGH"!'$D(XMZIENS) Q
 | 
|---|
| 136 |  S:$G(XMZFDA(3.9,XMZIENS,1.7))'["P" XMZFDA(3.9,XMZIENS,1.7)=$G(XMZFDA(3.9,XMZIENS,1.7))_"P"
 | 
|---|
| 137 |  Q
 | 
|---|
| 138 | INFO ; "X-MM-INFO-ONLY:YES"
 | 
|---|
| 139 |  S:$D(XMZIENS) XMZFDA(3.9,XMZIENS,1.97)="y"
 | 
|---|
| 140 |  Q
 | 
|---|
| 141 | REFE ; "REFERENCES:" (used by some systems, instead of 'in-reply-to')
 | 
|---|
| 142 |  Q
 | 
|---|
| 143 | INRE ; "IN-REPLY-TO:" message at this site
 | 
|---|
| 144 |  N I,XMLOCID,XMREC
 | 
|---|
| 145 |  S XMLOCID=$$REMID(XMP)
 | 
|---|
| 146 |  S XMZO=$$LOCALXMZ^XMR3A(XMLOCID)
 | 
|---|
| 147 |  Q:'XMZO
 | 
|---|
| 148 |  I $P(XMZO,U,3)'="E" S XMZO="" Q
 | 
|---|
| 149 |  S XMZO=+XMZO
 | 
|---|
| 150 |  S XMREC=$G(^XMB(3.9,XMZO,0))
 | 
|---|
| 151 |  I $P(XMREC,U,8) D  ; If reply to a reply, get original msg #
 | 
|---|
| 152 |  . S XMZO=$P(XMREC,U,8)
 | 
|---|
| 153 |  . S XMREC=$G(^XMB(3.9,XMZO,0))
 | 
|---|
| 154 |  I XMREC="" S XMZO="" Q  ; Original message not found, so make this reply a message.
 | 
|---|
| 155 |  I "^y^Y^"[(U_$P(XMREC,U,12)_U) S XMRINFO=1 Q  ; Reply to 'info only' msg
 | 
|---|
| 156 |  S:$D(XMZIENS) XMZFDA(3.9,XMZIENS,1.35)=XMZO  ; Point from response to original msg
 | 
|---|
| 157 |  Q
 | 
|---|
| 158 | REMID(X) ;
 | 
|---|
| 159 |  Q:X["<" $TR($P(X,">",1),"<")
 | 
|---|
| 160 |  ; I've seen some like this: "<<...>>"
 | 
|---|
| 161 |  ; I've seen some like this: "<...>; comment here"
 | 
|---|
| 162 |  Q X
 | 
|---|
| 163 | MESS ; "MESSAGE-ID:" at site where message originated
 | 
|---|
| 164 |  S XMREMID=$$REMID(XMP)
 | 
|---|
| 165 |  S:$D(XMZIENS) XMZFDA(3.9,XMZIENS,9)=XMREMID
 | 
|---|
| 166 |  Q
 | 
|---|
| 167 | PRIO ; "X-PRIORITY:1" (Priority)
 | 
|---|
| 168 |  I $$UP^XLFSTR(XMP)'=1!'$D(XMZIENS) Q
 | 
|---|
| 169 |  S:$G(XMZFDA(3.9,XMZIENS,1.7))'["P" XMZFDA(3.9,XMZIENS,1.7)=$G(XMZFDA(3.9,XMZIENS,1.7))_"P"
 | 
|---|
| 170 |  Q
 | 
|---|
| 171 | REPL ; "REPLY-TO:"
 | 
|---|
| 172 |  S XMREPLTO=XMP
 | 
|---|
| 173 |  ;I $D(XMHDR("REPL",1)) D CONTINU(.XMREPLTO,"REPL",.XMHDR)
 | 
|---|
| 174 |  Q
 | 
|---|
| 175 | RETU ; "RETURN-RECEIPT-TO:"
 | 
|---|
| 176 |  S:$D(XMZIENS) XMZFDA(3.9,XMZIENS,1.3)="y"
 | 
|---|
| 177 |  Q
 | 
|---|
| 178 | SEND ; "SENDER:" (Surrogate)
 | 
|---|
| 179 |  S XMSENDER=XMP
 | 
|---|
| 180 |  ;I $D(XMHDR("SEND",1)) D CONTINU(.XMSENDER,"SEND",.XMHDR)
 | 
|---|
| 181 |  Q:XMSENDER=$G(XMFROM)
 | 
|---|
| 182 |  S:$D(XMZIENS) XMZFDA(3.9,XMZIENS,1.1)=XMSENDER
 | 
|---|
| 183 |  Q
 | 
|---|
| 184 | SENS ; "SENSITIVITY:PERSONAL" (Confidential)
 | 
|---|
| 185 |  Q:"^PERSONAL^PRIVATE^COMPANY-CONFIDENTIAL^"'[(U_$$UP^XLFSTR(XMP)_U)
 | 
|---|
| 186 |  S:$D(XMZIENS) XMZFDA(3.9,XMZIENS,1.96)="y"
 | 
|---|
| 187 |  Q
 | 
|---|
| 188 | SUBJ ; "SUBJECT:"
 | 
|---|
| 189 |  S XMSUBJ=XMP
 | 
|---|
| 190 |  I XMSUBJ["   " S XMSUBJ=$$MAXBLANK^XMXUTIL1(XMSUBJ)
 | 
|---|
| 191 |  I XMSUBJ["^" S XMSUBJ=$$ENCODEUP^XMXUTIL1(XMSUBJ)
 | 
|---|
| 192 |  S XMSUBJ=$E(XMSUBJ,1,65)
 | 
|---|
| 193 |  Q:XMSUBJ=""!'$D(XMZIENS)
 | 
|---|
| 194 |  I $L(XMSUBJ)<3 S XMSUBJ="..."
 | 
|---|
| 195 |  S XMZFDA(3.9,XMZIENS,.01)=XMSUBJ
 | 
|---|
| 196 |  Q
 | 
|---|
| 197 | TYPE ; "X-MM-TYPE:"
 | 
|---|
| 198 |  S:$D(XMZIENS) XMZFDA(3.9,XMZIENS,1.7)=XMP
 | 
|---|
| 199 |  Q
 | 
|---|
| 200 | SET ; Set data into message file
 | 
|---|
| 201 |  I $G(XMREMID)'="" D CHEKDUP^XMR3A Q:$G(XMREJECT)
 | 
|---|
| 202 |  I $D(XMZFDA) D
 | 
|---|
| 203 |  . I $D(XMZFDA(3.9,XMZIENS,1.1)),$L(XMZFDA(3.9,XMZIENS,1))+$L(XMZFDA(3.9,XMZIENS,1.1))>130 S XMZFDA(3.9,XMZIENS,1.1)=$E($$REMADDR^XMXADDR3(XMZFDA(3.9,XMZIENS,1.1)),1,64)
 | 
|---|
| 204 |  . I $L(XMZFDA(3.9,XMZIENS,1))>100 S XMZFDA(3.9,XMZIENS,1)="<"_$$REMADDR^XMXADDR3(XMZFDA(3.9,XMZIENS,1))_">"
 | 
|---|
| 205 |  . D FILE^DIE("","XMZFDA")
 | 
|---|
| 206 |  ;SENDER only RCPT / REMOTE sender drops thru (local>0=pointer)
 | 
|---|
| 207 |  I $G(XMZO) D  Q:$O(^TMP("XMY",$J,""))  ; I don't understand this.
 | 
|---|
| 208 |  . D DOTRAN^XMC1(42315,XMZ,XMZO) ;> Putting response |1| into message |2|
 | 
|---|
| 209 |  . D DOTRAN^XMC1(42316,XMZO)     ;> Delivering message |1|
 | 
|---|
| 210 |  . D RPOST^XMKP("NR",XMZO,XMZ)
 | 
|---|
| 211 |  D FWD^XMKP(.5,XMZ,.XMINSTR)
 | 
|---|
| 212 |  D CHECK^XMKPL
 | 
|---|
| 213 |  Q
 | 
|---|
| 214 | PARSE(XMZ,XMREMID,XMSUBJ,XMFROM,XMDATE,XMSENDER,XMENCR,XMZO) ; Get data for remotely originated message
 | 
|---|
| 215 |  ; This is used by ^XMRENT & ^XMS3
 | 
|---|
| 216 |  ; XMSUBJ   subject
 | 
|---|
| 217 |  ; XMFROM   from
 | 
|---|
| 218 |  ; XMDATE   date
 | 
|---|
| 219 |  ; XMENCR   scramble hint "^" scramble key
 | 
|---|
| 220 |  ; XMREMID  message id at site where msg originated (not necessarily at the sending site)
 | 
|---|
| 221 |  ; XMZO     original message xmz (to which this msg is a response)
 | 
|---|
| 222 |  N XMP,XMH,XMHDR,XMRINFO,XMZFDA,XMZIENS,XMFIND
 | 
|---|
| 223 |  ; Don't add anything to this list:
 | 
|---|
| 224 |  S XMFIND="^DATE^ENCRYPTED^FROM^IN-REPLY-TO^MESSAGE-ID^SENDER^SUBJECT^"
 | 
|---|
| 225 |  D HDRFIND(XMZ,XMFIND,.XMHDR)
 | 
|---|
| 226 |  S XMH=""
 | 
|---|
| 227 |  F  S XMH=$O(XMHDR(XMH)) Q:XMH=""  D
 | 
|---|
| 228 |  . S XMP=XMHDR(XMH)
 | 
|---|
| 229 |  . D @XMH
 | 
|---|
| 230 |  Q
 | 
|---|
| 231 | HDRFIND(XMZ,XMFIND,XMHDR) ;
 | 
|---|
| 232 |  N XMH,XMI,XMREC
 | 
|---|
| 233 |  I XMFIND'?1"^".E1"^" D
 | 
|---|
| 234 |  . I $E(XMFIND,1)'=U S XMFIND=U_XMFIND
 | 
|---|
| 235 |  . I $E(XMFIND,$L(XMFIND))'=U S XMFIND=XMFIND_U
 | 
|---|
| 236 |  S XMI=0
 | 
|---|
| 237 |  F  S XMI=$O(^XMB(3.9,XMZ,2,XMI)) Q:XMI'<1!'XMI  S XMREC=^(XMI,0) Q:XMREC=""  D
 | 
|---|
| 238 |  . I $E(XMREC,1)=" "!($E(XMREC,1)=$C(9)) Q:XMH=""  D NEXT(XMH,.XMHDR,XMREC) Q
 | 
|---|
| 239 |  . S XMH=$$UP^XLFSTR($P(XMREC,":"))
 | 
|---|
| 240 |  . I XMFIND'[(U_XMH_U) S XMH="" Q
 | 
|---|
| 241 |  . I "^DATE^FROM^IMPORTANCE^IN-REPLY-TO^MESSAGE-ID^SUBJECT^"[(U_XMH_U) S XMH=$E($TR(XMH,"-"),1,4),XMHDR(XMH)=$$SCRUB($P(XMREC,":",2,99)) Q
 | 
|---|
| 242 |  . I "^ENCRYPTED^EXPIRY-DATE^REFERENCES^REPLY-TO^RETURN-RECEIPT-TO^SENDER^SENSITIVITY^"[(U_XMH_U) S XMH=$E($TR(XMH,"-"),1,4),XMHDR(XMH)=$$SCRUB($P(XMREC,":",2,99)) Q
 | 
|---|
| 243 |  . I "^X-PRIORITY^"[(U_XMH_U) S XMH=$E($P(XMH,"-",2),1,4),XMHDR(XMH)=$$SCRUB($P(XMREC,":",2,99)) Q
 | 
|---|
| 244 |  . I "^X-MM-BASKET^X-MM-CLOSED^X-MM-INFO-ONLY^X-MM-TYPE^"[(U_XMH_U) S XMH=$E($P(XMH,"-",3),1,4),XMHDR(XMH)=$$SCRUB($P(XMREC,":",2,99)) Q
 | 
|---|
| 245 |  . S XMH=""
 | 
|---|
| 246 |  Q
 | 
|---|