IMD 1.16: 31/08/2008 23:59:11 f07103 slave utility routine (slvutl) source/jcl diskette 84-93071-03 a0 12/13/79    @0|)v1uo)  " }jA cMIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIOS4 MCC790808141320A3790808141320 790808141320F07103 VOL   IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIM@jjggg@ o G`k򞽢_C# b# }B u[ ]e JRiCp@=<; G9P@ G=y;<": 06OS:: SYSL :B⃮ ކIIڣ5; 㜀@+kUƀy@NyC! # ' D,(!ă B # j { 9:7X@AKN1 # ܞ}K/ ** SLVUTLSRC.HLP ** / SLAVE UTILITY ROUTINE (SLVUTL) / SOURCE DISKETTE / / SLVUTL CONTAINS COMMANDS WHICH ENABLE THE / USER TO TALK TO A 4/10S SLAVE COMPUTER. / / SLVUTL.JCL - ASSEMBLY JCL / / SLVUTL.ASM - SLVUTL SOURCE / / SLVUTL.OBJ - SLVUTL OBJECT FOR LINKING / / SLVUTL.LST - SLVUTL PROGRAM LISTING / 790808141320790808141320790808141320MACRO DF.SLVUTL.OBJ=DF.SLVUTL.ASM(L=DF.SLVUTL.LST) / / FOR LISTING, ENTER C / PAUSE CO LP=DF.SLVUTL.LST(FL) JO 790808141320790808141320790808141320 TITL SLAVE UTILITY ROUTINE (SLVUTL) 93071-10A0 * SLAVE UTILITY ROUTINE (SLVUTL) 93071-10A0 * (MODIFIED FROM DLD4) * NAM SLVUTL * ERROR CODES ERSYNT EQU 0 SYNTAX ERROR * * ASCII EQUATES CR EQU : 0D CARRIAGE RETURN LF EQU :0A LINE FEED CRLF EQU :0D0A YOU GUESSED IT BA EQU  :5F BACK ARROW AF EQU :46 ASCII ; REL 0 SLVUTL EQU $ DLD:A EQU $ DLDA SBIT 6,S ALLOW 64K ADDRESSING JMP DLDA1 NORMAL ENTRY DLDLIM EQU $ WORD DLD:A BEGIN WORD DLD:Z END WORD DLDA START BYTE ' ' TYPE BYTE 'SLVUTL' BYTE '(A0) ' TITL * DLDA IS THE NORMAL EXECUTION ADDRESS. THE * USER MAY JUMP HERE AT ANY TIME. NO PARAMETERS * ARE INITIALIZED, EXCEPT THE TELETYPE LATCH. * DLDA1 COPY =13,A MOVE DLD DESCRIPTION TO JST COPY WORD DLDLIM ..SIGN-ON WORD BEGIN JST VWLINE EACHOK COPY =3,A PRINT JST OUTEXT CARRIAGE RETURN, LINE FEED,  WORD PROMPT ..PROMPT CHARACTER JST RDNAME READ THE COMMAND JMP CMDCR FOLLOWED BY CARRIAGE RETURN COPY NAME,A LOAD FIRST TWO CHARACTERS CLSN =' ',A IS IT A SINGLE CHARACTER JMP $+2 YES, MAY BE COMMAND JMP SE NO, SYNTAX ERROR SHIFT A,RO,8 COMMAND TO LOW ORDER BYTE COPY A,COMMND SAVE THE COMMAND COPY =-NADDRS,X SETUP COUNTER TO SEARCH COPY X,COUNTR ..COMMAND LIST COPY =COMCHR,Y PREPARE TO EXAMINE LIST COPY =0,X LOOP SBIT 2,S COPYB 0(X,Y),A LOAD ALLOWABLE COMMAND RBIT  2,S SUB COMMND,A SUBTRACT GIVEN COMMAND JEQ A,MATCH JUMP IF EQUAL ADD =1,X ELSE, INCREMENT X IMS COUNTR AND CHECK NEXT COMMAND JMP LOOP IF THERE IS ONE SE COPY =ERSYNT,A SYNTAX ERROR CODE COPY A,X ERROR CODE TO X COPY =ETBL,Y SBIT 2,S COPYB 0(X,Y),A LOAD ERROR SYMBOL  COPYB A,EMSG+1 STORE IN MESSAGE RBIT 2,S COPY =6,A JST OUTEXT OUTPUT ERROR MESSAGE  WORD EMSGS JMP EACHOK GET ANOTHER COMMAND PROMPT WORD CRLF BYTE '> ' ETBL BYTE 'S ' EMSGS WORD  CRLF EMSG BYTE '* E*' COMCHR BYTE 'JSMIXZQ' TITL MATCH COPY COUNTR,A LOAD INDEX TO COMMAND ADD =NADDRS,A COPY A,COMMND ADD =ADDRS,A COMPUTE INDEX TO JUMP TABLE COPY A,X COPY 0(X),X LOAD COMMAND ADDRESS JMP 0(X) JUMP THERE ADDRS EQU $ WORD STJUMP JUMP WORD STSTRT  START SLAVE PROCESSOR WORD STMOVE MOVE PROGRAM TO SLAVE PROCESSOR WORD STINSP INSPECT MEMORY LOCATION WORD STEXAM EXAMINE SLAVE PROCESSOR REGISTER WORD STSTEP SINGLE STEP SLAVE PROCESSOR WORD STSLAV SLAVE DEVICE ADDRESS SELECT NADDRS EQU $-ADDRS LPOOL TITL * * PRINT ASCII TEXT * OUTEXT ENT NEG A,A COPY A,OUTCNT STORE CHARACTER COUNT COPY OUTEXT,Y COPY 0(Y),Y  COPY =0,X BYTE INDEX TO TEXT OUTEX1 SBIT 2,S COPYB 0(X,Y),A LOAD THE CHARACTER RBIT 2,S COPY Y,SVY SAVE Y COPY OTTA,Y JST 0(Y) TYPE THE CHARACTER COPY SVY,Y RESTORE Y A DD =1,X IMS OUTCNT DONE? JMP OUTEX1 NO, GET ANOTHER CHARACTER IMS OUTEXT JMP *OUTEXT YES, RETURN OUTCNT RES 1 SVY RES 1 TITL * * PRINT A HEX WORD * OUTHEX ENT COPY =-4,X FOUR HEX DIGITS COPY X,OUTCNT OUTHE1 COPY A,OUTHLD SAVE THE NUMBER SHIFT A,RO,4 GET THE HIGH ORDER DIGIT  SHIFT A,RO,8 SUB =10,A JLT A,OUTHE2 ADD ='A',A JMP OUTHE3 OUTHE2 ADD ='0'+10,A OUTHE3 COPY OTTA,Y JST 0(Y) TYPE IT COPY OUTHLD,A RELOAD NUMBER SHIFT A,LO,4 POSITION TO NEXT CHARACTER IMS OUTCNT MORE DIGITS? JMP OUTHE1 YES, GETUM JMP *OUTHEX NO, RETURN OUTHLD RES  1 * OUSPAC ENT COPY =' ',A COPY OTTA,Y JST 0(Y) TYPE A SPACE JMP *OUSPAC TITL CMDCR COPY NAME,A CSK A,='S ' IS IT A START COMMAND? NOP JMP $+2 NO JMP START1 YES CSK A,='Z ' IS IT A SINGLE STEP COMMAND? NOP JMP $+2 NO JMP STEP1 YES  CSK A,='H ' IS IT A STOP INSTRUCTION? NOP JMP $+2 NO JMP HALT1 YES CSK  A,='K ' IS IT A RESET COMMAND? NOP JMP SE NO, ERROR JST RESET1 YES, GO TO RESET ROUTINE JMP EACHOK RETURN COMMND RES 1,0 COUNTR RES 1,0 LPOOL TITL * * VIEW ONE LINE OF FILE INFORMATION * VWLINE ENT COPY =2,A JST OUTEXT CARRIAGE RETURN, LINE FEED WORD PROMPT COPY =6,A  6 CHARACTERS JST OUTEXT TYPE IT WORD NAME JST OUSPAC SPACE COPY =12,A TYPE 12 CHARACTERS JST OUTEXT TYPE IT WORD FDATE JST OUSPAC SPACE COPY TYPE,A JEQ  A,VWLIN2 JUMP IF NO MORE DATA COPY OTTA,Y JST 0(Y) TYPE THE TYPE JST OUSPAC SPACE COPY BEGIN,A JST OUTHEX TYPE THE BEGIN ADDRESS COPY ='-',A COPY OTTA,Y JST 0(Y) TYPE A DASH COPY END,A JST OUTHEX TYPE THE END ADDRESS JST OUSPAC SPACE COPY START,A JST OUTHEX TYPE THE START ADDRESS VWLIN2 JMP *VWLINE TITL DTABLE EQU $ UNIT WORD 0 CURRENT UNIT NUMBER (0-3) UNITR RES 1 COPY FROM UNIT UNITW RES 1 COPY TO UNIT IKBA WORD IKB OTTA WORD OTT WORD DLD:A LOWER PROTECTION LIMIT WORD DLD:Z UPPER PROTECTION LIMIT AREG WORD 0 XREG WORD 0 OFFSET RES 1 RELOCATABLE LOAD OFFSET BEGIN RES 1 FIRST ADDRESS OF PROGRAM END RES 1 LAST ADDRESS OF PROGRAM. START RES 1 EXECUTION ADDR OF PROGRAM TYPE RES 1 LOAD TYPE (A OR R) NAME RES 3 FILE NAME FDATE RES 6 FILE SAVE DATE LDTABL EQU $-DTABLE TITL * * SINGLE CHARACTER COMMAND STRINGS * RESET1 ENT COPY SELVAL,Q SELECT SLAVE TO BE RESET COPY =1,X XNX Q SELP X,:00 SET PROGRAMMED RESET XNX Q SELP X,:03 CLEAR CONTROL REG JMP *RESE T1 SPACE 1 HALT1 COPY STOPI,A PUT STOP INSTRUCTION IN AREG JMP START2 SPACE 1 START1  COPY STARTI,A PUT START INSTRUCTION IN AREG START2 EXCH *SCIR,A PUT INSTRUCTION IN SLAVE INSTRUCTION REG.  JST SEND EXCH *SCIR,A RESTORE SLAVE INSTRUCTION JMP EACHOK SPACE 1 STEP1 JST CONSAV SAVE SLAVE CONTROL REGISTERS COPY STEPI,A PUT SINGLE STEP INSTRUCTION IN AREG COPY  A,*SCIR PUT INSTRUCTION IN SLAVE INST. REGISTER JST SEND SINGLE STEP THE SLAVE COPY =:310,A  OSCDR P INSTRUCTION COPY A,*SCIR JST SEND COPY =2,A JST OUTEXT WORD  PROMPT JST OUSPAC COPY *SCDR,A JST OUTHEX PRINT OUT SLAVE P REGISTER JST CONRST RESET SLAVE CONTROL REGISTERS JMP EACHOK TITL * * CHECK SYNTAX OF START AND SINGLE STEP COMMANDS * STSTRT JST SETP CHECK SYNTAX AND LOAD PREG ON SLAVE JMP START1 START SLAVE PROCESSOR SPACE 1 STSTEP JST SETP CHECK SYNTAX AND LOAD PREG ON SLAVE JMP STEP1 SINGLE STEP SLAVE PROCESSOR SPACE 1 SETP ENT JST CONSAV SAVE SLAVE CONTROL REGISTERS JST RDHEXR  GET ADDRESS FROM COMMAND FOR SLAVE PREG COPY A,*SCDR PUT ADDRESS INTO SLAVE DATA REGISTER COPY  ISCDRP,A 'INPUT SCDR TO PREG' INSTRUCTION COPY A,*SCIR PUT INTO SLAVE INSTRUCTION REGISTER JST  SEND JST CONRST RESTORE SLAVE CONTROL REGISTERS JMP *SETP * LPOOL TITL * *  CHECK SYNTAX OF INSPECT MEMORY COMMAND * STINSP EQU $ JST CONSAV SAVE SLAVE CONTROL REGISTERS  JST RDHEXR READ ADDRESS FROM COMMAND COPY A,*SCMAR PUT ADDRESS INTO SLAVE MEMORY ADDRESS REG  COPY A,T4 SAVE IN TEMPORARY LOCATION COPY OMSCDR,A 'OUTPUT MEMORY TO CDR' INSTRUCTION COPY  A,*SCIR PUT INTO SLAVE INSTRUCTION REGISTER JST SEND COPY =2,A JST OUTEXT CRLF WORD PROMPT JST OUSPAC OUTPUT A SPACE COPY *SCDR,A GET MEMORY VALUE JST OUTHEX OUTPUT TO TTY JST OUSPAC OUTPUT A SPACE JST CONRST RESTORE SLAVE CONTROL REGISTERS JST RDHEXT READ NEW MEMORY CONTENTS JMP STI1 NO INPUT; RETURN COPY  A,*SCDR PUT INPUT INTO SLAVE DATA REGISTER COPY T4,A GET ADDRESS AGAIN COPY A,*SCMAR PUT IT IN SLAVE MEMORY ADDRESS REGISTER COPY IMSCDR,A 'INPUT TO MEMORY FROM SCDR' INSTRUCTION COPY A,*SCIR PUT IT INTO SLAVE INSTRUCTION REGISTER JST SEND JST CONRST RESTORE SLAVE CONTROL REGISTERS STI1 JMP EACHOK RETURN TITL * * CHECK SYNTAX OF JUMP COMMAND * J,ADDR STJUMP EQU $ JST RDHEXR JUMP ADDRESS COPY A,START COPY START,Y JMP 0(Y) SPACE 1 * * SEND ROUTIN E FOR SLAVE CONTRTOL INSTRUCTIONS * SEND ENT COPY A,T5 SAVE A REGISTER COPY Q,T6 SAVE Q REGISTER COPY =1,A COPY SELVAL,Q XNX Q SELECT CORRECT SLAVE SELP A,:02 REQUEST SLAVE CONTROL SERVICE FROM SLAVE XNX Q SST :02 HAS SLAVE DONE SLAVE CONTROL SERVICE YET ? JMP $+2 YES JMP $-3 NOT YET COPY T5,A RESTORE A REGISTER  COPY T6,Q RESTORE Q REGISTER JMP *SEND TITL REGTBL WORD :41 A WORD :50 P WORD :58 X WORD :53 S WORD :51 Q WORD :4C L WORD :59 Y WORD :4B K SPACE 1 OSCDRI WORD :300 OUTPUT FROM REGISTER TO SCDR INSTRUCTION ISCDRI WORD :301 INPUT TO REGISTER FROM SCDR INSTRUCTION OMSCDR WORD :302 OUTPUT FROM MEMORY TO SCDR INSTRUCTION IMSCDR WORD :303 INPUT TO MEMORY FROM SCDR INSTRUCTION STOPI  WORD :304 STOP SLAVE PROCESSOR INSTRUCTION STEPI WORD :305 SINGLE STEP SLAVE PROCESSOR INSTRUCTION STARTI WORD :306 START SLAVE PROCESSOR INSTRUCTION ISCDRP WORD :311 INPUT TO PREG FROM SCDR SPACE 1 T1 RES 1,0 TEMP 1 T2 RES 1,0 TEMP 2 T3 RES 1,0 TEMP 3 T4 RES 1,0 TEMP 4 T5 RES 1,0 TEMP K T6 RES 1,0 TEMP 6 SELVAL WORD :F0  SELECT SLAVE VALUE SCIR WORD :100 SLAVE CONTROL INSTRUCTION REGISTER SCDR WORD :101 SLAVE CONTROL DATA REGISTER SCMAR WORD :102 SLAVE CONTROL MEMORY ADDRESS REGISTER LPOOL TITL * * CHECK SYNTAX OF EXAMINE REGISTER COMMAND * STEXAM EQU $ JST RDCHAR READ REGISTER SELECTION FROM TTY COPY =-8,X COUNT FOR TABLE SEARCH COPY X,STX4 COPY =REGTBL,X GET ADDRESS OF REGISTER TABLE STX1  CSK A,0(X) CHECK IF SAME AS REGISTER SELECTED NOP JMP $+2 NOT FOUND YET JMP STX2 FOUND MATCH - FINISH COMMAND ADD =1,X INCREMENT TABLE POINTER IMS STX4  INCREMENT COUNT JMP STX1 CONTINUE SEARCH JMP SE SELECTION NOT IN TABLE - SYNTAX ERROR STX2 JST RDCHAR READ TERMINATING CHARACTER CSK A,=CR SHOULD BE A CARRIAGE RETURN  NOP JMP SE IT'S NOT - SYNTAX ERROR JST CONSAV SAVE SLAVE CONTROL REGISTERS SUB =REGTBL,X SUBTRACT TABLE BASE ADDRESS SHIFT X,LO,4 ALIGN FOR INSTRUCTION FIELD COPY X,T4  SAVE FOR WRITE OPERATION ADD OSCDRI,X BUILD OUTPUT FROM REGISTER INSTRUCTION COPY X,*SCIR  PUT INTO SLAVE INSTRUCTION REGISTER JST SEND TITL COPY =2,A JST OUTEXT CRLF WORD PROMPT JST OUSPAC OUTPUT SPACE COPY *SCDR,A GET REGISTER CONTENTS   JST OUTHEX OUTPUT IT TO TTY JST OUSPAC OUTPUT SPACE JST CONRST RESTORE SLAVE CONTROL REGISTERS JST RDHEXT READ NEW REGISTER CONTENTS FROM TTY JMP STX3 NO INPUT; RETURN COPY A,*SCDR PUT NEW CONTENTS INTO SLAVE DATA REGISTER COPY T4,X GET REGISTER TO WRITE TO  ADD ISCDRI,X BUILD INPUT TO REGISTER INSTRUCTION COPY X,*SCIR PUT IT IN SLAVE INSTRUCTION REGISTER JST SEND JST CONRST RESTORE SLAVE CONTROL REGISTERS STX3 JMP EACHOK RETURN STX4 RES 1,0 TABLE SEARCH COUNT CELL TITL * * CHECK SYNTAX OF MOVE COMMAND * STMOVE EQU $  JST RDHEXC READ START-OF-SOURCE ADDRESS COPY A,BEGIN SAVE START-OF-SOURCE ADDRESS JST RDHEXC READ END-OF-SOURCE ADDRESS COPY A,END SAVE END-OF-SOURCE ADDRESS JST RDHEXR READ DESTINATION ADDRESS  COPY A,START SAVE DESTINATION ADDRESS JST CONSAV SAVE SLAVE CONTROL REGISTERS COPY STOPI,A 'STOP SLAVE' INSTRUCTION COPY A,*SCIR PUT INTO SLAVE INSTRUCTION REGISTER JST SEND  JST RESET1 COPY ISCDRP,A 'INPUT SCDR TO SLAVE PREG' INSTRUCTION COPY A,*SCIR PUT INTO SLAVE INSTRUCTION REGISTER COPY =M410S1,A GET ADDRESS OF MOVE ROUTINE OR L8000,A ADD OFFSET OF PUBLIC MEMORY COPY A,*SCDR PUT ADDRESS INTO SLAVE DATA REGISTER JST SEND COPY STARTI,A 'START SLAVE' INSTRUCTION COPY A,*SCIR PUT INTO SLAVE INSTRUCTION REGISTER JST SEND JST CONRST RESTORE SLAVE CONTROL REGISTERS SBIT 8,S ENABLE INTERRUPTS JMP $  WAIT FOR INTERRUPT STM2 ENT SLAVE INTERRUPT RETURN COPY =:FFA0,A SET UP TIMOUT LOOP  COPY A,T6 IMS T6 JMP $-1 JST RESET1 JMP *$+1 RETURN WORD EACHOK ADDRESS TITL * * CHECK SYNTAX OF SLAVE DEVICE ADDRESS SELECT * Q,00X0 WHERE X IS A VALUE WITHIN :1-:F * STSLAV EQU $ JST RDHEXR READ DEVICE ADDRESS SELECT COPY A,T6 SAVE VALUE FOR LATER AND =:FF0F,A TEST FOR VALID DEVICE ADDRESS JNE A,SE: INVALID DEVICE ADDRESS  COPY T6,A GET VALUE AGAIN JEQ A,SE: ZERO IS A RESERVED DEVICE ADDRESS COPY A,SELVAL PUT DEVICE ADDRESS IN SELECT D. A. VALUE JMP EACHOK RETURN SE: JMP SE LPOOL TITL * * SAVE SLAVE CONTROL REGISTERS (:100, :101, :102) * CONSAV ENT COPY *SCIR,A SLAVE CONTROL INSTRUCTION REGISTER COPY A,T1 COPY *SCDR,A SLAVE CONTROL DATA REGISTER COPY A,T2 COPY *SCMAR,A SLAVE CONTROL MEMORY ADDRESS REGISTER COPY A,T3 JMP *CONSAV * * RESTORE SLAVE CONTROL REGISTERS * CONRST ENT COPY T1,A COPY A,*SCIR INSTRUCTION REGISTER COPY T2,A   COPY A,*SCDR DATA REGISTER COPY T3,A COPY A,*SCMAR MEMORY ADDRESS REGISTER JMP *CONRST TITL * * READ A HEX NUMBER FROM TTY. RETURN TO ENT IF NO INPUT * ELSE, RETURN TO ENT+1 * RDHEXT ENT JST RDHEXR READ HEX NUMBER COPY RDHEX4,X GET INPUT CHARACTER COUNT NEG X,X CSK X,=4 CHECK FOR INPUT IMS RDHEXT YES NOP JMP *RDHEXT NO INPUT * * READ HEX TO A COMMA RDHEXC ENT JST RDHEX CLSN =',',X JMP *RDHEXC JMP SE * * READ HEX TO A CARRIGE RETURN RDHEXR ENT JST RDHEX CLSN =CR,X JMP *RDHEXR JMP SE LPOOL TITL * * READ A NAME. STORE IN NAME,NAMEW,AND NAMER. * RETURN TO ENT IF CR. RETURN TO ENT+1 IF COMMA. RDNAME ENT  COPY =-6,X MAXIMUM 6 CHARACTERS COPY X,RDNCNT COPY =0,X CREATE A BYTE INDEX TO NAME COPY X,UNAME COPY =' ',A BLANK NAME COPY A,NAME COPY A,NAME+1 COPY A,NAME+2 COPY =NAME,Y WORD ADDRESS OF NAME RDNAM1 JST RDCHAR GET A CHARACTER COPY A,Q SUB ='0',A TEST FOR ALPHANUMERIC(AN) JLT A,RDNAM3 NOT AN IF LESS THAN ZERO SUB =':'-'0',A JLE A,RDNAM2 AN IF BETWEEN 0-9  SUB ='A'-':',A JLT A,RDNAM3 NOT AN IF LESS THAN A SUB ='Z'-'A',A JGT A,RDNAM3 NOT AN IF GREATER THAN Z RDNAM2 COPY UNAME,X BYTE INDEX TO X SBIT 2,S COPYB Q,0(X,Y) STORE CHARACTER IN NAME BYTE ADDRESS(Y) * INDEXED BY X RBIT 2,S IMS UNAME INCREMENT STORE LOCATION IMS RDNCNT CAN I GET ANOTHER CHARACTER? JMP RDNAM1 YES, GET IT JST RDCHAR NO, GET TERMINATING CHARACTER COPY A,Q RDNAM3 COPY RDNCNT,A MAKE SURE THERE IS AT ADD =6,A LEAST ONE CHARACTER JEQ A,RDNAM4 COPY Q,A CLSN =CR,A JMP *RDNAME IMS RDNAME CLSN =',',A JMP *RDNAME RDNAM4 JMP SE RDNCNT RES 1 UNAME RES 1 SPACE 6 * * READ A CHARACTER FROM TTY. RESULT IN A. * QUIT IF BACK ARROW RDCHAR ENT JST IKB GET A CHARACTER CLSN =BA,A IS IT BACK ARROW? JMP EACHOK YES, GET ANOTHER COMMAND JMP *RDCHAR NOW FINISHED LPOOL TITL * * READ A HEX NUMBER FROM TTY * RESULT IN A. TERMINATING CHARACTER IN X. RDHEX ENT COPY =0,A COPY A,RDHEX5 ZERO THE HEX SUM COPY =-4,X COPY X,RDHEX4 MAXIMUM 4 HEX DIGITS RDHEX1 JST RDCHAR GET A CHARACTER COPY A,RDHEX6 SAVE IT SUB =AF,A COMPARE TO F JGT A,RDHEX3 STOP IF GREATER ADD ='F'-'A',A COMPARE TO A JGE A,RDHEX2 HEX DIGIT IF GREATER OR EQUAL ADD ='A'-'0',A COMPARE TO 0 JLT A,RDHEX3 STOP IF LESS SUB =':'-'0',A COMPARE TO 9 JGT A,RDHEX3 STOP IF GREATER RDHEX2 ADD =10,A CONVERT TO HEX DIGIT EXCH RDHEX5,A UPDATE HEX SUM SHIFT A,LO,4 SHIFT SUM OVER OR RDHEX5,A ADD IN NEW DIGIT COPY A,RDHEX5 SAVE UPDATED SUM   IMS RDHEX4 MORE DIGITS? JMP RDHEX1 YES, TRY TO GET ONE JST RDCHAR NO, GET TERMINATING CHAR  COPY A,RDHEX6 RDHEX3 COPY RDHEX6,X LOAD TERMINATING CHAR COPY RDHEX5,A LOAD HEX SUM JMP *RDHEX  RETURN RDHEX4 RES 1 CHARACTER COUNT RDHEX5 RES 1 ACCUMULATE HEX RDHEX6 RES 1 SAVE CHAR TITL * * COPY WORDS. COUNT IN A. TO AND FROM * ADDRESSES IN ARGUMENT LIST. * COPY ENT NEG A,A COPY  A,COPYCT STORE NEGATIVE COUNT COPY COPY,X COPY 0(X),X FROM POINTER IN X IMS COPY BUMP RETURN POINTER COPY COPY,Y COPY 0(Y),Y TO POINTER IN Y IMS COPY BUMP RETURN POINTER COPYLP COPY 0(X),A READ FROM COPY A,0(Y) STORE TO ADD =1,X INCREMENT TO POINTER ADD =1,Y INCREMENT TO POINTER IMS COPYCT INCREMENT COUNT JMP COPYLP CONTINUE JMP *COPY RETURN COPYCT RES 1,0 TITL * * SLAVE PROCESSOR MOVE ROUTINE * M410S1 SBIT 6,S TURN ON EXTENDED ADDRESSING  COPY *BEGINP,X GET THE BEGINNING SOURCE ADDRESS ADD L8000,X SET FOR PUBLIC MEMORY COPY *STARTP,Y GET THE BEGINNING DESTINATION ADDRESS COPY *ENDP,Q GET THE ENDING SOURCE ADDRESS OR L8000,Q SET FOR PUBLIC MEMORY M410S2 COPY 0(X),A GET A WORD OF SOURCE COPY A,0(Y) PUT IN A DESTINATION WORD CSM X,Q FINISHED YET JMP $+3 NOT YET NOP YES JMP M410S3 YES ADD =1,X GET ADDRESS OF NEXT SOURCE WORD ADD =1,Y GET ADDRESS OF NEXT DESTINATION WORD JMP M410S2 CONTINUE MOVING M410S3 COPY JST1,Q SET UP EXCH Q,*L8004 HOST COPY =STM2,X INTERRUPT EXCH X,*L8005 VECTOR COPY =5,A  SELP A,:FF INTERRUPT HOST SST :FF CHECK FOR INTERRUPT SERVICED JMP $+2  YES JMP $-2 NOT YET EXCH Q,*L8004 RESTORE HOST EXCH X,*L8005 INTERRUPT VECTOR HLT TITL JST1 JST *$+1 L8000 WORD :8000 L8004 WORD :8004 L8005 WORD :8005 BEGINP WORD BEGIN+:8000 START-OF-SOURCE STARTP WORD START+:8000 START-OF-DESTINATION ENDP WORD END+:8000 END-OF-SOURCE * * LPOOL TITL * * FOR KEYBOARD INPUT * JST IKB * * RETURN(AR WILL CONTAIN THE CHARACTER) * * FOR TTY OUTPUT * LDA CHARACTER * JST OTT * * RETURN * * IN BOTH ROUTINES, XR IS UNCHANGED, * CPU MUST BE IN WORD MODE. INTERRUPTS ARE * DISABLED FOR THE TIME OF CHARACTER INPUT * * DTTYDA EQU :7C DIO TTY DEVICE ASSIGNMENT IKB ENT JST IN COPY =:8618,A START,ECHO,NO INTERRUPT OUT A,DTTYDA%1;1 COPY =:100,X  RESET CODE IN DTTYDA%1;1,A SHIFT A,RO,4 DATA READY TO OV JF OV,$-2 IF DATA NOT READY  IN DTTYDA%1,A OUT X,DTTYDA%1;1 AND =:7F,A TURN PARITY BIT OFF JST OUT JMP * IKB OTT ENT JST IN COPY =:8612,X START,REQUEST TO SEND,DONT INTERRUPT OUT X,DTTYDA%1;1 OUT A,DTTYDA%1 COPY =:100,X RESET CODE IN DTTYDA%1;1,A SHIFT A,RO,5 JT OV,$-2 IN DTTYDA%1;1,A SHIFT A,RO,5 JF OV,$-2 OUT X,DTTYDA%1;1 JST OUT JMP *OTT IN ENT COPY X,HOLDX COPY S,X COPY X,HOLDS RBIT 8,S JMP *IN HOLDX RES 1 HOLDS RES 1 OUT ENT COPY HOLDS,X SHIFT X,RO,3 JF OV,$+2 SBIT 8,S COPY HOLDX,X  JMP *OUT LPOOL RES $;:FF-$&:FF+1,0 DLD:Z EQU $-1 END SLVUTL JT OV,$-2 IN DTTYDA%1;1,A SHIFT A,RO,5 JF OV,$-2 OUT X,DTTYDA%1;1 JST OUT JMP *OTT IN ENT COPY X,HOLDX COPY S,X COPY X,HOLDS RBIT 8,S JMP *IN HOLDX RES 1 HOLDSJSLVUTL O0SEGMENTBLANK oige SLVUTL(A0)  6  y() %'X+x %' 9 ^ > S * E*JSMIXZQ  ׊  +Z/<8G  |@ )%'߼@+ރvonop  ({9y  A :@1nrn  @{Ǻֺ ׺̺ S Z H K  36 0U , QM⑼@L7 -⋼@2D/dcp  )C $C $x瞁 ɓ5 6 ῕&jm ւ̇Ӿw ST/\Up tx m6 kj a`! @ Ơ Ÿ C C |–rAPX SQLYK (и+ޞy ¾ή.1bVd> 6 b__ȾϞYSHU/W ͇ˇ·>H"= DB6> 54~ .Ă+B*/ +=@\  x   x ! -zx ,,|V , |Q,  ()⥾ @    I% 'ޏލo@ F@ ]\ ,Z( _{   (o O D  I 1ކo^e-./  |zy@w@+kނzp eÜ@ F +kw‹ӌ }ӄ ̀΀  96" s "I6=I 6"q 0z  }.)6xyo81 2030 0717 COPY S,X 0282 A683 0286 0718 COPY X,HOLDS 0283 0E87 0719 RBIT 8,S 0284 9F7A 027F 0720 JMP *IN 0285 0721 HOLDX RES 1 0286 0722 HOLDS RES  1 0287 0E0D 0723 OUT ENT 0288 A27D 0286 0724 COPY HOLDS,X 0289 2E29 0725 SHIFT 1PAGE 0001 MACRO (D0) SLAVE UTILITY ROUTINE (SLVUTL) 93071-10A0 1979/08/08 19:29:12.00 0002 *  SLAVE UTILITY ROUTINE (SLVUTL) 93071-10A0 0003 * (MODIFIED FROM DLD4) 0004 *   0000 0005 NAM SLVUTL 0006 * ERROR CODES 00000000 0007 ERSYNT EQU 0  SYNTAX ERROR 0008 * 0009 * ASCII EQUATES 0000000D 0010 CR EQU  :0D CARRIAGE RETURN 0000000A 0011 LF EQU :0A LINE FEED 00000D0A 0012 CRLF  EQU :0D0A YOU GUESSED IT 0000005F 0013 BA EQU :5F BACK ARROW 00000046 0014 AF EQU :46 ASCII ; 0000 0001 0015 REL 0 00000000 0016 SLVUTL EQU $ 00000000 0017 DLD:A EQU $ 0000 0E65 0018 DLDA SBIT 6,S ALLOW 64K ADDRESSING 0001 9E8D 000F 0019 JMP DLDA1 NORMAL ENTRY 00000002 0020 DLDLIM EQU $ 0002 0000 0021  WORD DLD:A BEGIN 0003 02FF 0022 WORD DLD:Z END 0004 0000 0023 WORD DLDA START 0005 2020 0024 BYTE ' ' TYPE 0006 534C 0025 BYTE  'SLVUTL' 0007 5655 0008 544C 0009 2841 0026 BYTE '(A0) ' 000A 3029 000B 2020 000C 2020 000D 2020 000E 2020 1PAGE 0002 MACRO (D0) SLAVE UTILITY ROUTINE (SLVUTL) 93071-10A0 1979/08/08 19:29:14.00 0028 * DLDA IS THE NORMAL EXECUTION ADDRESS. THE 0029 * USER MAY JUMP HERE AT ANY TIME. NO PARAMETERS  0030 * ARE INITIALIZED, EXCEPT THE TELETYPE LATCH. 0031 * 000F 090D 0032 DLDA1 COPY =13,A MOVE DLD DESCRIPTION TO 0010 BFBE 004F 0033 JST COPY 0011 0002 0034 WORD DLDLIM ..SIGN-ON 0012 00CC 0035 WORD BEGIN 0013 BFBC 0050 0036 JST VWLINE 0014 0903  0037 EACHOK COPY =3,A PRINT 0015 BEC6 005C 0038 JST OUTEXT CARRIAGE RETURN, LINE FEED, 0016 0036 0039 WORD PROMPT ..PROMPT CHARACTER 0017 BFB9 0051 0040 JST RDNAME  READ THE COMMAND 0018 9EEF 0088 0041 JMP CMDCR FOLLOWED BY CARRIAGE RETURN 0019 83B4 004E 0042  COPY NAME,A LOAD FIRST TWO CHARACTERS 001A 0C20 0043 CLSN =' ',A IS IT A SINGLE CHARACTER 001B 9E81 001D 0044 JMP $+2 YES, MAY BE COMMAND 001C 9E8E 002B 0045 JMP SE NO, SYNTAX ERROR 001D 0E79 0046 SHIFT A,RO,8 COMMAND TO LOW ORDER BYTE 001E 86FB 009A 0047 COPY A,COMMND SAVE THE COMMAND 001F 28F9 0048 COPY =-NADDRS,X SETUP COUNTER TO SEARCH 0020 A6FA 009B 0049 COPY X,COUNTR ..COMMAND LIST 0021 E2B0 0052 0050 COPY =COMCHR,Y  PREPARE TO EXAMINE LIST 0022 2900 0051 COPY =0,X 0023 0E25 0052 LOOP SBIT 2,S 0024 80C0 0000 0053 COPYB 0(X,Y),A LOAD ALLOWABLE COMMAND 0025 0E27 0054 RBIT 2,S 0026 8EF3 009A  0055 SUB COMMND,A SUBTRACT GIVEN COMMAND 0027 1158 0040 0056 JEQ A,MATCH JUMP IF EQU  AL 0028 2B01 0057 ADD =1,X ELSE, INCREMENT X 0029 DEF1 009B 0058 IMS COUNTR  AND CHECK NEXT COMMAND 002A 9E78 0023 0059 JMP LOOP IF THERE IS ONE 002B 0900 0060 SE  COPY =ERSYNT,A SYNTAX ERROR CODE 002C 2000 0061 COPY A,X ERROR CODE TO X 002D E2A5 0053 0062 COPY =ETBL,Y 002E 0E25 0063 SBIT 2,S 1PAGE 0003 MACRO (D0) SLAVE UTILITY ROUTINE (SLVUTL) 93071-10A0 1979/08/08 19:29:16.75 002F 80C0 0000 0064 COPYB 0(X,Y),A LOAD ERROR SYMBOL 0030 8693 0075 0065 COPYB A,EMSG+1 STORE IN MESSAGE 0031 0E27 0066 RBIT 2,S 0032 0906 0067  COPY =6,A 0033 BEA8 005C 0068 JST OUTEXT OUTPUT ERROR MESSAGE 0034 0039 0069  WORD EMSGS 0035 9E5E 0014 0070 JMP EACHOK GET ANOTHER COMMAND 0036 0D0A 0071 PROMPT WORD CRLF 0037 3E20 0072 BYTE '> ' 0038 5320 0073 ETBL BYTE 'S ' 0039 0D0A 0074 EMSGS WORD CRLF 003A 2A20 0075 EMSG BYTE '* E*' 003B 452A 003C 4A53 0076 COMCHR BYTE 'JSMIXZQ' 003D 4D49 003E 585A 003F 5120 1PAGE 0004 MACRO (D0) SLAVE UTILITY ROUTINE (SLVUTL) 93071-10A0 1979/08/08 19:29:17.25  0040 82DA 009B 0078 MATCH COPY COUNTR,A LOAD INDEX TO COMMAND 0041 0B07 0079 ADD =NADDRS,A 0042 86D7 009A 0080 COPY A,COMMND 0043 8A90 0054 0081 ADD =ADDRS,A COMPUTE INDEX TO JUMP TABLE 0044 2000 0082 COPY A,X 0045 A080 0000 0083 COPY 0(X),X LOAD COMMAND ADDRESS  0046 9C80 0000 0084 JMP 0(X) JUMP THERE 00000047 0085 ADDRS EQU $ 0047 012B 0086 WORD STJUMP JUMP 0048 00F7 0087 WORD STSTRT START SLAVE PROCESSOR 0049 0183 0088 WORD STMOVE MOVE PROGRAM TO SLAVE PROCESSOR 004A 0112 0089 WORD STINSP  INSPECT MEMORY LOCATION 004B 015A 0090 WORD STEXAM EXAMINE SLAVE PROCESSOR REGISTER 004C 00F9  0091 WORD STSTEP SINGLE STEP SLAVE PROCESSOR 004D 01A2 0092 WORD STSLAV SLAVE DEVICE ADDRESS SELECT 00000007 0093 NADDRS EQU $-ADDRS 000E 0094 LPOOL 004E 00D0 NAME 004F 022F COPY 0050 00A6 VWLINE 0051 01DD RDNAME 0052 003C COMCHR 0053 0038 ETBL 0054 0047 ADDRS 0055 0056 0057 0058  0059 005A 005B 1PAGE 0005 MACRO (D0) SLAVE UTILITY ROUTINE (SLVUTL) 93071-10A0 1979/08/08 19:29:18.75 0096 * 0097 * PRINT ASCII TEXT 0098 * 005C 0E0D 0099 OUTEXT ENT 005D 0001 0100 NEG A,A 005E 868F 006E 0101 COPY A,OUTCNT STORE CHARACTER COUNT 005F E27C 005C 0102  COPY OUTEXT,Y 0060 E040 0000 0103 COPY 0(Y),Y 0061 2900 0104 COPY =0,X  BYTE INDEX TO TEXT 0062 0E25 0105 OUTEX1 SBIT 2,S 0063 80C0 0000 0106 COPYB 0(X,Y),A LOAD TH  E CHARACTER 0064 0E27 0107 RBIT 2,S 0065 E689 006F 0108 COPY Y,SVY SAVE Y 0066 E2DF 00C6 0109 COPY OTTA,Y 0067 BC40 0000 0110 JST 0(Y) TYPE THE CHARACTER 0068 E286 006F 0111 COPY SVY,Y RESTORE Y 0069 2B01 0112 ADD =1,X 006A DE83 006E 0113 IMS OUTCNT DONE? 006B 9E76 0062 0114 JMP OUTEX1 NO, GET ANOTHER CHARACTER 006C DE6F 005C 0115 IMS OUTEXT 006D 9F6E 005C 0116 JMP *OUTEXT YES, RETURN 006E 0117 OUTCNT  RES 1 006F 0118 SVY RES 1 1PAGE 0006 MACRO (D0) SLAVE UTILITY ROUTINE (SLVUTL) 93071-10A0 1979/08/08 19:29:20.25 0120 * 0121 * PRINT A HEX WORD 0122 * 0070 0E0D  0123 OUTHEX ENT 0071 28FC 0124 COPY =-4,X FOUR HEX DIGITS 0072 A67B 006E 0125 COPY  X,OUTCNT 0073 868E 0082 0126 OUTHE1 COPY A,OUTHLD SAVE THE NUMBER 0074 0E39 0127 SHIFT A,RO,4 GET THE HIGH ORDER DIGIT 0075 0E79 0128 SHIFT A,RO,8 0076 0AF6 0129 SUB =10,A 0077 13C2 007A 0130 JLT A,OUTHE2 0078 0B41 0131 ADD ='A',A 0079 9E81 007B 0132  JMP OUTHE3 007A 0B3A 0133 OUTHE2 ADD ='0'+10,A 007B E2CA 00C6 0134 OUTHE3 COPY OTTA,Y 007C BC40 0000 0135 JST 0(Y) TYPE IT 007D 8284 0082 0136 COPY OUTHLD,A RELOAD NUMBER 007E 0E31 0137 SHIFT A,LO,4 POSITION TO NEXT CHARACTER 007F DE6E 006E 0138 IMS OUTCNT  MORE DIGITS? 0080 9E72 0073 0139 JMP OUTHE1 YES, GETUM 0081 9F6E 0070 0140 JMP *OUTHEX NO, RETURN 0082 0141 OUTHLD RES 1 0142 * 0083 0E0D 0143 OUSPAC ENT 0084 0920 0144 COPY =' ',A 0085 E2C0 00C6 0145 COPY OTTA,Y 0086 BC40 0000 0146 JST 0(Y) TYPE A SPACE 0087 9F7B 0083 0147 JMP *OUSPAC 1PAGE 0007 MACRO (D0) SLAVE UTILITY ROUTINE (SLVUTL) 93071-10A0 1979/08/08 19:29:21.50 0088 82C7 00D0 0149 CMDCR COPY NAME,A 0089 BA94 009E 0150 CSK A,='S ' IS IT A START COMMAND? 008A 0000 0151 NOP 008B 9E81 008D 0152 JMP $+2  NO 008C 9ED6 00E3 0153 JMP START1 YES 008D BA91 009F 0154 CSK A,='Z ' IS IT A SINGLE STEP COMMAND? 008E 0000 0155 NOP 008F 9E81 0091 0156 JMP $+2 NO 0090 9ED7 00E8 0157 JMP STEP1 YES 0091 BA8E 00A0 0158 CSK A,='H ' IS IT A STOP INSTRUCTION? 0092 0000 0159 NOP 0093 9E81 0095 0160 JMP $+2 NO 0094 9ECC 00E1 0161  JMP HALT1 YES 0095 BA8B 00A1 0162 CSK A,='K ' IS IT A RESET COMMAND? 0096 0000 0163 NOP 0097 9E13 002B 0164 JMP SE NO, ERROR 0098 BEC0 00D9 0165 JST RESET1   YES, GO TO RESET ROUTINE 0099 9F83 009D 0166 JMP EACHOK RETURN 009A 0000 0167 COMMND RES 1,0 009B 0000 0168 COUNTR RES 1,0 000A 0169 LPOOL 009C 00C6 OTTA 009D 0014 EACHOK 009E 5320 009F 5A20 00A0 4820 00A1 4B20 00A2 00A3 00A4 00A5 1PAGE 0008 MACRO (D0) SLAVE UTILITY ROUTINE (SLVUTL) 93071-10A0 1979/08/08 19:29:22.75 0171 * 0172 * VIEW ONE LINE OF FILE INFORMATION  0173 * 00A6 0E0D 0174 VWLINE ENT 00A7 0902 0175 COPY =2,A 00A8 BE33 005C 0176  JST OUTEXT CARRIAGE RETURN, LINE FEED 00A9 0036 0177 WORD PROMPT 00AA 0906 0178  COPY =6,A 6 CHARACTERS 00AB BE30 005C 0179 JST OUTEXT TYPE IT 00AC 00D0 0180  WORD NAME 00AD BE55 0083 0181 JST OUSPAC SPACE 00AE 090C 0182 COPY =12,A  TYPE 12 CHARACTERS 00AF BE2C 005C 0183 JST OUTEXT TYPE IT 00B0 00D3 0184 WORD  FDATE 00B1 BE51 0083 0185 JST OUSPAC SPACE 00B2 829C 00CF 0186 COPY TYPE,A 00B3 114D 00C1 0187 JEQ A,VWLIN2 JUMP IF NO MORE DATA 00B4 E291 00C6 0188 COPY OTTA,Y 00B5 BC40 0000 0189 JST 0(Y) TYPE THE TYPE 00B6 BE4C 0083 0190 JST OUSPAC SPACE 00B7 8294 00CC 0191 COPY BEGIN,A 00B8 BE37 0070 0192 JST OUTHEX TYPE THE BEGIN ADDRESS 00B9 092D  0193 COPY ='-',A 00BA E28B 00C6 0194 COPY OTTA,Y 00BB BC40 0000 0195 JST 0(Y) TYPE A DASH 00BC 8290 00CD 0196 COPY END,A 00BD BE32 0070 0197 JST OUTHEX TYPE THE END ADDRESS 00BE BE44 0083 0198 JST OUSPAC SPACE 00BF 828E 00CE 0199 COPY START,A 00C0 BE2F 0070 0200 JST OUTHEX TYPE THE START ADDRESS 00C1 9F64 00A6 0201 VWLIN2 JMP *VWLINE 1PAGE 0009 MACRO (D0) SLAVE UTILITY ROUTINE (SLVUTL) 93071-10A0 1979/08/08 19:29:24.75 000000C2 0203 DTABLE EQU  $ 00C2 0000 0204 UNIT WORD 0 CURRENT UNIT NUMBER (0-3) 00C3 0205 UNITR RES 1 COPY FROM UNIT 00C4 0206 UNITW RES 1 COPY TO UNIT 00C5 0263 0207 IKBA  WORD IKB 00C6 0270 0208 OTTA WORD OTT 00C7 0000 0209 WORD DLD:A LOWER PROTECTION LIMIT 00C8 02FF 0210 WORD DLD:Z UPPER PROTECTION LIMIT 00C9 0000 0211 AREG WORD 0 00CA 0000 0212 XREG WORD 0 00CB 0213 OFFSET RES 1 RELOCATABLE LOAD OFFSET 00CC 0214 BEGIN RES 1 FIRST ADDRESS OF PROGRAM 00CD 0215 END RES 1  LAST ADDRESS OF PROGRAM. 00CE 0216 START RES 1 EXECUTION ADDR OF PROGRAM 00CF 0217 TYPE RES 1 LOAD TYPE (A OR R) 00D0 0218 NAME RES 3 FILE NAME 00D3   0219 FDATE RES 6 FILE SAVE DATE 00000017 0220 LDTABL EQU $-DTABLE 1PAGE 0010 MACRO (D0) SLAVE UTILITY ROUTINE (SLVUTL) 93071-10A0 1979/08/08 19:29:25.75 0222 * 0223 *  SINGLE CHARACTER COMMAND STRINGS 0224 * 00D9 0E0D 0225 RESET1 ENT 00DA C2F8 0153 0226  COPY SELVAL,Q SELECT SLAVE TO BE RESET 00DB 2901 0227 COPY =1,X 00DC 430A 0228  XNX Q 00DD 2400 0229 SELP X,:00 SET PROGRAMMED RESET 00DE 430A 0230 XNX  Q 00DF 2403 0231 SELP X,:03 CLEAR CONTROL REG 00E0 9F78 00D9 0232 JMP *RESET1  00E1 82E7 0149 0234 HALT1 COPY STOPI,A PUT STOP INSTRUCTION IN AREG 00E2 9E81 00E4 0235 JMP START2 00E3 82E7 014B 0237 START1 COPY STARTI,A PUT START INSTRUCTION IN AREG 00E4 93EF 0154 0238 START2 EXCH  *SCIR,A PUT INSTRUCTION IN SLAVE INSTRUCTION REG. 00E5 BEC9 012F 0239 JST SEND 00E6 93ED 0154 0240  EXCH *SCIR,A RESTORE SLAVE INSTRUCTION 00E7 9F35 009D 0241 JMP EACHOK 00E8 BF9E 0107 0243 STEP1 JST CONSAV SAVE SLAVE CONTROL REGISTERS 00E9 82E0 014A 0244 COPY STEPI,A PUT SINGLE STEP INSTRUCTION IN AREG 00EA 87E9 0154 0245 COPY A,*SCIR PUT INSTRUCTION IN SLAVE INST. REGISTER 00EB BEC3 012F 0246 JST SEND SINGLE STEP THE SLAVE 00EC 82A0 010D 0247 COPY =:310,A OSCDR P INSTRUCTION 00ED 87E6 0154 0248 COPY A,*SCIR 00EE BEC0 012F 0249 JST SEND 00EF 0902  0250 COPY =2,A 00F0 BF97 0108 0251 JST OUTEXT 00F1 0036 0252 WORD PROMPT  00F2 BE10 0083 0253 JST OUSPAC 00F3 83E1 0155 0254 COPY *SCDR,A 00F4 BF95 010A 0255  JST OUTHEX PRINT OUT SLAVE P REGISTER 00F5 BF95 010B 0256 JST CONRST RESET SLAVE CONTROL REGISTERS 00F6 9F26 009D 0257 JMP EACHOK 1PAGE 0011 MACRO (D0) SLAVE UTILITY ROUTINE (SLVUTL) 93071-10A0 1979/08/08 19:29:28.75 0259 * 0260 * CHECK SYNTAX OF START AND SINGLE STEP COMMANDS  0261 * 00F7 BE83 00FB 0262 STSTRT JST SETP CHECK SYNTAX AND LOAD PREG ON SLAVE 00F8 9E6A 00E3 0263 JMP START1 START SLAVE PROCESSOR 00F9 BE81 00FB 0265 STSTEP JST SETP CHECK SYNTAX AND LOAD PREG ON SLAVE 00FA 9E6D 00E8 0266 JMP STEP1 SINGLE STEP SLAVE PROCESSOR 00FB 0E0D  0268 SETP ENT 00FC BF8A 0107 0269 JST CONSAV SAVE SLAVE CONTROL REGISTERS 00FD BF8E 010C 0270  JST RDHEXR GET ADDRESS FROM COMMAND FOR SLAVE PREG 00FE 87D6 0155 0271 COPY A,*SCDR PUT ADDRESS INTO SLAVE DATA REGISTER 00FF 82CC 014C 0272 COPY ISCDRP,A 'INPUT SCDR TO PREG' INSTRUCTION 0100 87D3 0154 0273 COPY A,*SCIR PUT INTO SLAVE INSTRUCTION REGISTER 0101 BEAD 012F 0274 JST S END 0102 BF88 010B 0275 JST CONRST RESTORE SLAVE CONTROL REGISTERS 0103 9F77 00FB 0276 JMP  *SETP 0277 * 000E 0278 LPOOL 0104 0153 SELVAL 0105 0154 SCIR 0106 012F SEND 0107 01B9 CONSAV 0108 005C OUTEXT 0109 0155 SCDR 010A 0070 OUTHEX 010B 01C1 CONRST 010C 01D6 RDHEXR 010D 0310 010E 010F 0110 0111 1PAGE 0012 MACRO (D0) SLAVE UTILITY ROUTINE (SLVUTL) 93071-10A0 1979/08/08 19:29:30.00 0280 *  0281 * CHECK SYNTAX OF INSPECT MEMORY COMMAND 0282 * 00000112 0283 STINSP EQU $ 0112 BF74 0107 0284 JST CONSAV SAVE SLAVE CONTROL REGISTERS 0113 BF78 010C 0285 JST RDHEXR READ ADDRESS FROM COMMAND 0114 87C1 0156 0286 COPY A,*SCMAR PUT ADDRESS INTO SLAVE MEMORY ADDRESS REG 0115 86BA 0150 0287 COPY A,T4 SAVE IN TEMPORARY LOCATION 0116 82B0 0147 0288  COPY OMSCDR,A 'OUTPUT MEMORY TO CDR' INSTRUCTION 0117 87BC 0154 0289 COPY A,*SCIR PUT INTO SLAVE INSTRUCTION REGISTER 0118 BE96 012F 0290 JST SEND 0119 0902 0291 COPY =2,A 011A BF6D 0108 0292 JST OUTEXT CRLF 011B 0036 0293 WORD PROMPT 011C BFBA 0157 0294 JST OUSPAC OUTPUT A SPACE 011D 83B7 0155 0295 COPY *SCDR,A GET MEMORY VALUE 011E BF6B 010A 0296 JST OUTHEX OUTPUT TO TTY 011F BFB7 0157 0297 JST OUSPAC OUTPUT A SPACE 0120 BF6A 010B 0298 JST CONRST RESTORE SLAVE CONTROL REGISTERS 0121 BFB6 0158 0299 JST RDHEXT  READ NEW MEMORY CONTENTS 0122 9E87 012A 0300 JMP STI1 NO INPUT; RETURN 0123 87B1 0155 0301  COPY A,*SCDR PUT INPUT INTO SLAVE DATA REGISTER 0124 82AB 0150 0302 COPY T4,A GET ADDRESS AGAIN 0125 87B0 0156 0303 COPY A,*SCMAR PUT IT IN SLAVE MEMORY ADDRESS REGISTER 0126 82A1 0148 0304  COPY IMSCDR,A 'INPUT TO MEMORY FROM SCDR' INSTRUCTION 0127 87AC 0154 0305 COPY A,*SCIR PUT IT INTO SLAVE INSTRUCTION REGISTER 0128 BE86 012F 0306 JST SEND 0129 BF61 010B 0307 JST CONRST RESTORE SLAVE CONTROL REGISTERS 012A 9FAE 0159 0308 STI1 JMP EACHOK RETURN 1PAGE 0013 MACRO (D0) SLAVE UTILITY ROUTINE (SLVUTL) 93071-10A0 1979/08/08 19:29:32.25 0310 * 0311 * CHECK SYNTAX OF JUMP COMMAND 0312 * J,ADDR 0000012B 0313 STJUMP EQU $ 012B BF60 010C 0314  JST RDHEXR JUMP ADDRESS 012C 8621 00CE 0315 COPY A,START 012D E220 00CE 0316 COPY  START,Y 012E 9C40 0000 0317 JMP 0(Y) 0319 * 0320 * SEND ROUTINE FOR SLAVE CONTRTOL INSTRUCTIONS 0321 * 012F 0E0D 0322 SEND ENT 0130 86A0 0151 0323 COPY A,T5 SAVE A REGISTER 0131 C6A0 0152 0324 COPY Q,T6 SAVE Q REGISTER 0132 0901 0325  COPY =1,A 0133 C29F 0153 0326 COPY SELVAL,Q 0134 430A 0327 XNX Q  SELECT CORRECT SLAVE 0135 0402 0328 SELP A,:02 REQUEST SLAVE CONTROL SERVICE FROM SLAVE 0136 430A 0329 XNX Q 0137 0602 0330 SST :02 HAS SLAVE DONE SLAVE CONTROL SERVICE YET ? 0138 9E81 013A 0331 JMP $+2 YES 0139 9E7C 0136 0332 JMP $-3 NOT YET 013A 8296 0151 0333 COPY T5,A RESTORE A REGISTER 013B C296 0152 0334 COPY T6,Q RESTORE Q REGISTER 013C 9F72 012F 0335 JMP *SEND 1PAGE 0014 MACRO (D0) SLAVE UTILITY ROUTINE (SLVUTL) 93071-10A0 1979/08/08 19:29:34.25 013D 0041 0337 REGTBL WORD :41 A 013E 0050 0338 WORD :50 P 013F 0058 0339 WORD :58 X 0140 0053 0340 WORD :53 S 0141 0051 0341 WORD :51 Q 0142 004C 0342 WORD :4C L 0143 0059  0343 WORD :59 Y 0144 004B 0344 WORD :4B K 0145 0300 0346 OSCDRI WORD :300 OUTPUT FROM REGISTER TO SCDR INSTRUCTION 0146 0301 0347 ISCDRI WORD :301 INPUT TO REGISTER FROM SCDR INSTRUCTION 0147 0302 0348 OMSCDR WORD :302 OUTPUT FROM MEMORY TO SCDR INSTRUCTION 0148 0303 0349 IMSCDR WORD :303 INPUT TO MEMORY FROM SCDR INSTRUCTION 0149 0304 0350 STOPI  WORD :304 STOP SLAVE PROCESSOR INSTRUCTION 014A 0305 0351 STEPI WORD :305 SINGLE STEP SLAVE PROCESSOR INSTRUCTION 014B 0306 0352 STARTI WORD :306 START SLAVE PROCESSOR INSTRUCTION 014C 0311  0353 ISCDRP WORD :311 INPUT TO PREG FROM SCDR 014D 0000 0355 T1 RES 1,0 TEMP 1 014E 0000 0356 T2 RES 1,0 TEMP 2 014F 0000 0357 T3 RES 1,0 TEMP 3 0150 0000 0358 T4 RES 1,0 TEMP 4 0151 0000 0359 T5 RES 1,0 TEMP K 0152 0000 0360 T6 RES 1,0 TEMP 6 0153 00F0 0361 SELVAL WORD :F0 SELECT SLAVE VALUE 0154 0100 0362 SCIR WORD :100 SLAVE CONTROL INSTRUCTION REGISTER 0155 0101 0363 SCDR WORD  :101 SLAVE CONTROL DATA REGISTER 0156 0102 0364 SCMAR WORD :102 SLAVE CONTROL MEMORY ADDRESS REGISTER 0003 0365 LPOOL 0157 0083 OUSPAC 0158 01C9 RDHEXT 0159 0014 EACHOK 1PAGE 0015 MACRO (D0) SLAVE UTILITY ROUTINE (SLVUTL) 93071-10A0 1979/08/08 19:29:36.50 0367 * 0368 * CHECK SYNTAX OF EXAMINE REGISTER COMMAND 0369 * 0000015A 0370 STEXAM EQU $ 015A BFD0 01AB 0371  JST RDCHAR READ REGISTER SELECTION FROM TTY 015B 28F8 0372 COPY =-8,X COUNT FOR TABLE SEARCH 015C A6A5 0182 0373 COPY X,STX4 015D A2D0 01AE 0374 COPY =REGTBL,X GET ADDRE SS OF REGISTER TABLE 015E B880 0000 0375 STX1 CSK A,0(X) CHECK IF SAME AS REGISTER SELECTED 015F 0000 0376 NOP 0160 9E81 0162 0377 JMP $+2 NOT FOUND YET 0161 9E84 0166 0378 JMP  STX2 FOUND MATCH - FINISH COMMAND 0162 2B01 0379 ADD =1,X INCREMENT TABLE POINTER 0163 DE9E 0182 0380 IMS STX4 INCREMENT COUNT 0164 9E79 015E 0381 JMP STX1 CONTINUE SEARCH 0165 9FC6 01AC 0382 JMP SE SELECTION NOT IN TABLE - SYNTAX ERROR 0166 BFC4 01AB 0383 STX2 JST RDCHAR READ TERMINATING CHARACTER 0167 0D0D 0384 CSK A,=CR SHOULD BE A CARRIAGE RETURN 0168 0000 0385 NOP 0169 9FC2 01AC 0386 JMP SE IT'S NOT - SYNTAX ERROR 016A BECE 01B9 0387 JST CONSAV SAVE SLAVE CONTROL REGISTERS 016B AEC2 01AE 0388 SUB =REGTBL,X SUBTRACT TABLE BASE ADDRESS 016C 2E31 0389 SHIFT X,LO,4 ALIGN FOR INSTRUCTION FIELD 016D A662 0150 0390 COPY X,T4 SAVE FOR WRITE OPERATION 016E AA56 0145 0391 ADD OSCDRI,X BUILD OUTPUT FROM REGISTER INSTRUCTION 016F A764 0154 0392 COPY X,*SCIR PUT INTO SLAVE INSTRUCTION REGISTER 0170 BE3E 012F 0393 JST SEND 1PAGE 0016 MACRO (D0) SLAVE UTILITY ROUTINE (SLVUTL) 93071-10A0 1979/08/08 19:29:38.75 0171 0902 0395 COPY =2,A 0172 BF15 0108 0396 JST OUTEXT CRLF 0173 0036 0397 WORD PROMPT 0174 BF62 0157 0398 JST OUSPAC OUTPUT SPACE 0175 835F 0155 0399  COPY *SCDR,A GET REGISTER CONTENTS 0176 BF13 010A 0400 JST OUTHEX OUTPUT IT TO TTY 0177 BF5F 0157 0401 JST OUSPAC OUTPUT SPACE 0178 BEC8 01C1 0402 JST CONRST RESTORE SLAVE CONTROL REGISTERS 0179 BECF 01C9 0403 JST RDHEXT READ NEW REGISTER CONTENTS FROM TTY 017A 9E86 0181 0404 JMP STX3 NO INPUT; RETURN 017B 8759 0155 0405 COPY A,*SCDR PUT NEW CONTENTS INTO SLAVE DATA REGISTER 017C A253 0150 0406 COPY T4,X GET REGISTER TO WRITE TO 017D AA48 0146 0407 ADD ISCDRI,X BUILD INPUT TO REGISTER INSTRUCTION 017E A755 0154 0408 COPY X,*SCIR PUT IT IN SLAVE INSTRUCTION REGISTER 017F BE2F 012F 0409 JST SEND 0180 BEC0 01C1 0410 JST CONRST RESTORE SLAVE CONTROL REGISTERS 0181 9F57 0159 0411 STX3 JMP EACHOK RETURN 0182 0000 0412 STX4 RES 1,0 TABLE SEARCH COUNT CELL 1PAGE 0017 MACRO (D0) SLAVE UTILITY ROUTINE (SLVUTL) 93071-10A0 1979/08/08 19:29:39.75 0414 * 0415 * CHECK SYNTAX OF MOVE COMMAND 0416  * 00000183 0417 STMOVE EQU $ 0183 BECD 01D1 0418 JST RDHEXC READ START-OF-SOURCE ADDRESS 0184 87AA 01AF 0419 COPY A,BEGIN SAVE START-OF-SOURCE ADDRESS 0185 BECB 01D1 0420 JST R DHEXC READ END-OF-SOURCE ADDRESS 0186 87A9 01B0 0421 COPY A,END SAVE END-OF-SOURCE ADDRESS 0187 BECE 01D6 0422 JST RDHEXR READ DESTINATION ADDRESS 0188 87A8 01B1 0423 COPY A,START  SAVE DESTINATION ADDRESS 0189 BEAF 01B9 0424 JST CONSAV SAVE SLAVE CONTROL REGISTERS 018A 823E 0149 0425 COPY STOPI,A 'STOP SLAVE' INSTRUCTION 018B 8748 0154 0426 COPY A,*SCIR PUT INTO SLAVE INSTRUCTION REGISTER 018C BE22 012F 0427 JST SEND 018D BFA4 01B2 0428 JST RESET1 018E 823D 014C 0429 COPY ISCDRP,A 'INPUT SCDR TO SLAVE PREG' INSTRUCTION 018F 8744 0154 0430 COPY A,*SCIR PUT INTO SLAVE INSTRUCTION REGISTER 0190 82A2 01B3 0431 COPY =M410S1,A GET ADDRESS OF MOVE ROUTINE 0191 B7A2 01B4 0432 OR L8000,A ADD OFFSET OF PUBLIC MEMORY 0192 8742 0155 0433 COPY A,*SCDR PUT ADDRESS INTO SLAVE DATA REGISTER 0193 BE1B 012F 0434 JST SEND 0194 8236 014B 0435 COPY STARTI,A 'START SLAVE' INSTRUCTION 0195 873E 0154 0436 COPY A,*SCIR PUT INTO SLAVE INSTRUCTION REGISTER 0196 BE18 012F 0437 JST SEND 0197 BEA9 01C1 0438 JST CONRST RESTORE SLAVE CONTROL REGISTERS 0198 0E85 0439 SBIT 8,S ENABLE INTERRUPTS 0199 9E7F 0199 0440 JMP  $ WAIT FOR INTERRUPT 019A 0E0D 0441 STM2 ENT SLAVE INTERRUPT RETURN 019B 08A0  0442 COPY =:FFA0,A SET UP TIMOUT LOOP 019C 8635 0152 0443 COPY A,T6 019D DE34 0152 0444  IMS T6 019E 9E7E 019D 0445 JMP $-1 019F BF92 01B2 0446 JST RESET1 01A0 9F80 01A1 0447 JMP *$+1 RETURN 01A1 0014 0448 WORD EACHOK ADDRESS 1PAGE 0018 MACRO (D0) SLAVE UTILITY ROUTINE (SLVUTL) 93071-10A0 1979/08/08 19:29:43.00 0450 * 0451 *  CHECK SYNTAX OF SLAVE DEVICE ADDRESS SELECT 0452 * Q,00X0 WHERE X IS A VALUE WITHIN :1-:F  0453 * 000001A2 0454 STSLAV EQU $ 01A2 BEB3 01D6 0455 JST RDHEXR READ DEVICE ADDRESS SELECT 01A3 862E 0152 0456 COPY A,T6 SAVE VALUE FOR LATER 01A4 9690 01B5 0457 AND  =:FF0F,A TEST FOR VALID DEVICE ADDRESS 01A5 11C4 01AA 0458 JNE A,SE: INVALID DEVICE ADDRESS 01A6 822B 0152 0459 COPY T6,A GET VALUE AGAIN 01A7 1142 01AA 0460 JEQ A,SE: ZERO IS A RESERVED DEVICE ADDRESS 01A8 862A 0153 0461 COPY A,SELVAL PUT DEVICE ADDRESS IN SELECT D. A. VALUE 01A9 9F2F 0159 0462 JMP EACHOK RETURN 01AA 9F81 01AC 0463 SE: JMP SE 000E 0464  LPOOL 01AB 0206 RDCHAR 01AC 002B SE 01AD 01D6 RDHEXR 01AE 013D REGTBL 01AF 00CC BEGIN 01B0 00CD END 01B1 00CE START 01B2 00D9 RESET1 01B3 0240 M410S1 01B4 025C L8000 01B5 FF0F 01B6 01B7 01B8 1PAGE 0019 MACRO (D0) SLAVE UTILITY ROUT INE (SLVUTL) 93071-10A0 1979/08/08 19:29:44.50 0466 * 0467 * SAVE SLAVE CONTROL REGISTERS (:100, :101, :102) 0468 * 01B9 0E0D 0469 CONSAV ENT 01BA 8319 0154 0470 COPY  *SCIR,A SLAVE CONTROL INSTRUCTION REGISTER 01BB 8611 014D 0471 COPY A,T1 01BC 8318 0155 0472  COPY *SCDR,A SLAVE CONTROL DATA REGISTER 01BD 8610 014E 0473 COPY A,T2 01BE 8317 0156 0474  COPY *SCMAR,A SLAVE CONTROL MEMORY ADDRESS REGISTER 01BF 860F 014F 0475 COPY A,T3 01C0 9F78 01B9 0476 JMP *CONSAV 0477 * 0478 * RESTORE SLAVE CONTROL REGISTERS  0479 * 01C1 0E0D 0480 CONRST ENT 01C2 820A 014D 0481 COPY T1,A 01C3 8710 0154 0482  COPY A,*SCIR INSTRUCTION REGISTER 01C4 8209 014E 0483 COPY T2,A 01C5 870F 0155 0484 COPY A,*SCDR DATA REGISTER 01C6 8208 014F 0485 COPY T3,A 01C7 870E 0156 0486 COPY A,*SCMAR MEMORY ADDRESS REGISTER 01C8 9F78 01C1 0487 JMP *CONRST 1PAGE 0020 MACRO (D0) SLAVE UTILITY ROUTINE (SLVUTL) 93071-10A0 1979/08/08 19:29:45.75 0489 * 0490 * READ A HEX NUMBER FROM TTY. RETURN TO ENT IF NO INPUT 0491 * ELSE, RETURN TO ENT+1 0492 * 01C9 0E0D 0493 RDHEXT ENT 01CA BE8B 01D6 0494 JST RDHEXR READ HEX NUMBER 01CB A2E0 022C 0495 COPY RDHEX4,X GET INPUT CHARACTER COUNT 01CC 2021 0496 NEG X,X 01CD 2D04 0497 CSK X,=4 CHECK FOR INPUT 01CE DE7A 01C9 0498 IMS RDHEXT YES 01CF 0000 0499 NOP 01D0 9F78 01C9 0500 JMP *RDHEXT NO INPUT 0501 * 0502 * READ HEX TO A COMMA  01D1 0E0D 0503 RDHEXC ENT 01D2 BEBE 0211 0504 JST RDHEX 01D3 2C2C 0505 CLSN =',',X 01D4 9F7C 01D1 0506 JMP *RDHEXC 01D5 9F56 01AC 0507 JMP SE 0508 *  0509 * READ HEX TO A CARRIGE RETURN 01D6 0E0D 0510 RDHEXR ENT 01D7 BEB9 0211 0511 JST RDHEX 01D8 2C0D 0512 CLSN =CR,X 01D9 9F7C 01D6 0513 JMP *RDHEXR 01DA 9F51 01AC 0514  JMP SE 0002 0515 LPOOL 01DB 022C RDHEX4 01DC 1PAGE 0021 MACRO (D0) SLAVE UTILITY ROUTINE (SLVUTL) 93071-10A0 1979/08/08 19:29:47.25 0517 * 0518 * READ A NAME. STORE IN NAME,NAMEW,AND NAMER. 0519 * RETURN TO ENT IF CR. RETURN TO ENT+1 IF COMMA. 01DD 0E0D 0520 RDNAME ENT 01DE 28FA  0521 COPY =-6,X MAXIMUM 6 CHARACTERS 01DF A6A4 0204 0522 COPY X,RDNCNT 01E0 2900  0523 COPY =0,X CREATE A BYTE INDEX TO NAME 01E1 A6A3 0205 0524 COPY X,UNAME 01E2 82A8 020B 0525 COPY =' ',A BLANK NAME 01E3 87A8 020C 0526 COPY A,NAME 01E4 87A8 020D 0527   COPY A,NAME+1 01E5 87A8 020E 0528 COPY A,NAME+2 01E6 E2A5 020C 0529 COPY =NAME,Y  WORD ADDRESS OF NAME 01E7 BE9E 0206 0530 RDNAM1 JST RDCHAR GET A CHARACTER 01E8 4000 0531 COPY A,Q 01E9 0AD0 0532 SUB ='0',A TEST FOR ALPHANUMERIC(AN) 01EA 13CF 01FA 0533 JLT A,RDNAM3 NOT AN IF LESS THAN ZERO 01EB 0AF6 0534 SUB =':'-'0',A 01EC 12C4 01F1 0535  JLE A,RDNAM2 AN IF BETWEEN 0-9 01ED 0AF9 0536 SUB ='A'-':',A 01EE 13CB 01FA 0537 JLT A,RDNAM3 NOT AN IF LESS THAN A 01EF 0AE7 0538 SUB ='Z'-'A',A 01F0 1249 01FA 0539 JGT A,RDNAM3 NOT AN IF GREATER THAN Z 01F1 A293 0205 0540 RDNAM2 COPY UNAME,X BYTE INDEX TO X 01F2 0E25 0541 SBIT 2,S 01F3 C4C0 0000 0542 COPYB Q,0(X,Y) STORE CHARACTER IN NAME BYTE ADDRESS(Y) 0543 * INDEXED BY X 01F4 0E27 0544 RBIT 2,S 01F5 DE8F 0205 0545 IMS UNAME INCREMENT STORE LOCATION 01F6 DE8D 0204 0546 IMS RDNCNT CAN I GET ANOTHER CHARACTER? 01F7 9E6F 01E7 0547 JMP RDNAM1 YES, GET IT 01F8 BE8D 0206 0548 JST RDCHAR NO, GET TERMINATING CHARACTER 01F9 4000 0549 COPY A,Q 01FA 8289 0204 0550 RDNAM3 COPY RDNCNT,A MAKE SURE THERE IS AT 01FB 0B06 0551 ADD =6,A LEAST ONE CHARACTER 01FC 1146 0203 0552 JEQ A,RDNAM4 1PAGE 0022 MACRO (D0) SLAVE UTILITY ROUTINE (SLVUTL) 93071-10A0 1979/08/08 19:29:50.25 01FD 0040 0553 COPY Q,A 01FE 0C0D 0554 CLSN =CR,A 01FF 9F5D 01DD 0555 JMP  *RDNAME 0200 DE5C 01DD 0556 IMS RDNAME 0201 0C2C 0557 CLSN =',',A 0202 9F5A 01DD 0558  JMP *RDNAME 0203 9F28 01AC 0559 RDNAM4 JMP SE 0204 0560 RDNCNT RES 1 0205  0561 UNAME RES 1 0563 * 0564 * READ A CHARACTER FROM TTY. RESULT IN A. 0565 * QUIT IF BACK ARROW 0206 0E0D 0566 RDCHAR ENT 0207 BEDB 0263 0567 JST IKB GET A CHARACTER 0208 0C5F 0568 CLSN =BA,A IS IT BACK ARROW? 0209 9F85 020F 0569  JMP EACHOK YES, GET ANOTHER COMMAND 020A 9F7B 0206 0570 JMP *RDCHAR NOW FINISHED 0006 0571 LPOOL 020B 2020 020C 00D0 NAME 020D 00D1 020E 00D2 020F 0014 EACHOK 0210 1PAGE 0023 MACRO (D0) SLAVE UTILITY ROUTINE (SLVUTL) 93071-10A0 1979/08/08 19:29:51.25 0573 * 0574 * READ A HEX NUMBER FROM TTY 0575 * RESULT IN A. TERMINATING CHARACTER IN X. 0211 0E0D 0576 RDHEX ENT 0212 0900 0577 COPY =0,A 0213 8699 022D 0578 COPY A,RDHEX5 ZERO THE HEX SUM 0214 28FC 0579 COPY =-4,X 0215 A696 022C 0580 COPY X,RDHEX4 MAXIMUM 4 HEX DIGITS 0216 BE6F 0206 0581 R DHEX1 JST RDCHAR GET A CHARACTER 0217 8696 022E 0582 COPY A,RDHEX6 SAVE IT 0218 0ABA 0583 SUB =AF,A COMPARE TO F 0219 124F 0229 0584 JGT A,RDHEX3 STOP IF GREATER 021A 0B05 0585 ADD ='F'-'A',A COMPARE TO A 021B 1344 0220 0586 JGE A,RDHEX2 HEX DIGIT IF GREATER OR EQUAL 021C 0B11 0587 ADD ='A'-'0',A COMPARE TO 0 021D 13CB 0229 0588 JLT A,RDHEX3 STOP IF LESS 021E 0AF6 0589 SUB =':'-'0',A COMPARE TO 9 021F 1249 0229 0590 JGT A,RDHEX3 STOP IF GREATER 0220 0B0A 0591 RDHEX2 ADD =10,A CONVERT TO HEX DIGIT 0221 928B 022D 0592 EXCH RDHEX5,A UPDATE HEX SUM 0222 0E31 0593 SHIFT A,LO,4 SHIFT SUM OVER 0223 B689 022D 0594 OR RDHEX5,A ADD IN NEW DIGIT 0224 8688 022D 0595 COPY A,RDHEX5 SAVE UPDATED SUM 0225 DE86 022C 0596 IMS RDHEX4 MORE DIGITS? 0226 9E6F 0216 0597 JMP RDHEX1 YES, TRY TO GET ONE 0227 BE5E 0206 0598 JST RDCHAR NO, GET TERMINATING CHAR 0228 8685 022E 0599 COPY A,RDHEX6 0229 A284 022E 0600 RDHEX3 COPY RDHEX6,X LOAD TERMINATING CHAR 022A 8282 022D 0601 COPY RDHEX5,A LOAD HEX SUM 022B 9F65 0211 0602 JMP *RDHEX RETURN 022C 0603 RDHEX4 RES 1 CHARACTER COUNT 022D 0604 RDHEX5 RES 1 ACCUMULATE HEX 022E  0605 RDHEX6 RES 1 SAVE CHAR 1PAGE 0024 MACRO (D0) SLAVE UTILITY ROUTINE (SLVUTL) 93071-10A0 1979/08/08 19:29:53.75 0607 * 0608 * COPY WORDS. COUNT IN A. TO AND FROM  0609 * ADDRESSES IN ARGUMENT LIST. 0610 * 022F 0E0D 0611 COPY ENT 0230 0001 0612  NEG A,A 0231 868D 023F 0613 COPY A,COPYCT STORE NEGATIVE COUNT 0232 A27C 022F 0614  COPY COPY,X 0233 A080 0000 0615 COPY 0(X),X FROM POINTER IN X 0234 DE7A 022F 0616 IMS  COPY BUMP RETURN POINTER 0235 E279 022F 0617 COPY COPY,Y 0236 E040 0000 0618 COPY 0(Y),Y TO POINTER IN Y 0237 DE77 022F 0619 IMS COPY BUMP RETURN POINTER 0238 8080 0000 0620 COPYLP COPY 0(X),A READ FROM 0239 8440 0000 0621 COPY A,0(Y) STORE TO 023A 2B01 0622  ADD =1,X INCREMENT TO POINTER 023B 6B01 0623 ADD =1,Y INCREMENT TO POINTER 023C DE82 023F 0624 IMS COPYCT INCREMENT COUNT 023D 9E7A 0238 0625 JMP COPYLP CONTINUE 023E 9F70 022F 0626 JMP *COPY RETURN 023F 0000 0627 COPYCT RES 1,0 1PAGE 0025  MACRO (D0) SLAVE UTILITY ROUTINE (SLVUTL) 93071-10A0 1979/08/08 19:29:55.25 0629 * 0630  * SLAVE PROCESSOR MOVE ROUTINE 0631 * 0240 0E65 0632 M410S1 SBIT 6,S TURN ON E XTENDED ADDRESSING 0241 A39D 025F 0633 COPY *BEGINP,X GET THE BEGINNING SOURCE ADDRESS 0242 AA99 025C 0634 ADD L8000,X SET FOR PUBLIC MEMORY 0243 E39C 0260 0635 COPY *STARTP,Y GET THE BEGINNING DESTINATION ADDRESS 0244 C39C 0261 0636 COPY *ENDP,Q GET THE ENDING SOURCE ADDRESS 0245 F696 025C 0637  OR L8000,Q SET FOR PUBLIC MEMORY 0246 8080 0000 0638 M410S2 COPY 0(X),A GET A WORD OF SOURCE 0247 8440 0000 0639 COPY A,0(Y) PUT IN A DESTINATION WORD 0248 2046 0640 CSM X,Q FINISHED YET 0249 9E82 024C 0641 JMP $+3 NOT YET 024A 0000 0642 NOP  YES 024B 9E83 024F 0643 JMP M410S3 YES 024C 2B01 0644 ADD =1,X  GET ADDRESS OF NEXT SOURCE WORD 024D 6B01 0645 ADD =1,Y GET ADDRESS OF NEXT DESTINATION WORD  024E 9E77 0246 0646 JMP M410S2 CONTINUE MOVING 024F C28B 025B 0647 M410S3 COPY JST1,Q SET UP 0250 D38C 025D 0648 EXCH Q,*L8004 HOST 0251 A290 0262 0649 COPY =STM2,X INTERRUPT 0252 B38B 025E 0650 EXCH X,*L8005 VECTOR 0253 0905 0651 COPY =5,A 0254 04FF 0652 SELP A,:FF INTERRUPT HOST 0255 06FF 0653 SST :FF CHECK FOR INTERRUPT SERVICED 0256 9E81 0258 0654 JMP $+2 YES 0257 9E7D 0255 0655 JMP $-2 NOT YET 0258 D384 025D 0656 EXCH Q,*L8004 RESTORE HOST 0259 B384 025E 0657 EXCH X,*L8005 INTERRUPT VECTOR 025A 0E0D 0658 HLT 1PAGE 0026 MACRO (D0) SLAVE UTILITY ROUTINE (SLVUTL) 93071-10A0 1979/08/08 19:29:58.00 025B BF80 025C 0660 JST1 JST *$+1 025C 8000 0661 L8000 WORD :8000 025D 8004 0662 L8004 WORD :8004 025E 8005 0663 L8005 WORD :8005 025F 80CC 0664 BEGINP WORD BEGIN+:8000  START-OF-SOURCE 0260 80CE 0665 STARTP WORD START+:8000 START-OF-DESTINATION 0261 80CD 0666 ENDP WORD END+:8000 END-OF-SOURCE 0667 * 0668 * 0001 0669 LPOOL 0262 019A STM2 1PAGE 0027 MACRO (D0) SLAVE UTILITY ROUTINE (SLVUTL) 93071-10A0 1979/08/08 19:29:58.25 0671 *  0672 * FOR KEYBOARD INPUT 0673 * JST IKB 0674 * * RETURN(AR WILL CONTAIN THE CHARACTER) 0675 * 0676 * FOR TTY OUTPUT 0677 * LDA CHARACTER 0678 * JST OTT 0679 * * RETURN 0680 *  0681 * IN BOTH ROUTINES, XR IS UNCHANGED, 0682 * CPU MUST BE IN WORD MODE. INTERRUPTS ARE  0683 * DISABLED FOR THE TIME OF CHARACTER INPUT 0684 * 0685 * 0000007C  0686 DTTYDA EQU :7C DIO TTY DEVICE ASSIGNMENT 0263 0E0D 0687 IKB ENT 0264 BE9A 027F 0688   JST IN 0265 82A8 028E 0689 COPY =:8618,A START,ECHO,NO INTERRUPT 0266 02F9 0690  OUT A,DTTYDA%1;1 0267 A2A7 028F 0691 COPY =:100,X RESET CODE 0268 01F9 0692 IN  DTTYDA%1;1,A 0269 0E39 0693 SHIFT A,RO,4 DATA READY TO OV 026A 36BD 0268 0694 JF OV,$-2 IF DATA NOT READY 026B 01F8 0695 IN DTTYDA%1,A 026C 22F9 0696 OUT X,DTTYDA%1;1 026D 187F 0697 AND =:7F,A TURN PARITY BIT OFF 026E BE98 0287 0698 JST OUT 026F 9F73 0263 0699 JMP *IKB 0270 0E0D 0700 OTT ENT 0271 BE8D 027F 0701 JST IN  0272 A29D 0290 0702 COPY =:8612,X START,REQUEST TO SEND,DONT INTERRUPT 0273 22F9 0703 OUT  X,DTTYDA%1;1 0274 02F8 0704 OUT A,DTTYDA%1 0275 A299 028F 0705 COPY =:100,X RESET CODE 0276 01F9 0706 IN DTTYDA%1;1,A 1PAGE 0028 MACRO (D0) SLAVE UTILITY ROUTINE (SLVUTL) 93071-10A0 1979/08/08 19:30:00.50 0277 0E49 0707 SHIFT A,RO,5 0278 363D 0276 0708 JT OV,$-2 0279 01F9 0709 IN DTTYDA%1;1,A 027A 0E49 0710 SHIFT A,RO,5 027B 36BD 0279 0711  JF OV,$-2 027C 22F9 0712 OUT X,DTTYDA%1;1 027D BE89 0287 0713 JST OUT 027E 9F71 0270 0714 JMP *OTT 027F 0E0D 0715 IN ENT 0280 A684 0285 0716 COPY X,HOLDX 0281 2030 0717 COPY S,X 0282 A683 0286 0718 COPY X,HOLDS 0283 0E87 0719 RBIT 8,S 0284 9F7A 027F 0720 JMP *IN 0285 0721 HOLDX RES 1 0286 0722 HOLDS RES  1 0287 0E0D 0723 OUT ENT 0288 A27D 0286 0724 COPY HOLDS,X 0289 2E29 0725 SHIFT  X,RO,3 028A 36C1 028C 0726 JF OV,$+2 028B 0E85 0727 SBIT 8,S 028C A278 0285 0728  COPY HOLDX,X 028D 9F79 0287 0729 JMP *OUT 0003 0730 LPOOL 028E 8618 028F 0100 0290 8612 0291 0000 0731 RES $;:FF-$&:FF+1,0 000002FF 0732 DLD:Z EQU $-1 0000  0733 END SLVUTL 0000 ERRORS (0000) 0000 WARNINGS (0000) 8,S JMP *IN HOLDX RES 1 HOLDS/ ** SLVUTLSRCE.HLP ** / SLAVE UTILITY ROUTINE (SLVUTL) / SOURCE DISKETTE / / SLVUTL CONTAINS COMMANDS WHICH ENABLE THE /  USER TO TALK TO A 4/10S SLAVE COMPUTER. / / SLVUTL.JCL - ASSEMBLY JCL / / SLVUTL.ASM - SLVUTL SOURCE / / SLVUTL.OBJ - SLVUTL OBJECT FOR LINKING / / SLVUTL.LST - SLVUTL PROGRAM LISTING / / **NOTE - SLVUTL.JCL ASSUMES MACRO IS ON THE SF UNIT / 790808141320790808141320790808141320IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII  IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII! IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII" IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII# IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII$ IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII% IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII& IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIe; 790808141320790808141320790808141320e@790808141320790808141320790808141320e:' 790808141320790808141320790808141320e790808141320790808141320790808141320790808141320790808141320790808141320e7908091201330079080912013825dep7908081421100079080814211500de0^7908081421470079080814220750d e6z7908081422352579080819300250d(  e:Z7908081423002579080819300325d) * + , - . / 0 . SLVUTLSRCE HLPSLVUTL JCLSLVUTL ASM SLVUTL OBJ SLVUTL LST1 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII2 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 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII