IMD 1.16: 31/08/2008 22:59:21 84-93035-xx a000 f03501 timer:490 os4e700 lsi 4/90 instruction set timer    @0|)wwЀЀtQql)  " }gA `MIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIOS4 ME681071011352100810710115659 810710115659,TIMER:490 VOLLSI 4/90 INSTRUCTION SET TIMER   IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIM@jjggg@ o G`k_C# b# }B u[ ]e JRiCCp@<;: F8P@ G;NPCHC C GTqE'ɞ * Cϟx @0DAJL )‘ЀЀΎQBx"  i+ fEB)3 `jmBBI,v  BI,m  @EEFF)D^EF% jH@pOğv g7g4]X] PhV+s=胾c_N GF֞ؾ “@ALS)"$ C k1/j-h p vRw ppwp ki 15 !^\d X %'+Ns愾Q)s ED|{ @$ o O m J K i g. V tsFn`"FED) E`Cnrgy w"N{Rq1H }L2`0tG- Bc (>=>>  EXEC:: SYSLD '1Ğ mM)¢fE) ]]ⷤB1C: ':Ѣ̃ !_pC PE` C   p0! pCPEs " LD HcIqC C @UkkjރGcB a!_ pCC @KP@E OF@ +y9CI 0ƀv: s# &% [ G  OC ` EXEC:: NOT FOUND  BAD TYPE CODE PROGRAM TOO LARGE LOAD ERROR  NO EXECUTION ADDRESS  UAT WIPED OUT SYSTEM EXCEPTION XXXX OCCURRED AT LOCATION XXXX%I@2NK0M9K+U'#  =/p(p(C @`pD+E` B@ C@/ph@ph?ph@kphE@/p p?p(+p(# OCSL :@`` D@1HNFLODL)OB`H: )# (#   OVST +@pJp@`H@BC ADEFGHF EG@h @6@6@6@6I pB# 7ZP?IPOIBƻ:C @@ B+{āc  0 0$:7:A  :7:Aw 1:A 1:7 Z: :ZPZP+׀!ӄҢҢ̀@QD@QBkz A@N JÀA+kUǺ : ::&y X R C x r ck4  > 4~47+)*  OC(OC+OC% CRX> ? 7} ABCDEFGHIJK$L,M3N;OEPPQZRgSqTyUVWXYZK NOT READY WRITE PROTECT TIME OUT POWER FAIL  VOLUME NOT ON UNIT  VOLUME NOT FOUND  LOGICAL UNIT NOT RELEASED  BAD CHECK SUM UNASSIGNED DEVICE LOGICAL UNIT NOT IN UAT END OF MEDIA  HARDWARE ERROR  ILLEGAL OPERATION NON-EXISTANT MEMORY ADDR  ADDR IN SYSTEM MEMORY DIRECTORY FULL  DISK NOT LABELED  FILE ADDR OV ILLEGAL AU  AU NOT FOUND  WRITE DIRECT EOF  FILE NOT EXTENDABLE ILLEGAL FILE ADDR ALLOCATION TABLE ERROR  SYSTEM USAGE ONLY BAD FCB CHAIN FILE OPEN FILE NOT OPEN ILLEGAL FILE POINTER  UNIT NOT GIVEN  UNASSIGNED FCB  BUFFER HAS WRITE PENDING DISK FULL RTX ERROR UNDEFINED ERROR0GG GBpaFbDcE/ph@ph?ph@kph# FaDbEc# # 44~,</ph@ph/ph@ph?ph@kph?ph@kphĢ/ph@ph`pHK Q KRQH ?ph@kph`pC# 44~C!ŸǟžǜœǙšǖ˜Ǔ–ǐ”Ǎ p+LJc #   itPt| n0 GSMPJV C_Ybe t H H ZH ZH>    TV01P$v$x ${$v t%$'.?,4R TV02P$v$x ${P$vR 4t%$'.?,Rk  DF00AAM MGk  DF01AAM MG  DF02AAM MG  DF03AAM MG R v*c*c+?, fd 4 LP00 Q.$$}2P$}R DM00AA  &zR DM01AA  &  v+++++?,dz DM10AA  & DM11AA  & v+++++?,BdDl DH00AA 7  &7#]@Ll Dv+++++?,dl X1X2X3X4SILO4SFkUFOCCISLSOSALDOVXXPO4Z1Z2Z3Z4Z5Z6ZP4dvRICNBCO# $'/p(p(` D/ph@ph)@BCOD6D[ `+ʀP COBBT€RQ EVBQ mWG CW90.r@ VBCOQ OV"00ߞހP D  /NBy M  `+d,NQ (Vy )ք5` @P  `+MN sVWNy%ZrY['OCP  /NM D%Y'B2BC] ҀO? ?ph@kphD?p(+p(# r pN N igIRN1N1  #  Qd/p(p(` BDCEAׂI `+C Uф@z 0 :D A FE [ _ E :E ED DAQ\DQZBN!BB @BCN1@CA,D,E,@k%'jACN€MDB BEB CA?p(+p(#  ]</p(p(` /p(p( MNQ@ ϪSW/p(p(Nq% ' z ` ?p(+p(M?p(+p(# '?p(+p(L 0n^bMN1EMM M1ÉB I@@Mǁ# ]  1 æ :I:/ph@ph?ph@kphF:Q ª # @SAybCI" SLCIY bSL[_ @Ǡ1DSB# :"SFUF"UϤA F  DZYBZ Z Bą  Y H H H @ ɠAZg Zuf]\x o 6wzzfѤA ʄZH ОǞȞɀWX AZȀ  TZT UVETj`ZЀ`ZʠAZZgZAvf\ o  6wzN͠Y ABSA ZZߠYABā A@Ѐ ĀBĉZĊ¨ć§ā@ giZAZw ABZZCAN f ]\Qz6wUp*B1:A! _ "* H1xvB C @C @ pā_B __ __6  1  pE/p p_/p p @*3AB1NBɀ6f 1 g/p py fR!z] hljPc Pfdma1*\BB1HVggRy VӞ N OQJ?QC @QBTP G `QRS GGG_\ ­G!ac BR IG!SGBĝBR IG SB #  oxu] Y 1C# MTfC @C @C @C @C @`p FYcB/p $p# ' I[QaGWXZ/p(p(Y@IC @C U?p(+p(# } o YIA@AĊ# PB1LZĀ6P1PA# ƒċ# )IGVWXWBG! R]^TVC SSURR9ƀ^S66 # d TɞQ;/ph@ph@(РP+?ph@kph P+P6jP  fP{z  Ā ΥQ/ph@ph ?ph@kph ?ph@kph # ?ph@kphv"44~MT6wCZB+E(z(# ^][WXS SDI@ Y\΀[ PWXG[ # I\ba\+U*ZZ#  o YYB1Jy YQ^\YQg!WXWXJS+XW7y B N OLƠQ ?G # }{y>v N O6ӠQMI+9\Y\+\JR9P$P#  \F6\AB [ IZF cL\FXN9C 48J""""""""""B[GZI # ,A6AkDYLWXFXC """""""XX0WXADAASO`NCZNZYNNYCYTڀ`LS  o !MXWFA Z [NWOX I]G [NWOXWXPAOGArA6QSÂYK=A:YQFXQfx'`WX%A$EA [SÂlYHAgYDfc#LWXā ( A6ADYF """"""""%%%oo"$"9WXAPQBWXFA;A6XSÀYRSDAYA]Aw.3 h o4 ~66BnWNXOAhPQfBbWX``F^AY\;[A6_SÀYSYSAIQQYAbAWFXFBBAA@k?((WXY )C-NOAWXAFA;SDA B gÕE JEI\YSZZ Z ~61w4WXPQY )oBBWXBB]rYE JEI\YROPeNDZ   o4`C`(9A6ALWXhF מ DSAGV WE [NOWXP [ I"$WXWXLāEҠA+ DSAGV NCWXM [ IA+WXNFрOF [WXEA;WXAĂ/ 43LNO[(`FFA ՠA6AA֠A`AAƀF̄F@BK@" @+ `  @6F@F@``/AB`@ CWVF̈́F` ʀ6AAA   o  6w{qqA6B6D6BF ĠA AZ_Aդ`AQQF̄FN@BK@" H @(_GCCB_@``EF D`@2`G CABŀÀ@@`@"C!`AF@F@ā ܉ZL  Z__(A_ABB o _^7 TBV񀧄UA__ggC_bv+O*P+N{TTOxU΀VG_FZP@Ʉ`_99t`A`00 i_`_ A^  +@(U+@(@#QF*U+UVATVU # /ph@ph?ph@kphsx m\Y/p(p(E%G @  }*19 ' ?p(+p(Y# YDLPWX T]VBG S^YSBYDEQ` LPLπIY@SB INZZI QE# 2SN# PQWXʸNO F # [| TV]R]TSUR^S # " !*\ Yx^A]AZؠQÈJ^*+DYY^yEDDY]AZNWOXQEDZ\\1f*\ "E8Y@Y]RVU ƀWNXOc om ~ +yDZZHnnD؀DeeZπDZ)@AІ̆VUU #  2NO@AGVA PÀYCY# 2V# AVUT# MB TUA/ąV # /A1 # L# ANO# WPXQY)>EYPY # NYR€YNN# A+# 4~ qSÒZNZ# 0_@APOQ`H%} 'F+`HPu `@_P# ZB+F C8# AEYF@Y# pAWXĂ/ # NVWXW# YNY# A+# 4oYS@@YCYZBZ @GVWX@ Y# Q# C @Q# C A @\"\S@"VSO 6ĈEN 6ОEN 6Q`*%VB`H`H5Q`*%VBt`H`H5Q`%VA`HA`HA'kK*Q`V`H 6*%`H`H'. 5D@5c # "S SRKRPQWSРBGVNOPSǀSP S # } o i RBG NOS GS G !GVNO# }S. Q# @ GؠBG! SȜRU# BG! ]^ # I C U# B+# !+# B SXR.*RS SB 9P{Qr@"r."A s⑂@ @AF ## # "r"#s p`pA bDBOϠ 1E OS p# G AEA@BF EG HK 1ETRIP EAO sO G@iNJK˜FC@@BF]GG@oFS#ab?#x#HIHIFA6@B  FD6A+&DHˆI# FF# $T###$f#9Zp pSRXN` P 0Q Q О E@ @ E 1QZ‚p# @M SA GC  ##$$$$$)$)$$6LL@hLOLoLmK qXX3ĤXBXS%''X# YlgE YBA@YHV#Z*@YFHV0NGQFHVIT&DL@LYHVIGtVVHVI YF&GA@GY"GG} p``p[Z )5Z@AB\ZDE6Bd[ p# @##TV00P$v$x ${$vl t%$'.?,$v    4t$'.?,$} $  TCR00P )P T t)))?, T m PP00      T mt$'.?,   PR00  _    t%%,?,   $EDπF ĠB΋QG F ʀD,TR%T(YDۄDI3BJEK  ~CFxDOFB6E@6ArP + 1QCܗ 0y vBD+KFQFQFVAxPB ЄP䀑GG\䟉,|,r",,,P,W"F%SO ZDFF6EEKeee dcAxF@0 CXJQB1h6ǀy C DD P+KFQFBJGy ÂGG/pPAC ,q&f""<OϞw@KQB@61U@ KCNJĂ܄6À @KQNDI@lJFJCIIBΛQ:ʗNyJQKQĀJ/6-&5,,"",,LP('&j IPRED*DDNF  EKBF @Q6@JP F 6 M_CK_%'3 oPDJ IQDF6AKFQCK_%+'PQ͟&v,' "F,|'&&LL K IDGDQh IIADDIIFXJQCcKF6+DJ B%QC*˞aa' QQ ICB1€F DPQ_QAFND&',%~%/&%EKM B%'Q_J  K@* H%'@(KK+I_K#BK`M@#QbAIIDMN F6FKK _IQҠMK1yAʠMK1yv DBKFFM `K@P QQҞ QMJM`UEK>Q hKMeII ΀_E6q.y' IICđB@1B H# k p+p(/*,q",%%+%L,r,,%M,"%''BJFF % $ ʠK` D II ӠB1P1wD+KB I螮 ҠB K D IIF  FBDQKNy@HID@DÀDrI1oD+KGeCI I  ^ BBܗI ICF  ŠB- @KQB@6TLP "F%%J%L%T,"%?Bp MBV ;KI D I KI D I ,'GTYTKPP'\TP'('(wDIBK̈́JSC DIFF IEDמҞОсKy  D5 ͠CFK ICDEKnCCFF DBKCILUCCIDGKCǞ{x "F,q",) ,((,",|,rp؞ӀDIBK̈́JFGFc0 DCIĐ IK ֠CKD@yNqāKJpGFCDEK@CC:`DI77݀FF DCBK Ā$#I" IG}wDI@lJ_6D/6Bh""<,)KF@6+%'6* 6|EK+D@*l# )zEDрF PDIBNCDIEKמ؞ٞ߀DIDBJ1B6GBK'B /6yF ̠BǀII F ^D DBP KDB āBKB6À }J/6wur"F,,P,,q",")""<,," c@ SjB T,)3 C )@aE+6֤ N 6LN 6E@KQ:C6N13C6FB # # }/*F AE D,, ,,+*g++mEDB-5# BCDB1ABCD !E-E*GCV B B# BB# !EEECD# * N 5# 00A0/-=# --B.DBBCDEE EE# G N GH GDN GGGG CD# 0/0A/-v2DBBQ# CDE+E+*# CGCCDQÀCD# G G# GHIGNH# 00U//0A0-V/-C @QBBRRc # 0--F ÄB%*h-B1ANONBB# # +2*+1m# *2Q+*1d# B1ANO 1Q# NOM M# M M# NOM M# 00//.  B 1A)BNO# 00g.M0BBBBGCBGB1D+1A@AB0M# 000.= M0@IG0M# 00.K QPONMLKk p`c # .V # 0.ZF# RR# 0.cN# 0.iN# 0.o# 0.s# 0.wM00M# 00.M00M# 00.# 00.R# .R+R# .M0܀R0M# . M0 HJR0M# .# 00.# 00.# 00.K# RR# 0..2# # 00..2#  # 00. .2I@*# I@#C # 00.5# 0/0.M00M# ..N6@ 5# 00. M0N50M# 00/5# 0/0/M00M# // N 65# 00/! M0 N 50M# 00/- M0 N 50M# 00/9NO@ RA9@A8*2+# --=-B-v-00+0/W@RNOA8# -. /a@RA9@*A # ..=.K.V.Z.c.i.o.s.w../~//A .... A6AA6A0+..../@RA8.A6A    ....0000////!/-  0.../C @C @`pä@Ak p`c #  /W//a/\/9/ // ~1A v0/# # N#  N # 0 @IGVA # 0 1Q# .i|# 0CDE6A)BCDE# 00+?66/66# R B# Q B# P B# 0A#CDEM M# CDE*MMRA R# BNO# 0g0g!QGV++ *2F+3.a" p܀ p܀# I# *6# //0A֒AN2XC N# P# O# Q# N@p# @0A֒AN2XC N# P# O# Q# r@N# @0AIk p`6   *9C @_9#C @o? P Px!@p@C @ *P z ał S 9*q : z6>>  >{c 7~ e6J/6664565|67q60<@ A# @HBD`pCDEF!I JAFGHDIH6 @QDCEGEI A‰ `@# 6w171M# BJJ B` E ``b`# D# r`@@ABCDEF` &`JHIFˤHG^FDZ HFFEFĎEJ # 555b556WBGDFwDHI`(j򀁄IJKLG@ @HA BF@`CED@ H6RC @I܆/#@# ``@ # CČ @䀞l 76w731 01AsA?10,qgI,B0&C1&D `@/ph@ph?ph@kphq`H@@h@`@@q`H@@ 2344~6g |2k22PiSC* bĀ+u*M] # Sm vjsCk JS검@mkb `@nbG*`@ G*g'ā OC  OC   OC  AT   >:χ: : : "y X x B  ! q>B|{ñC F E:  : hCEC @Û㕣f&!1ç1>/Njc   7qmEEEBE5E3--E2E1CICIOVicEdDanoaASSIGN ADVANCE AUTOLOADBACKSP COPY  ]COPYALL CREATE COPYPACKDATE DELETE DISMOUNTDO  DUMP IDIR INIT JOB aKILL MOUNT PAUSE lPRINT RENAME REWIND TIME aVIEW  .VERIFY WTAPEM Z3. ..  OS:: SYSLDZ1LD 'Z1Z2Z1Z2Z3LOCIZ1CICIOCOCCIOC > CX> I L 9ÑXQEpt SICI(a:O0) B( f /ݢǃ \ ߗ Ž%AɿԞSFOV$j1Gɣ€BŞ0ǃdf ]\ ςXXT%VԃPRKЃJE ,sȃJE B   Z1l 1:7 g] + X: 0:7㑀@AM :CI a ˜%̓K:C# %z#y tUFOVf߅SYq0 ƿk@QDɃQC+ly ؇JJJ%I ۇ̓̎؃Ȏ;1HFJ̈́:*u 1:72N+ B㯀@AK[ۃ` 뭀APÒΟQ ÊΒQ ᇋ CISLCL ihDc  0:7 Ń , +# :GO܃GK D1GA  0i:7 7N+ B5@AW'T 1T:7 HgC@  i  1M@6ʃ 1:wfƃDb::B^1ĿV YR:o:W NyLCLXILcLxEm)):;wzCI\   @w:/. ң݃A܃θ @BKѠ1NF ɀɠ뻀BC ߭߰X:/O C:/# @P 6 @ K: p p+ # SL /24 *  -MTEX:: SYS4 UNIMPLIMENTED COMMAND. USE MAG TAPE EXEC (MTEX::)  LU DEVICE FNO 2Ђբ%7OԖAт҇у˖BȂ͇ɇȃuƇţ L Pp:?ιL @  @0¯$㗀@k+U# |yUFOVDUT$IN00#CDM*^^^%][އ^D ه آDԇϢD͇ɢDƇ:r8m߻.*G *' :':':' I Ā 3*     ,:' 'e:' `ϙQ RR # k|yv ),p   هŀBy M  :胞Ec )C @   LO I$  : ;͟͟:+9 ãX+ ¿ :"  ++ " +6E3 .6B-  ,)C @ɟD ]  9 B E H4,Z;E\ C @)$5 p5 ZX c # 4  < cc 5L6‚]?>ۇЀ;Nʀ Dsƞpoà * p6F*4+  <A F  +  A+Iǒ# +Ilj,IR  <<>>v3E\LM*0 R+] -SP -逅 I 7HE ߿ P۞^.рC΀.:D&'6_6 pQJNyJQIQJQD߫ð˪ǩ_6^o6G G ÀF D pM@+C @* B D < ]  3  |p^ [Tp OD E , Rp# qkwxyno  09 ĿğE° ݃S ۿE œǚà  "MT> ̃iJey \b Y][]Ẇ̃[Y:F QAƟ  0:K ؃;975;G d: :؃˃'"ȃ%ţÐ Q`ȃƃ:W؟ ~  C쿩aW: T1D ›ǙCC n>MT  1n6ȃE  dSB@A@YIP +OPPw F +DD ? ,# # FL$"9 ]spmkj%gC @  [ G @Aǹ öG ǵ :?hE 6ߟt+ ÛN Cߘg/zc # D23#C  j{ +ts n (ܣ;+ I 5BB}+ߩߨm e_ A# 6J:/ ߕߌ  # } 4,v q;&g `` ^  6 +@VK K7GH+ FCnB.#  !b -  IǤ+ߠ'i %+!cIǓ+ߏXU + # }LA*E\CR J NAME .EXT LENGTH DATE TIME EXTENTS  AU'S F# 2NDX NAMSJ NAME .EXT NAME .EXT NAME .EXT NAME .EXT <1PAGE VIEW (E700) UNIT=  VOLUME= J 19YY/MM/DD HH:MM:SS CREATED 19YY/MM/DD HH:MM:SS DIRECTORY=  TITLE=  TOTAL AU'S =  TOTAL FILES=  AU'S FREE =  AU'S USED = FA FB FSUFFL NAMEONLYEXTENDEDSTANDARDALLFILES NOTREE @DIRONLY SUMMARY  ž% SӃт:O)i cbUFOVT5 ң1D ²ǰ_NGDW  MT /I A˂ˇ!+ bƃ DQ2[Y‡Y:BŞ 0: HCG d d:Ã3Ξ: ÏK + *j ,cIR "Çe:^ \Z:_ S¯K E1+ ? y% njy# {kwkusr9d  n4  Gң: y 4 À- # # ßßßßPH㨌DBð; ™2/ :$":DIR /3 fcłŇe:  ЀC 6IMƢIBG ߦߨn҃<=:  # k|Lyv sZ3 "wL ܇ɇɇڇڇڂڇڇهه# lҿEµdz Nǂ݃ ۿE ¡ǟ6à #$MT>\̓a^NyJQSYP PTKTQI: D=QA  0:C2 .Aك0.30.:J 0:郏Þ "& Bѿhi 1D ”ǏSS!MT> CtSB@A@Y974 +>\ \ÿ+` ,B# pwstpqmnkjg'd+؃%̓ H'Z3Z4#snA₞+ š:B2 0: RVQQ ̓Et:p 0: ÜQ ÚK[ :_  "pa`,+,cd q 99  +1 ,# OVERWRITE Z4'Z3\:ラ - - :: # W| EEٞٞ٢Q9 هآ SȀ; π QI ÀDy Ń8e+± :XZI%QI :'# ~ {x ,IR *:ˇ Ƣɿ Ň Z¿ 1㿣@AǽigeceP((@6ˀ:7:w1 E1DSB%%:#+kߎP#  E\zCI w=ɞ ǀŃ ܢÿG ǽD  ?êG!@ «:? ǃÓG!ϒR# MT#2C4 ]<k.YC @ كR֣ЀL̃Fȏ̞v 㿀߷:/ c # c # : o:Wy C X c x ~l 1:7 # # DE *\: a =C @G`@@Q+kc I# c # C @QQ@AǩY%'㥣%'ߞߟߛqc I# c # C @QP@Aǐ@%'㌣%'߆߇߃rc # C @) w'N GpoN15c # :_:WFy# C @H^@N2@% @'Suc # C @)@ G@0FD5c # C @%'ߙc # C @@Xy}@} . ~ .M I.M~I.d@bc # 4.C @yI [ /O+Um kHic # dII C :7+UU S0Q#  { Hʑw I䀅 I.Gj#   ҃ՇՂՇբ)Ƣς:# :|xĢ%CýL(Ӄ )1B ,_ +]# wk t0123456789ABCDEF dUFOV& ̂Ѣ%͇͇̓p%都E샷: _õK  !:'  :'# {xktqnUFOV$f/,+*d: -R-<H-<::  ># ;_|00 \#&& m VT1Pc  ÕT ‘Ǒ  # {TV(C @` @@Aǡ%'  +ÖN1B60ߑo pc #   kc # ߇: I E܂AA # } {  0:' # Ξ} 1:' # Ş}ć ‡:C #  {I Ƿ :  0:? Ø G!Ǖ:? 1:? # }F+*.?CB5ރˏ̇eˠS6ćYG*@ # IM"  + # B ? >:? ? 1#  1y w'#un"Dwx!H V@ąڄD΢gk9IUE@+t@y# Y+9 T v 0:/ # } 1:/ # } {+ âK):/qp :' D # } {OL!SL/LO264*,. 0:::G:6: ߏl# # Fe #"G:s;r:omi - `@QA+kVV죅Z# $% +u:r +:6k hC @ߴ ³ -IîG! G!@B @Injc #  *BLOCK AU  IĀ+# Ӟ 1 # I?ʣʄ+U# LH ǢE # B( | :)䃧⃰ ކIIڣ; 㞀@+kUƀy@NyC # , 4Ƀ S DB # 3 { [9:'7SX@AKN1O # ݞ}KFA+s # } ɣ| 0VKԀCC C :'ߢm ^] |  G ǡǡ::  # |IR*+.#&! # } B90.r# Z1# zTQS: ɣB:#  2YSIN ˃mm ÃkB# gyQ B ΢TT˃Q )HH # BB yTO) }@5I1%C B'`(j%C @'` dK#oe `kA YX ƃD  # % {#  ~|{IC @`@@+kc #  ~ƊK 1ģ+ icqp  C @ @…Ā+c # EXEC (E700)  AU YY/MM/DD HH:MM:SS /JOB (FILE IS OVERWRITTEN) > FILE ALREADY EXISTS. OVERWRITES IT?(Y OR N)  VERIFY SUCCESS VERIFY IS PROGRESSING , END OF MEDIA, MOUNT NEXT VOLUME?(Y OR N)  END OF MEDIA  FILES DO NOT MATCH SYNTAX ERROR INVALID COMMAND  DIRECTORY NOT FOUND  INVALID UNIT NAME  INVALID OPTION INVALID DECIMAL NUMBER UNIT NOT FOUND INVALID FILE NAME & FILE ALREADY EXISTS FILE NOT FOUND ON " NEITHER UNIT OR VOLUME SPECIFIED CLOSING  VOLUME NOT GIVEN( CORRECT VOLUME NAME IS  PARAMETERS IGNORED & FILE IS SYSTEM FILE BAD AU  UNITS NOT SAME TYPE INVALID DATE  INVALID TIME  SYSTEM LOGICAL UNIT  NOT LABELED  UNITS DO NOT MATCH  JCL STACK FULL 8 FILES DO NOT MATCH AT RECORD WORD 2 FILE DOES NOT EXIST, CREATE IT? ZBP* CI XQ# zZ$ 0>:ɂφ; P8 5:)XQ` P] @ V2Ԟ+ QP6qJ©@)5JQB|@ 1 :Z$ÙXQÖ֘ǔ1D .Z%+ (*<ևσՇ :ʇ : &:   P ": 1:ւA:: ` 란A: 0:Z$#  CIUFn⧂ @+k zZ$C @ YYZ OY T: c # pZ$@V KL`$ BATCH FILE NOT FOUND* BATCH QUEUE EMPTY - PROCESSING SUSPENDED " BATCH QUEUE PROCESSING COMPLETED  OS4 INTERACTIVE MODE RESUMED  LUN EF NOT FOUND  I/O ERROR ON LUN ZBmECEBE5E3--E2E1 1:ւA:: ` 란A: 0:Z$#  CIUFn⧂ @+k zZ$C @ YYZ OY T: c # pZ$@V KL`$ BATCH FILE NOT FOUND* BATCH QUEUE EMPTY - PROCESSING SUSPENDED " BATCH QUEUE PROCESSING COMPLETED  OS4 INTERACTIVE MODE RESUMED  LUN EF NOT FOUND  I/O ERROR ON LUN ZBmEOVicEdDanoL!  ~*w:!C:!n"C SL@!LO!@!CI @!CI!" ADDITIONAL LOG DEVICE = ^H 0   # RH 1 # F$H!! >z$iy 7:!l:! iN K ,&:" S &&:" AT:" GV !" YLO i-I$;W@Q})iG# G*)t4 G#" `H3EG@I GLJ(#I#J$$#K#L#?$j6  a6BZ6Be' KUI*1 DC* 1 6. *:* 1 5ŀ We'(6Qn@6 Ɯ&p$2$2$N$2UW$###!"73 i 6B_ 6A+) B)-%'N )/+=σM,0)  ########$ %', Ӄ).͞t̞Y" 6A+ .%޼'&$ 4  6I1+U 6⬞ 6A++ B+k++ A+k@6‚$vJ1 $v${#D$$t#E !#$ 08$ $ 0 5 t$3$= Hk H_4  LSI 4 INSTRUCTION SET TIMER   +0000.00 USEC:  + 000.00 MSEC: I/O ERROR4 LSI 4 INSTRUCTION SET TIMER....END  DOCUMENTATION NOT FOUNDR$ $0$$$ $$$# $$$ 6LSI4/90 BASIC + FLOATING POINT OPTION INSTRUCTION SET $$$^$$$ $$$V$$$ $$$N$$$ DATE: / /$$$@$$$ CONFIGURATION:$%%2%%%!8 CPU: LSI4/90 WITH BASIC + F.P. OPTION INSTRUCTION SET %%#%#%$%%%% MEMORY: %%%/%/%0%1%1 6RTC INTERRUPT OVERHEAD COMPENSATION: 2000 NANOSECONDS %1%Q%Q# %R%T%TUSEC = MICROSECONDS %T%c%co%d%e%e&ALL TIMES +- 50 NANOSECONDS (.05 USEC)%e%}%}U%~%% %%%M%%% %%%E%%% %%%=%%%!8 * SINGLE WORD MEMORY REFERENCE ADDRESSING - WORD MODE *%%%%%% %%%%%%%%%T߄|#%%% RELATIVE DIRECT %%%To|# %%%RELATIVE INDIRECT, XA=1 %%%TU|g&D%%%%&&gTI{[&&&"RELATIVE INDIRECT ONE LEVEL, XA=0 &&&gT,{>&#&$&$& 10 ADDITIONAL LEVELS&$&<&<gT { &ODEFGHIJKLM&B&P&P&P&T&TT߄|#&Y&\&\"ABSOLUTE (SCRATCH) INDIRECT, XA=1 &\&r&r Tf| # &w&z&z&z&~&~gTY{u&&&,ABSOLUTE (SCRATCH) INDIRECT ONE LEVEL, XA=0 &&&g T7{S&&&0 10 ADDITIONAL LEVELS& &&g T{/&&&&&&T|$&&&DIRECT POST-INDEXED &&&T߃|#&&&INDIRECT POST-INDEXED &&&Tl|# ''''''`T`{u' ''PRE-INDEXED DIRECT'''`PTJ{_'#'$'$PRE-INDEXED INDIRECT'$'3'3`LT4{I'9':': PRE-INDEXED DIRECT POST-INDEXED ':'O'O`T{-'U'V'V"PRE-INDEXED INDIRECT POST-INDEXED 'V'l'l`T߃{#'r't't 't'z'z'{'|'| '|''# '''":* SINGLE WORD MEMORY REFERENCE INSTRUCTIONS - WORD MODE * '''\''' '''T''' '''T<}K''' 6COPY MEM,REG - LOAD REGISTER FROM MEMORY, WORD MODE '''T|%''' 6COPY REG,MEM - STORE REGISTER INTO MEMORY, WORD MODE'((T߄|## (( (  2ADD MEM,REG - ADD MEMORY TO REGISTER, WORD MODE( ((((T]|\(-(.(." :SUB MEM,REG - SUBTRACT MEMORY FROM REGISTER, WORD MODE (.(P(PT5|4(U(V(V" :EXCH MEM,REG - EXCHANGE MEMORY WITH REGISTER, WORD MODE (V(x(xT | (}(~(~4AND  MEM,REG - AND MEMORY WITH REGISTER, WORD MODE(~((T߄|## (((4OR MEM,REG - OR MEMORY WITH REGISTER, WORD MODE (((T\|[((($>XOR MEM,REG - EXCLUSIVE OR MEMORY WITH REGISTER, WORD MODE (((T2|1(((.CSK REG,MEM - COMPARE 3 WAY (<), WORD MODE ())T|))). (>), WORD MODE ))3)3 T߄{## )9)=)=. (=), WORD MODE )=)Y)Y  T]z\)`)a)a)a)e)e# )hTQzP)l)m)m,JMP ADDR - UNCONDITIONAL JUMP, WORD MODE )m))T0|/)))!8JST ADDR - JUMP AND STORE PROGRAM COUNTER, WORD MODE )))T|))))))# )T߅xKK## )))!8JSK ADDR - JUMP AND STACK PROGRAM COUNTER, WORD MODE )))ZYTXzW))))))TN|M)))#+>PRE-INDEXED DIRECT, BYTE MODE +>+R+R `%`'Ty+Z+[+[ PRE-INDEXED INDIRECT, BYTE MODE +[+p+p `%L'T߃y## +x+{+{*PRE-INDEXED DIRECT POST-INDEXED, BYTE MODE+{++ `%'T^y]+++,PRE-INDEXED INDIRECT POST-INDEXED, BYTE MODE+++ `%'T:y9+++ +++1+++ +++)+++":* SINGLE WORD MEMORY REFERENCE INSTRUCTIONS - BYTE MODE * ++++++ +++# ++++,,%'T{u#, , ,  6COPYB MEM,REG - LOAD REGISTER FROM MEMORY, BYTE MODE , ,+,+ % 'TZzL,2,4,4 6COPYB REG,MEM - STORE REGISTER INTO MEMORY, BYTE MODE,4,T,T % 'T1z#,[,],]2ADDB MEM,REG - ADD MEMORY TO REGISTER, BYTE MODE,],{,{% 'T z# ,,,":SUBB MEM,REG - SUBTRACT MEMORY FROM REGISTER, BYTE MODE ,,,% 'T߃zU#,,,!8EXCHB MEM,REG - EXCHANGE MEMORY AND REGISTER, BYTE MODE,,, % 'TXz*,,,4ANDB MEM,REG - AND MEMORY WITH REGISTER, BYTE MODE,,, % 'T0z---4ORB MEM,REG - OR MEMORY WITH REGISTER, BYTE MODE --"-"% 'Tz# -)-,-,$>XORB MEM,REG - EXCLUSIVE OR MEMORY WITH REGISTER, BYTE MODE -,-P-P% 'T߃zS#-W-Z-Z.CSKB REG,MEM - COMPARE 3 WAY (<), BYTE MODE -Z-v-v %'T]z--}--. (>), BYTE MODE --- % 'T7y---. (=), BYTE MODE --- %  'Tx# ------# -Tzs---,JMP ADDR - UNCONDITIONAL JUMP, BYTE MODE ---T߄|R#---!8JST ADDR - JUMP AND STORE PROGRAM COUNTER, BYTE MODE -..T[|).".$.$.$.(.(# .,TLxKK.1.4.4!8JSK ADDR - JUMP AND STACK PROGRAM COUNTER, BYTE MODE .4.U.U\[T!z# .\.^.^.^.b.bT|v.g.i.i#PRE-INDEXED DIRECT POST-INDEXED, DOUBLE WORD MEMORY REFERENCE 00<0<` 2T߃zT#0C0E0E%@PRE-INDEXED INDIRECT POST-INDEXED, DOUBLE WORD MEMORY REFERENCE 0E0j0j` r TUz&0q0r0r 0r0x0x0y0z0z 0z000002 * MULTI-WORD MEMORY REFERENCE INSTRUCTIONS * 000# 000 000x000000T}o0004COPYE MEM,REG - EXTENDED LOAD REGISTER FROM MEMORY 000T߃{I#0004COPYE REG,MEM - EXTENDED STORE REGISTER INTO MEMORY000 T\{"1110ADDE MEM,REG - EXTENDED ADD MEMORY TO REGISTER111 T8{# 1$1&1&!8SUBE MEM,REG - EXTENDED SUBTRACT MEMORY FROM REGISTER 1&1G1G T{X1M1N1N 6EXCHE MEM,REG - EXTENDED EXCHANGE MEMORY AND REGISTER1N1n1n T߃{1#1t1v1v2ANDE MEM,REG - EXTENDED AND MEMORY WITH REGISTER1v11T]{ 1112ORE MEM,REG - EXTENDED OR MEMORY WITH REGISTER 111'T8{# 111#) 22)2)' T_z202121, (=) 212L2L '  T;y# 2T2V2V 6CSME MEM,REG - EXTENDED COMPARE MAGNITUDE 3 WAY (<) 2V2v2vT{Y2|2}2} 6  (>) 2}22 T߃z1#222 6  (=) 222   TYy222(CEA ADDR - COMPUTE EFFECTIVE ADDRESS 222T9{# 2222ADDC MEM,REG - ADD MEMORY TO REGISTER WITH CARRY 233T{[333":SUBC MEM,REG - SUBTRACT MEMORY FROM REGISTER WITH CARRY 33737'T߃{2#3=3?3?3?3C3C Tw{&ZZg3I3N3N!8MUL MEM,REG - MULTIPLY MEMORY AND REGISTER (TYPICAL) 3N3o3o [Z'TIy# 3w3y3y$>DIV MEM,A:REG - DIVIDE DOUBLE REGISTER BY MEMORY (TYPICAL) 3y33 ..'TyS333333# 3TzG333*JMPE ADDR - EXTENDED UNCONDITIONAL JUMP 333 T߃{&#333 6JSTE ADDR - EXTENDED JUMP AND STORE PROGRAM COUNTER 333' T[{# 333344# 4TLxrKK4 4 4  6JSKE ADDR - EXTENDED JUMP AND STACK PROGRAM COUNTER 4 4,4, ][T!yG444545454949T|=4>4@4@!8IMSE MEM - EXTENDED INCREMENT MEMORY & SKIP (NO SKIP) 4@4a4aG T߃z#4h4j4j4  (SKIP)4j44 G  TZy# 444$>DMSE MEM - DECREMENT MEMORY & SKIP IF RESULT = -1 (NO SKIP) 444g T-zT444":  (SKIP)444 g  Ty)444444T߃}#4444COPYE MEM,A:REG - LOAD DOUBLE REGISTER FROM MEMORY 455'T\{# 5554COPYE A:REG,MEM - STORE DOUBLE REGISTER INTO MEMORY55;5;'T5{Z5A5B5B 5B5H5HR5I5J5J 5J5P5PJ5Q5R5R& * IMMEDIATE INSTRUCTIONS *5R5j5j05k5l5l 5l5r5r(5s5t5t!8COPY =-IMM,REG - LOAD NEGATIVE IMMEDIATE INTO REGISTER5t55T߃|#555!8COPY =IMM,REG - LOAD POSITIVE IMMEDIATE INTO REGISTER 555 T[|# 5552SUB =IMM,REG - SUBTRACT IMMEDIATE FROM REGISTER555 T6|\555,ADD =IMM,REG - ADD IMMEDIATE TO REGISTER 566 T|;66 6 .CLSN =IMM,REG - COMPARE LOWER BYTE (NO SKIP)6 6%6% T߃|#6*6,6,,  (SKIP) 6,6G6G T`{# 6M6O6O.CSK =IMM,REG - COMPARE 3 WAY IMMEDIATE (<) 6O6k6k T=|^6p6q6q. (>) 6q66  T{;666. (=) 666   T߃z#666.AND =IMM,REG - AND IMMEDIATE WITH REGISTER 666T`|# 666,OR =IMM,REG - OR IMMEDIATE WITH REGISTER666T>|_666 6XOR =IMM,REG - EXCLUSIVE OR IMMEDIATE WITH REGISTER677T|97"7#7# 7#7)7)17*7+7+   7+7171)727373, * REGISTER TO REGISTER INSTRUCTIONS * 737N7N 7O7P7P 7P7V7V7W7X7X *COPY REG,REG - COPY REGISTER TO REGISTER7X7r7r T߃|## 7w7z7z,NEG REG,REG - NEGATE REGISTER TO REGISTER7z77 T`|_777 *ADD REG,REG - ADD REGISTER TO REGISTER 777 T@|?777 0SUB REG,REG - SUBTRACT REGISTER FROM REGISTER777 T|777,AND REG,REG - AND REGISTER WITH REGISTER 777 T߃|## 788*OR REG,REG - OR REGISTER WITH REGISTER888 Ta|`8 8!8!4XOR REG,REG - EXCLUSIVE OR REGISTER WITH REGISTER8!8@8@ T<|;8E8F8F,CSN REG,REG - COMPARE REGISTERS (NO SKIP)8F8a8a T|8f8g8g*  (SKIP) 8g88  T߃{## 888,CSK REG,REG - COMPARE REGISTERS 3 WAY (<)888+T`|_888, (>)888+ T>{=888, (=)888+  Tz888 0EXCH REG,REG - EXCHANGE REGISTER WITH REGISTER89 9  T߃|## 9990COMP REG,REG - COMPLEMENT REGISTER TO REGISTER99292 T^|]979898,CSM REG,REG - COMPARE MAGNITUDE 3 WAY (<)989S9S&T=|<9X9Y9Y, (>)9Y9t9t& T{9z9{9{, (=)9{99&  T߃z## 999 999x999 999p999* * BIT MANIPULATION INSTRUCTIONS * 999T999 999L9992SBIT BIT,REG - SET GENERAL PURPOSE REGISTER BIT 999 T)|(9994RBIT BIT,REG - RESET GENERAL PURPOSE REGISTER BIT 9:: T|:::!8CBIT BIT,REG - COMPLEMENT GENERAL PURPOSE REGISTER BIT::>:>T߃|## :C:F:F# > /Tc|1>>>>>>TZ}(>>>#><></T1|# >A>C>C( - 10 ADDITIONAL PLACES>C>\>\/T|a>a>b>b>b>f>fT}X>j>k>k!8ROTATE A:REG,L,1 - ROTATE DOUBLE REGISTER LEFT 1 PLACE >k>>/T߃|1#>>>( - 10 ADDITIONAL PLACES>>>/Tc|>>>>>>TZ}>>>#>>/T1|# >>>( - 10 ADDITIONAL PLACES>>>/T|a??????T}X? ? ? !8SHIFT A:REG,R,1   - SHIFT DOUBLE REGISTER RIGHT 1 PLACE ? ?.?./T߃|1#?3?5?5( - 10 ADDITIONAL PLACES?5?N?N/Tc|?S?T?T?T?X?XTZ}?\?]?]#ROTATE A:REG,RO,1 - ROTATE DOUBLE REGISTER RIGHT W/OV 1 PLACE ?@#@#/ T0|# @(@*@*(  - 10 ADDITIONAL PLACES@*@C@C/T|a@H@I@I@I@M@MT}X@Q@R@R$>SHIFT A:REG,RA,1 - SHIFT DOUBLE REG RIGHT ARITHMETIC 1 PLACE @R@v@v/ T߃|.#@{@}@}( - 10 ADDITIONAL PLACES@}@@/Tc|@@@ @@@@@@ @@@# @@@* * CONDITIONAL JUMP INSTRUCTIONS *@@@d@@@ @@@\@@@@@@T%}S@@@4JEQ REG,ADDR - JUMP IF REG CONTENTS = 0 (NO JUMP)@@@@T|.@@@2  (JUMP) @AA@T߃| #A"A$A$ 6JNE REG,ADDR - JUMP IF REG CONTENTS NOT 0 (NO JUMP)A$ADADT\|# AIAKAK4  (JUMP) AKAjAjT6|[AoApAp4JGT REG,ADDR - JUMP IF REG CONTENTS > 0 (NO JUMP)ApAA@T|6AAA2 (JUMP) AAA@T߃|#AAA 6JLE REG,ADDR - JUMP IF REG CONTENTS <= 0 (NO JUMP) AAAT\|# AAA2 (JUMP)AAAT7|\BBB 6JGE REG,ADDR - JUMP IF REG CONTENTS >= 0 (NO JUMP) BB%B%@T|6B*B+B+2  (JUMP)B+BIBI@T߃|#BNBPBP4JLT REG,ADDR - JUMP IF REG CONTENTS < 0 (NO JUMP)BPBoBoT]|# BtBvBv2 (JUMP) BvBBT8|\BBBBBB T.|RBBB":IJEQ REG,ADDR - INCREMENT & JUMP IF RESULT = 0 (NO JUMP)BBB 4@T{)BBB!8  (JUMP) BBB 4@T߃{#BBB#JNED REG,ADDR - DECREMENT & JUMP IF RESULT NOT -0 (NO JUMP) CCC 5TW{# CCC": (JUMP)CCC 5T-{WCCCCCCT#|MCCC4JT SS,ADDR - JUMP IF SENSE SWITCH SET (NO JUMP) CDD@T߃{'#D!D#D#0 (JUMP)D#D@D@@T^{DFDGDG!8JF SS,ADDR - JUMP IS SENSE SWITCH NOT SET (NO JUMP) DGDhDhT6{# DnDpDp4 (JUMP)DpDDT{ZDDD`DDD0T|PDDD`.JT OV,ADDR - JUMP IF OV BIT SET (NO JUMP) DDD06@T߃{-#DDDb* (JUMP)DDD06@Ta{ DDDb2JF OV,ADDR - JUMP IF OV BIT NOT SET (NO JUMP) DEE06T<{# E E E `.  (JUMP)E E'E'06T{]E-E.E.`.JT CY,ADDR - JUMP IF CY BIT SET (NO JUMP) E.EJEJ0V@T߃{:#EPERERa* (JUMP)ERElEl0V@Ta{ErEsEsa2JF CY,ADDR - JUMP IF CY BIT NOT SET (NO JUMP) EsEE0VT<{# EEE`. (JUMP)EEE0VT{]EEE EEEUEEE EEEMEEE" * I/O INSTRUCTIONS *EEE5EEE EEE-EEEEEET߃}$#EEE&OUT REG,DAFC - OUTPUT FROM REGISTEREFFTd|FFF$IN REG,DAFC - INPUT TO REGISTER FF+F+TG|# F0F2F22SELP REG,DAFC - SELECT AND PRESENT REGISTER DATAF2FPFPT"|\FUFVFV.SST DAFC - SENSE AND SKIP IF TRUE (NO SKIP)FVFrFrT|:FwFxFx$>USEC: (SKIP), CALCULATED FxFFFFF 6USEC: AIB DAFC - AUTOMATIC INPUT BYTE (CALCULATED) FFF# FFF 6USEC: AOB DAFC - AUTOMATIC OUTPUT BYTE (CALCULATED)FFF^FFF 6USEC: AIN DAFC - AUTOMATIC INPUT WORD (CALCULATED) FGG<GGG 6USEC: AOT DAFC - AUTOMATIC OUTPUT WORD (CALCULATED)GG%G%G&G'G' G'G-G-G.G/G/ G/G5G5 G6G7G7$ * CONTROL INSTRUCTIONS *G7GNGN# GOGQGQ GQGWGW xGXGYGYGYG]G]T߃}o#GaGcGc.FMT REG - FETCH MACHINE TYPE INTO REGISTER GcGGT`|LGGG4UIS - UPDATE INTERRUPT STATUS OF I/O CONTROLLERS GGG T;|'GGG$XNX REG - INDEX NEXT INSTRUCTION GGG T| GGGGGGT|GGGSIN COUNT - STATUS INHIBIT GGGT߃{## GGG GGGxGGG GGGpGGG$  * STACK INSTRUCTIONS * GHHWHHH HHHOHHHHH#H#߇|DzCKK#H*H.H.*PUSH STATUS - PUSH REGISTERS ONTO STACK H.HHHH bC ```zxHQHRHR"POP - POP REGISTERS FROM STACK HRHhHh Bc AA{߃y## HpHsHsHsHwHw p pp TtysHHHRSK - RETURN THROUGH STACK HHH p p# p TUxTHHH HHHLHHH HHHDHHH( * PROGRAMMED TRAP INSTRUCTIONS *HHH)HHH HHH!HHH}HHHHTxHHH}UTRAP REG,VALUE - USER TRAPHHH T߃y## HHH}STRAP REG,VALUE - SYSTEM TRAPHII TdycIII II!I![I"I#I# I#I)I)SI*I+I+( * FLOATING POINT INSTRUCTIONS * I+IDID8IEIFIF IFILIL0IMININ$  (ALL TIMES ARE TYPICAL) INIeIeIfIgIg IgImImInIoIoIoIsIsÇ߇|zLL#IzI~I~4FIX - CONVERT FROM FLOATING POINT TO FIXED POINT I~II ]] \{߃y## III4FLOAT - CONVERT FROM FIXED POINT TO FLOATING POINT III È 2{YyXLLIII$ADDF MEM - FLOATING ADD, NO ALIGN III É\z6x5LsLtIII& , ALIGN ACC 1IJ J  ee\f߅zx#JJJ( , ALIGN ACC 11 JJ1J1 AA\Daz߃x## J:J=J=4  , NO ALIGN, DIFFERENT SIGNSJ=J\J\ \6zXxWLJeJgJg(SUBF MEM - FLOATING SUBTRACT, NO ALIGNJgJJ É\z4x3LsLtJJJ, , ALIGN ACC 1 JJJ bb\߅z x #JJJ, , ALIGN ACC 11JJJ <<\_z߃x## JJJ": , NO ALIGN, DIFFERENT SIGNS JJJ \v1zUxTLKKKMULF MEM - FLOATING MULTIPLYKKK É\_z6x5L{L| K#K&K&DIVF MEM - FLOATING DIVIDEK&K9K9 jj\B߅zx#KBKDKD(CSKF MEM - FLOATING COMPARE 3 WAY (<) KDK]K] Ë\&az߄xL## LKfKkKk(  (>) KkKK bÉ\ 9y\w[LKKK( (=) KKK =Ê\  x6v5L pPpP w pPz@KLsQD=NQLQLVLH~^]ODSLSLOCIS LP01 R<2*, LP00 i< 2HJ Zxex"Pn0 "P MHZZ # ))-.W34/Yf[RICNBCO# $'/p(p(` D/ph@ph)@BCOD6D[ `+ʀP COBBT€RQ EVBQ mWG CW90.r@ VBCO6OV00ߞހP D  /NBy M  `+d,NQ (Vy )ք5` @P  `+MN sVWNy%ZrY['OCP  /NM D%Y'B2BC] ҀO? ?ph@kphD?p(+p(# r pN N igIRN1N1  # 6d/p(p(` BDCEAׂI `+C Uф@z 0 :D A FE [ _ E :E ED DAQ\DQZBN!BB @BCN1@CA,D,E,@k%'jACN€MDB BEB CA?p(+p(#  </p(p(` /p(p( MNQ@ ϪSW/p(p(Nq% ' z ` ?p(+p(M?p(+p(# '?p(+p(L 0nMN1EMM M1ÉB I@@Mǁ# Ǡ1DSB# :"SFUFUϤA FDZYBZ Z Bą  Y H H H @ ɠAZg Zu^U  Tpgx !rrfѤA ʄZH ОǞȞɀWX AZȀ  TZT UVETj`ZЀ`ZʠAZZgZAv^  Tg~ !rN͠Y ABSA ZZߠYۀABā A@Ѐ ĀBĉZĊ¨ć§ā@ giZAZw ABZZCAN ^U  T I r !Mp*B1:A! _ "* H1xvB C @C @ pā_B __ __6 1  pE/p  p_/p p @*3AB1NBɀ6f 1 g/p py ^ J|rUljPc Pfdma1*\BB1HVggRyVӞ N OQJ?QC @QBTP G `QRS GGG_\ ­G!ac BR IG!SGBĝBR IG SB # ~gxuU Y 1C# MT^C @C @C @C @C @`p FYcB/p $p# x'  I[QaGWXZ/p(p(Y@IC @C U?p(+p(# }gYIA@AĊ# PB1LZĀ6P1PA# ƒċ# )IGVWXWBG! R]^TVC SSURR9ƀ^S66 # ~TɞQ;/ph@ph@(РP+?ph@kph P+P6jP  fP{z  Ā ΥQ/ph@ph ?ph@kph ?ph@kph # ?ph@kphvH(MT !CZB+E(z(# ^][WXS SDI@ Y\΀[ PWXG[ # I\ba\+U*ZZ# g~YYB1Jy YQ^\YQg!WXWXJS+XW7y B N OLƠQ ?G # }{y>v N O6ӠQMI+9\Y\+\JR9P$P#    \F6\AB [ IZF cL\FXN9C  , 0 B          B[GZI # %A6AkDYLWXFXC         P P0WXADAASO`NCZNZYNNYCYTڀ`LS  g~EXWFA Z [NWOX I ]G [NWOXWXPAOGAjA6QSÂYK=A:YQFXQfx'`WX%A$EA [SÂlYHAgYDfc#LWXā   A6ADYF             g g    9WXAPQBWXFA;A6XSÀYRSDAYA]Aw& + `g,v  . .BnWNXOAhPQfBbWX``F^AY\;[A6_SÀYSYSAIQQYAbAWFXFBBAA@k?((WXY )C-NOAWXAFA;SDA B gÕE JEI\YSZZ Zx v . 1w4WXPQY )oBBWXBB]rYE JEI\YROPeNDZg,`C` 9A6ALWXhF מ DSAGV WE [NOWXP [ I   WXWXLā EҠA+ DSAGV NCWXM [ IA+WXNFрOF [WXEA;WXAĂ/ H +LNO[ `FFA ՠA6AA֠A`AAƀF̄F@BK@" @+ `  @6F@F@``/AB`@ CWVF̈́F` 6AAA g   !{qqA6B6D6BπF ĠA AZ_Aդ`AQQF̄FN@BK@" H @(_GCCB_@``EF D`@2`G CABŀÀ@@`@"C!`AF@F@ā ܉ZL  Z__  A_ABBg~WV7 TBV񀧄UA__ggC_bv+O*P+N{TTOxU΀VG_FZP@Ʉ`_99t`A`00 i_`_ A^  +@(U+@(@#QF*U+UVATVU # /ph@ph?ph@kphspm\Y/p(p(E%G @  }*19 ' ?p(+p(Y# YDLPWX T]VBG !  S^YSBYDEQ` LPLπIY@SB INZZI QE# 2SN# PQWXʸNO F # [| TV]R]TSUR^S # "\ Yx^A]AZؠQÈJ^*+DYY^yEDDY]AZNWOXQEDZ\\1f*\ "E8Y@Y]RVU ƀWNXOcgev~+yDZZHnnD؀DeeZπDZ)@AІ̆VUU # 2NO@AGVA PÀYCY# 2V# AVUT# MB TUA/ąV # /A1 # L# ANO# WPXQY)>EYPY # NYR€YNN# A+# ( qSÒZNZ# 0_@APOQ`H%} 'F+`HPu `@_P# ZB+F C8# AEYF@Y# hAWXĂ/ # NVWXW# YNY# A+# HoYS@@YCYZBZ @GVWX@ Y# Q# C @Q# C A @\"\S@"VSO 6ĈEN 6ОEN 6Q`*%VB`H`H5Q`*%VBt`H`H5Q`%VA`HA`HA'kK*Q`V`H 6*%`H`H'. 5D@5c # "S SRKRPQWSРBGVNOPSǀSP S # }g~i RBG NOS GS G !GVNO# }S. Q# @ GؠBG! SȜRU# BG! ]^ # I C U# B+# !+# B SXR.*RS SB 9P{Q8(@8(.A s⑂@ @AF ## # 8(?K# SoTV00P oSt8 ?!o    o,t ?!     EDπF ĠB΋QG F ʀDTR$YDۄDI3BJEK~CFxDOFB6E@6ArP + 1QCܗ 0y vBD+KFQFQFVAxPB ЄP䀑GG\䟉w4>SO ZDFF6EEKeee dcAxF@0 CXJQB1h6ǀy C DD P+KFQFBJGy ÂGG/pPAC 4OϞw@KQB@61U@ KCNJĂ6À @KQNDI@lJFJCIIBΛQ:ʗNyJQKQĀJ/6-% w4LPj IPRED*DDNF  EKBF @Q6@JP F 6 M_CK_%'3 oPDJ IQDF6AKFQCK_%+'PQ͟>9~LL K IDGDQh IIADDIIFXJQCcKF6+DJ B%QC*˞aa' QQ ICB1€F DPQ_QAFND4LEKM B%'Q_J  K@* H%'@(KK+I_K#BK`M@#QbAIIDMN F6FKK _IQҠMK1yAʠMK1yv DBKFFM `K@P QQҞ QMJM`UEK>Q hKMeII ΀_E6q.y' IICđB@1B H# k p+p(/*wx4% TnBJFF % $ ʠK` D II ӠB1P1wD+KB I ҠB K D IIF  FBDQKNy@HID@DÀDrI1oD+KGeCI I  ^ BBܗI ICF  ŠB- @KQB@6TLP > ?Bp MBV ;KI D I KI D I BTYTKPPTPwDIBK̈́JSC DIFF IEDמҞОсKy  D5 ͠CFK ICDEKnCCFF DBKCILUCCIDGKCǞ{x >w4w{ p؞ӀDIBK̈́JFGFc0 DCIĐ IK ֠CKD@yNqāKJpGFCDEK@CC:`DI77݀FF DCBK Ā$#I" IG}wDI@lJ_6D/6Bh4%)KF@6+%'6* 6|EK+D@*l# B@SA# F@6 @`E%  }*19'`@F@6 A # EJCC H # C lF0 A@ĀfDK@A A@ āF6܂# C݄ # C B@.y$B8%# # CC #  "&$@&@## # ܗ+ A !@ )A G֏@'G# C# j194BF ?@@ā6F @ā6C # ::# >  9C @_9#C @o? P Px!@p@C @ *P z ał S 9*q@ v>> >{c !Y~ eJ! Q C5| J!& <p<@ A# @HBD`pCDEF!I JAFGHDIH6 @QDCEGEI A‰ `@#  !!M# BJJ B` E ``b`# D# r`@@ABCDEF` &`JHIFˤHG^FDZ HFFEFĎEJ # o uD BGDFwDHI`(j򀁄IJKLG@ @HA BF@`CED@ H6RC @I܆/#@# ``@ # CČ @䀞l!U !!3Q 01AsA?10,qgI,B0&C1&D `@/ph@ph?ph@kphq`H@@h@`@@q`H@@ USH( BVkXYPiSC* bĀ+u*M] # Sm vjsCk JS검@mkb `@nbG*`@ G*g'ā ), WORD MODE' CSK A,CELL0 HLT TIME 0,0,' (=), WORD MODE' CSK A,CELL0 HLT HLT TIME 0,0,'OV',OV,HIGH XNX X JMP *$+1 WORD $+1 TIME 0,0,'JMP ADDR - UNCONDITIONAL JUMP, WORD MODE' JMP SUB1 JMPCONT TIME 0,-3,'JST ADDR - JUMP AND STORE PROGRAM COUNTER, WORD MODE' JST SUB0 TIME 0,0,'OV',OV,HIGH JST STKSET XNX X JMP *$+1 WORD $+1 JST STKEND TIME 0,1,'JSK ADDR - JUMP AND STACK PROGRAM COUNTER, WORD MODE' JST STKSET JSK SUB1 RETN1 JST STKEND TIME 0,0,'OV',OV,HIGH COPY A,CELL2 TIME 1,0,'IMS MEM - INCREMENT MEMORY AND SKIP (NO SKIP), WORD MODE' COPY A,CELL2 IMS CELL2 TIME :FFFF,0,' (SKIP), WORD MODE' COPY A,CELL2 IMS CELL2 HLT TITL ADDRESSING MODES - BYTE MODE * * ADDRESSING MODES - BYTE MODE * PAGE HEADER ' * SINGLE WORD MEMORY REFERENCE ADDRESSING - BYTE MODE * ' TIME 0,0,'OV',OV,HIGH &  SBIT 2,S COPYB CELL2,X RBIT 2,S TIME 0,0,'RELATIVE DIRECT, BYTE MODE' SBIT 2,S COPYB CELLF,X RBIT 2,S TIME 0,0,'RELATIVE INDIRECT, BYTE MODE' SBIT 2,S COPYB *BNDF1,X RBIT 2,S TIME:INC BNDF1 WORD CELLF CELLF WORD 0 TIME 0,0,'ABSOLUTE (SCRATCH) INDIRECT, BYTE MODE' SBIT 2,S COPYB *SIND1,X RBIT 2,S TIME 0,0,'DIRECT POST-INDEXED, BYTE MODE' SBIT 2,S COPYB CELL2(X),A  RBIT 2,S TIME 0,0,'INDIRECT POST-INDEXED, BYTE MODE' SBIT 2,S COPYB *SIND1(X),A RBIT 2,S TIME 0,0,'OV',OV,HIGH COPY A,Y SBIT 2,S COPYB CELL2,X RBIT 2,S TIME 0,0,'PRE-INDEXED DIRECT, BYTE MODE' COPY A,Y SBIT 2,S COPYB CELL2(Y),X RBIT 2,S TIME 0,0,'PRE-INDEXED INDIRECT, BYTE MODE' COPY A,Y SBIT 2,S COPYB *SIND1(Y),X RBIT 2,S TIME 0,0,'PRE-INDEXED DIRECT POST-INDEXED, BYTE MODE' COPY A,Y SBIT 2,S COPYB CELL2(X,Y),Y RBIT 2,S TIME 0,0,'PRE-INDEXED INDIRECT POST-INDEXED, BYTE MODE' COPY A,Y SBIT 2,S COPYB *SIND1(X,Y),Y RBIT 2,S TITL MEMORY REFERENCE SINGLE WORD - BYTE MODE * * MEMORY REFERENCE - SINGLE WORD, BYTE MODE * HEADER '* SINGLE WORD MEMORY REFERENCE INSTRUCTIONS - BYTE MODE *' TIME 0,0,'OV',OV,HIGH SBIT 2,S RBIT 2,S TIME 0,0,'COPYB MEM,REG - LOAD REGISTER FROM MEMORY, BYTE MODE' SBIT 2,S COPYB CELL2,A RBIT 2,S TIME 0,0,'COPYB REG,MEM - STORE REGISTER INTO MEMORY, BYTE MODE' SBIT 2,S COPYB A,CELL2 RBIT 2,S TIME 0,0,'ADDB MEM,REG - ADD MEMORY TO REGISTER, BYTE MODE' SBIT 2,S ADDB CELL2,A RBIT 2,S TIME 0,0,'SUBB MEM,REG - SUBTRACT MEMORY FROM REGISTER, BYTE MODE' SBIT 2,S SUBB CELL2,A RBIT 2,S TIME 0,0,'EXCHB MEM,REG - EXCHANGE MEMORY AND REGISTER, BYTE MODE' SBIT 2,S EXCHB CELL2,A RBIT 2,S TIME 0,0,'ANDB MEM,REG - AND MEMORY WITH REGISTER, BYTE MODE' SBIT 2,S ANDB CELL2,A RBIT 2,S TIME 0,0,'ORB MEM,REG - OR MEMORY WITH REGISTER, BYTE MODE' SBIT 2,S ORB CELL2,A RBIT 2,S TIME 0,0,'XORB MEM,REG - EXCLUSIVE OR MEMORY WITH REGISTER, BYTE MODE' SBIT 2,S XORB CELL2,A RBIT 2,S TIME 0,0,'CSKB REG,MEM - COMPARE 3 WAY (<), BYTE MODE' SBIT 2,S CSKB A,CELL1+1 RBIT 2,S TIME :0F0F,0,' (>), BYTE MODE' SBIT 2,S CSKB A,CELL0 HLT RBIT 2,S TIME 0,0,'  (=), BYTE MODE' SBIT 2,S CSKB A,CELL0 HLT HLT RBIT 2,S TIME 0,0,'OV',OV,HIGH XNX X JMP *$+1 WORD $+1 TIME 0,2,'JMP ADDR - UNCONDITIONAL JUMP, BYTE MODE' JMP SUB1 JMPCONT1 EQU $ TIME 0,-3,'JST ADDR - JUMP AND STORE PROGRAM COUNTER, BYTE MODE' JST SUB0 TIME 0,0,'OV',OV,HIGH JST STKSET XNX X JMP *$+1 WORD $+1 JST STKEND TIME 0,3,'JSK  ADDR - JUMP AND STACK PROGRAM COUNTER, BYTE MODE' JST STKSET JSK SUB1 RETN2 JST STKEND TIME 0,0,'OV',OV,HIGH COPY A,CELL2  TIME 1,0,'IMS MEM - INCREMENT MEMORY AND SKIP (NO SKIP), BYTE MODE' COPY A,CELL2 IMS CELL2 TIME :FFFF,0,'  (SKIP), BYTE MODE' COPY A,CELL2 IMS CELL2 HLT TITL MULTI-WORD * * MULTI-WORD ADDRESSING * PAGE HEADER ' * MULTI-WORD MEMORY REFERENCE ADDRESSING *' TIME 0,0,'OV',OV,HIGH ADDC CELL0,A TIME 0,0,'RELATIVE DIRECT, DOUBLE WORD MEMORY REFERENCE' ADDC CELLN,A TIME 0,0,'RELATIVE INDIRECT, DOUBLE WORD MEMORY REFERENCE' ADDC *ENDF1,A TIME:INC ENDF1 WORD CELLN CELLN WORD 0 TIME 0,0,'ABSOLUTE (SCRATCH) INDIRECT, DOUBLE WORD MEMORY REFERENCE' ADDC *SIND1,A TIME 0,0,'DIRECT POS' T-INDEXED, DOUBLE WORD MEMORY REFERENCE' ADDC CELL0(X),A TIME 0,0,'INDIRECT POST-INDEXED, DOUBLE WORD MEMORY REFERENCE' ADDC *SIND1(X),A TIME 0,0,'OV',OV,HIGH COPY X,Y ADDC CELL0,A TIME 0,0,'PRE-INDEXED DIRECT, DOUBLE WORD MEMORY REFERENCE' COPY X,Y ADDC CELL0(Y),A TIME 0,0,'PRE-INDEXED INDIRECT, DOUBLE WORD MEMORY REFERENCE' COPY X,Y ADDC *SIND1(Y),A TIME 0,0,'PRE-INDEXED DIRECT POST-INDEXED, DOUBLE WORD MEMORY REFERENCE' COPY X,Y ADDC CELL0(X,Y),A TIME 0,0,'PRE-INDEXED INDIRECT POST-INDEXED, DOUBLE WORD MEMORY REFERENCE' COPY X,Y ADDC *SIND1(X,Y),A TITL * * MULTI-WORD INSTRUCTIONS * HEADER ' * MULTI-WORD MEMORY REFERENCE INSTRUCTIONS *' TIME 0,0,'OV',OV,HIGH TIME 0,0,'COPYE MEM,REG - EXTENDED LOAD REGISTER FROM MEMORY' COPYE CELL2,A TIME 0,0,'COPYE REG,MEM - EXTENDED STORE REGISTER INTO MEMORY' COPYE A,CELL2 TIME 0,0,'ADDE MEM,REG - EXTENDED ADD MEMORY TO REGISTER' ADDE CELL0,A TIME 0,0,'SUBE MEM,REG - EXTENDED SUBTRACT MEMORY FROM REGISTER' SUBE CELL0,A TIME 0,0,'EXCHE MEM,REG - EXTENDED EXCHANGE MEMORY AND REGISTER' EXCHE A,CELL2 TIME 0,0,'ANDE MEM,REG - EXTENDED AND MEMORY WITH REGISTER' ANDE CELL0,A TIME 0,0,'ORE MEM,REG - EXTENDED OR MEMORY WITH REGISTER' ORE CELL0,A TIME 0,0,'XORE MEM,REG - EXTENDED EXCLUSIVE OR MEMORY WITH REGISTER' XORE CELL0,A TIME 0,0,'CSKE REG,MEM - EXTENDED COMPARE 3 WAY (<)' CSKE A,CELL1 TIME 2,0,' (>)' CSKE A,CELL0 HLT TIME 0,0,' (=)' CSKE A,CELL0 HLT HLT TIME 0,0,'CSME MEM,REG - EXTENDED COMPARE MAGNITUDE 3 WAY (<)' CSME A,CELL1 TIME 2,0,'  (>)' CSME A,CELL0 HLT TIME 0,0,' (=)' CSME A,CELL0 HLT HLT TIME 0,0,'CEA ADDR - COMPUTE EFFECTIVE ADDRESS' CEA CELL0,A TIME 0,0,'ADDC MEM,REG - ADD MEMORY TO REGISTER WITH CARRY' ADDC CELL1,A TIME 0,0,'SUBC MEM,REG - SUBTRACT MEMORY FROM REGISTER WITH CARRY' SUBC CELL0,A TIME 0,0,'OV',OV,HIGH COPY MULCELL,A COPY MULCELL,X TIME:INC MULCELL WORD :5A5A DIVCELL1 WORD :1FE3 DIVCELL2 WORD :67A4 TIME 0,0,'MUL  MEM,REG - MULTIPLY MEMORY AND REGISTER (TYPICAL)' COPY MULCELL,A COPY MULCELL,X MUL CELL4,AX TIME 0,0,'DIV MEM,A:REG - DIVIDE DOUBLE REGISTER BY MEMORY (TYPICAL)' COPY DIVCELL1,A COPY DIVCELL2,X DIV CELL4,AX TIME 0,0,'OV',OV,HIGH XNX X JMP  *$+1 WORD $+1 TIME 0,4,'JMPE ADDR - EXTENDED UNCONDITIONAL JUMP' JMPE SUB1 JMPECONT EQU $ TIME 0,-3,'JSTE ADDR - EXTENDED JUMP AND STORE PROGRAM COUNTER' JSTE SUB0 TIME 0,0,'OV',OV,HIGH JST STKSET XNX X JMP *$+1 WORD $+1 JST STKEND TIME 0,5,'JSKE ADDR - EXTENDED JUMP AND STACK PROGRAM COUNTER' JST STKSET JSKE SUB1 RETN3 EQU $ JST STKEND TIME 0,0,'OV',OV,HIGH COPY A,CELL2 TIME 1,0,'IMSE MEM - EXTENDED INCREMENT MEMORY & SKIP (NO SKIP)' COPY A,CELL2 IMSE CELL2 TIME :FFFF,0,' (SKIP)' COPY A,CELL2 IMSE CELL2 HLT TIME 1,0,'DMSE MEM - DECREMENT MEMORY & SKIP IF RESULT = -1 (NO SKIP)' COPY A,CELL2 DMSE CELL2 TIME 0,0,' (SKIP)' COPY A,CELL2 DMSE CELL2 HLT TIME 0,0,'OV',OV,HIGH TIME 0,0,'COPYE MEM,A:REG - LOAD DOUBLE REGISTER FROM MEMORY' COPYE CE( LL2,AX TIME 0,0,'COPYE A:REG,MEM - STORE DOUBLE REGISTER INTO MEMORY' COPYE AX,CELL2 TITL IMMEDIATE INSTRUCTIONS * * IMMEDIATE INSTRUCTIONS * PAGE HEADER ' * IMMEDIATE INSTRUCTIONS *' TIME 0,0,'COPY =-IMM,REG - LOAD NEGATIVE IMMEDIATE INTO REGISTER' COPY =-1,A TIME 0,0,'COPY =IMM,REG - LOAD POSITIVE IMMEDIATE INTO REGISTER' COPY =1,A TIME 0,0,'SUB =IMM,REG - SUBTRACT IMMEDIATE FROM REGISTER' SUB =1,A TIME 0,0,'ADD =IMM,REG - ADD IMMEDIATE TO REGISTER' ADD =1,A TIME 1,0,'CLSN =IMM,REG - COMPARE LOWER BYTE (NO SKIP)' CLSN =1,A TIME 0,0,' (SKIP)' CLSN =1,A  NOP TIME 0,0,'CSK =IMM,REG - COMPARE 3 WAY IMMEDIATE (<)' CSK A,=1 TIME 1,0,' (>)' CSK A,=0 HLT TIME 1,0,' (=)' CSK A,=1 HLT HLT TIME 0,0,'AND =IMM,REG - AND IMMEDIATE WITH REGISTER' AND =1,A TIME 0,0,'OR =IMM,REG - OR IMMEDIATE WITH REGISTER' OR =1,A TIME 0,0,'XOR =IMM,REG - EXCLUSIVE OR IMMEDIATE WITH REGISTER' XOR =1,A TITL REGISTER - REGISTER * * REGISTER - REGISTER * HEADER ' * REGISTER TO REGISTER INSTRUCTIONS *' TIME :A,:B,'COPY REG,REG - COPY REGISTER TO REGISTER' COPY A,X TIME 0,0,'NEG REG,REG - NEGATE REGISTER TO REGISTER' NEG A,X TIME :A,:B,'ADD REG,REG - ADD REGISTER TO REGISTER' ADD A,X TIME :A,:B,'SUB REG,REG - SUBTRACT REGISTER FROM REGISTER' SUB A,X TIME 0,0,'AND REG,REG - AND REGISTER WITH REGISTER' AND A,X TIME 0,0,'OR  REG,REG - OR REGISTER WITH REGISTER' OR A,X TIME 0,0,'XOR REG,REG - EXCLUSIVE OR REGISTER WITH REGISTER' XOR A,X TIME 0,0,'CSN REG,REG - COMPARE REGISTERS (NO SKIP)' CSN A,X TIME 0,1,' (SKIP)' CSN A,X HLT TIME 0,1,'CSK REG,REG - COMPARE REGISTERS 3 WAY (<)' CSK A,X TIME 2,1,' (>)' CSK A,X HLT TIME 0,0,' (=)' CSK A,X HLT HLT TIME :A,:B,'EXCH REG,REG - EXCHANGE REGISTER WITH REGISTER' EXCH A,X TIME 0,0,'COMP REG,REG - COMPLEMENT REGISTER TO REGISTER' COMP A,X TIME 0,1,'CSM REG,REG - COMPARE MAGNITUDE 3 WAY (<)' CSM A,X TIME 2,1,' (>)' CSM A,X HLT TIME 0,0,'  (=)' CSM A,X HLT HLT TITL BIT MANIPULATION INSTRUCTIONS * * BIT MANIPULATION * HEADER '  * BIT MANIPULATION INSTRUCTIONS *' TIME 0,0,'SBIT BIT,REG - SET GENERAL PURPOSE REGISTER BIT' SBIT 0,A TIME 0,0,'RBIT BIT,REG - RESET GENERAL PURPOSE REGISTER BIT' RBIT 0,A TIME 0,0,'CBIT BIT,REG - COMPLEMENT GENERAL PURPOSE REGISTER BIT' CBIT 0,A TIME 0,0,'TBIT BIT,REG - TRANSFER GENERAL PURPOSE REGISTER BIT TO OV' TBIT 0,A TIME 0,0,'SBIT BIT,S - SET STATUS REGISTER BIT ' SBIT 15,S TIME 0,0,'RBIT BIT,S - RESET STATUS REGISTER BIT ' RBIT 15,S TITL SINGLE REGISTER SHIFTS * * SINGLE REGISTER SHIFTS/ROTATES * PAGE HEADER ' * SINGLE REGISTER SHIFT/ROTATE INSTRUCTIONS *' TIMEOH 0,0,'SHIFT REG,L,1  - SHIFT REGISTER LEFT 1 PLACE' SHIFT A,L,1 TIME 0,0,' - 10 ADDITIONAL PLACES' SHIFT A,L,11 TIME 0,0,'OV',OV,HIGH TIMEOH 0,0,'SHIFT REG,LO,1 - SHIFT REGISTER LEFT W/OV 1 PLACE' SHIFT A,LO,1 TIME 0,0,' - 10 ADDITIONAL P) LACES' SHIFT A,LO,11 TIME 0,0,'OV',OV,HIGH TIMEOH 0,0,'ROTATE REG,L,1 - ROTATE REGISTER LEFT 1 PLACE' ROTATE A,L,1 TIME 0,0,' - 10 ADDITIONAL PLACES' ROTATE A,L,11 TIME 0,0,'OV',OV,HIGH TIMEOH 0,0,'ROTATE REG,LO,1 - ROTATE REGISTER LEFT W/OV 1 PLACE' ROTATE A,LO,1 TIME 0,0,' - 10 ADDITIONAL PLACES' ROTATE A,LO,11 TIME 0,0,'OV',OV,HIGH TIMEOH 0,0,'SHIFT REG,R,1 - SHIFT REGISTER RIGHT 1 PLACE' SHIFT A,R,1 TIME 0,0,' - 10 ADDITIONAL PLACES' SHIFT  A,R,11 TIME 0,0,'OV',OV,HIGH TIMEOH 0,0,'SHIFT REG,RO,1 - SHIFT REGISTER RIGHT W/OV 1 PLACE' SHIFT A,RO,1 TIME 0,0,'  - 10 ADDITIONAL PLACES' SHIFT A,RO,11 TIME 0,0,'OV',OV,HIGH TIMEOH 0,0,'ROTATE REG,R,1 - ROTATE REGISTER RIGHT 1 PLACE' ROTATE A,R,1 TIME 0,0,' - 10 ADDITIONAL PLACES' ROTATE A,R,11 TIME 0,0,'OV',OV,HIGH TIMEOH 0,0,'ROTATE REG,RO,1 - ROTATE REGISTER RIGHT W/OV 1 PLACE' ROTATE A,RO,1 TIME 0,0,' - 10 ADDITIONAL PLACES' ROTATE A,RO,11 TIME 0,0,'OV',OV,HIGH TIMEOH 0,0,'SHIFT REG,RA,1 - SHIFT REGISTER RIGHT ARITHMETIC 1 PLACE' SHIFT A,RA,1 TIME 0,0,'  - 10 ADDITIONAL PLACES' SHIFT A,RA,11 TITL DOUBLE REGISTER SHIFTS * * DOUBLE REGISTER SHIFTS/ROTATES * HEADER ' * DOUBLE REGISTER SHIFT/ROTATE INSTRUCTIONS *' TIME 0,0,'OV',OV,HIGH TIMEOH 0,0,'SHIFT A:REG,L,1 - SHIFT DOUBLE REGISTER LEFT 1 PLACE' SHIFT AX,L,1 TIME 0,0,' - 10 ADDITIONAL PLACES' SHIFT AX,L,11 TIME 0,0,'OV',OV,HIGH TIMEOH 0,0,'SHIFT A:REG,LO,1 - SHIFT DOUBLE REGISTER LEFT W/OV 1 PLACE' SHIFT AX,LO,1 TIME 0,0,' - 10 ADDITIONAL PLACES' SHIFT AX,LO,11 TIME 0,0,'OV',OV,HIGH TIMEOH 0,0,'ROTATE A:REG,L,1 - ROTATE DOUBLE REGISTER LEFT 1 PLACE' ROTATE AX,L,1 TIME 0,0,' - 10 ADDITIONAL PLACES' ROTATE AX,L,11 TIME 0,0,'OV',OV,HIGH TIMEOH 0,0,'ROTATE A:REG,LO,1 - ROTATE DOUBLE REGISTER LEFT W/OV 1 PLACE' ROTATE AX,LO,1 TIME 0,0,' - 10 ADDITIONAL PLACES' ROTATE AX,LO,11 TIME 0,0,'OV',OV,HIGH TIMEOH 0,0,'SHIFT A:REG,R,1 - SHIFT DOUBLE REGISTER RIGHT 1 PLACE' SHIFT AX,R,1 TIME 0,0,'  - 10 ADDITIONAL PLACES' SHIFT AX,R,11 TIME 0,0,'OV',OV,HIGH TIMEOH 0,0,'SHIFT A:REG,RO,1 - SHIFT DOUBLE REGISTER RIGHT W/OV 1 PLACE' SHIFT AX,RO,1 TIME 0,0,' - 10 ADDITIONAL PLACES' SHIFT AX,RO,11 TIME 0,0,'OV',OV,HIGH TIMEOH 0,0,'ROTATE A:REG,R,1 - ROTATE DOUBLE REGISTER RIGHT 1 PLACE' ROTATE AX,R,1 TIME 0,0,' - 10 ADDITIONAL PLACES' ROTATE AX,R,11 TIME 0,0,'OV',OV,HIGH TIMEOH 0,0,'ROTATE A:REG,RO,1 - ROTATE DOUBLE REGISTER RIGHT W/OV 1 PLACE' ROTATE AX,RO,1 TIME 0,0,' - 10 ADDITIONAL PLACES' ROTATE AX,RO,11 TIME 0,0,'OV',OV,HIGH TIMEOH 0,0,'SHIFT A:REG,RA,1 - SHIFT DOUBLE REG RIGHT ARITHMETIC 1 PLACE' SHIFT AX,RA,1 TIME 0,0,' - 10 ADDITIONAL PLACES' SHIFT AX,RA,11 TITL CONDITIONAL JUMPS * * CONDITIONAL JUMPS * PAGE HEADER ' * CONDITIONAL JUMP INSTRUCTIONS *' TIME 0,0,'OV',OV,HIGH TIME 1,0,'JEQ REG,ADDR - JUMP IF REG CONTENTS = 0 (NO JUMP)' JEQ A,MEMLC9 MEMLC9 TIME 0,0,'  (JUMP)' JEQ A,MEMLCA MEMLCA TIME 0,0,'JNE REG,ADDR - JUMP IF REG CONTENTS NOT 0 (NO JUMP)' JNE A* ,MEMLCB MEMLCB TIME 1,0,' (JUMP)' JNE A,MEMLCC MEMLCC TIME 0,0,'JGT REG,ADDR - JUMP IF REG CONTENTS > 0 (NO JUMP)' JGT A,MEMLCD MEMLCD TIME 1,0,' (JUMP)' JGT A,MEMLCE MEMLCE TIME 1,0,'JLE REG,ADDR - JUMP IF REG CONTENTS <= 0 (NO JUMP)' JLE A,MEMLCF MEMLCF TIME 0,0,'  (JUMP)' JLE A,MEMLCG MEMLCG TIME :FFFF,0,'JGE REG,ADDR - JUMP IF REG CONTENTS >= 0 (NO JUMP)' JGE A,MEMLCH MEMLCH TIME 0,0,' (JUMP)' JGE A,MEMLCI MEMLCI TIME 0,0,'JLT REG,ADDR - JUMP IF REG CONTENTS < 0 (NO JUMP)' JLT A,MEMLCJ MEMLCJ TIME :FFFF,0,' (JUMP)' JLT A,MEMLCK MEMLCK TIME 0,0,'OV',OV,HIGH COPY A,X TIME 1,0,'IJEQ REG,ADDR - INCREMENT & JUMP IF RESULT = 0 (NO JUMP)' COPY A,X IJEQ X,MEMLCL MEMLCL TIME :FFFF,0,' (JUMP)' COPY A,X IJEQ X,MEMLCM MEMLCM EQU $ TIME :FFFF,0,'IJNE REG,ADDR - INCREMENT & JUMP IF RESULT NOT 0 (NO JUMP)' COPY A,X IJNE X,MEMLCN MEMLCN EQU $ TIME 0,0,'  (JUMP)' COPY A,X IJNE X,MEMLCO MEMLCO TIME 2,0,'JEQD REG,ADDR - DECREMENT & JUMP IF RESULT = -1 (NO JUMP)' COPY A,X JEQD X,MEMLCP MEMLCP TIME 0,0,' (JUMP)' COPY A,X JEQD X,MEMLCQ MEMLCQ TIME 0,0,'JNED REG,ADDR - DECREMENT & JUMP IF RESULT NOT -0 (NO JUMP)' COPY A,X JNED X,MEMLCR MEMLCR TIME 1,0,' (JUMP)' COPY A,X JNED X,MEMLCS MEMLCS TIME 0,0,'OV',OV,HIGH OUT A,0 TURN OFF SENSE SWITCH TIME 0,0,'JT SS,ADDR - JUMP IF SENSE SWITCH SET (NO JUMP)' OUT A,0 TURN OFF SENSE SWITCH JT SS,MEMLCW MEMLCW TIME 1,0,' (JUMP)' OUT A,0 TURN ON SENSE SWITCH JT SS,MEMLCX MEMLCX TIME 1,0,'JF SS,ADDR - JUMP IS SENSE SWITCH NOT SET (NO JUMP)' OUT A,0 TURN ON SENSE SWITCH JF SS,MEMLCY MEMLCY TIME 0,0,' (JUMP)' OUT A,0 TURN OFF SENSE SWITCH JF SS,MEMLC4 MEMLC4 TIME :160,0,'OV',OV,HIGH COPY A,S TIME :160,0,'JT OV,ADDR - JUMP IF OV BIT SET (NO JUMP)' COPY A,S JT OV,MEMLC5 MEMLC5 TIME :162,0,' (JUMP)' COPY A,S JT OV,MEMLC6 MEMLC6 TIME :162,0,'JF OV,ADDR - JUMP IF OV BIT NOT SET (NO JUMP)' COPY A,S JF OV,MEMLC7 MEMLC7 TIME :160,0,' (JUMP)' COPY A,S JF OV,MEMLC8 MEMLC8 TIME :160,0,'JT CY,ADDR - JUMP IF CY BIT SET (NO JUMP)' COPY A,S JT CY,MEMLC1 MEMLC1 TIME :161,0,'  (JUMP)' COPY A,S JT CY,MEMLC2 MEMLC2 TIME :161,0,'JF CY,ADDR - JUMP IF CY BIT NOT SET (NO JUMP)' COPY A,S JF CY,MEMLC3 MEMLC3 TIME :160,0,' (JUMP)' COPY A,S JF CY,MEMLCZ MEMLCZ EQU $ TITL I/O INSTRUCTIONS * * I/O INSTRUCTIONS * HEADER ' * I/O INSTRUCTIONS *' TIME 0,0,'OV',OV,HIGH TIME 0,0,'OUT REG,DAFC - OUTPUT FROM REGISTER' OUT A,4 TIME 0,0,'IN REG,DAFC - INPUT TO REGISTER' IN 4,A TIME 0,0,'SELP REG,DAFC - SELECT AND PRESENT REGISTER DATA' SELP A,4 TIME 0,0,'SST DAFC - SENSE AND SKIP IF TRUE (NO SKIP+ )' SST 4 COMMENT 'USEC: (SKIP), CALCULATED' COMMENT 'USEC: AIB DAFC - AUTOMATIC INPUT BYTE (CALCULATED)' COMMENT 'USEC: AOB DAFC - AUTOMATIC OUTPUT BYTE (CALCULATED)' COMMENT 'USEC: AIN DAFC - AUTOMATIC INPUT WORD (CALCULATED)' COMMENT 'USEC: AOT DAFC - AUTOMATIC OUTPUT WORD (CALCULATED)' TITL CONTROL INSTRUCTIONS * * CONTROL * PAGE HEADER ' * CONTROL INSTRUCTIONS *' TIME 0,0,'OV',OV,HIGH TIME 0,0,'FMT REG - FETCH MACHINE TYPE INTO REGISTER' FMT A TIME 0,0,'UIS - UPDATE INTERRUPT STATUS OF I/O CONTROLLERS' UIS TIME 0,0,'XNX REG - INDEX NEXT INSTRUCTION' XNX A TIME 0,0,'OV',OV,HIGH NOP TIME 0,0,'SIN COUNT - STATUS INHIBIT' SIN 1 NOP TITL STACK OPERATIONS * * STACK OPERATIONS * HEADER ' * STACK INSTRUCTIONS *' TIME1 0,0,'OV',OV,HIGH JST STKSET JST STKEND TIME1 0,0,'PUSH  STATUS - PUSH REGISTERS ONTO STACK' JST STKSET PUSH :0160 JST STKEND TIME1 0,0,'POP - POP REGISTERS FROM STACK' JST STKSET POP JST STKEND TIME 0,0,'OV',OV,HIGH COPY K,X COPY =CELL3,A COPY A,K COPY X,K TIME 0,0,'RSK - RETURN THROUGH STACK' COPY K,X COPY =CELL3,A COPY A,K RSK LOC0 EQU $ COPY X,K TITL TRAP INSTRUCTIONS * * PROGRAMMED TRAPS * HEADER ' * PROGRAMMED TRAP INSTRUCTIONS *' TIME :9F7D,:A6,'OV',OV,HIGH EXCH 0(X),A JMP *$+1 WORD $+1 SIN 1 EXCH 0(X),A TIME :9F7D,:A2,'UTRAP REG,VALUE - USER TRAP' EXCH 0(X),A UTRAP A,0 SIN 1 EXCH 0(X),A TIME :9F7D,:A6,'STRAP REG,VALUE - SYSTEM TRAP' EXCH 0(X),A STRAP A,0 SIN 1 EXCH 0(X),A TITL FLOATING POINT INSTRUCTIONS * * FLOATING POINT * HEADER '  * FLOATING POINT INSTRUCTIONS *' COMMENT ' (ALL TIMES ARE TYPICAL)' COMMENT ' ' TIME1 0,0,'OV',OV,HIGH COPY CELF5,A COPY CELF6,Q TIME1 0,0,'FIX - CONVERT FROM FLOATING POINT TO FIXED POINT' COPY CELF5,A COPY CELF6,Q FIX TIME1 0,0,'FLOAT - CONVERT FROM FIXED POINT TO FLOATING POINT' COPY CELF7,A COPY CELF8,Q FLOAT TIME1 0,0,'ADDF MEM - FLOATING ADD, NO ALIGN' COPY CELF1,A COPY CELF2,Q ADDF FLOAT1 TIME1 0,0,' , ALIGN ACC 1' COPY CELF1,A COPY CELF2,Q ADDF FLOAT2 TIME1 0,0,' , ALIGN ACC 11' COPY CELF1,A COPY CELF2,Q ADDF FLOAT3 TIME1 0,0,'  , NO ALIGN, DIFFERENT SIGNS' COPY CELFB,A COPY CELF2,Q ADDF FLOAT1 TIME1 0,0,'SUBF MEM - FLOATING SUBTRACT, NO ALIGN' COPY CELF1,A COPY CELF2,Q SUBF FLOAT1 TIME1 0,0,' , ALIGN ACC 1' COPY CELF1,A COPY CELF2,Q SUBF FLOAT2 TIME1 0,0,' , ALIGN ACC 11' COPY CELF1,A COPY CELF2,Q SUBF FLOAT3 TIME1 0,0,' , NO ALIGN, DIFFERENT SIGNS' COPY CELFB,A COPY CELF2,Q SUBF FLOAT1 TIME1 0,0,'MULF MEM - FLOATING MULTIPLY' COPY CELF3,A COPY CELF4,Q MULF FLOAT4 TIME1 0,0,'DIVF MEM - FLOATING DIVIDE' COPY CELF3,A COPY CELF4,Q DIVF FLOAT5 TIME1 0,0,'CSKF MEM - FLOATING COMPARE 3 WAY (<)' COPY CELF9,A COPY CELFA,Q CSKF FLOAT6 TIME1 0,0,'  (>)' COPY CELF9,A COPY CELFC,Q CSKF FLOAT6 HLT TIME1 0,0,'  (=)' COPY CELF9,A COPY CELFD,Q CSKF FLOAT6 HLT HLT TIME:END TITL DATA & SUBROUTINES * * REL DATA & SUBROUTINES *,  SPACE 1 STKSET ENT COPY K,A COPY A,SAVEK COPY L,A COPY A,SAVEL COPY =STKTOP,A COPY A,K COPY X,L JMP *STKSET SPACE 1 STKEND ENT COPY SAVEK,A COPY A,K COPY SAVEL,A COPY A,L JMP *STKEND SPACE 2 STKBOT EQU $ RES 6,:1111 STKTOP EQU $ RES  6,:0140 SAVEK WORD 0 SAVEL WORD 0 LPOOL RES 128+$-STKSET TITL CELF1 WORD :5144 CELF2 WORD :3D4E FLOAT1 WORD :511E WORD :FB4C FLOAT2 WORD :519E WORD :FB4C FLOAT3 WORD :569E WORD :FB4C CELF3 WORD :487E CELF4 WORD :DC00 FLOAT4 WORD :C85E WORD :AD00 FLOAT5 WORD :D05D WORD :AF03 CELF5 WORD :4FFF CELF6 WORD :FFFF CELF7 WORD :7FFF CELF8 WORD :FF80 CELF9 WORD :0000 CELFA WORD :0000 FLOAT6 WORD :0000 WORD :0001 CELFB WORD :D144 CELFC WORD :0002 CELFD WORD :0001 SPACE 1 TIMEREND EQU $ TITL * * ABS DATA AND SUBROUTINES * ABS :C SIND1 WORD CELL3 SIND2 WORD INDF10+:8000 CELL0 WORD 0 CONTENTS DO NOT CHANGE CELL1 WORD 1 CONTENTS DO NOT CHANGE CELL2 WORD 0,0 CONTENTS MAY CHANGE CELL3 WORD LOC0 CELL4 WORD :5A5A CONTENTS DO NOT CHANGE SPACE 2 SUB0 ENT SUB1 EQU $ XNX X WORD :9F80 (JMP *$+1 REL. INDIR.) WORD JMPCONT WORD RETN1 WORD JMPCONT1 WORD RETN2 WORD JMPECONT WORD RETN3 SPACE 1 END ORD :0000 WORD :0001 CELFB WORD :D144 CELFC WORD :0002 CELFD WORD :0001 SPACE 1 TIMEREND EQU $ TITL * * ABS DATA AND SUBROUTINES * ABS :C SIND1 WORD CELL3 SIND2 WORD INDF10+:8000 CELL0 WORD 0 CONTENTS DO NOT CHANGE CELL1 WORD 1 CONTENTS DO NOT CHANGE CELL2 WORD 0,0 CONTENTS MAY CHANGE CELL3 WORD LOC0 CELL4 WORD :5A5A CONTENTS DO NOT CHANGE SPACE 2 SUB0 ENT SUB1 EQU  TITL LSI 4 INSTRUCTION SET TIMER TITL I/O MACRO SUBROUTINES NAM TIMER NAM CNT:HIGH NAM CNT:LOW NAM TM:RTN * EXTR TIME:ST  EXTR RTCI:OHD * LOAD FM:SVC LOAD R:GTOD,R:AFB,R:RFB * OUTPUT ENT COPY *OUTPUT,X COPY X,WTIOB+5 COPY X,OUTIOB+5 SUB =1,X COPY 0(X),X COPY X,WTIOB+4 COPY X,OUTIOB+4 IMS OUTPUT I:IO WTIOB JMP IOERR COPY PRFLG,A JEQ A,OUTXIT I:IO OUTIOB JMP IOERR OUTXIT JMP *OUTPUT * * LPOOL * * * SET UP IOB TO WRITE ON 'SL' * IOB:A WTIOB,'SL',WR:,FA:,RDBCT,RDBUF,0 * IOB:A OUTIOB,'LO',WR:,FA:,RDBCT,RDBUF,WTDCFI * IOB:A CMD:IN,'CI',RE:,FA:,RDBCT,RDBUF,0 * IOB:A PROMPT,'CI',WR:,WP:,26,PROMPTX,0 * WTDCFI RES 2,0 WRITE CFI RDBCT EQU 64 RDBUF RES 64/2,0 PROMPTX BYTE :00,:0A,'ADDITIONAL LOG DEVICE = ' PRFLG WORD 0 GFN:PL NAMPTR,ISMPL LUN EQU NAMPTR+LUN: SEXT EQU NAMPTR+SEXT: INXT EQU NAMPTR+INXT: RLN EQU NAMPTR+RLN: * OPIF COPY =OUTIOB,X COPY PRFLG,A JEQ A,OPIF1 COPY:M =FU:%4+OP:,A,IO:FC(X) I:IO 0(X) HLT COPY =OUTIOB,X COPY:M =WR:%4+FA:,A,IO:FC(X) OPIF1 RSK * CLIF COPY =OUTIOB,X COPY PRFLG,A JEQ A,CLIF1 COPY:M =FU:%4+CL:,A,IO:FC(X) I:IO 0(X) NOP COPY =OUTIOB,X COPY:M =WR:%4+FA:,A,IO:FC(X) CLIF1 RSK * * IOERR COPY:M =0,A,PRFLG WRITE ERRMSG E:MON LPOOL NOFOUND COPY:M =0,A,PRFLG WRITE NOFMSG E:MON TITL TIMER EXECUTIVE * * * TIMER EQU $ COPY =' ',A COPY A,RDBUF COPY =0,A COPY A,PRFLG I:IO PROMPT ASK FOR LOG FILE SPECIFICATION KILLIT JMP IOERR IF ERROR, REPORT AND RETRY I:IO CMD:IN READ IN LOG FILE NAME JMP IOERR COPY =RDBUF,A COPY A,ISMPL+ISMUB: STORE BUFFER ADDRESS COPY =0,A COPY A,ISMPL+ISMBP: ZERO THE BYTE POINTER E:GFN NAMPTR READ THE SPECIFIED FILE/DEVICE NAME CLSN =1,A NULL BUFFER? JMP TIMER4 YES, NO SECOND LOG DEVICE COPY ='LO',A COPY A,LUN COPY A,PRFLG F:CONN NAMPTR CONNECT-  TO IT JGT A,TIMER4 IF FILE EXISTS, CONTINUE COPY =20,A COPY A,INXT COPY A,SEXT F:CREA NAMPTR CREATE THE FILE IF I CAN JGE A,TIMER3 IF OK, GO DO LOG CONNECT JMP IOERR TIMER3 COPY:M ='LO',A,LUN F:CONN NAMPTR JGT A,TIMER4 JMP NOFOUND * LPOOL * TIMER4 COPY =105,A COPY A,RLN JSK OPIF OPEN THE LOG FILE WRITE HEADING RBIT 5,S COPY:M RTCINC,A,RTCSAVE COPY:M RTCINC+1,A,RTCSAVE1 COPY:M RTCINC+2,A,RTCSAVE2 COPY:M JMP1,A,RTCINC+1 COPY:M =RTCRTN,A,RTCINC+2 SPACE 1 COPY =RTCI:OHD,X GET PTR TO RTC INCR. INT. OVERHEAD COPY 0(X),A COPY 1(X),Q OR A,Q JEQ Q,GOTOIT COPY 1(X),Q ADJUST TIMING COPY =0,X LOOP COUNT COPY =0,Y FOR RTC RBIT 0,S INCREMENT ADDC RTCINTVL+1,Q INTERRUPT ADDC RTCINTVL,A OVERHEAD DIVLOOP EQU $ . RBIT 0,S . ADDC =-50,Q . ADDC =-1,A . JLT A,ENDIVLP . IJNE Y,DIVLOOP . IJNE X,DIVLOOP . HLT . ENDIVLP EQU $ . RBIT 0,S . ADDC =25,Q . ADDC =0,A . EXCH A,X . EXCH Q,Y . JGE X,NEGCNT . RBIT 0,S . ADDC =-1,Q . ADDC =-1,A . NEGCNT EQU $ . COMP Q,Q . COMP A,A . RBIT 0,S . ADDC =1,Q . ADDC =0,A . COPY Q,LOW1 . COPY A,HIGH1 . JMP GOTOIT . RTCINTVL DOUBLE 8333333 LPOOL SPACE 1 GOTOIT EQU $ COPY TIME:ST,X COPY X,TM:CUR TIMER10 COPY TM:CUR,X COPY 1(X),A TBIT 14,A JF OV,TIMER20 SHIFT A,LO,1 COPY =0,A ROTATE A,LO,1 COPY A,CURES TIMER20 COPY =0,A COPY A,ABORT COPY CURES,A TBIT 0,A COPY =LOW1,X JT OV,$+3 COPY 1(X),A JMP $+2 COPY 0(X),A COPY A,CNT:LOW COPY CURES,A TBIT 0,A COPY =HIGH1,X JT OV,$+3 COPY 1(X),A JMP $+2 COPY 0(X),A COPY A,CNT:HIGH * * INITIATE TEST AND TIMER * SBIT 6,S RBIT 2,S COPY =:0100,A OUT A,:F8+1 RESET CRT CONTROLLER COPY =0,A COPY A,RTCINC SBIT 5,S ENABLE RTC INTERRUPT COPY RTCINC,X SYNCHRONIZE SUB =2,X . WITH JNE X,$-2 . THE SYNCLP COPY A,SYNCNT . REAL COPY =0,A . TIME COPY A,RTCINC . CLOCK COPY RTCINC,X . SUB =1,X . ADD =1,A . JNE X,$-3 . COPY A,X . SUB SYNCNT,A . JGT A,SYNCLP . SHIFT X,RO,1 . SUB =3,X . COPY RTCINC,A . SUB =1,X . ADD =1,A . JNE X,$-3 . SPACE 1 COPY =0,A COPY A,RTCINC CLEAR RTC INCR. LOCATION COPY TM:CUR,X COPY 0(X),A COPY A,STRT COPY CNT:LOW,Q GET LOOP COUNT LOW WORD COPY 2(X),A LOAD INITIAL VALUES COPY 3(X),X JMP *STRT SPACE 1 SYNCNT WORD 0 RTC SYNC. COUNTER SPACE 1 * * HERE ON RETURN FROM TEST * TM:RTN ENT RBIT 5,S SBIT 6,S RBIT 2,S COPY RTCINC,A COPY A,SCORE COPY TM:CUR,X COPY 1(X),A TBIT 14,A COPY SCORE,A JT OV,TIMER40 SUB OHD,A EXCH ABORT,A JNE A,$+2 EXCH ABORT,A JST CONVERT JST RESULT TIMER30 COPY *TM:RTN,A JNE A,$+2 JMP TIMER60 COPY TM:CUR,X  COPY 1(X),Q TBIT 11,Q JF OV,$+3 COPY SCORE,Q COPY Q,OHD COPY A,TM:CUR JMP TIMER10 TIMER40 EXCH ABORT,A JNE A,TIMER50 EXCH ABORT,A TIMER50 COPY A,OHD JMP TIMER30 TIMER60 WRITE BLANK,BLANK,ENDMSG,BLANK COPY:M RTCSAVE,A,RTCINC COPY:M RTCSAVE1,A,RTCINC+1 COPY:M RTCSAVE2,A,RTCINC+2 SBIT 5,S JSK CLIF E:MON RTCRTN EQU $ RBIT 5,S COPY =-1,A COPY A,ABORT JMP *STRT OHD WORD 0 CURES WORD 0 TM:CUR WORD 0 SCORE WORD 0 ABORT WORD 0 STRT WORD 0 RTCINC EQU :91 RTCSAVE WORD 0 RTCSAVE1 WORD 0 RTCSAVE2 WORD 0 JMP1 JMP *$+1 LPOOL TITL SERVICE SUBROUTINE BIN-ASCII CONVERT ENT * * SET UP FOR CONVERT * COPY A,BUF COPY CURES,X RESOLUTION TBIT 0,X COPY =CONTBL,X JT OV,$+3 COPY 1(X),A JMP $+2 COPY 0(X),A CONVERT CONTROL TABLE ADDR(RESOLUTION) COPY . A,PTR COPY:M =-5,A,KNT COPY CURES,X TBIT 0,X COPY =TMBFD,X JT OV,$+2 ADD =1,X COPY 0(X),A BUFFER DATA ADDR(RESOLUTION) EXCH BUF,A COPY A,VALUE COPY =' ',X JGE A,$+3 NEG A,A MAKE POSITIVE COPY ='-',X COPY A,VALUE INITIAL VALUE TO CONVERT SBIT 2,S COPYB X,*BUF PUT 'SIGN' IN BUFFER RBIT 2,S IMS BUF COPY CURES,A ADJUST POINTER IF LOW RESOLUTION JNE A,$+2 . IMS BUF . SPACE 1 COPY =0,A COPY A,STFLG START OF FIELD FLAG * * OUTER LOOP - CONVERT NEXT DIGIT TO CHAR * BAC04 EQU $ COPY VALUE,A GET REMAINING VALUE COPY ='0'-1,X INITIAL RESULT BAC08 EQU $ * * INNER LOOP - SUBTRACT CONVERTER TILL DIGIT DONE * ADD *PTR,A SUBTRACT OFF DIGIT ADD =1,X BUMP RESULT JGE A,BAC08 LOOP TILL NEGATIVE SUB *PTR,A RESTORE VALUE COPY A,VALUE SAVE INTERMEDIATE IMS PTR TITL * * BLANK OUT START OF FIELD AND STORE CHAR * COPY STFLG,A JNE A,BAC12 GO IF FIELD BEGUN COPY *PTR,A NEXT DIGIT CONTROL JEQ A,BAC12 SKIP IF DECIMAL POINT NEXT CLSN ='0',X SKIP IF RESULT NOT ZERO COPY =' ',X REPLACE ZERO WITH SPACE JMP BAC12 LPOOL BAC12 EQU $ SBIT 2,S COPYB X,*BUF STORE RESULT IN OUTPUT BUFFER RBIT 2,S IMS BUF CLSN =' ',X JMP $+2 COPY X,STFLG SET FIELD START IF CHAR NOT SPACE * * PLACE DECIMAL POINT IF REQUESTED * COPY *PTR,A GET NEXT CONTROL WORD JNE A,BAC16 CONTINUE IF DECIMAL POINT NEXT COPY ='.',X IMS PTR JMP BAC12 STORE DECIMAL POINT BAC16 EQU $ IMS KNT BUMP DIGIT COUNTER JMP BAC04 LOOP UNTIL DONE * * PAD BUFFER WITH TERMINATOR DIGIT(S) * COPY CURES,X TBIT 0,X COPY =TRLTBL,X JT OV,$+2 ADD =1,X COPY 0(X),A TERMINATOR TABLE(RESOLUTION) ADD VALUE,A +REMAINDER COPY A,X SHIFT X,LO,1 MAKE BYTE PTR SBIT 2,S COPYB 0(X),A GET FIRST CHAR COPYB A,*BUF STORE IN STRING IMS BUF COPYB 1(X),A SECOND CHAR COPYB A,*BUF STORE IN STRING BAC20 EQU $ RBIT 2,S JMP *CONVERT LPOOL TITL RESULT OUTPUT ROUTINE RESULT ENT COPY TM:CUR,X COPY 1(X),X TBIT 14,X JF OV,$+2 JMP RESULT40 COPY =50-1,Q COPY =WTBUF+1,X COPY BLANK+1,A RESULT10 COPY A,0(X) ADD =1,X JNED Q,RESULT10 COPY TM:CUR,X COPY 1(X),X TEST COMMENT FLAG TBIT 13,X . JF OV,$+3 JUMP IF NOT SET COPY =WTBUF+6,Y JMP RESULT22 COPY CURES,X TBIT 0,X COPY =TMBUF,X JT OV,RESULT20 ADD =1,X RESULT20 COPY 0(X),X COPY 0(X),A GET RESULT BYTE CNT ADD =1,X GET RESULT BUFFER ADDRESS SHIFT A,RO,1 CHANGE TO WORD CNT COPY =WTBUF-1,Y GET WRITE BUFFER ADDRESS RESULT21 COPY 0(X),Q MOVE A WORD COPY Q,2(Y) ADD =1,X ADD =1,Y JNED A,RESULT21 RESULT22 COPY TM:CUR,X ADD =4,X POINT TO MESSAGE BYTE COUNT COPY 0(X),A GET IT ADD =1,X GET MESSAGE BUFFER ADDRESS SHIFT A,RO,1 CHANGE BYTE CNT TO WORD CNT RESULT30 COPY 0(X),Q COPY Q,1(Y) ADD =1,X ADD =1,Y JNED A,RESULT30 COPY =:2020,A COPY A,0(Y) REMOVE TRASH FROM OUTPUT COPY TM:CUR,X TEST TOP OF FORM FLAG COPY 1(X),A . TBIT 12,A . JF OV,$+3 JUMP IF NOT SET COPY TOFCHAR,A PUT TOP OF FORM CHAR. IN WRITE BUF. COPY A,WTBUF+1 . WRITE WTBUF RESULT40 JMP *RESULT SPACE 1 VALUE WORD 0 CURRENT REMAINDER BUF WORD 0 BUFFER ADDR PTR WORD 0 CONVERT TABLE POINTER KNT WORD 0 DIGIT COUNTER STFLG WORD 0 START OF FIELD FLAG TOFCHAR WORD '1 ' LPOOL TITL TABLE STORAGE * * TEST LOOP COUNTER * CNT:LOW WORD 0 CNT:HIGH WORD 0 * * DUAL PRECISION CONVERTER TABLES * CONTBL WORD HRT CONVERT TABLE POINTER - HIGH RES WORD LRT CONVERT TABLE PO/ INTER - LOW RES HRT WORD -20000,-2000,-200,-20,0,-2 HIGH RES CONVERT TABLE LRT WORD -10000,-1000,-100,0,-10,-1 LOW RES CONVERT TABLE TRLTBL WORD HRT2 TERMINATOR TABLE POINTER - HIGH RES WORD LRT2 TERMINATOR TABLE POINTER - LOW RES HRT2 WORD '0 ','5 ' TERMINATE WITH 0 OR 50 NANOSECS LRT2 WORD :2000 PAD WITH ONLY A BLANK LOW1 WORD -35595 166,667 LOW ORDER (50 NSEC RES) WORD -833 833 LOW ORDER (10 MSEC RES) HIGH1 WORD -3 166,667 HIGH ORDER (50 NSEC RES) WORD -1 833 HIGH ORDER (10 MSEC RES) TMBUF WORD HBUF PRINT RESULT BUFFER - HIGH RES WORD LBUF PRINT RESULT BUFFER - LOW RES TMBFD WORD HBUF*2+5 PRINT BUFFER RESULT POINTER - HIGH RESOLUTION WORD LBUF*2+5 PRINT BUFFER RESULT POINTER - LOW RESOLUTION HEADING MSG ' LSI 4 INSTRUCTION SET TIMER' BLANK MSG ' ' HBUF MSG ' +0000.00 USEC: ' RESULT - HIGH RESOLUTION LBUF MSG ' + 000.00 MSEC: ' RESULT - LOW RESOLUTION ERRMSG MSG ' I/O ERROR' ENDMSG MSG ' LSI 4 INSTRUCTION SET TIMER....END' NOFMSG MSG ' DOCUMENTATION NOT FOUND' WTBUF RES 1,82 RES 41 RES 9,' ' SPACE 1 SAVE END TIMER UF*2+5 PRINT BUFFER RESULT POINTER - HIGH RESOLUTION WORD LBUF*2+5 PRINT BUFFER RESULT POINTER - LOW RESOLUTION HEADING MSG ' LSI 4 INSTRUCTION SET TITL TIMER PROGRAM STAND-ALONE MONITOR (X1) TITL RTX INITIALIZATION NAM UAT:NS NAM E:MON NAM R:INIT EXTR TIMER * * * OC SET 1 LO SET 2 SHARABLE MON: MON: REL UAT:AA UAT:NS UAT:EE 'SL',D:TV00 UAT:EE 'LO',0 UAT:EE 'CI',D:TV00 UAT:ZZ * DIB:LP LP01,82,60 DIB:LP LP00,105,60,LF: * BUF:R 1 INIT:A 0,0,0,0,ECBAD,TIMEMON,:100,12*10,, TDB:A TIMEMON,TIMER,0,0,:100 ECB:A ECBAD,UAT:NS E:MON HLT PROGRAM FINISHED JMP TIMER DO IT AGAIN * LPOOL END 0710113521 TITL LSI 4 INSTRUCTION SET TIMER MACROS MSG MACRO SIZE SET !END-$ SIZE SET SIZE*2 WORD SIZE-2 BYTE #(1) !END EQU $ ENDM * * WRITE MACRO JST OUTPUT WORD #(1)+1 IFT #?>1 JST OUTPUT WORD #(2)+1 ENDC IFT #?>2 JST OUTPUT WORD #(3)+1 ENDC IFT #?>3 JST OUTPUT WORD #(4)+1 ENDC ENDM * * INIT MACRO NAM TIME:ST NAM RTCI:OHD EXTR TM:RTN EXTR CNT:LOW EXTR CNT:HIGH RTCI:OHD DOUBLE -RTCIOH COMNTFLG SET 0 TOPOFORM SET 0 NXTIMS SET 0 IMSFLG SET 0 NOTLUPE SET 0 OHD SET 0 TM:END SET 0 TIME:2 SET $ TIME:ST WORD 0 ENDM * * COMMENT MACRO COMNTFLG SET :2000 TIME 0,0,#(1) COMNTFLG SET 0 ENDM * * HEADER MACRO COMNTFLG SET :2000 TIME 0,0,' ' TIME 0,0,' ' TIME 0,0,#(1) TIME 0,0,' ' COMNTFLG SET 0 ENDM * * TIME:INC MACRO OPSAVE OPTIONS +:0004 IFT TM:END IFF NOTLUPE IFT IMSFLG IMS CNT:LOW JMP TIME:1 ENDC IFF IMSFLG IJNE Q,TIME:1 ENDC IMS CNT:HIGH JMP TIME:1 ENDC JST TM:RTN TIME:2 SET $ WORD 0 LPOOL ENDC IMSFLG SET 0 IFT NXTIMS IMSFLG SET 1 ENDC NOTLUPE SET 0 IFT COMNTFLG NOTLUPE SET 1 ENDC TM:END SET 0 OPTIONS OPSAVE ENDM * * TIME MACRO OPTIONS +:0004 ERROR LISTING ONLY TIME:INC OHEAD SET 0 IFT #?>3 OHEAD SET #(4,'OV')%14 IFT OHEAD HIGHRES SET #(5,'HIGH')%15 ENDC ENDC TM:END SET 1 TIME:0 SET $ ORG TIME:2 WORD TIME:0 ORG TIME:0 WORD 0 WORD 0 WORD #(1) WORD #(2) IFF OHEAD MSG #(3) ENDC TIME:1 SET $ ORG TIME:0 WORD TIME:1 WORD OHEAD+HIGHRES+COMNTFLG+TOPOFORM+OHD TOPOFORM SET 0 ORG TIME:1 OPTIONS -:0004 TURN LISTING BACK ON ENDM * * TIME1 MACRO NXTIMS SET 1 TIME #10 ,#2,#3,#4,#5 NXTIMS SET 0 ENDM MACRO TIMEOH OHD SET :0800 TIME #1,#2,#3,#4,#5 OHD SET :0000 ENDM * * MACRO PAGE TOPOFORM SET :1000 ENDM * * TIME:END MACRO TIME:INC WORD 0 ENDM * * MACRO SAL SALCOD: SET 0 IFT #(1,?) SALCOD: SET #(1,)&:000F%4 ENDC IFT #(2,?) SALCOD: SET #(2)&:000F++SALCOD: ENDC SALCOD: SET :6600++SALCOD: WORD SALCOD: ENDM * SAVE END OHEAD+HIGHRES+COMNTFLG+TOPOFORM+OHD TOPOFORM SET 0 ORG TIME:1 OPTIONS -:0004 TURN LISTING BACK ON ENDM * * TIME1 MACRO NXTIMS SET 1 TIME #1//AS LO=LP / / MOUNT LSI 4/90 TIMER FLOPPY IN DF0, WRITE PROTECT OFF. / /MACRO TIM490:BPF(D=TIMER,NOX,FI) /CNC TIM490:BPF.ASM /MACRO TIMER:MON(D=IOS+RTX+IOSD+GEN,NOX,FI) /CNC TIMER:MON.ASM /MACRO RTX:TIMER(D=TIMER+OS4+SFM+IOS+RTX+GEN,NOX,FI) /CNC RTX:TIMER.ASM /CNC TIMER.MAC(L) /DELETE TIM490:BPF.BIN /LINK TIM490:BPF.BIN=RTX:TIMER(RL=100)+TIMER:MON+TIM490:BPF+ SFM+IOS+RTX /MO DF /DE DF.TIM490:BPF.BIN /DE DF.TIM490:BPF.ASM /DE DF.RTX:TIMER.ASM /DE DF.TIMER:MON.ASM /DE DF.TIMER.MAC /DE DF.TIM490:BPF.JCL /CO DF=TIM490:BPF.BIN /CO DF=TIM490:BPF.ASM /CO DF=RTX:TIMER.ASM /CO DF=TIMER:MON.ASM /CO DF=TIMER.MAC /CO DF=TIM490:BPF.JCL /VI DF /VI DF /DIS DF /DIS DM1 / / *** DONE *** /CNC TIMER:MON.ASM /MACRO RTX:TIMER(D=TIMER+OS4+SFM+IOS+RTX+GEN,NOX,FI) /CNC RTX:TIMER.ASM /CNC TIMER.MAC(L) /DELETE TIM490:BPF.BIN /LINK TIM490:BPF.BIN=RTX:TIMER(RL=100)+TIMER:MON+TIM490:BPF+ SFM+IOS+RTX /MO DF /DE DF.TIM490:BPF.BIN /DE DF.TIM490:BPF.ASM /DE DF.RTX:TIMER.ASM /DE DF.TIMER:MON.ASM /DE DF.TIMER.MAC /DE DF.TIM490:BPF.JCL /CO IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII1 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII2 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII3 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII4 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII5 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII6 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII7 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII8 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII9 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII: IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII; IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII< IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII= IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII> IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII?  IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII@  IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIA  IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIB  IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIC  IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIID  IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIE  IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIF  IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIG  IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIH  IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII  IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJ  IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIK  IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIL  IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII