IMD 1.16: 1/09/2008 10:43:52 84-93079-01 b100 f07901 nm4/scout synch. comm. controller computer-to-computer test prog. source 24nov82    @0{)vvЀЀsQpk)p " }fA __M@IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIICARTOSMA282112408155240821124081552 821124081552' 3F07901 VOLSCC COMPUTER TO COMPUTER TEST PROGRAM   IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII_M@qGyy GGG`HX@ b G`^Y e GQ @@p@987 85P@ G:پN 8)0. * C'xC# b# }B* @0DAJL w+™ЀЀΖQA1"   i  ž} š} @EEFF)DEۄF8 џ} ԟ} ̟} * `jUBBI,v BI, # @ G7H@pܾrCHC C GTq` Lg gEXC P+s=胾P+c fQN p $Rxnj  ޔniZ ތ⊞ } }HGž Ÿ@ALS)"$ C k20j.h( +$`%ꂜ\1 !M' y %'+os慾)sY ed|{ @8 o O m J K i gN )V% t%sLn`"E F. F„ D>) =`;nrgy w"G,{Kq1 A&}E*`(t@% ;c  765y342(.OS:: SYSG @ @G6BDāCGDĀ# BC @E OB TITL NM4/SCOUT SCC COMPUTER TO COMPUTER TEST PROGRAM 93079-10B1 TITL TITLE PAGE * * NM4/SCOUT SYNCHRONOUS COMMUNICATION  CONTROLLER * * COMPUTER TO COMPUTER INTERFACE * * TEST PROGRAM * * 84-93079-10-B1 * * * * * * * * COPYRIGHT 1981 COMPUTER AUTOMATION INC. * * * * TITL REVISION HISTORY ****************************** * * REVISION HISTORY * ****************************** * * REVISION DATE COMMENTS * -------- ---- -------- * * A0 MAY 1982 ORIGINAL RELEASE * BY ROBERT ROBINSON * *  B0 AUG 1982 UPDATED FOR SCOUT MULTI- * CHANNEL BY MARK HAYES. *  SEE 'SETRDY', 'MCSIN', * 'CLEANUP', 'MCSOUT', MCSFLG. * * B1 NOV 1982 MODIFIED FOR CARTOS SAVE * CONTEXT INSTRUCTION BY * ERIC CHRISTENSEN. SEE TBIADD * TERMINATION BLOCK. * REV: EQU 'B1' LATEST REVISION TITL LINKER INFORMATION ****************************** * * LINKER INFORMATION * ****************************** * EXTR DEBUG4 LINK TO DEBUG NAM G :0 LINK ADD. * OBJNOTE 'SCCIF.OBJ - REV. ',REV:%-8,REV:&:FF TITL EQUATES (SCC EQUATES) ****************************** * * SCC EQUATES * ****************************** * * (STANDARD) SCC I/O CTRL. BLK. * CH:OPC EQU 0 CHNL./OPCODE ME:AD1 EQU 1 FIRST I/O BUF. STARTING ADD. BT:CT1 EQU 2 BYTE COUNT FOR FIRST I/O BUF. ME:AD2 EQU 3 SECOND I/O BUF. STARTING ADD. (DATA CHAINING) BT:CT2 EQU 4 BYTE COUNT FOR SECOND I/O BUF. (DATA CHAINING) * * (INITIALIZE) SCC I/O CTRL. BLK. * TB:ADD EQU 1 TERM. BLK./INT. ADD. CH:ADD EQU 3 CHNL. ADD./SDLC FLAG (:7E) * * SCC OP CODES * OPC:NP EQU 0 NOP OPC:TX EQU 1 TX OPC:RX EQU 2 RX OPC:IZ EQU 3 INITIALIZE OPC:MK EQU 3 OP CODE MASK TITL * * SCC CHNL./OPCODE WORD BITS * DTR:TR EQU 4 BIT 4 - DATA TERMINAL READY RTS:RS EQU 5 BIT 5 - READY TO SEND SAD: EQU 6 BIT 6 - SECONDARY ADD. SELECT CHA: EQU 7 BIT 7 - CHNL. (0-A, 1-B) * * SCC I/O FUNCTION CODES * ENIN EQU 0 ENABLE INTS. (SELP INSTRS.) COBU EQU 0 CONTROLLER BUSY (SST INSTRS.) LCBA EQU 1 LOAD CTRL. BLK. ADD. (SELP INSTRS.) INTZ EQU 4 RESET/INITIATE MICRODIA. (SELP INSTRS.) MICR EQU 7 MICRODIAG. LED (SELP INSTRS.) TITL * * TERM. BLK./INT. ADD. WORDS * TB:RXS EQU 0 RX STATUS TB:RXB EQU 1 RX BYTE COUNT TB:TXS EQU 4 TX STATUS TB:TXB EQU 5 TX BYTE COUNT TB:INS EQU 8 NOP/TX STATUS TB:RXI EQU 12 RX INT. SERVICE ROUTINE ADD. TB:TXI EQU 13 TX INT. SERVICE ROUTINE ADD. TB:INI EQU 14 NOP/INITIALIZE INT. SERVICE ROUTINE ADD. * * SCC STATUS BITS * OPCO: EQU 15 BIT 15 - OPERATION COMPLETE RCIP: EQU 14 BIT 14 - RX COM. IN PROGRESS TCIP: EQU 13 BIT 13 - TX COM. IN PROGRESS TSTM: EQU 12 BIT 12 - TEST MODE/RS-449 SIGNAL * CTS:CS EQU 11 BIT 11 - CLEAR TO SEND DCD:RR EQU 10 BIT 10 - DATA CARRIER DETECT RI:IC EQU 9 BIT 9 - RING INDICATOR DSR:DM EQU 8 BIT 8 - DATA SET READY * CRCE: EQU 7 BIT 7 - CRC ERROR RXOV: EQU 6 BIT 6 - RX OVERRUN ABRT: EQU 5 BIT 5 - ABORT TXUR: EQU 4 BIT 4 - TX UNDERRUN * DMAE: EQU 3 BIT 3 - DMA ERROR IFER: EQU 2 BIT 2 - INTERFACE ERROR *RES EQU 1 BIT 1 - RESERVED RXDP: EQU 0 BIT 0 - RX DATA PRESENT TITL EQUATES (ERROR CODES) ****************************** * * ERROR CODES * ****************************** * ER003 EQU 003 MICRODIAG. FAILED. BUSY FLAG DID NOT GO FALSE. * ER004 EQU 004 SCC INT. TIMED OUT * ER005 EQU 005 MULTIPLE INTS. FOR A NOP/INITIALIZE COM. COMMENT POSSIBLE 'MODEM STATUS' INTERRUPT * ER006 EQU 006 RX STATUS WORD IN THE TBI WAS ALTERED COMMENT UPON TERM. OF A NOP/INITIALIZE COM. * ER007 EQU 007 RX BYTE COUNT WORD IN THE TBI WAS ALTERED COMMENT UPON TERM. OF A NOP/INITIALIZE COM. * ER008 EQU 008 TX STATUS WORD IN THE TBI WAS ALTERED COMMENT UPON TERM. OF A NOP/INITIALIZE COM. * ER009 EQU 009 TX BYTE COUNT WORD IN THE TBI WAS ALTERED COMMENT UPON TERM. OF A NOP/INITIALIZE COM. * ER010 EQU 010 SCC INTERRUPTED TO THE RX INT. COMMENT VECTOR IN THE TBI UPON TERM. OF A COMMENT NOP/INITIALIZE COM. * ER011 EQU 011 SCC INTERRUPTED TO THE TX INT. COMMENT VECTOR IN THE TBI UPON TERM. OF A COMMENT NOP/INITIALIZE COM. * ER012 EQU 012 MULTIPLE INTS. FOR A TX COM. TITL ER013 EQU 013 RX STATUS WORD IN THE TBI WAS ALTERED COMMENT UPON TERM. OF A TX COM. * ER014 EQU 014 RX BYTE COUNT WORD IN THE TBI WAS ALTERED COMMENT UPON TERM. OF A TX COM. * ER015 EQU 015 NOP/INITIALIZE STATUS WORD IN THE TBI WAS COMMEN T ALTERED UPON TERM. OF A TX COM. COMMENT POSSIBLE 'MODEM STATUS' INTERRUPT * ER016 EQU 016 TX BYTE COUNT IN THE TBI DOES NOT EQUAL COMMENT THE TX PRIMARY BUF. LENGTH PLUS THE COMMENT TX DATA CHAIN BUF. LENGTH IN THE CTRL. BLK. * ER017 EQU 017 SCC BUSY BIT DID NOT GO 'FALSE' AFTER COMMENT THE CONTROL BLOCK WAS SENT TO THE SCC. * ER018 EQU 018 SCC INTERRUPTED TO THE RX INT. VECTOR COMMENT IN THE TBI UPON TERM. OF A TX COM. * ER019 EQU 019 SCC INTERRUPTED TO THE NOP/INITIALIZE INT. COMMENT VECTOR IN THE TBI UPON TERM. OF A TX COMMENT COM. POSSIBLE 'MODEM STATUS' INTERRUPT * ER020 EQU 020 RX COM. IN PROGRESS BIT, TX COMMENT COM. IN PROGRESS BIT, OR RX DATA COMMENT PRESENT BIT WAS NOT RESET IN THE COMMENT NOP/INITIALIZE STATUS WORD COMMENT IN THE TBI UPON TERM. OF A COMMENT NOP/INITIALIZE COM. * ER025 EQU 025 MULTIPLE INTS. FOR A RX COM. * ER028 EQU 028 NOP/INITIALIZE STATUS WORD IN THE TBI WAS ALTERED COMMENT UPON TERM. OF A RX OR A TX COM. POSSIBLE COMMENT 'MODEM STATUS' INTERRUPT TITL ER030 EQU 030 SCC INTERRUPTED TO THE NOP/INITIALIZE INT. COMMENT VECTOR IN THE TBI UPON TERM. OF A COMMENT RX COM. POSSIBLE 'MODEM STATUS' INTERRUPT * ER031 EQU 031 RX COM. IN PROGRESS BIT OR COMMENT RX DATA PRESENT BIT WAS NOT RESET IN COMMENT THE TX STATUS WORD UPON TERM. COMMENT OF A TX COM. * ER033 EQU 033 TX IN PROGRESS BIT OR RX DATA PRESENT BIT COMMENT IN THE RX STATUS WORD WAS NOT RESET UPON COMMENT TERM. OF A RX COMMAND * ER034 EQU 034 RX BYTE COUNT IN THE TBI DOES NOT COMMENT EQUAL THE RX PRIMARY BUF. LENGTH PLUS COMMENT THE RX DATA CHAIN BUF. LENGTH IN THE COMMENT CTRL. BLK. * ER038 EQU 038 RX IN PROGRESS BIT WAS NOT SET IN THE RX COMMENT STATUS WORD UPON TERM. OF COMMENT A RX COMMAND * ER039 EQU 039 TX IN PROGRESS BIT WAS NOT SET IN COMMENT THE TX STATUS WORD UPON TERM. COMMENT OF A TX COM. * ER050 EQU 050 CURRENT COM. DID NOT COMPLETE. THE COMMENT 'OPERATION COMPLETE' BIT OF THE STATUS COMMENT WORD IS RESET. * ER051 EQU 051 INTERFACE ERROR. AN ABNORMAL CONDITION HAS COMMENT OCCURRED ON THE MODEM SIGNALS. TITL ER052 EQU 052 DMA ERROR. A DIRECT MEMORY ACCESS ERROR HAS COMMENT OCCURRED DURING THE TRANSFER OF DATA FROM/TO COMMENT USER MEMORY. * ER053 EQU 053 TX UNDERRUN. THIS ERROR INDICATES THAT COMMENT A TX UNDERRUN ERROR CONDITION HAS OCCURRED COMMENT DURING A TX OPERATION. * ER054 EQU 054 ABORT. THIS ERROR INDICATES THAT AN ABORT COMMENT SEQUENCE (7 OR MORE 1'S) WAS DETECTED COMMENT DURING PROCESS OF AN INCOMING MESSAGE. * ER055 EQU 055 RX OVERRUN. THIS ERROR INDICATES THAT A COMMENT RX OVERRUN CONDITION HAS OCCURRED COMMENT WITHIN THE SCC. * ER056 EQU 056 CRC ERROR. THIS ERROR INDICATES AN ERROR COMMENT WAS DETECTED AS THE RESULT OF COMPARING THE COMMENT CRC CHECKER TO THE APPROPRIATE CHECK VALUE. TITL EQUATES (PROGRAM EQUATES) ******************************* * * PROGRAM EQUATES * ******************************* * * I/O DEVICE ADDS. * CONSL EQU :00 CONSOLE DEVICE ADD. STDDA EQU :02 SCC STANDARD DEVICE ADD. DTTYDA EQU :7C CRT/TTY DEVICE ADD. (DIO) MCSDA EQU :40 MULTI-CHANNEL DEVICE ADDRESS * * CONSOLE FUNCTION CODES * SENSE EQU :00 CONSOLE SENSE SWITCH FUNCTION CODE INT EQU :01 CONSOLE INT. LIGHT FUNCTION CODE * * ASCII CTRL. CHARS. * CLRSCR EQU :0C ASCII CTRL. CHAR. TO CLEAR SCREEN (TOF) CR: EQU :0D ASCII CR LF: EQU :0A ASC II LF CRLF: EQU :0D0A ASCII CR/LF BCKAR: EQU :5F ASCII BACK ARROW UPAR: EQU :5E ASCII UP ARROW SPACE: EQU :20 ASCII SPACE TITL * * PSW BIT EQUATES * CY: EQU 0 CARRY BIT OV: EQU 1 OVERFLOW BIT BY: EQU 2 BYTE MODE BIT CI: EQU 4 CONSOLE INT. ENABLE BIT RC: EQU 5 REAL-TIME-CLOCK INT. ENABLE BIT XA: EQU 6 EXTENED ADD.ING BIT GI: EQU 8 GLOBAL INT. ENABLE BIT EI: EQU 12 EOB INTS. BIT DI: EQU 13 DATA INTS. BIT TITL STANDARD TRAP ADDS./DIO INT. LOCATIONS **************************************** * * STANDARD TRAPS/EXCEPTION ADDS. * * DIO INT. LOCATIONS * **************************************** * OPTIONS +:20 * ABS 0 DEBUG JUMP DEBUGS JST *$+1 JUMP TO DEBUG WORD DEBUG4 DEBUG ADD. * ABS :80 POWER UP JST *$+1 JUMP TO POWER UP ROUTINE WORD POWRUP ADD. OF ROUTINE * ABS :84 TRAP ADD. :0084 RES 2,0 UNIMPLEMENTED INSTRUCTION TRAP JST *$+1 JUMP TO SERVICE ROUTINE WORD UITRT ADD. OF ROUTINE * RES 2,0 UNINSTALLED MEMORY TRAP JST *$+1 JUMP TO SERVICE ROUTINE WORD UMRT ADD. OF ROUTINE * RES 2,0 POWER FAIL JST *$+1 JUMP TO SERVICE ROUTINE WORD PFRT ADD. OF ROUTINE * ABS :94 CONSOLE INT. JST *$+1 CONSOLE INT. LOCATION WORD CIRT ADD. OF SERVICE ROUTINE * ABS :98 TRAP ADD. :0098 RES 2,0 CHAR/NUM. EXCEPTION JST *$+1 JUMP TO SERVICE ROUTINE WORD CNERT ADD. OF ROUTINE * RES 2,0 STACK OVERFLOW JST *$+1 JUMP TO SERVICE ROUTINE WORD SORT ADD. OF ROUTINE * RES 2,0 USER TRAP JST *$+1 JUMP TO SERVICE ROUTINE WORD UTRT ADD. OF ROUTINE * RES 2,0 SYSTEM TRAP JST *$+1 JUMP TO SERVICE ROUTINE WORD STRT ADD. OF ROUTINE * RES 2,0 ARITHMETIC ERROR JST *$+1 JUMP TO SERVICE ROUTINE WORD AERT ADD. OF ROUTINE TITL PROGRAM STARTUP *************************************** * * PROGRAM STARTUP * * :200 - DEFSTR (DEFAULT MODE START) * * RESET STATUS REG. *  RESET SENSE SWITCH * RESET CONSOLE INT. * *************************************** * ABS :200 PROGRAM START (DEFAULT) G:0 EQU $ DEBUG LINK STRTUP IN DTTYDA%1;1,A GET SPI BOARD STATUS IF THERE IS ONE JNE A,STRTUP2 JUMP IF THERE IS A SPI BOARD THERE COPY =1,A 1 MEANS MULTI-CHANNEL BOARD COPY A,MCSFLG SET MULTI-CHANNEL FLAG JST SETRDY SET UP THE MULTI-CHANNEL STRTUP2 COPY =0,A RESET STATUS REG. COPY A,S PUT INTO STATUS REG. OUT A,CONSL;SENSE RESET SENSE SWITCH (LIGHT) OUT A,CONSL;INT RESET CONSOLE INT. COPY =EOM:,A SET TRAP ADDRESS COPY A,:8B SBIT XA:,S EXTENDED ADDRESSING COPY =:3FF,X SET INITIAL ADDRESS JMP $+2 * EOM: ENT TRAP ADDRESS SUB =:400,X GENERATE NEW TEST ADDRESS COPY =:55,A SET TEST PATTERN EXCH 0(X),A STORE IN MEM. EXCH 0(X),A DITTO SUB =:55,A SAME PATTERN JNE A,EOM:+1 NO, TRY NEW ADDRESS EXCH 0(X),A TRY A ZERO EXCH 0(X),A DITTO JNE A,EOM:+1 COPY X,ENDMEM STORE ENDING ADDRESS COPY =UMRT,A RESTORE ADDRESS COPY A,:8B JST MSGA OUTPUT TITL OF DIAG. WORD TITLE MESSAGE ADD. COPY ENDMEM,A GET ENDING ADDRESS JST OHEX DISPLAY IT JST CRLF DO IT TITL QUERIES - DEFAULT MODE (DEVICE ADD.) ****************************** * * DEVICE ADD. * * QUERY: * * DEVICE ADDRESS (:02)?: * * SELECTION: * * :01 - :1F * DEFAULT IS ':02' * ****************************** * QERY10 EQU $ COPY =0,Q RESET MESSAGE NUMBER COPY Q,MESSN COPY =STDDA,A SET DEFAULT DEVICE ADDRESS COPY A,DEVAX COPY LOOPX,A GET LOOP COUNT COPY A,LOOP JST MSGA OUTPUT QERY WORD QRYM10 'DEVI CE ADDRESS (:02)?:' JST IHEX GET RESPONSE JEQ X,QERY12 IF ZERO, SEE WHY COPY X,DEVAX STORE DEVICE ADD. SHIFT X,RO,5 CHECK FOR GREATER THAN :1F JNE X,QERY10 IF GREATER, ERROR QERY11 JST CHARCK CHECK FOR SPECIAL CHARS. JMP QERY10 UP ARROW JMP QERY10 BACK ARROW JMP QERY20 CR JMP TSTL10 '#' JMP QERY10 ANYTHING ELSE QERY12 COPY HXTMP2,X GET INPUT COUNT JEQ X,QERY11 IF ZERO, CHECK TERMINATOR JMP QERY10 GO TRY AGAIN * LPOOL TITL QUERIES (CHANNEL) ****************************** * * CHANNEL * * QUERY: * * CHNL (A)? * * SELECTION: * * A OR B * * DEFAULT IS 'A' * ***************************** * QERY20 EQU $ COPY =0,A RESET LOOP COUNT COPY A,LOOPX COPY =-PRSIZE,A SET DEFAULT VALUES JST MOVE WORD PRAMSX WORD PRAMS JST MSGA OUTPUT QUERY  WORD QRYM20 'CHNL (A)?' JST IKB GET RESPONSE QERY21 JST CHARCK CHECK TERMINATION JMP QERY10 JMP QERY20 JMP QERY30 JMP TSTL10 SUB ='A',A GENERATE CHANNEL BIT JLT A,QERY20 CSK A,=2 JMP $+3 IF D-Z, WRONG NOP JMP QERY20 SHIFT A,LO,CHA: COPY A,CHAN: JST IKB GET TERMINATION JMP QERY21 * LPOOL TITL QUERIES (TX OR RX) ****************************** * * TX OR RX * * QUERY: * * TX (T) OR RX (R)? * * SELECTION * * T - TRANSMIT * R - RECEIVE * DEFAULT IS 'R' * ****************************** * QERY30 EQU $ COPY =0,A RESET TO RECEIVE COPY A,DGFLG JST MSGA OUTPUT QUERY WORD QRYM30 'TX (T) OR RX (R)? JST IKB GET RESPONSE QERY31 JST CHARCK CHECK TERM. JMP QERY20 JMP QERY30 JMP QERY40 JMP TSTL10 CLSN A,='R' JMP QERY32 CLSN A,='T' JMP $+2 JMP QERY30 IMS DGFLG QERY32 JST IKB GET TERM. JMP QERY31 * LPOOL TITL QUERIES (RTS/RS) ****************************** * * RTS/RS * * QUERY: * * RTS/RS (0)? * * SELECTION: * * 0 - ON * 1 - OFF * DEFAULT IS '0' * ****************************** * QERY40 EQU $ COPY =0,A COPY A,BITS RESET BIT SETTING JST MSGA OUTPUT QUERY WORD QRYM40 'RTS/RS (0)?' JST IHEX INPUT RESPONSE COPY X,Q CSK Q,=2 DO RANGE CHECK JMP $+3 GOOD NOP JMP QERY40 SHIFT Q,LO,RTS:RS OR BITS,Q OR BIT SETTINGS COPY Q,BITS JST CHARCK JMP QERY30 JMP QERY40 JMP QERY50 JMP TSTL10 JMP QERY40 * LPOOL TITL QUERIES (SECONDARY ADDRESS BIT) ****************************** * * SECONDARY ADDRESS BIT * * QUERY: * * SEC. ADD. BIT (0)? * * SELECTION: * * 0 - MATCH ON SEC. CHNL. ADD. * 1 - ALL ADDS. * DEFAULT IS '0' * ****************************** * QERY50 EQU $ COPY BITS,A GET BIT SETTING RBIT SAD:,A 'ON' COPY A,BITS JST MSGA OUTPUT QUERY WORD QRYM50 'SEC. ADD. BIT (0)?' JST IHEX INPUT RESPONSE COPY X,Q CSK Q,=2 DO RANGE CHECK JMP $+3 NOP JMP QERY50 BAD SHIFT Q,LO,SAD: SHIFT INTO PLACE OR BITS,Q COPY Q,BITS STORE NEW SETTINGS JST CHARCK JMP QERY40 JMP QERY50 JMP QERY60 JMP TSTL10 JMP QERY50 * LPOOL TITL QUERIES (CHANNEL ADDRESS) ****************************** * * CHANNEL ADDRESS IF = :FF SWITCH CHANNEL ADDRESS * * QUERY: QUERY: * * CHNL. ADD. (:F8)? : SWITCH CHNL. ADD.? : * * SELECTION: SELECTION: * * :00 TO :FF  :00 TO :FF * DEFAULT IS ':F8' NO DEFAULT * ****************************** * QERY60 EQU $ COPY CHADDX,A GET DEFAULT ADDRESS COPY A,INCHAD COPY A,CHADD JST MSGA WORD QRYM60 JST IHEX INPUT RESPONSE JEQ X,QERY62 CSK X ,=:FF DO RANGE CHECK JMP $+3 OK JMP QERY60 BAD JMP QERY63 GET SWITCH ADD. COPY X,INCHAD COPY X,CHADD STORE ADD. QERY61 JST CHARCK JMP QERY50 JMP QERY60 JMP QERY70 JMP TSTL10 JMP QERY60 QERY62 COPY HXTMP2,X GET INPUT COUNT JEQ X,QERY61 IF ZERO, OK JMP QERY61-2 QERY63 COPY X,INCHAD STORE INZ. CHNL. ADD. JST MSGA OUTPUT QUERY WORD QRYM61 'SWITCH CHNL. ADD.? :' JST IHEX GET RESPONSE JEQ X,QERY65 CSK X,=:FF DO RANGE CHECK JMP $+2 OK JMP QERY63+1 BAD COPY X,CHADD QERY64 JST CHARCK JMP QERY60  JMP QERY63+1 JMP QERY70 JMP TSTL10 JMP QERY63+1 QERY65 COPY HXTMP2,X GET INPUT COUNT JEQ X,QERY63+1 JMP QERY64-1 * LPOOL  TITL QUERYIES (PRIMARY BUFFER ADDRESS) ******************************* * * PRIMARY BUFFER ADDRESS * * QUERY: * * BUFF. ADD. (:1800)? : * * SELECTION: * * :1800 TO (END-OF-MEMORY)-1 * DEFAULT IS :1800 * ******************************** * QERY70 EQU $ COPY PRIADDX,A GET DEFAULT VALUE COPY A,PRIADD JST MSGA OUTPUT QUERY WORD QRYM70 'BUFF. ADD. (:1800)? :' JST IHEX INPUT RESPONSE JEQ X,QERY72 COPY X,PRIADD COPY PRIADDX,Y COPY ENDMEM,Q CSM X,Q CSM X,Y JMP QERY70 NOP QERY71 JST CHARCK JMP QERY60 JMP QERY70 JMP QERY80 JMP TSTL10 JMP QERY70 QERY72 COPY HXTMP2,X GET INPUT COUNT JEQ X,QERY71 JMP QERY70 * LPOOL TITL QUERIES (PRIMARY BUFFER LENGTH) ******************************* * * PRIMARY BUFFER LENGTH * * QUERY: * * BUFF. LENGTH (:100)? : * * SELECTION: * * 1 TO ((END-OF-MEMORY)-(BUFF. ADD.))*2 * DEFAULT IS :100 * ******************************** * QERY80 EQU $ COPY SHFLGX,A GET SHIFT FLAG COPY A,SHFLG COPY LENX,A GET LENGTH DEFAULT COPY A,LEN JST MSGA OUTPUT QUERY WORD QRYM80 'BUFF. LENGTH (:100)? :' JST IHEX GET RESPONSE COPY Q,SHFLG STORE SHIFT FLAG JEQ X,QERY83 QERY81 COPY X,LEN STORE LENGTH SHIFT X,RO,1 ADD PRIADD,X DO RANGE CHECK COPY ENDMEM,Q CSM X,Q JMP $+2 JMP QERY80 QERY82 JST CHARCK JMP QERY70 JMP QERY80 JMP QERY90 JMP TSTL10 JMP QERY80 QERY83 COPY HXTMP2,X GET INPUT COUNT JNE X,QERY80 ZERO IS BAD COPY LENX,X GET DEFAULT VALUE CLSN A,=CR: JMP QERY81 JMP QERY82 * LPOOL TITL QUERIES (DATA CHAIN BUFFER ADDRESS) ****************************** * * DATA CHAIN BUFFER ADDRESS * * QUERY: * * DATA CHAIN BUFF. ADD. (:1900)? : * * SELECTION: * * (BUFF. ADD.)+(BUFF. LENGTH)/2 TO (END-OF-MEMORY) * DEFAULT IS ':1900' * ****************************** * QERY90 EQU $ COPY DCHADDX,A COPY A,DCHADD JST MSGA OUTPUT QUERY WORD QRYM90 'DATA CHAIN BUFF. ADD. (:1900)? :' JST IHEX GET RESPONSE JEQ X,QERY93 QERY91 COPY X,DCHADD COPY ENDMEM,Y DO RANGE CHECK COPY LEN,Q SHIFT Q,RO,1 ADD PRIADD,Q CSM X,Y CSM X,Q JMP QERY90 NOP QERY92 JST CHARCK JMP QERY80 JMP QERY90 JMP QERYA0 JMP TSTL10 JMP QERY90 QERY93 COPY HXTMP2,X GET INPUT COUNT JNE X,$+5 COPY DCHADDX,X GET DEFAULT VALUE CLSN A,=CR: JMP QERY91 JMP QERY92 COPY =0,X NO DATA CHAIN COPY X,DCHADD JMP QERY92 * LPOOL TITL QUERIES (DATA CHAIN BUFFER LENGTH) ****************************** * * DATA CHAIN BUFFER LENGTH * * QUERY: * * DATA CHAIN BUFF. LENGTH (:100)? : * * SELECTION: * * 1 TO ((END-OF-MEMORY)-(DATA CHAIN BUFF. ADD.))*2 * DEFAULT IS ':100' * ******************************* * QERYA0 EQU $ COPY DCHADD,A GET ADD. JNE A,$+3 IF NOT ZERO, DATA CHAIN COPY A,DCLEN JMP QERYB0 GO ON COPY DCLEN X,A GET DEFAULT VALUE COPY A,DCLEN JST MSGA OUTPUT QUERY WORD QRYMA0 'DATA CHAIN BUFF. LENGTH (:100)? :' JST IHEX GET RESPONSE JEQ X,QERYA3 QERYA1 COPY X,DCLEN STORE VALUE COPY ENDMEM,Q SHIFT X,RO,1 ADD DCHADD,X CSM X,Q JMP $+2 JMP QERYA0 QERYA2 JST CHARCK JMP QERY90 JMP QERYA0 JMP QERYB0 JMP TSTL10 JMP QERYA0 QERYA3 COPY HXTMP2,X GET INPUT COUNT JNE X,QERYA0 ZERO IS BAD COPY DCLENX,X GET DEFAULT VALUE CLSN A,=CR: JMP QERYA1 JMP QERYA2 * LPOOL TITL QUERIES (PATTERN) ****************************** * * PATTERN * * QUERY: * * PAT (:5A)? : * * SELECTION: * * :00 TO :FF * DEFAULT IS ':5A' * ******************************* * QERYB0 EQU $ COPY PATINCX,A GET INC. FLAG COPY A,PATINC COPY PATX,A GET DEFAULT PAT. COPY A,PAT JST MSGA OUTPUT QUERY WORD QRYMB0 'PAT (:5A)? :' JST IHEX GET RESPONSE JEQ X,QERYB2 COPY Q,PATINC STORE INC. FLAG QERYB00 COPY X,PAT CSK X,=:FF DO RANGE CHECK JMP $+2 OK JMP QERYB0 BAD QERYB01 JST CHARCK JMP QERYB1 JMP QERYB0 JMP QERYC0 JMP TSTL10 JMP QERYB0 QERYB1 COPY DCHADD,Q GET ADD. JNE Q,$+2 IF NOT ZERO, GO BACK JMP QERY90 GO BACK TWO JMP QERYA0 QERYB2 COPY HXTMP2,X JEQ X,QERYB01 COPY =0,X JMP QERYB00 * LPOOL TITL QUERIES (LOOP COUNT) ****************************** * * LOOP COUNT * * QUERY: * * LOOP COUNT (0)? * * SELECTION: * * 0 TO 32768 * DEFAULT IS 0 * ****************************** * QERYC0 EQU $ JST MSGA OUTPUT QUERY WORD QRYMC0 'LOOP COUNT (0)?' JST IDEC GET RESPONSE COPY X,LOOP STORE RESULT COPY X,LOOPX ALSO AS DEFAULT JST CHARCK JMP QERYB0 JMP QERYC0 JMP QERYD0 JMP TSTL10 JMP QERYC0 * LPOOL TITL QUERIES (TIME OUT COUNT) ******************************* * * TIME OUT COUNT * * QUERY: * * TIME OUT COUNT (2)? * * SELECTION: * * 1 TO 32768 * DEFAULT IS '2' * ******************************** * QERYD0 EQU $ COPY SECSX,A GET DEFAULT VALUE COPY A,SECS JST MSGA OUTPUT QUERY WORD QRYMD0 'TIME OUT COUNT (2)?' JST IDEC GET RESPONSE JEQ X,QERYD2 COPY X,SECS QERYD1 JST CHARCK JMP QERYC0 JMP QERYD0 JMP TSTL10 JMP TSTL10 JMP QERYD0 QERYD2 COPY IDCTM3,X GET INPUT COUNT JEQ X,QERYD1 JMP QERYD0 * LPOOL TITL TEST CTRL. (DEVICE ADD. MODIFICATION) ****************************** * * TEST CTRL. - DEVICE ADD. MODIFICATION * * THIS SECTION WILL SET THE STARTING DEVICE * ADD. THE SCC I/O * INSTRUCTIONS ARE MODIFIED WITH THE NEW *  DEVICE ADD. AND CONSOLE INT. ENABLED. * ****************************** * TSTL10 JST CRLF DO IT COPY DEVA,A GET THE CURRENT DEVICE ADD. SHIFT A,LO,3 SHIFT FOR INSERTION COPY A,TEMP1 SAVE SHIFTED CURRENT DEVICE ADD. COPY =-DASIZ,A GET I/O TABLE SIZE  COPY A,TEMP2 SAVE TABLE SIZE COPY =DAFRST,A GET I/O TABLE ADD. COPY A,TEMP3 SAVE TABLE ADD. TCTL12 COPY TEMP3,X GET TABLE ADD. COPY 0(X),X GET I/O INSTRUCTION ADD. COPY =-:F9,A MASK FOR I/O INSTRUCTION & FUNCTION CODE ONLY AND 0(X),A 'AND' OUT OLD DEVICE ADD. OR TEMP1,A 'OR' IN NEW DEVICE ADD. COPY A,0(X) STORE NEW I/O INSTRUCTION IMS TEMP3 INC. TABLE ADD. IMS TEMP2 INC. TABLE COUNT JMP TCTL12 LOOP FOR MORE GOODIES!! * SBIT CI:,S ENABLE CONSOLE INT. SBIT GI:,S ENABLE INTS. JMP INITLZ * LPOOL  TITL INITIALIZE ****************************** * * INITIALIZE STEPS * ****************************** * INITLZ EQU $ COPY =1,A  SET TIME OUT FOR 1 SEC. JST TIMEST JST SEL RESET SCC JST SENBSY STILL BUSY? JMP $+5 NO JST DELAY DO DELAY JMP $-3 COPY =ER003,A MICRO. FAILED JST ERROR DISPLAY ERROR * JST INITL0 DO INITIALIZE JST DAGCHK JMP RXTST DO RX JMP TXTST DO TX * LPOOL TITL NOP ****************************** * * NOP0 - THIS SUBROUTINE WILL ISSUE A * NOP COMMAND TO THE SCC. * ****************************** * NOP0 ENT NOP IT COPY =OPC:NP,A GET NOP OPCODE COPY =CB:IZ,X GET NOP CTRL. BLK. JST CBSET BUILD CTRL. BLK. COPY NOP0,A GET RETURN ADD. COPY A,INITL0 JMP INIT:0 DO IT * LPOOL TITL INITIALIZE (SUBROUTINE INITL0) ****************************** * * INITZ - EXECUTE INITIALIZE FUNCTION * * THIS SUBROUTINE WILL CLEAR THE TERM. BLK. * AND SET UP AN 'INITIALIZE' CTRL. BLK. ACCORDING * TO CHNL., ADD. SELECT AND CHNL. ADD. * * THE SUBROUTINE WILL THEN ISSUE AN 'INITIALIZE' COM. * * THE FOLLOWING PARAMETERS/MEMORY LOCATIONS MUST BE SET * BEFORE ENTERING THIS SUBROUTINE: * * CHADD - CHNL. ADD. (CHNL. ADD. FIELD) * BITS - DTR/TR, RTS/RS AND SEC. ADD. BITS FOR CHNL./OP CODE WORD * ****************************** * INITL0 ENT EXECUTE INITIALIZE FUNCTION JST MSGA OUTPUT MESSAGE WORD INITM 'INITIALIZE' COPY =CB:IZ,X GET 'INITIALIZE' CTRL. BLK. ADD. COPY =OPC:IZ,A GET 'INITIALIZE' OP CODE JST CBSET BUILD 'INITIALIZE' CTRL. BLK. COPY =TBIADD,A GET TERM. BLK. ADD. COPY A,TB:ADD(X) STORE IN CTRL. BLK. COPY INCHAD,A GET CHNL. ADD. FIELD SHIFT A,LO,8 SHIFT INTO WORD POSITION OR SDLCF,A 'OR' IN SDLC FLAG COPY A,CH:ADD(X) STORE IN CTRL. BLK. * INIT:0 COPY X,CB1 SET CTRL. BLK. ADD. FOR 'ERROR' ROUTINE COPY X,CB:AD SET CTRL. BLK. ADD. FOR 'STATUS' ROUTINE JST CLRTBI CLEAR TBI COPY =INADD,A GET NOP/INITIALIZE INT. ADD. (NORMAL TERM.) COPY A,TB:INI(X) SET NOP/INITIALIZE INT. SERV. RT. ADD. COPY =INERX,A GET RX ERROR INT. ADD. COPY A,TB:RXI(X) SET RX INT. SERVICE ROUTINE ADD. COPY =INETX,A GET TX ERROR INT. ADD. COPY A,TB:TXI(X) SET TX INT. SERVICE ROUTINE ADD. * COPY =1,A SET TIME OUT FOR 1 SECOND JST TIMEST SET TIME COPY =CB:IZ,X GET CTRL. BLK. ADD. JST ENSCC ENABLE SCC INTS. JST OTX SEND CTRL. BLK. ADD. JST SENBSY STILL BUSY? JMP INIT:1 NO, JUMP JST DELAY INC. TIME JMP $-3 TIME NOT EXPIRED COPY =ER017,A 'BUSY BIT STILL SET' JST ERROR DISPLAY ERROR * INIT:1 JST DELAY INC. TIME JMP $-1 TIME NOT EXPIRED COPY =ER004,A 'SCC INT. TIMED OUT' JST ERROR DISPLAY ERROR INIT:2 JMP *INITL0 EXIT * LPOOL TITL INITIALIZE END-OF-BLOCK ROUTINES ****************************** * * INADD - NORMAL 'NOP/INITIALIZE' INT. SERVICE ROUTINE * * THIS IS THE EOB SERVICE ROUTINE FOR A NORMAL * TERM. OF A NOP/INITIALIZE COM. * * THIS SERVICE ROUTINE WILL CHECK FOR MULTIPLE * EOB INTS. AND STATUS ERRORS UPON * TERM. OF A NOP/INITIALIZE COM. * * ALSO THE TX AND RX STATUS IN THE TBI WILL BE * CHECK FOR ALTERATIONS AS WELL AS THE BYTE * COUNTS. * ****************************** * INADD ENT NORMAL EOB IMS IN:FLG SET NOP/INITIALIZE INT. FLAG JMP INADD1 IF NOT PREVIOUSLY SET, JUMP COPY =ER005,A 'MULTIPLE INTS. JST ERROR DISPLAY ERROR INADD1 JST STATUS CHECK STATUS JST ERROR DISPLAY ERROR REPORT JST DAGCHK TX OR RX? JMP $+2 RX JMP  INADD2 TX COPY =INADD:,A GET NEXT EOB ADD. COPY A,TBIADD+TB:INI JST MSGA OUTPUT MESSAGE WORD ENXMIT 'ENABLE TRANSMITTER' COPY =60,A GET TIME COUNT JST TIMEST JST ENSCC SBIT GI:,S JST DELAY INC. TIME JMP $-1 COPY =ER004,A TIME OUT ERROR JST ERROR * INADD: ENT ALTERNATE EOB COPY TBIADD+TB:INS,A GET STATUS AND =:FC,A ANY ERRORS? JEQ A,$+3 NO, CONT. JST STATUS CHECK STATUS JST ERROR DISPLAY ERROR * INADD2 SBIT GI:,S ENABLE INTS. COPY =TBIADD,X GET TBI ADD. COPY TB:RXS(X),A GET RX STATUS - SHOULD BE 0 JEQ A,$+3 IF ZERO, IS GOOD COPY =ER006,A 'RX TBI STATUS ALTERED' JST ERROR DISPLAY ERROR * COPY TB:RXB(X),A GET RX BYTE COUNT - SHOULD BE 0 JEQ A,$+3 IF ZERO, IS GOOD COPY =ER007,A 'RX BYTE COUNT ALTERED' JST ERROR DISPLAY ERROR * COPY TB:TXS(X),A GET TX STATUS - SHOULD BE 0 JEQ A,$+3 IF ZERO, IS GOOD COPY =ER008,A 'TX STATUS ALTERED' JST ERROR DISPLAY ERROR * COPY TB:TXB(X),A GET TX BYTE COUNT - SHOULD BE 0 JEQ A,$+3 IF ZERO, IS GOOD COPY =ER009,A 'TX TBI BYTE COUNT ALTERED' JST ERROR DISPLAY ERROR * COPY TB:INS(X),A GET NOP/INITIALIZE STATUS TBIT RCIP:,A RX COM. BIT SHOULD BE 0 JT OV,INADD3 IF SET, ERROR TBIT TCIP:,A TX COM. BIT SHOULD BE 0 JT OV,INADD3 IF SET, ERROR TBIT RXDP:,A RX DATA PRESENT BIT SHOULD BE 0 JF OV,$+3 IF RESET, JUMP INADD3 COPY =ER020,A 'RCIP, TCIP OR RXDP BIT SET' JST ERROR DISPLAY ERROR JMP INIT:2 EXIT * LPOOL TITL ****************************** * * INERX - RX ERROR 'NOP/INITIALIZE' INT. SERVICE ROUTINE * INETX - TX ERROR 'NOP/INITIALIZE' INT. SERVICE ROUTINE * * THESE ARE THE ERROR EOB SERVICE ROUTINES FOR * AN ABNORMAL TERM. OF A NOP/INITIALIZE *  COM. TO THE RX OR TX INT. VECTOR * ADD. IN THE TBI. * ****************************** * INERX ENT RX ERROR 'NOP/INITIALIZE' EOB IMS RX:SE SET RX STATUS ERROR FLAG COPY =ER010,A 'RX INT. VECTOR INSTEAD OF NOP/INZ.' JST ERROR DISPLAY ERROR * INETX ENT TX ERROR 'NOP/INITIALIZE' EOB IMS TX:SE SET TX STATUS ERROR FLAG COPY =ER011,A 'TX INT. VECTOR INSTEAD OF NOP/INZ.' JST ERROR DISPLAY ERROR * LPOOL TITL TRANSMIT ****************************** * * TXTST - THIS SUBROUTINE WILL CLEAR THE TBI OF STATUS AND * BYTE COUNTS AND SET THE INT. VECTOR FOR A * TX ONLY TEST AS WELL AS THE ERROR 'RX' * AND 'NOP/INITZ.' VECTOR INTS. * * ****************************** * TXTST EQU $ TX ONLY COPY =CB:TX,X GET CTRL. BLK. ADD. COPY =OPC:TX,A GET TX OPCODE JST CBSET BUILD CB COPY PRIADD,A GET BUFF. ADD. COPY A,ME:AD1(X) ADD =1,A INC ADD. COPY A,TXSTR COPY LEN,A GET BUFF. LENGTH COPY A,BT:CT1(X) STORE IN CTRL. BLK. COPY DCHADD,A GET DATA CHAIN ADD. JEQ A,$+4 IF ZERO, NO DATA CHAIN COPY A,ME:AD2(X) STORE IN CTR. BLK. COPY DCLEN,A GET BUFF. LENGTH COPY A,BT:CT2(X) STORE IN CTRL. BLK. * COPY PRIADD,X GET BUFF. ADD. COPY =-2,A SET LOOP COUNT TO 2 COPY A,TEMP1 COPY LEN,Y GET LENGTH TXTST0 COPY PATINC,Q GET PAT CONTROL COPY PAT,A GET PATTERN SHIFT X,LO,1 MAKE BYTE ADD. TXTST1 SBIT BY:,S SET BYTE MODE COPYB A,0(X) RBIT BY:,S ADD =1,X INC. ADD. SUB =1,Y DEC. COUNT JEQ Y,TXTST2 IF ZERO, ALL DONE JEQ Q,TXTST1 JLT Q,$+3 IF PAT CONTROL IS NEG., DECREMENT PAT. ADD =1,A IF PAT CONTROL IS POS., INCREMENT PAT. JMP TXTST1 SUB =1,A JMP TXTST1 TXTST2 COPY DCHADD,X GET DATA CHAIN ADD. JEQ X,$+4 IF ZERO, NO  DATA CHAIN COPY DCLEN,Y GET LENGTH IMS TEMP1 INC. LOOP COUNT JMP TXTST0 DO DATA CHAIN COPY CHADD,A GET CHNL. ADD. SHIFT A,LO,8 OR =:20,A 'OR' IN SPACE COPY PRIADD,X GET BUFF. ADD. COPY A,0(X) COPY =-4,A JST MOVE MOVE IN MESSAGE WORD MESS+1 TXSTR WORD 0 * JST MSGA OUTPUT MESSAGE WORD IDLE 'IDLE' JST NOP0 DO NOP TBIT DSR:DM,A DSR SET? JF OV,$-2 NO JST MSGA OUTPUT MESSAGE WORD TXM 'TRANSMIT' COPY =:4000,A DELAY A WHILE FOR RX TO COME UP SUB =1,A JNE A,$-1 * COPY =TBIADD,X GET THE TBI ADD. COPY =TRCRX1,A GET RX ERROR EOB ADD. COPY A,TB:RXI(X) SET RX INT. VECTOR ADD. COPY =TRCIN1,A GET NOP/INITZ. ERROR EOB ADD. COPY A,TB:INI(X) SET NOP/INITZ. VECTOR ADD. COPY =TRTX1,A GET TX EOB ADD. COPY A,TB:TXI(X) SET TX INT. VECTOR ADD. COPY =CB:TX,A GET TX CTRL BLK. ADD. COPY A,CB:AD STORE CTRL. BLK. ADD. FOR 'STATUS' ROUTINE COPY A,CB1 STORE CTRL. BLK. ADD. FOR 'ERROR' ROUTINE * TXTST3 COPY SECS,A GET TIME OUT COUNT JST TIMEST IMS MESSN INC. MESS NUMBER NOP DON'T CARE JST CLRTBI COPY MESSN,A GET MESSAGE NUMBER COPY PRIADD,X GET BUFFER ADD. COPY A,5(X) PUT INTO BUFFER COPY =CB:TX,X GET CTRL. BLK. ADD. JST ENSCC ENABLE SCC INTS. JST OTX SEND CTRL. BLK. JST SENBSY STILL BUSY? JMP TRAN:1 NO, JUMP JST DELAY INC. TIME JMP $-3 TIME NOT EXPIRED COPY =ER017,A 'BUSY BIT STILL SET' JST ERROR DISPLAY ERROR * TRAN:1 JST DELAY INC. TIME JMP $-1 TIME NOT EXPIRED COPY =ER004,A 'SCC INT. TIMED OUT' JST ERROR DISPLAY ERROR * LPOOL TITL TRANSMIT END-OF=BLOCK ROUTINES ****************************** * * TRTX1 - NORMAL 'TX' INT. SERVICE ROUTINE * * THIS IS THE EOB SERVICE ROUTINE FOR A NORMAL * TERM. OF A 'TX' COM. . * * THIS SERVICE ROUTINE WILL CHECK FOR MULTIPLE * EOB INTS. AND STATUS ERROS UPON * TERM. OF A 'TX' COM., * * ALSO THE RX AND NOP/INITZ. STATUS IN THE TBI * WILL BE CHECK FOR ALTERATIONS AS WELL AS THE * RX BYTE COUNT. * ****************************** * * TRTX1 - NORMAL 'TX' INT. SERVICE ROUTINE * TRTX1 ENT TX EOB IMS TX:FLG SET INT. FLAG JMP $+3 COPY =ER012,A MULT. INTS JST ERROR JST STATUS CHECK STATUS JST ERROR DISPLAY ANY ERRORS COPY =TBIADD,X GET TBI ADD. COPY TB:TXS(X),A GET TX STATUS TBIT RCIP:,A RX COM. IN PROGRESS - SHOULD BE 0 JT OV,TRTX11 IF SET, ERROR TBIT RXDP:,A RX DATA PRESENT - SHOULD BE 0 JF OV,$+4 IF RESET, JUMP TRTX11 COPY =ER031,A 'RCIP BIT, TCIP BIT OR RXDP BIT SET' JST ERROR DISPLAY ERROR * COPY TB:TXS(X),A GET TX STATUS TBIT TCIP:,A TX COM. IN PROGRESS - SHOULD BE 1 JT OV,$+3 IF SET, JUMP COPY =ER039,A 'TX COMAND IN PROGRESS WAS RESET' JST ERROR DISPLAY ERROR * COPY TB:RXS(X),A GET RX STATUS - SHOULD BE 0 JEQ A,$+3 IF ZERO, IS GOOD COPY =ER013,A 'RX TBI STATUS ALTERED' JST ERROR DISPLAY ERROR * COPY TB:RXB(X),A GET RX BYTE COUNT - SHOULD BE 0 JEQ A,$+3 IF ZERO, IS GOOD COPY =ER014,A 'RX BYTE COUNT ALTERED' JST ERROR DISPLAY ERROR * COPY TB:INS(X),A GET NOP/INITZ. STATUS - SHOULD BE 0 JEQ A,$+3 IF ZERO, IS GOOD COPY =ER015,A 'NOP/INITZ. STATUS ALTERED' JST ERROR DISPLAY ERROR * COPY =CB:TX,X GET CTRL. BLK. ADD. COPY BT:CT1(X),A GET PRIMARY BUF. SIZE ADD BT:CT2(X),A ADD DATA CHAIN BUF. SIZE COPY =TBIADD,X GET TBI ADD. CSK A,TB:TXB(X) COMPARE TO BYTES XFRD NOP JMP $+2 BAD JMP $+3 GOOD COPY =ER016,A JST ERROR  DISPLAY ERROR * ENDOFBL JST MSGA OUTPUT MESSAGE WORD MESS 'MESSAGE ' COPY MESSN,A GET MESSAGE NUMBER JST OHEX DISPLAY IT * COPY SHFLG,Q GET SHIFT CONTROL COPY CB1,X GET CTRL. BLK. JEQ Q,ENDOFBL1 IF ZERO, NO SHIFT COPY BT:CT1(X),A GET PRIMARY BUFF. SIZE JLT Q,$+3 IF SHIFT CONTROL IS NEG., SHIFT RIGHT (DIV.) SHIFT A,LO,1 IF SHIFT CONTROL IS POS., SHIFT LEFT (MULT.) JMP $+2  SHIFT A,RO,1 COPY A,BT:CT1(X) STORE IN CTRL. BLK. JEQ A,ENDOFBL3 IF ZERO, ERROR SHIFT A,RO,1 MAKE WORD ADD ME:AD1(X),A ADD ADD. COPY ENDMEM,Q DO RANGE CHECK CSM Q,A JMP $+2 OK JMP ENDOFBL3 BAD COPY ME:AD2(X),Y GET DATA CHAIN ADD. JEQ Y,ENDOFBL1 IF ZERO, NO DATA CHAIN CSM Y,A DO RANGE CHECK JMP $+2 OK JMP ENDOFBL3 BAD COPY SHFLG,Q GET SHIFT FLAG COPY BT:CT2(X),A GET BYTE COUNT JLT Q,$+3 SHIFT A,LO,1 JMP $+2 SHIFT A,RO,1 COPY A,BT:CT2(X) STORE IN CTRL. BLK. JEQ A,ENDOFBL3 SHIFT A,RO,1 MAKE WORD ADD ME:AD2(X),A ADD ADD. COPY ENDMEM,Q GET END OF MEM. CSM Q,A DO RANGE CHECK JMP ENDOFBL1 JMP ENDOFBL3 ENDOFBL1 COPY LOOP,A GET LOOP COUNT JEQ A,ENDOFBL2 IF ZERO, JUMP SUB =1,A DEC. LOOP COUNT COPY A,LOOP STORE LOOP COUNT JNE A,ENDOFBL2 IF NOT ZERO, JUMP JMP ENDOFBL4 START OVER ENDOFBL2 JST DAGCHK TX OR RX? JMP RXTST1 RX JMP TXTST3 TX ENDOFBL3 COPY =1000,A MEMORY ERROR JST ERROR DISPLAY ERROR ENDOFBL4 RBIT GI:,S DISABLE INTS. COPY SECS,A GET TIME OUT JST TIMEST SET TIME JST DELAY INC. TIME JMP $-1 JST SEL JMP STRTUP * LPOOL TITL ****************************** * * TRCRX1 - RX ERROR 'TX ONLY' INT. SERVICE ROUTINE * TRCIN1 - NOP/INITZ. ERROR 'TX ONLY' INT. SERVICE ROUTINE * * THESE ARE THE ERROR EOB SERVICE ROUTINES FOR AN * ABNORMAL TERM. OF A 'TX' COM. TO * THE RX OR NOP/INITZ. INT. VECTOR ADD. IN * THE TBI. * ****************************** * TRCRX1 ENT RX ERROR 'TX ONLY' EOB IMS RX:SE SET RX STATUS ERROR FLAG COPY =ER018,A 'RX INT. VECTOR INSTEAD OF TX' JST ERROR DISPLAY ERROR * TRCIN1 ENT NOP/INITZ. ERROR 'TX ONLY' EOB IMS IN:SE SET NOP/INITZ. STATUS ERROR FLAG COPY =ER019,A 'NOP/INITZ. VECTOR INSTEAD OF TX' JST ERROR DISPLAY ERROR * LPOOL TITL RECEIVE ****************************** * * RXTST - THIS SUBROUTINE WILL CLEAR THE TBI OF STATUS AND * BYTE COUNTS AND SET THE INT. VECTORS FOR A *  RX TEST AS WELL AS AN ERROR * 'NOP/INITZ' INT. * ****************************** * RXTST EQU $ RECIEVE TEST JST MSGA OUTPUT MESSAGE WORD RXM 'RECEIVE' COPY LEN,A GET BUFF. LENGTH COPY PRIADD,X GET BUFF. ADD. SHIFT A,RO,1 MAKE WORD JST CLEAR CLEAR IT OUT COPY DCLEN,A GET DATA CHAIN LENGTH JEQ A,$+4 IF ZERO, NO DATA CHAIN SHIFT A,RO,1 MAKE WORD COPY DCHADD,X GET BUFF. ADD. JST CLEAR CLEAR IT OUT COPY =TBIADD,X GET TBI ADD. COPY =RXADD,A GET RX EOB ADD. COPY A,TB:RXI(X) SET RX INT. VECTOR ADD. COPY =TXER1,A GET TX EOB ADD. COPY A,TB:TXI(X) SET TX INT. VECTOR ADD. COPY =INER1,A GET NOP/INITZ. ERROR EOB ADD. COPY A,TB:INI(X) SET NOP/INITZ. INT. VECTOR ADD. * COPY =CB:RX,X GET CTRL. BLK. ADD. COPY X,CB1 COPY X,CB:AD COPY =OPC:RX,A GET RX OP CODE JST CBSET BUILD CB COPY PRIADD,A GET BUFF. ADD. COPY A,ME:AD1(X) STORE IN CTRL. BLK. COPY LEN,A GET BUFF. LENGTH COPY A,BT:CT1(X) STORE IN CTRL. BLK. COPY DCHADD,A GET DATA CHAIN BUFF. ADD. JEQ A,$+4 IF ZERO, NO DATA CHAIN COPY A,M  E:AD2(X) STORE IN CTRL. BLK. COPY DCLEN,A GET BUFF. LENGTH COPY A,BT:CT2(X) STORE IN CTRL. BLK. * RXTST1 COPY SECS,A GET TIME OUT COUNT JST TIMEST SET TIME IMS MESSN INC. MESSAGE NUMBER NOP DON'T CARE JST CLRTBI COPY =CB:RX,X GET RX CTRL. BLK. ADD.  JST ENSCC ENABLE INTS. JST OTX SEND RX CTRL. BLK. JST SENBSY STILL BUSY? JMP RXTST2 NO JST DELAY INC. TIME JMP $-3 COPY =ER017,A ERROR JST ERROR DISPLAY ERROR RXTST2 JST DELAY INC. TIME JMP $-1 COPY =ER004,A TIME OUT ERROR JST ERROR DISPLAY ERROR * LPOOL TITL RECEIVE END-OF-BLOCKS ****************************** * * RXADD - NORMAL 'RX' INT. SERVICE ROUTINE * *  THIS IS THE EOB SERVICE ROUTINE FOR A NORMAL * TERM. OF A RX COM. * ****************************** * RXADD ENT NORMAL RX EOB IMS RX:FLG SET INT. FLAG JMP $+3 COPY =ER025,A MULTI. INTS. JST ERROR JST STATUS DO STATUS CHECK JST ERROR DISPLAY ANY ERRORS * COPY =TBIADD,X GET TBI ADD. COPY TB:TXB(X),A GET TX BYTE COUNT JEQ A,$+3 IF ZERO, IS GOOD COPY =ER009,A JST ERROR * COPY TB:TXS(X),A GET TX STATUS JEQ A,$+3 IF ZERO, IS GOOD COPY =ER008,A JST ERROR * COPY TB:INS(X),A GET NOP/INITZ. STATUS - SHOULD BE 0 JEQ A,$+3 IF ZERO, IS GOOD COPY =ER028,A 'NOP/INITZ STATUS ALTERED' JST ERROR DISPLAY ERROR * COPY TB:RXS(X),A GET RX STATUS TBIT RCIP:,A 'RX' COM. IN PROGRESS - SHOULD BE 1 JT OV,$+3 IF SET, JUMP COPY =ER038,A 'RCIP BIT RESET' JST ERROR DISPLAY ERROR * TBIT TCIP:,A TX COM. IN PROGRESS - SHOULD BE 0 JT OV,TRRX12 IF SET, ERROR TBIT RXDP:,A RX DATA PRESENT - SHOULD BE 0 JF OV,$+3 IF RESET, JUMP TRRX12 COPY =ER033,A 'TCIP BIT OR RXDP BIT SET' JST ERROR DISPLAY ERROR * COPY =CB:RX,X GET CTRL. BLK. ADD. COPY BT:CT1(X),A GET PRIM. BYTE COUNT ADD BT:CT2(X),A ADD DATA CHAIN BYTE COUNT COPY =TBIADD,X GET TBI ADDRESS CSK A,TB:RXB(X) EQUAL TO BYTES RCVD? NOP NO JMP $+2 NO, BAD JMP ENDOFBL YES, GOOD COPY =ER034,A JST ERROR DISPLAY ERROR * LPOOL TITL ****************************** * * INER1 - NOP/INITZ. ERROR 'RX' INT. SERVICE ROUTINE * * TXER1 - TX ERROR 'RX' INT. SERVICE ROUTINE * * THESE ARE THE ERROR EOB SERVICE ROUTINES FOR AN * ABNORMAL TERM. OF A  RX * COM. TO THE NOP/INITZ. OR TX INT. VECTOR * ADD. IN THE TBI. * ****************************** * * INER1 - NOP/INITZ. ERROR 'RX' INT. SERVICE ROUTINE * INER1 ENT NOP/INTZ. ERROR 'RX' EOB IMS IN:SE SET NOP/INITZ. ERROR STATUS FLAG  COPY =ER019,A JST ERROR * TXER1 ENT TX ERROR 'RX' EOB IMS TX:SE SET ERROR STATUS FLAG COPY =ER030,A JST ERROR * LPOOL TITL TEST UTILITIES (CLRTBI) ****************************** * * CLRTBI - CLEAR TBI * * THIS SUBROUTINE WILL CLEAR THE TBI OF * STATUS AND BYTE COUNTS. * * ALSO THIS SUBROUTINE WILL RESET THE * INT. FLAGS AND STATUS ERROR FLAGS. * * ENTER WITH THE TBI ADD. IN THE X * REG. * ****************************** * CLRTBI ENT CLEAR TBI COPY =TBIADD,X GET TBI ADD. COPY =0,A SET A TO ZERO COPY A,TB:RXS(X) CLEAR RX STATUS COPY A,TB:RXB(X) CLEAR RX BYTE COUNT  COPY A,TB:TXS(X) CLEAR TX STATUS COPY A,TB:TXB(X) CLEAR TX BYTE COUNT COPY A,TB:INS(X) CLEAR NOP/INITZ. STATUS COPY A,TB:INS+1(X) CLEAR NOP/INITZ. RESERVED WORD * COPY A,RX:SE CLEAR RX STATUS ERROR FLAG COPY A,TX:SE CLEAR TX STATUS ERROR FLAG COPY A  ,IN:SE CLEAR NOP/INITZ. STATUS ERROR FLAG * COPY =-2,A SET INT. COUNT TO 2 COPY A,RX:FLG SET RX INT. FLAG COPY A,TX:FLG CLEAR TX INT. FLAG COPY A,IN:FLG CLEAR NOP/INITZ. INT. FLAG * JMP *CLRTBI EXIT * LPOOL TITL TEST UTILITIES (STATUS) ****************************** * * STATUS - CHECK RETURNED STATUS * * THIS SUBROUTINE WILL CHECK FOR THE * FOLLOWING ERROR BITS IN THE RETURNED * STATUS: * * CRC ERROR BIT 7 * RX OVERRUN BIT 6 * ABORT BIT 5 * TX UNDERRUN BIT 4 * DMA ERROR BIT 3 * INTERFACE ERROR BIT 2 * * THE FOLLOWING PARAMETERS/MEMORY LOCATIONS * MUST BE SET UP PRIOR TO ENTERING THIS * SUBROUTINE: * * CB:AD - CTRL. BLK. ADD. * TB:AD - TBI ADD. * * CALLING SEQUENCE: * JST STATUS * JMP ? BAD STATUS R * JMP ? GOOD STATUS R+1 * ****************************** * STATUS ENT STATUS CHECK COPY CB:AD,X GET CTRL. BLK. ADD. COPY CH:OPC(X),A GET CHNL./OPCODE WORD AND =OPC:MK,A MASK FOR OPCODE ONLY COPY TB:AD,X GET TBI ADD. CLSN A,=OPC:RX IS IT A RECIEVE FUNCTION? JMP STAT20 YES, JUMP CLSN A,=OPC:TX IS IT A TX FUNCTION? JMP STAT10 YES, JUMP ADD =4,X INC. TBI STATUS ADD. STAT10 ADD =4,X INC. TBI STATUS ADD. STAT20 COPY 0(X),A GET STATUS WORD JEQ A,STAT30 IF ZERO, EXIT * COPY =ER050,X 'OPERATION NOT COMPLETED' TBIT OPCO:,A IS 'OPERATION COMPLETE' SET? JF OV,STAT40 NO, JUMP * COPY =ER051,X 'INTERFACE ERROR' TBIT IFER:,A IS IT SET? JT OV,STAT40 YES, JUMP * COPY =ER052,X 'DMA ERROR' TBIT DMAE:,A IS IT SET? JT OV,STAT40 YES, JUMP * COPY =ER053,X 'TX UNDERRUN' TBIT TXUR:,A IS IT SET? JT OV,STAT40 YES, JUMP * COPY =ER054,X 'ABORT' TBIT ABRT:,A IS IT SET? JT OV,STAT40 YES, JUMP * COPY =ER055,X 'RX OVERRUN' TBIT RXOV:,A IS IT SET? JT OV,STAT40 YES, JUMP * COPY =ER056,X 'CRC ERROR' TBIT CRCE:,A IS IT SET? JT OV,STAT40 YES, JUMP * STAT30 IMS STATUS SET GOOD RETURN ADD. STAT40 COPY X,A PUT ERROR CODE INTO A REG. JMP *STATUS RETURN * CB:AD WORD CB:IZ CTRL. BLK. ADD. TB:AD WORD TBIADD TBI ADD. * LPOOL TITL TEST UTILITIES (CBSET) ****************************** * * CBSET - SET CTRL. BLK. * * THIS SUBROUTINE WILL SET UP A CTRL. * BLK. ACCORDING TO CHNL., ADD. SELECT * AND DTR/TR AND RTS/RS BIT SETTING. * * ENTER WITH CTRL. BLK. ADD. IN X REG. * AND OP CODE IN A REGSITER. * * CALLING SEQUENCE: * COPY =CB ADD.,X * COPY =OPCODE,A * JST CBSET * ****************************** * CBSET ENT SET CTRL. BLK. COPY A,CBTMP SAVE OP CODE COPY =4,A SET CLEAR COUNT FOR 5 WORDS JST CLEAR CLEAR CTRL. BLK. COPY CHAN:,A GET CHNL. UNDER TEST OR CBTMP,A 'OR' IN OP CODE OR BITS,A 'OR' IN DTR/TR, RTS/RS AND SEC. ADD. BITS COPY A,CH:OPC(X) STORE IN CTRL. BLK. JMP *CBSET EXIT * CBTMP RES 1,0 SAVED OPCODE * LPOOL TITL TEST UTILITIES (CLEAR) ****************************** * * CLEAR - CLEARS OUT, STORES ZEROS IN, THE * CTRL. BLK./BUF. * * CALLING SEQUENCE: * * COPY =BUF. ADD.,X * COPY =BUF. SIZE,A * JST CLEAR * * ENTER WITH STARTING ADD. IN THE * X-REG. (AND SIZE IN A-REG.) * ******************************* * CLEAR ENT CLEAR BLK./BUF. COPY X,  CLR1 SAVE X REG. COPY X,CLR2 SAVE TO ADD. IMS CLR2 INC. ADD. NEG A SET A TO NEGATIVE COPY A,CLRTMP SAVE A REG. COPY =0,A SET A TO ZERO COPY A,0(X) RESET FIRST WORD COPY CLRTMP,A GET A REGSITER JST MOVE CLEAR IT OUT CLR1 WORD 0 FROM CLR2 WORD 0 TO JMP *CLEAR * CLRTMP RES 1,0 SAVED A REG. * LPOOL TITL TEST UTILITIES (ERROR) ****************************** * * ERROR - DISPLAY ERROR REPORT * * THIS SUBROUTINE WILL DISPLAY AN * ERROR REPORT IN THE FOLLOWING * FORMAT ACCORDING TO SENSE SWITCH * AND CTRL. WORD SETTING: * * ER 000 ER ADD :XXXX CHNL Y MESSAGE 000 * CHNL/OPC :XXXX (FUNCTION) * CTRL BLK ADD :XXXX TBI ADD :XXXX * STATUS :XXXX ( BBBB BBBB BBBB BBBB ) *  BUF ADD :XXXX LEN :XXXX BYTS XFRD :XXXX CHNL ADD : * DATA CHAIN BUF ADD :XXXX LEN :XXXX * * THE FOLLOWING PARAMETERS/MEMORY LOCATION MUST * BE SET UP PRIOR TO ENTERING THIS SUBROUTINE: * * CB1 - PRIMARY CTRL. BLK. ADD. - NOP,TX,INITZ * TB:AD - TBI ADD. * * ENTER WITH ERROR CODE IN THE A REG. * * CALLING SEQUENCE: *  COPY =ERROR CODE,A * JST ERROR * ****************************** * ERROR ENT ERROR DISPLAY RBIT GI:,S DISABLE INTS. JST SEL RESET THE SCC COPY A,ERCDE SAVE THE ERROR CODE * JST MSGA OUTPUT ERROR MESSAGE WORD EMSG01 'ER ' COPY ERCDE,A GET ERROR CODE JST ODEC DISPLAY IT JST SPACE3 SPACE OVER JST MSGA OUTPUT ERROR MESSAGE WORD EMSG02 'ER ADD ' COPY ERROR,A GET ERROR ADD. JST OHEX DISPLAY IT JST SPACE3 SPACE OVER JST MSGA OUTPUT ERROR MESSAGE WORD EMSG03 'CHNL ' COPY CB1,X GET CTRL. BLK. ADD. COPY CH:OPC(X),A GET CHNL/OPC WORD SHIFT A,RO,CHA: SHIFT CHNL. SELECT BIT AND =1,A MASK FOR CHNL. ONLY ADD ='A',A ADD IN ASCII OFFSET JST OTTY DISPLAY CHNL. JST SPACE3 SPACE OVER JST MSGA OUTPUT ERROR MESSAGE WORD MESS+1 'MESSAGE ' COPY MESSN,A GET PASS NUMBER JST OHEX DISPLAY IT COPY ERCDE,A GET ERROR CODE CLSN A,=ER003 IS IT 'MICRODIAG. FAILED'? JMP ERRO20 YES, EXIT ROUTINE * JST CRLF JST ERR10 'CHNL/OPC' AND '(FUNCTION)' JST CRLF DO IT COPY CB1,X GET CTRL. BLK. ADD. JST ERR20 'CTRL BLK ADD ' AND ' TBI ADD ' JST CRLF DO IT COPY CB1,X GET CTRL. BLK. ADD. JST ERR30 'STATUS ' AND '(BBBB BBBB BBBB BBBB)' COPY CB1,X GET CTRL. BLK. ADD. COPY CH:OPC(X),A GET CHNL/OPC WORD AND =OPC:MK,A MASK FOF OPCODE ONLY CLSN A,=OPC:IZ IS IT INIT? JMP ERRO20 YES, JUMP JEQ A,ERRO20 NOP, JUMP * JST CRLF DO IT COPY CB1,X GET CTRL. BLK. ADD. JST ERR40 JST CRLF DO IT COPY CB1,X GET CTRL. BLK. ADD. COPY ME:AD2(X),A DATA CHAINING? JEQ A,ERRO20 NO, EXIT JST ERR50 * ERRO20 JST CRLF CRLF IT HLT WAIT HERE JMP STRTUP DO AGAIN * ERCDE RES 1,0 SAVED ERROR CODE ERTMP1 RES 1,0 TEMP. STORAGE CB1 WORD CB:IZ PRIMARY CTRL. BLK. ADD. (TX,NOP,INZ) * LPOOL TITL TEST UTILITIES (ERROR - SUBROUTINE 'ERR10') ****************************** * * ERR10 - DISPLAY THE FOLLOWING ERROR * REPORT MESSAGE: * * CHNL/OPC :XXXX (FUNCTION) * * ENTER WITH THE CTRL. BLK. ADD. IN * THE X REG. * * CALLING SEQUENCE: * COPY =CTRL. BLK. ADD.,X * JST ERR10 * ****************************** * ERR10 ENT DISPLAY ERROR MESSAGE JST MSGA OUTPUT ERROR MESSAGE WORD EMSG04 'CHNL/OPC ' COPY CH:OPC(X),A G ET CHNL/OPC WORD FROM CB JST OHEX DISPLAY IT JST SPACE3 SPACE OVER COPY CH:OPC(X),A GET CHNL/OPC WORD FROM CB AND =OPC:MK,A MASK FOR OP CODE ONLY ADD =OPMSG,A ADD IN OP CODE MESSAGE TABLE ADD. COPY A,X PUT IN X COPY 0(X),A GET OP CODE MESSAGE ADD. COPY A,$+2 STORE IT FOR DISPLAYING JST MSGA OUTPUT ERROR MESSAGE WORD 0 '(FUNCTION)' JMP *ERR10 EXIT * LPOOL TITL TEST UTILITIES (ERROR - SUBROUTINE 'ERR20') ****************************** * * ERR20 - THIS SUBROUTINE WILL DISPLAY THE * FOLLOWING ERROR REPORT MESSAGE: * * CTRL BLK ADD :XXXX TBI ADD :XXXX * * ENTER WITH THE CTRL. BLK. ADD. *  IN THE X REG. * * CALLING SEQUENCE: * COPY =CTRL. BLK. ADD.,X * JST ERR20 * ****************************** * ERR20 ENT DISPLAY ERROR MESSAGE JST MSGA OUTPUT ERROR MESSAGE WORD EMSG05 'CTRL BLK ADD ' COPY X,A PUT CTRL. BLK. ADD. INTO X JST OHEX DISPLAY IT JST SPACE3 SPACE OVER JST MSGA OUTPUT ERROR MESSAGE WORD EMSG06 'TBI ADD ' COPY TB:AD,A GET TBI ADD. JST OHEX DISPLAY IT JMP *ERR20 EXIT * LPOOL TITL TEST UTILITIES (ERROR - SUBROUTINE 'ERR30') ****************************** * * ERR30 - THIS SUBROUTINE WILL DISPLAY THE * FOLLOWING ERROR REPORT MESSAGE: * * STATUS :XXXX ( BBBB BBBB BBBB BBBB ) * * ENTER WITH THE CTRL. BLK. ADD. * IN THE X REG. * * CALLING SEQUENCE: * COPY =CTRL. BLK. ADD.,X * JST ERR30 * ****************************** * ERR30 ENT DISPLAY ERROR MESSAGE COPY CH:OPC(X),A GET CHNL/OPC WORD AND =OPC:MK,A MASK FOR OP CODE ONLY COPY TB:AD,X GET TBI ADD. CLSN A,=OPC:RX IS IT RX? JMP ERR32 YES, JUMP CLSN A,=OPC:TX IS IT TX? JMP ERR31 YES, JUMP ADD =4,X SET TBI ADD. FOR NOP/INZ STATUS ERR31 ADD =4,X SET TBI ADD. FOR TX STATUS ERR32 COPY 0(X),A GET STATUS COPY A,ERCT3 STORE FOR BINARY DISPLAY JST MSGA OUTPUT ERROR MESSAGE WORD EMSG07 'STATUS ' COPY ERCT3,A GET STATUS JST OHEX DISPLAY IT JST SPACE3 SPACE OVER COPY ='(',A DISPLAY A '(' JST OTTY DISPLAY IT COPY =-4,A SET COUNT FOR 4 DIGITS COPY A,ERCT1 STORE COUNT ERR33 COPY =SPACE:,A GET ASCII SPACE JST OTTY DISPLAY IT COPY =-4,A SET COUNT FOR 4 BINARY BITS COPY A,ERCT2 STORE COUNT ERR34 COPY ERCT3,A GET STATUS SHIFT A,LO,1 SHIFT LEFT COPY A,ERCT3 STORE NEW STATUS COPY ='0',A GET ASCII ZERO JF OV,$+2 IF NO OV, JUMP ADD =1,A GET ASCII 1 JST OTTY DISPLAY IT IMS ERCT2 INC. BINARY DIGIT COUNT JMP ERR34 DISPLAY ANOTHER IMS ERCT1 INC. DIGIT COUNT JMP ERR33 DISPLAY A SPACE COPY =SPACE:,A GET ASCII SPACE JST OTTY DISPLAY IT COPY =')',A DISPLAY A ')' JST OTTY DISPLAY IT * COPY TB:AD,X GET TBI ADDRES COPY RX:SE,A GET RX STATUS ERROR FLAG JEQ A,ERR35 IF RESET, JUMP COPY =0,A SET A TO ZERO COPY A,RX:SE DON'T DISPLAY AGAIN JST MSGA OUTPUT ERROR MESSAGE WORD EMSG14 'RX--' COPY TB:RXS(X),A GET RX STATUS JMP ERR32+1 DISPLAY IT ERR35 COPY TX:SE,A GET TX STATUS ERROR FLAG JEQ A,ERR36 IF RESET, JUMP COPY =0,A SET A TO ZERO COPY A,TX:SE DON'T DISPLAY AGAIN JST MSGA OUTPUT ERROR MESSAGE WORD EMSG13 'TX--' COPY TB:TXS(X),A GET TX STATUS JMP ERR32+1 DISPLAY IT ERR36 COPY IN:SE,A GET NOP/INITZ. STATUS ERROR FLAG JEQ A,ERR37 IF RESET, JUMP COPY =0,A SET A TO ZERO COPY A,IN:SE DON'T DISPLAY AGAIN JST MSGA OUTPUT ERROR MESSAGE WORD EMSG19 'IN--' COPY TB:INS(X),A GET NO P/INITZ. STATUS JMP ERR32+1 DISPLAY IT * ERR37 JMP *ERR30 EXIT * ERCT1 RES 1,0 DIGIT COUNT ERCT2 RES 1,0 BINARY DIGIT COUNT ERCT3 RES 1,0 SAVED STATUS * RX:SE RES 1,0 RX STATUS ERROR FLAG TX:SE RES 1,0 TX STATUS ERROR FLAG IN:SE RES 1,0 NOP/INITZ. STATUS ERROR FLAG * LPOOL TITL TEST UTILITIES (ERROR - SUBROUTINE 'ERR40') ****************************** * * ERR40 - THIS SUBROUTINE WILL DISPLAY THE * FOLLOWING ERROR REPORT MESSAGE: * * BUF ADD :XXXX LEN :XXXX BYTS XFRD :XXXX CHNL ADD :XX * OR * BUF ADD :XXXX LEN :XXXX BYTS RCVD :XXXX CHNL ADD :XX * * ENTER WITH THE CTRL. BLK. ADD. IN THE * X REG. * ****************************** * ERR40 ENT DISPLAY ERROR MESSAGE JST MSGA OUTPUT ERROR MESSAGE WORD EMSG08 'BUF ADD ' COPY ME:AD1(X),A GET BUF. ADD. JST OHEX DISPLAY IT JST SPACE3 SPACE OVER JST MSGA OUTPUT ERROR MESSAGE WORD EMSG09 'LEN ' COPY BT:CT1(X),A GET BYTE COUNT JST OHEX DISPLAY IT JST SPACE3 SPACE OVER COPY CH:OPC(X),A GET CHNL/OPC WORD COPY X,ERTMP1 SAVE CTRL. BLK. ADD. AND =OPC:MK,A MASK FOR OPCODE COPY TB:AD,X GET TBI ADD. CLSN A,=OPC:RX IS IT A RX COM.? JMP ERR41 YES, JUMP JST MSGA OUTPUT ERROR MESSAGE WORD EMSG10 'BYTS XFRD ' COPY TB:TXB(X),A GET BYTES TRANSMITTED JMP ERR42 DISPLAY IT ERR41 JST MSGA OUTPUT ERROR MESSAGE WORD EMSG11 'BYTS RCVD ' COPY TB:RXB(X),A GET BYTES RECEIVED ERR42 JST OHEX DISPLAY NUMB. OF BYTES JST SPACE3 SPACE OVER JST MSGA OUTPUT ERROR MESSAGE WORD EMSG20 'CHNL ADD :' COPY ERTMP1,X GET CTRL. BLK. ADD. COPY ME:AD1(X),X GET BUF. ADD. COPY 0(X),A GET CHNL. ADD. SHIFT A,RO,8 SHIFT INTO PLACE JST ERR70 DISPLAY IT JMP *ERR40 EXIT TITL TEST UTILITIES (ERROR - SUBROUTINE 'ERR50') ****************************** * * ERR50 - THIS SUBROUTINE WILL DISPLAY THE * FOLLOWING ERROR REPORT MESSAGE: * * DATA CHAIN BUF ADD :XXXX LEN :XXXX * * ENTER WITH THE CTRL. BLK. ADD. * IN THE X REG. * * CALLING SEQUENCE: * COPY =CTRL. BLK. ADD.,X * JST ERR50 * ****************************** * ERR50 ENT DISPLAY ERROR MESSAGE JST MSGA OUTPUT ERROR MESSAGE WORD EMSG12 'DATA CHAIN BUF ADD ' COPY ME:AD2(X),A GET DATA CHAIN BUF. ADD. JST OHEX DISPLAY IT JST SPACE3 SPACE OVER JST MSGA OUTPUT ERROR MESSAGE WORD EMSG09 'LEN ' COPY BT:CT2(X),A GET BYTE COUNT JST OHEX DISPLAY IT JMP *ERR50 EXIT TITL TEST UTILITIES (ERROR - SUBROUTINE 'ERR70') ****************************** * * ERR70 - THIS SUBROUTINE WILL DISPLAY 1 * BYTE IN THE LOWER ORDER BYTE OF THE * A REG. AND A ASCII SPACE. * * CALLING SEQUENCE: * COPY =BYTE,A * JST ERR70 * ******************************* * ERR70 ENT DISPLAY A BYTE AND =:FF,A MASK FOR LOWER BYTE ONLY COPY A,ERTMP1 SAVE THE BYTE SHIFT A,RO,4 GET HIGH ORDER DIGIT CSK A,=9 IS IT 9 OR LESS? JMP $+2 YES, JUMP ADD =7,A NO, ADD IN OFFSET ADD ='0',A ADD IN ASCII OFFSET JST OTTY DISPLAY IT COPY ERTMP1,A GET ORIGINAL BYTE AND =:F,A MASK FOR LOW ORDER DIGIT CSK A,=9 IS IT 9 OR LESS? JMP $+2 YES, JUMP ADD =7,A NO, ADD IN OFFSET ADD ='0',A ADD IN ASCII OFFSET JST OTTY DISPLAY IT COPY =SPACE:,A DISPLAY A SPACE JST OTTY DISPLAY IT JMP *ERR70 EXIT TITL TEST UTILITIES (ERROR - SUBROUTINE 'SPACE3') ****************************** * * SPACE3 - THIS SUB ROUTINE WILL PRINT * 3 ASCII SPACES. * * CALLING SEQUENCE: * JST SPACE3 * ****************************** * SPACE3 ENT PRINT 3 SPACES COPY =SPACE:,A GET ASCII SPACE JST OTTY PRINT IT JST OTTY PRINT IT JST OTTY PRINT IT JMP *SPACE3 EXIT TITL TEST UTILITIES (TIMEST) ****************************** * * TIMEST - INITIALIZE THE TIMING CELLS FOR * 'DELAY' * * ENTER WITH THE NUMBER OF SECONDS * FOR TIMING IN THE A REG. * * CALLING SEQUENCE: * * COPY =SECONDS,A * JST TIMEST * ****************************** * TIMEST ENT SET TIME FMT Q GET MACHINE TYPE TBIT 5,Q IS IT A 495? JT OV,M495 YES, JUMP TBIT 4,Q IS IT A 410S? JT OV,M404 YES, JUMP TBIT 6,Q IS IT A 404? JT OV,M404 YES, JUMP JMP M430 NO, THEN A 490 OR 430 M495 SHIFT A,LO,1 MULT. BY NUMBER OF SECONDS FOR 4-95 M430 SHIFT A,LO,1 MULT. BY NUMBER OF SECONDS FOR 4-30 M404 SHIFT A,LO,1 MULT. BY NUMBER OF SECONDS FOR 404 NEG A MAKE NEGATIVE COPY A,COUNT2 STORE TIME FOR OUTER LOOP COPY =0,A SET TIME FOR INNER LOOP COPY A,COUNT1 STORE TIME FOR INNER LOOP JMP *TIMEST EXIT TITL TEST UTILITIES (DELAY) ****************************** * * DELAY - INCS. TIME SET BY * 'TIMEST' * * CALLING SEQUENCE: * * JST DELAY * JMP ? TIME NOT EXPIRED R * JMP ? TIME EXPIRED R+1 * ****************************** * DELAY ENT INC. TIME  IMS COUNT1 INC. INNER LOOP JMP *DELAY RETURN IMS COUNT2 INC. OUTER LOOP JMP *DELAY RETURN IMS DELAY INC. RETURN ADD. JMP *DELAY RETURN * COUNT1 RES 1,0 INNER LOOP TIME COUNT COUNT2 RES 1,0 OUTER LOOP TIME COUNT TITL TEST UTILITIES (SCC I/O INSTRUCTIONS) ****************************** * * ENSCC - ENABLE SCC INTS. * * SENBSY - SENSE CTRL.LER BUSY * * OTA - OUTPUT CTRL. BLK. FROM A REG. * * OTX - OUTPUT CTRL. BLK. FROM X REG. * * SEL - RESET/INITIATE MICRODIAG. * * MICLED - TURN ON MICRODIAG. LED * * CALLING SEQUENCE: * * ENSCC - JST ENSCC * * SENBSY - JST SENBSY * JMP ?  NOT BUSY R * JMP ? BUSY R+1 * * OTX - COPY =CTRL. BLK. ADD.,X * JST OTX * * SEL - JST SEL * * MICLED - JST MICLED * ****************************** * ENSCC ENT ENABLE SCC INTS. COPY A,IOTMP1 SAVE THE A REG. COPY =0,A SET A TO ZERO DA1 SELP A,STDDA%3;ENIN SEND TO SCC COPY IOTMP1,A RESTORE THE A REG. JMP *ENSCC EXIT * SENBSY ENT SENSE SCC BUSY DA2 SST STDDA%3;COBU JMP *SENBSY NOT BUSY IMS SENBSY IT IS BUSY JMP *SENBSY EXIT * OTX ENT OUTPUT X REG. DA4 SELP X,STDDA%3;LCBA SEND BLK. ADD. TO SCC SBIT GI:,S ENABLE INTS. JMP *OTX EXIT * SEL ENT RESET SCC COPY A,IOTMP1 SAVE THE A REG. COPY =0,A SET A TO ZERO DA5 SELP A,STDDA%3;INTZ SEND TO SCC COPY IOTMP1,A RESTORE THE A REG. JMP *SEL EXIT * MICLED ENT TURN ON MICRO LED COPY A,IOTMP1 SAVE THE A REG. COPY =0,A SET A TO ZERO DA6 SELP A,STDDA%3;MICR SEND TO SCC COPY IOTMP1,A RESTORE THE A REG. JMP *MICLED EXIT * IOTMP1 RES 1,0 SAVED A REG. TITL PROGRAM UTILTIES (DAGCHK) ****************************** * * DAGCHK - CHECK DIAG. FLAG * FOR RX TEST = 0 * OR TX TEST = 1 * * CALLING SEQUENCE: * JST DAGCHK * JMP ? RX * JMP ? TX * ****************************** * DAGCHK EN T DIAG. OR TECH. COPY DGFLG,A GET DIAG. FLAG JEQ A,$+2 IF ZERO RETURN TO NORMAL RETURN ADD. IMS DAGCHK INC. RETURN ADD. BY 1  JMP *DAGCHK EXIT * LPOOL TITL PROGRAM UTILITIES (MSGA) ****************************** * * MSGA - THIS SUBROUTINE WILL PRINT AN ASCII * MESSAGE, THE LAST CHAR. OF WHICH * MUST BE 0, TO CRT/TTY AND LP. * * * CALLING SEQUENCE: * JST MSGA * WORD (MESSAGE ADD.) * ****************************** * MSGA ENT PRINT MESSAGE COPY X,MSTMP SAVE THE X REG. COPY *MSGA,X GET MESSAGE ADD. IMS MSGA INC. RETURN ADD. SHIFT X,LO,1 CONVERT WORD ADD. TO A BYTE ADD. MSGA1 SBIT BY:,S SET BYTE MODE COPYB 0(X),A GET CHAR. FROM MESSAGE RBIT BY:,S SET WORD MODE JEQ A,MSGA2 IF END OF MESSAGE, EXIT LOOP JST OTTY PRINT CHAR. ADD =1,X INC. MESSAGE ADD. JMP MSGA1 LOOP BACK FOR MORE MSGA2 COPY MSTMP,X RESTORE THE X REG. JMP *MSGA EXIT * MSTMP RES 1,0 SAVED X REG. TITL PROGRAM UTITLITIES (IKB) ****************************** * * IKB - THIS SUBROUTINE WILL INPUT, INTO *  THE LEAST SIGNIFICANT BYTE OF THE * A REG., AN ASCII CHAR. FROM * THE CRT KEYBOARD/TTY. * * CALLING SEQUENCE: * JST IKB * ****************************** * IKB ENT INPUT FROM CRT/TTY COPY MCSFLG,A ARE WE USING THE SCOUT MCS BOARD JEQ A,$+3 JUMP IF NO JST MCSIN GET CHAR. VIA THE MCS BOARD JMP *IKB EXIT IKB COPY =:8618,A GET CRT/TTY INPUT STARTUP COM. OUT A,DTTYDA%1;1 SEND TO CRT/TTY IN DTTYDA%1;1,A GET STATUS FROM CRT/TTY SHIFT A,RO,4 SHIFT 'DATA READY' BIT (3) INTO OV JF OV,$-2 IF 'DATA READY' BIT IS RESET, LOOP BACK IN DTTYDA%1,A INPUT ASCII CHAR. FROM CRT/TTY AND =:7F,A MASK OFF POSSIBLE PARITY BIT COPY A,IKBTMP SAVE CHAR. COPY =:100,A GET CRT/TTY RESET COM. CODE OUT A,DTTYDA%1;1 SEND TO CRT/TTY COPY IKBTMP,A RESTORE CHAR. TO A JMP *IKB EXIT * IKBTMP RES 1,0 SAVED INPUT CHAR. * LPOOL TITL PROGRAM UTILITIES (MCSIN) ****************************** * * MCSIN MULTI-CHANNEL SERIAL INPUT * * THIS SUBROUTINE IS USED TO GET INPUT FROM * THE KEYBOARD VIA THE MULTI-CHANNEL SERIAL BOARD. * * THE INPUT CHAR. WILL BE IN THE A-REG. * * CALLING SEQUENCE: * * JST MCSIN * ****************************** * MCSIN ENT NOW ENTERING THE WORLD OF MULTI-CHANNEL COPY Q,MCTMP1 SAVE Q-REG. COPY X,MCTMP2 SAVE X-REG. ECHOWT EQU $ COPY =MCSDA,Q GET DEVICE ADDRESS OF THE MCS XNX Q IN 1,A TRANSMITTED BEFORE ENABLING ECHO TBIT 2,A IS TRANSMITTER EMPTY? JF OV,ECHOWT IF NOT, WAIT UNTIL IT IS COPY =MCECHO,A NOW SET ECHO TO RECIEVE XNX Q SELP A,3 WAITST EQU $ XNX Q IN 1,A TBIT 7,A DEVICE READY? JF OV,WAITST IF NOT, KEEP WAITING COPY =MC06,A DTR & RECIEVE ENABLE CONTROL WORD  XNX Q OUT A,1 WAITR EQU $ XNX Q IN 1,A WAIT FOR RECIEVE READY TBIT 1,A JF OV,WAITR XNX Q IN 0,A GET ASCII CHARACTER AND =:7F,A MASK OFF POSSIBLE PARITY BIT JST CLEANUP CLEAN UP SCOUT MCS COPY MCTMP1,Q RESTORE Q-REG. COPY MCTMP2,X RESTORE X-REG. JMP *MCSIN EXIT * MCECHO EQU :18 MC06 EQU :06 MCTMP1 RES 1,0 MCTMP2 RES 1,0 TITL PROGRAM UTILITIES (CLEANUP) ****************************** * * CLEANUP * * THIS SUBROUTINE DOES NECESSARY CHORES * TO CLEAN UP THE MULTI-CHANNEL ONLY. * * CALLING SEQUENCE: * * JST CLEANUP * ****************************** * CLEANUP ENT COPY =0,X CHANNEL 0, TRANS/RECIE VE DISABLE COPY =MCSDA,Q GET MULTI-CHANNEL DEVICE ADDRESS XNX Q OUT X,1 SEND COMMAND TO MCS COPY =MCNECHO,X DISABLE AUTO ECHO XNX Q SELP X,3 JMP *CLEANUP EXIT TITL PROGRAM UTILITIES (IDEC) ****************************** * * IDEC - THIS SUBROUTINE WILL INPUT, FROM * THE CRT/TTY, AN ASCII-DECIMAL NUMBER WHICH * IT WILL CONVERT TO BINARY AND RETURN IT IN *  THE X REG. * * THIS SUBROUTINE IS EXITED UPON INPUT OF THE * FIRST NON ASCII-DECIMAL CHAR., WHICH IT WILL * RETURN IN THE A REG. * * DURING THIS SUBROUTINE, A QUESTION MARK IS OUTPUT * IF THE INPUT VALUE BECOMES GREATER THAN 32768 AND * RESTARTS THE INPUT. * * CALLING SEQUENCE: * JST IDEC * ****************************** * IDEC ENT INPUT A DECIMAL NUMBER COPY =0,A SET A TO ZERO COPY A,IDCTM1 CLEAR VALUE CELL COPY A,IDCTM3 AND CHAR. COUNT IDEC1 JST IKB GET A CHAR. COPY A,IDCTM2 SAVE THE CHAR. SUB ='0',A SEE IF IT IS ASCII '0'-'9' JLT A,IDEC2 IF NOT, TERMINATE ROUTINE SUB =10,A CHECK NUMBER JGE A,IDEC2 IF GREATER, TERMINATE ROUTINE IMS IDCTM3 INC. CHAR. COUNT COPY IDCTM1,A ADD TO VALUE SHIFT A,LO,2 TIMES 4 ADD IDCTM1,A TIMES 5 SHIFT A,LO,1 TIMES 10 ADD IDCTM2,A ADD NEW VALUE SUB ='0',A LESS ASCII OFFSET JLT A,IDEC3 MINUS IS BAD COPY A,IDCTM1 STORE NEW VALUE JMP IDEC1 GET NEXT INPUT IDEC2 COPY IDCTM2,A GET TERMINATOR IN THE A REG. COPY IDCTM1,X GET VALUE IN THE X REG. JMP *IDEC EXIT IDEC3 COPY ='?',A ERROR JST OTTY OUTPUT '?' JMP IDEC+1 START AGAIN * IDCTM1 RES 1,0 VALUE CELL IDCTM2 RES 1,0 ASCII CHAR. IDCTM3 RES 1,0 CHAR. COUNT TITL PROGRAM UTILITIES (OTTY) ****************************** * * OTTY - OUTPUT THE LEAST SIGNIFICANT BYTE OF THE * A REG. TO THE CRT/TTY. * * 'OTTY' TALKS TO THE NM4-DIO, SCOUT-SPI BOARDS; * 'MCSOUT' TALKS TO THE SCOUT-MCS BOARD. * * CALLING SEQUENCE: * COPY =CHAR.,A *  JST OTTY * * ENTER WITH THE ASCII CHAR. IN THE A REG. * ****************************** * OTTY ENT OUTPUT TO CRT/TTY COPY X,OTTMP1 SAVE X REG. COPY A,OTTMP2 SAVE A REG. COPY Q,OTTMP3 SAVE Q REG. COPY MCSFLG,X DIO/SPI OR MCS? JEQ X,$+3 JUMP IF ITS A DIO OR SPI BOARD JST MCSOUT OTHERWISE GOTO MULTI-CHANNEL JMP RESTORE RESTORE & EXIT OTTY COPY =:8612,X CRT/TTY STARTUP COM. OUT X,DTTYDA%1;1 SEND COM. CODE TO CRT/TTY OUT A,DTTYDA%1 SEND CHAR. TO CRT/TTY IN DTTYDA%1;1,X INPUT STATUS FROM CRT/TTY SHIFT X,RO,5 SHIFT 'TX EMPTY' BIT (4) INTO OV JT OV,$-2 IF TRUE -TX EMPTY- LOOP BACK IN DTTYDA%1;1,X INPUT STATUS FROM CRT/TTY SHIFT X,RO,5 SHIFT 'TX EMPTY' BIT (4) INTO OV JF OV,$-2 IF FALSE -TX FULL- LOOP BACK COPY =:100,X GET CRT/TTY RESET COM. CODE OUT X,DTTYDA%1;1 SEND TO CRT/TTY RESTORE COPY OTTMP1,X RESTORE X REG. COPY OTTMP2,A RESTORE A REG. COPY OTTMP3,Q RESTORE Q REG. JMP *OTTY EXIT * OTTMP1 RES 1,0 SAVED X REG. OTTMP2 RES 1,0 SAVED A REG. OTTMP3 RES 1,0 SAVED Q REG. * LPOOL TITL PROGRAM UTILITIES (MCSOUT) ****************************** * * MCSOUT MULTI-CHANNEL OUTPUT * * THIS SUBROUTINE WILL OUTPUT THE LEAST * SIGNIFICANT BYTE OF THE A-REG TO THE * TTY/CRT. * THIS ROUTINE IS CALLED FROM OTTY ONLY. * * CALLING SEQUENCE: * * COPY =CHAR,A * JST MCSOUT * ****************************** * MCSOUT ENT  THIS IS WHERE WE TALK TO THE MCS COPY =MCSDA,Q GET MCS DEVICE ADDRESS COPY =MCNECHO,X SET FOR NO ECHO XNX Q SELP X,3 COPY =:22,X PSEUDO CONTROL WORD XNX Q OUT X,1 NOT ENABLING TRANSMITTER WAIT1 EQU $ XNX Q IN 1,X GET CHANNEL 0 STATUS TBIT 7,X JF OV,WAIT1 COPY =MC0023,X RTS, DTR, TRANSMIT ENABLE XNX Q OUT X,1 CHANNEL 0 CONTROL WORD WAITW EQU $ XNX Q IN 1,X WAIT FOR TRANSMIT READY TBIT 0,X JF OV,WAITW XNX Q OUT A,0 SEND DATA BYTE OUT JMP *MCSOUT EXIT BACK TO OTTY * MCNECHO EQU :8 MC0023 EQU :23 TITL PROGRAM UTILITIES (OHEX) ****************************** * * OHEX - OUTPUT THE A-REG. TO THE * TTY/CRT AS FOUR ASCII-HEX * DIGITS. * * CALLING SEQUENCE: * COPY =NUMBER,A * JST OHEX * * ENTER WITH NUMBER IN * THE A-REG. * ****************************** * OHEX ENT SUBROUTINE ENTRANCE COPY X,OXTMP1 SAVE THE X REG. COPY =-4,X SET COUNT FOR 4 DIGITS COPY X,OXTMP2 STORE COUNT COPY A,X INITIALIZE THE X-REG. COPY =':',A GET ASCII ':' JST OTTY OUTPUT ':' JMP $+2 DON'T SHIFT OHEX1 SHIFT X,LO,4 GET HEXT DIGIT INTO PLACE COPY X,A PUT INTO THE A-REG. SHIFT A,RO,8 SHIFT TO L.S. NIBBLE SHIFT A,RO,4 CONT. TO SHIFT CSK A,=9 IS DIGIT 9 OR LESS JMP $+2 YES, CONVERT TO ASCII ADD =7,A NO, ADD OFFSET FIRST ADD ='0',A CONVERT TO ASCII JST OTTY OUTPUT DIGIT IMS OXTMP2 INC. COUNT JMP OHEX1 GET ANOTHER CHAR. COPY OXTMP1,X RESTORE THE X REG. JMP *OHEX EXIT * OXTMP1 RES 1,0 SAVED X REG. OXTMP2 RES 1,0 HEX COUNT TITL PROGRAM UTILITIES (IHEX) ****************************** * * IHEX - INPUT UP TO 4 HEX DIGITS * TO FORM A 16 BIT HEX NUMBER * FROM THE CRT OR TTY. * * CALLING SEQUENCE: * JST IHEX * * EXIT UPON INPUT OF THE FIRST NON-HEX * ASCII CHAR., WHICH IS RETURNED IN * THE A-REG. WITH THE HEX VALUE IN * THE X-REG. * ***************************** * IHEX ENT SUBROUTINE ENTRANCE COPY =0,X SET INITIAL VALUE FOR 0 COPY X,HXTMP2 RESET INPUT COUNT COPY =0,Q RESET FLAG JST IKB GET FIRST CHARACTER CLSN A,='+' INC.? COPY =1,Q YES CLSN A,='-' DEC.? COPY =-1,Q YES JEQ Q,$+2 IF ZERO, JUMP IHEX1 JST IKB GET CHAR. COPY A,HXTMP1 STORE POSSIBLE TERMINATING CHAR. SUB ='0',A SUBTRACT ASCII 0 JLT A,IHEX2 IF LESS THAN 0 EXIT CSK A,=10 IS CHAR. 0-9? JMP IHEX3 YES, SET VALUE NOP SUB =7,A SUBTRACT FOR ASCII A-F CSK A,=10 IS CHAR. NON-HEX A-F? JMP IHEX2 YES, GO TO EXIT NOP CSK A,=16 IS CHAR. HEX A-F? JMP IHEX3 YES, SET VALUE NOP IHEX2 COPY HXTMP1,A SET TERMINATING CHAR. IN A-REG. JMP *IHEX EXIT IHEX3 SHIFT X,LO,4 SHIFT X FOR POSITION OF DIGIT OR A,X PUT DIGIT INTO PLACE IMS HXTMP2 INC. INPUT COUNT COPY HXTMP2,A GET INPUT COUNT  CLSN A,=5 5 INPUTS? JMP $+2 YES, OUTPUT '?' JMP IHEX1 NO, CONT. COPY ='?',A GET CHAR. JST OTTY '?' JMP IHEX+1 START OVER JMP IHEX1 GET ANOTHER CHAR. * HXTMP1 RES 1,0 TERMINATING CHAR. HXTMP2 RES 1,0 INPUT COUNT * LPOOL TITL PROGRAM UTILITIES (ODEC) ****************************** * * ODEC - THIS SUBROUTINE WILL PRINT A DECIMAL * NUMBER, CONTAINED IN THE A REG., *  IN THE RANGE OF 0 TO 9999. * * IF THE NUMBER IS GREATER THAN OR EQUAL TO * 10000, THEN '****' WILL BE PRINTED. * * CALLING SEQUENCE: * COPY =NUMBER,A * JST ODEC * ****************************** * ODEC ENT PRINT A DECIMAL NU MBER COPY X,ODTMP1 SAVE THE X REG. COPY A,ODTMP2 SAVE THE NUMBER TO BE PRINTED CSK A,=10000 IS THE NUMBER >= 10000? JMP ODEC1 NO, PRINT NUMBER NOP JST MSGA PRINT STARS MESSAGE WORD STRMSG '****' JMP ODEC6 RESTORE X REG. AND EXIT ODEC1 JGT A,ODEC2 IF NOT ZERO, PRINT NUMBER COPY ='0',A OTHERWISE, PRINT A ZERO JST OTTY PRINT IT JMP ODEC6 RESTORE X REG. AND EXIT ODEC2 COPY =ODCTBL,A GET CONVERSION TABLE ADD. COPY A,ODTMP3 SAVE ADD. COPY =0,A RESET LEADING ZEROES FLAG COPY A,ODTMP4 STORE FLAG COPY =-4,A SET DIGIT COUNT COPY A,ODTMP5 SAVE COUNT ODEC3 COPY ODTMP2,A GET NUMBER COPY =-1,X SET X TO 0-1 SUB *ODTMP3,A SUBTRACT POWER OF TEN FROM NUMBER ADD =1,X INC. THE X REG. JGE A,$-2 IF NUMBER IS NOT NEGATIVE, CONT. SUBTRACTING ADD *ODTMP3,A ADD IN LAST POWER OF TEN COPY A,ODTMP2 SAVE NUMBER JEQ X,ODEC8 IF DIGIT IS ZERO, SEE IF IT IS A LEADING ZERO COPY X,ODTMP4 SET LEADING ZEROES FLAG ODEC4 ADD ='0',X ADD IN ASCII OFFSET COPY X,A PUT INTO THE A REG. JST OTTY PRINT THE DIGIT ODEC5 IMS ODTMP3 INC. CONVERSION TABLE ADD. IMS ODTMP5 INC. DIGIT COUNT JMP ODEC3 GO FOR MORE ODEC6 COPY ODTMP1,X RESTORE THE X REG. JMP *ODEC EXIT ODEC8 COPY ODTMP4,A GET LEADING ZEROES FLAG JEQ A,ODEC5 IF RESET, DON'T PRINT A ZERO JMP ODEC4 OTHERWISE, DO PRINT A ZERO * ODCTBL WORD 1000,100,10,1 HEX TO DECIMAL CONVERSION TABLE * ODTMP1 RES 1,0 SAVED X REG. ODTMP2 RES 1,0 NUMBER TO BE PRINTED ODTMP3 RES 1,0 HEX TO DECIMAL CONVERSION TABLE ADD. ODTMP4 RES 1,0 LEADING ZEROES FLAG ODTMP5 RES 1,0 DIGIT COUNT * LPOOL TITL PROGRAM UTILITIES (CHARCK) ****************************** * * CHARCK - WILL CHECK TERMINATING INPUT * CHAR. FOR SPECIAL CHARS. * * CALLING SEQUENCE: * JST CHARCK * JMP ? UP ARROW R * JMP ? BACK ARROW R+1 * JMP ? CARRIAGE RETURN R+2 * JMP ? POUND SIGN R+3 * JMP ? ANYTHING ELSE R+4 * * ENTER WITH TERMINATING CHAR. * IN THE A-REG. * ****************************** * CHARCK ENT CHECK FOR SPECIAL CHARS. CLSN A,=UPAR: IS IT A UP ARROW? JMP *CHARCK YES, RETURN TO STD ADD. R IMS CHARCK NO, INC. RETURN ADD. CLSN A,=BCKAR: IS IT A BACK ARROW? JMP *CHARCK YES, RETURN TO ADD. R+1 IMS CHARCK NO, INC. RETURN ADD. CLSN A,=CR: IS IT A CARRIAGE RETURN? JMP *CHARCK YES, RETURN TO ADD. R+2 IMS CHARCK NO, INC. RETURN ADD. CLSN A,='#' IS IT A POUND SIGN? JMP *CHARCK YES, RETURN TO ADD. R+3 IMS CHARCK NO, INC. RETURN ADD. JMP *CHARCK ANYTHING ELSE RETURN ADD. R+4 TITL PROGRAM UTILITIES (RLPCRT) ****************************** * * RLPCRT - RESET CRT/TTY & LP * * CALLING SEQUENCE: *  JST RLPCRT * ****************************** * RLPCRT ENT SUBROUTINE ENTRANCE COPY =0,A RESET A-REG. COPY A,S PUT INTO S-REG. COPY =:100,A GET RESET COM. OUT A,DTTYDA%1;1 RESET CRT/TTY JST SEL RESET THE SCC JST CRLF OUTPUT YOU KNOW WHAT JMP *RLPCRT EXIT * LPOOL TITL PROGRAM UTILITIES (CRLF) ****************************** * * CRLF - OUTPUT CARRIAGE RETURN/LINE FEED * * CALLING SEQUENCE: * JST CRLF * ****************************** * CRLF ENT OUTPUT YOU KNOW WHAT COPY =CR:,A CARRIAGE RETURN JST OTTY SEND IT AWAY COPY =LF:,A LINE FEED JST OTTY SEND IT AWAY TOO JMP *CRLF RETURN TO WHENCE CAME FROM TITL PR OGRAM UTILITIES (MOVE) ****************************** * * MOVE - MOVE A BLK. OF DATA. THIS SUBROUTINE * IS USED TO MOVE A BLK. OF DATA FROM * ONE AREA OF MEMORY TO ANOTHER. * * ENTER WITH NEGATIVE DATA LENGTH IN THE A * REG. * * CALLING SEQUENCE: * COPY =-DATA LENGTH,A * JST MOVE * WORD AREA1 ADD. OF 'FROM AREA' *  WORD AREA2 ADD. OF 'TO AREA' * ******************************* * MOVE ENT MOVE DATA SUBROUTINE COPY A,MOVECT SAVE DATA LENGTH COPY *MOVE,A GET 'FROM' ADD. COPY A,MOVEFM SAVE ADD. IMS MOVE INC. RETURN ADD. COPY *MOVE,A GET 'TO' ADD. COPY A,MOVETO SAVE ADD. IMS MOVE INC. RETURN ADD. MOVE1 COPY *MOVEFM,A GET A WORD OF DATA COPY A,*MOVETO STORE IN NEW LOCATION IMS MOVEFM INC. 'FROM' ADD. IMS MOVETO INC. 'TO' ADD. IMS MOVECT INC. DATA LENGTH JMP MOVE1 LOOP FOR MORE JMP *MOVE EXIT * MOVECT RES 1,0 DATA LENGTH MOVEFM RES 1,0 'FROM' ADD. MOVETO RES 1,0 'TO' ADD. TITL PROGRAM UTILITIES (SETRDY) ****************************** * * SETRDY SET THE MULTI-CHANNEL TO READY * * THIS ROUTINE RESETS THE MULTI-CHANNEL * INTO A READY STATE. * * CALLING SEQUENCE: * * JST SETRDY * ****************************** * SETRDY ENT COPY =0,X SELP X,MCSDA;3 RESET MULTI-CHANNEL BOARD IJNE X,$ WAIT A LITTLE WHILE COPY =:8,X UN-RESET CODE SELP X,MCSDA;3 BOARD CONTROL WORD COPY =2,X MEANINGLESS VALUE TO... OUT X,MCSDA;1 JUST FORCE CHANNEL 0 TO TAKE COPY =:50,X FOR INTERNAL RESET (CONTROL WORD) OUT X,MCSDA;1 IN ORDER TO SEND THE...(CH 0) COPY =CRTMODE,X CRT MODE WORD OUT X,MCSDA;1 SEND CRT MODE WORD TO CH 0 JMP *SETRDY EXIT * CRTMODE EQU :BA LPOOL TITL TRAPS' AND CONSOLE INT. SERVICE ROUTINES ****************************** * * TRAP SERVICE ROUTINES * ****************************** * * UNIMPLEMENTED INSTRUCTION TRAP * UITRT ENT UNI. INSTR. TRAP SERVICE ROUTINE SIN 3 STATUS INHIBIT COPY =INSMSG,X GET TRAP MESSAGE ADD. SRT2 COPY =0,Q SET Q TO ZERO COPY Q,S SET PSW TO ZERO COPY X,SR:MSG SAVE MESSAGE ADD. JST RLPCRT RESET LP & CRT/TTY JST MSGA OUTPUT ERROR MESSAGE SR:MSG WORD 0 MESSAGE ADD. HLT WAIT HERE JMP STRTUP ELSE, GO TO QUERIES * * UNINSTALLED MEMORY TRAP * UMRT ENT UNI. MEM. TRAP SERVICE ROUTINE SIN 4 STATUS INHIBIT COPY =MEMMSG,X GET TRAP MESSAGE ADD. JMP SRT2 OUTPUT MESSAGE & CDR DISPLAY * * POWER UP * POWRUP ENT PWR. UP SERVICE ROUTINE SIN 4 STATUS INHIBIT  COPY =POWMSG,X GET TRAP MESSAGE ADD. JMP SRT2 OUTPUT MESSAGE & CDR DISPLAY * * POWER FAIL * PFRT ENT PWR. FAIL SERVICE ROUTINE HLT WAIT FOR POWER * * CHAR/NUM. EXCEPTION * CNERT ENT CHAR/NUM. EXCEP. SERVICE ROUTINE SIN 4 STATUS INHIBIT COPY =CHAMSG,X GET TRAP MESSAGE ADD. JMP SRT2 OUTPUT MESSAGE & CDR DISPLAY * * STACK OVERFLOW * SORT ENT STK. OVR. TRAP SERVICE ROUTINE SIN 4 STATUS INHIBIT COPY =STKMSG,X GET TRAP MESSAGE ADD. JMP SRT2 OUTPUT MESSAGE & CDR DISPLAY * * USER TRAP * UTRT ENT USER TRAP SERVICE ROUTINE SIN 4 STATUS INHIBIT COPY =USEMSG,X GET TRAP MESSAGE ADD. JMP SRT2 OUTPUT MESSAGE & CDR DISPLAY * * SYSTEM TRAP * STRT ENT SYSTEM TRAP SERVICE ROUTINE SIN 4 STATUS INHIBIT COPY =SYSMSG,X GET TRAP MESSAGE ADD. JMP SRT2 OUTPUT MESSAGE & CDR DISPLAY * * ARITHMETIC TRAP * AERT ENT ARIT. TRAP SERVICE ROUTINE SIN 4 STATUS INHIBIT COPY =ARIMSG,X GET TRAP MESSAGE AD D. JMP SRT2 OUTPUT MESSAGE & CDR DISPLAY * TITL ****************************** * * CONSOLE INT. SERVICE ROUTINE * * CALLS: *  RLPCRT * ****************************** * CIRT ENT CONSOLE INT. SERVICE ROUTINE SIN 2 STATUS INHIBIT COPY =0,A RESET A REG. COPY A,S RESET STATUS REG. OUT A,CONSL;INT RESET CONSOLE INT. JST RLPCRT RESET TTY/CRT & LP JMP STRTUP GO TO START UP * LPOOL TITL TABLES (RESET-PARAMETER TABLE) ****************************** * * RESET-PARAMETER TABLE * * THESE ARE THE DEFAULT PARAMETERS. * TABLE MUST BE KEPT IN ORDER. * ****************************** * PRAMSX EQU $ START OF RESET-PARAMETER TABLE * DGFLGX WORD 0 DIAG. FLAG - DEFAULT * DEVAX WORD STDDA DEVICE ADD. - DEFAULT * CHNLX WORD 0 CHNL. * BITSX WORD 0 DTR/TR, RTS/RS AND SEC. ADD. BITS * LENX WORD :100 PRIMARY BUF. LENGTH * DCLENX WORD :100 DATA CHAIN BUF. LENGTH * PATX WORD :5A TEST PATTERN * INCHADX WORD :F8 * CHADDX WORD :F8 CHNL. ADD. * LOOPX WORD 0 LOOP COUNT * PRIADDX WORD :1800 PRIMARY BUF. ADD. * DCHADDX WORD :1900 DATA CHAIN BUF. ADD. * SECSX WORD 2 TIME OUT IN SECONDS * PATINCX WORD 0 PATTERN CONTROL FLAG * SHFLGX WORD 0 SHIFT CONTROL FLAG TITL TABLES (WORKING-PARAMETER TABLE) ****************************** * * WORKING-PARAMETER TABLE * * THIS IS THE ACTUAL WORKING PARAMETER TABLE. * TABLE MUST BE KEPT IN ORDER * ****************************** * PRAMS EQU $ START OF WORKING-PARAMETER TABLE * DGFLG WORD 0 DIAG. FLAG * DEVA WORD STDDA DEVICE ADD. * CHAN: WORD 0 CHNL. SELECTION * BITS WORD 0 DTR/TR, RTS/RS AND SEC. ADD. BIT SELECTION * LEN WORD :100 PRIMARY BUF. LENGTH * DCLEN WORD :100 DATA CHAIN BUF. LENGTH * PAT WORD :5A TEST PATTERN * INCHAD WORD :F8 * CHADD WORD :F8 CHNL. ADD. * LOOP WORD 0 LOOP COUNT * PRIADD WORD :1800 PRIMARY BUFF. ADD. * DCHADD WORD :1900 DATA CHAIN BUFF. ADD. * SECS WORD 2 TIME OUT COUNT * PATINC WORD 0 PATTERN CONTROL FLAG * SHFLG WORD 0 SHIFT CONTROL FLAG * PRSIZE EQU $-PRAMS PARAMETER TABLE SIZE TITL TABLES (GLOBAL VARIABLES) ****************************** * * GLOBAL VARIABLES * * THESE VARIABLES ARE USED THROUGH OUT THE PROGRAM. * ****************************** * MESSN WORD 0 MESSAGE NUMBER * TEMP1 WORD 0 TEMP. CELL * TEMP2 WORD 0 TEMP. CELL * TEMP3 WORD 0 TEMP. CELL * SDLCF WORD :7E SDLC FLAG (INITIALIZE COM.) * IN:FLG WORD 0 NOP/INITIALIZE INT. FLAG * TX:FLG WORD 0 TX INT. FLAG * RX:FLG WORD 0 RX INT. FLAG * ENDMEM WORD -1 END OF MEMORY * MCSFLG WORD 0 MULTI-CHANNEL FLAG (0=DIO/SPI;1=MCS) * TITL TABLES TBI ****************************** * * TBIADD - TERMINATION BLOCK * ****************************** * TBIADD EQU $ TERMINATION BLOCK * RES 1,0 RX STATUS RES 1,0 RX BYTES RXD JST *TB:RX RX INT. VECTOR RES 1,0 RESERVED FOR CARTOS SAVE CONTEXT INSTRUCTION * RES 1,0 TX STATUS RES 1,0 TX BYTES TRANSFERRED JST *TB:TX TX INT. VECTOR RES 1,0 RESERVED FOR CARTOS SAVE CONTEXT INSTRUCTION * RES 1,0 NOP/INITIALIZE STATUS RES 1,0 RESERVED JST *TB:IN NOP/INITIALIZE INT. VECTOR RES 1,0 RESERVED FOR CARTOS SAVE CONTEXT INSTRUCTION * TB:RX WORD 0 RX INT. SERVICE ROUTINE ADD. TB:TX WORD 0 TX INT. SERVICE ROUTINE ADD. TB:IN WORD 0 NOP/INITIALIZE INT. SERVICE ROUTINE ADD. * TITL TABLES (CONTROL BLOCKS) ****************************** * * THESE ARE THE CONTROL BLOCKS * * CB:TX - TX CTRL. BLK. * * CB:RX - RX CTRL. BLK. * * ***************** ************* * CB:TX EQU $ TX CTRL. BLK. WORD 0 CHNL./OP CODE RES 1,0 PRIMARY BUF. ADD. RES 1,0 PRIMARY BUF. SIZE IN BYTES  RES 1,0 DATA CHAIN BUF. ADD. RES 1,0 DATA CHAIN BUF. SIZE IN BYTES * * * CB:RX EQU $ RX CTRL. BLK. WORD 0 CHNL./OP CODE RES 1,0 PRIMARY BUF. ADD. RES 1,0 PRIMARY BUF. SIZE IN BYTES RES 1,0 DATA CHAIN BUF. ADD. RES 1,0 DATA CHAIN BUF. SIZE IN BYTES * * * CB:IZ EQU $ NOP/INITIALIZE CTRL. BLK. WORD 0 CHNL./OP CODE RES 1,0 TERM. BLK./INT. ADD. RES 1,0 RESERVED RES 1,0 CHNL. ADD./SDLC FLAG RES 1,0 RESERVED TITL TABLES (OPCODE MESSAGE ADDS.) ****************************** * * THESE ARE THE ADDS. OF THE OP CODE * FUNCTION MESSAGES USED IN THE * ERROR REPORT. * ******************************* * OPMSG EQU $ START OF TABLE * WORD EROP0 NOP * WORD EROP1 TRANSMIT * WORD EROP2 RECEIVE * WORD EROP3 INITIALIZE * TITL TABLES (I/O INSTRUCTION ADDS.) ****************************** * * I/O INSTRUCTION ADDS. * ****************************** * DAFRST EQU $ * WORD DA1 ENABLE SCC INTS. * WORD DA2 SENSE SCC BUSY * WORD DA4 SEND CTRL. BLK. ADD. IN X REG. * WORD DA5 INITIATE SCC MICRODIAG. * WORD DA6 TURN ON SCC MICRODIAG. LED * DASIZ EQU $-DAFRST I/O INSTRUCTION ADD. TABLE SIZE TITL CRT/TTY/LP MESSAGES (QUERY MESSAGES) ****************************** * * QUERY MESSAGES * ****************************** * TITLE WORD CLRSCR%8;SPACE: BYTE 'SYNCHRONOUS COMMUNCIATION CONTROLLER',CR:,LF: BYTE 'COMPUTER TO COMPUTER INTERFACE TEST PROGRAM',CR:,LF: BYTE '93079-' WORD REV: BYTE CR:,LF:,'END OF MEMORY = ',0 * QRYM10 BYTE CR:,LF:,'DEVICE ADDRESS (:02)? :',0 * QRYM20 BYTE CR:,LF:,'CHNL (A)? ',0 * QRYM30 BYTE CR:,LF:,'TX (T) OR RX (R)? ',0 * QRYM40 BYTE CR:,LF:,'RTS/RS (0)? ',0 * QRYM50 BYTE CR:,LF:,'SEC. ADD. BIT (0)? ',0 * QRYM60 BYTE CR:,LF:,'CHNL. ADD. (:F8)? :',0 * QRYM61 BYTE CR:,LF:,'SWITCH CHNL. ADD.? :',0 * QRYM70 BYTE CR:,LF:,'BUFF. ADD. (:1800)? :',0 * QRYM80 BYTE CR:,LF:,'BUFF. LENGTH (:100)? :',0 * QRYM90 BYTE CR:,LF:,'DATA CHAIN BUFF. ADD. (:1900)? :',0 * QRYMA0 BYTE CR:,LF:,'DATA CHAIN BUFF. LENGTH (:100)? :',0 * QRYMB0 BYTE CR:,LF:,'PAT (:5A)? :',0 * QRYMC0 BYTE CR:,LF:,'LOOP COUNT (0)? ',0 * QRYMD0 BYTE CR:,LF:,'TIME OUT COUNT (2)? ',0 * TITL CRT/TTY/LP MESSAGES (ERROR REPORT MESSAGES) ****************************** * * ERROR REPORT MESSAGES * ****************************** * EMSG01 BYTE CR:,LF:,LF:,'ER ',0 * EMSG02 BYTE 'ER ADD ',0 * EMSG03 BYTE 'CHNL ',0 * EMSG04 BYTE 'CHNL/OPC ',0 * EMSG05 BYTE 'CTRL BLK ADD ',0 * EMSG06 BYTE 'TBI ADD ',0 * EMSG07 BYTE 'STATUS ',0 * EMSG08 BYTE 'BUF ADD ',0 * EMSG09 BYTE 'LEN ',0 * EMSG10 BYTE 'BYTS XFRD ',0 * EMSG11 BYTE 'BYTS RCVD ',0 * EMSG12 BYTE 'DATA CHAIN BUF ADD ',0 * EMSG13 BYTE CR:,LF:,'TX--',0 * EMSG14 BYTE CR:,LF:,'RX--',0 * EMSG19 BYTE CR:,LF:,'IN--',0 * EMSG20 BYTE 'CHNL ADD :',0 * TITL CRT/TTY/LP MESSAGES (OPCODE FUNCTION MESSAGES) ****************************** * * OPCODE FUNCTION MESSAGES * ****************************** * EROP0 BYTE '(NOP)',0 * EROP1 BYTE '(TRANSMIT)',0 * EROP2 BYTE '(RECEIVE)',0 * EROP3 BYTE '(INITIALIZE)',0 * TITL CRT/TTY/LP MESSAGES (TRAP/EXCEPTION MESSAGES) ****************************** * * TRAP/EXCEPTION MESSAGES * ****************************** * INSMSG BYTE CR:,LF:,'UNIMPLEMENTED INSTRUCTION TRAP',CR:,LF:,0 * MEMMSG BYTE CR:,LF:,'UNINSTALLED MEMO RY TRAP',CR:,LF:,0 * POWMSG BYTE CR:,LF:,'POWER FAIL',CR:,LF:,0 * CHAMSG BYTE CR:,LF:,'CHAR./NUM EXCEPTION',CR:,LF:,0 * STKMSG BYTE CR:,LF:,'STACK OVERFLOW',CR:,LF:,0 * USEMSG BYTE CR:,LF:,'USER TRAP',CR:,LF:,0 * SYSMSG BYTE CR:,LF:,'SYSTEM TRAP',CR:,LF:,0 * ARIMSG BYTE CR:,LF:,'ARITHMETIC TRAP',CR:,LF:,0 * TITL CRT/TTY/LP MESSAGES (MISCELLANEOUS MESSAGES) ****************************** * * MISCELLANEOUS MESSAGES * ****************************** * MESS BYTE CR:,' MESSAGE ',0 * STRMSG BYTE '****',0 * ENXMIT BYTE CR:,LF:,'ENABLE TRANSMITTER',CR:,LF:,0 * INITM BYTE CR:,LF:,' INITIALIZE ',0 * TXM BYTE CR:,LF:,' TRANSMIT ',CR:,LF:,0 * RXM BYTE CR:,LF:,' RECEIVE ',CR:,LF:,0 * IDLE BYTE CR:,LF:,' IDLE ',0 * ENDPRG EQU $ THAT'S ALL FOLKS! END STRTUP DEFAULT START-UP P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII/AS LO=TV /MACRO SCCIF(ERR) /LINK SCCIF+SF.DEBUGS(AB=1000,UL) /JO O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII  IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII! IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIe' 821124081552821124081552821124082838e@821124081552821124081552821124081552" e821124081552821124081552821124081552e821124081552821124081552821124081552821124081552821124081552821124081552e' 3 821124082720821124082753821124082753e' B821124082832821124082833821124082833# $ % & ' ( ) * + . SCCIF ASMSCCIF JCLIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII, IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII- IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII. IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII/ IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII0 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII1 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII2 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII3 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII4 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII5 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII6 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII7 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII8 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII9 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII: IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII; IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII< IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII= IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII> IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII? IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII@ IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIA IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIB IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIC IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIID IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIE IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIF IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIG IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIH IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJ IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIK IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIL IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIICARTOSMA282112408155240821124081552 821124081552' 3F07901 VOLSCC COMPUTER TO COMPUTER TEST PROGRAM