%N (*********************************************** * * DEFT Pascal Version 3.0 * (C) Copyright 1984 DEFT Systems, Inc. * Standard Run-time Package * ************************************************) INTERFACE DFT_STANDARD; FUNCTION ENCODE (VAR ASCII : STRING) : INTEGER; PROCEDURE DECODE (NUMBER, SIZE : INTEGER; VAR ASCII : STRING); PROCEDURE HEX (ADDRESS : INTEGER; BYTECOUNT : INTEGER; VAR ASCII : STRING); PROCEDURE STRINGCOPY (VAR SOURCE : STRING; INDEX, LENGTH : INTEGER; VAR DESTINATION : STRING); PROCEDURE STRINGDELETE (VAR SOURCE : STRING; INDEX, LENGTH : INTEGER); PROCEDURE STRINGINSERT (VAR SOURCE : STRING; VAR DESTINATION : STRING; INDEX : INTEGER); FUNCTION STRINGPOS (VAR IMAGE, TARGET : STRING) : INTEGER; PROCEDURE PAGE (VAR FILEVAR : TEXT); FUNCTION FILEERROR (VAR FILEVAR : TEXT) : INTEGER; PROCEDURE CLOSE (VAR FILEVAR : TEXT); PROCEDURE CURSOR (POSITION : INTEGER); FUNCTION PEEK (SEG : INTEGER; ADR : INTEGER) : INTEGER; PROCEDURE POKE (SEG, ADR, DATA : INTEGER); END; %L LEVAR : TEXT); FUNCTION FILEERROR (VAR FILEVAR : TEXT) :AR : TEXT) : INTEGER; PROCEDURE CLOSE (VAR FILEVAR : TEXT); PROCEDURE CURSOR (POSITION : INTEGER); FUNCTION ENCODEREAL (VAR ASCII : STRING) : REAL; PROCEDURE DECODEREAL (VAR NUMBER : REAL; SIZE, FRACTION : INTEGER; VAR ASCII : STRING); FUNCTION SIN (RADIANS : REAL) : REAL; FUNCTION COS (RADIANS : REAL) : REAL; FUNCTION ARCTAN (TANGENT : REAL) : REAL; FUNCTION EXP (POWER : REAL) : REAL; FUNCTION LN (NUMBER : REAL) : REAL; FUNCTION SQRT (NUMBER : REAL) : REAL; FUNCTION SQR (NUMBER : REAL) : REAL; FUNCTION TRUNC (NUMBER : REAL) : INTEGER; FUNCTION ROUND (NUMBER : REAL) : INTEGER; FUNCTION PEEK (SEG : INTEGER; ADR : INTEGER) : INTEGER; PROCEDURE POKE (SEG, ADR, DATA : INTEGER); END; %L UMBER : REAL) : R˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙MODULE LIBRARY; (*I SHOULD CHECK TO MAKE SURE ALL USED BYTES ARE LOADED*) (*JUL 17/91: ADDED CHECK IN ADRMODE FOR INDIRECT AND NOT IAM 0,2 JUL 9/91: MADE MASK LOCAL, IN ADRMODE, REMOVED NUMEROUS READS AND MADE JUST 3 AT THE BEGINING. *) CONST (*BANK NUMBERS FOR DATA STRUCTURES*) CODESEG=0; LOADBMSEG=8; OPCODEBMSEG=9; OPSTARTBMSEG=10; SYMDATSEG=11; SYMADRSEG=12; DATABMSEG=13; UNKNOWNBMSEG=14; DEFSYMBMSEG=15; SYMBOLSEG=16; VAR EXTERNAL DTHD, LBHD:STRING(8); VAR (*VARIABLES USED EXCLUSIVELY IN LIBRARY MODULE*) STATIC AMODE:STRING(19); (*THE ADDRESSING MODE STRINGS*) MASK:ARRAY [0..7] OF INTEGER; (*MASK FOR BIT MANIPULATION*) MEN:ARRAY [0..5] OF STRING; (*THE NMEMONIC OP CODE STRING*) OPSTRNGNUM:STRING(20); RG1:ARRAY [0..7] OF STRING(5); RG2:ARRAY [0..15] OF STRING(5); RG3:ARRAY [0..3] OF STRING(5); PROCEDURE GETASYM(ADR,LEN:INTEGER;HD:STRING(63);VAR S:STRING(15));EXTERNAL; FUNCTION ISSET(ADR,BANK:INTEGER):BOOLEAN; (*GENERIC BIT SET TEST ROUTINE*) VAR BT,D,X:INTEGER; BEGIN BT:=ADR AND 7;X:=ADR LSR 3; D:=PEEK(BANK,X); ISSET:=((D AND MASK[BT])<>0); END; PROCEDURE SETBIT(ADR,BANK:INTEGER); (*GENERIC BIT SET ROUTINE*) VAR BT,D,X:INTEGER; BEGIN BT:=ADR AND 7;X:=ADR LSR 3; D:=PEEK(BANK,X); D:=D OR MASK[BT]; POKE(BANK,X,D); END; PROCEDURE CLRBIT(ADR,BANK:INTEGER);PUBLIC; (*GENERIC BIT CLEAR ROUTINE*) VAR BT,D,X:INTEGER; BEGIN BT:=ADR AND 7;X:=ADR LSR 3; D:=PEEK(BANK,X); D:=D AND (255-MASK[BT]); POKE(BANK,X,D); END; FUNCTION ISUNKNOWN(ADR:INTEGER):BOOLEAN;PUBLIC; (*IS THIS ADDRESS OF UNKNOWN TYPE*) BEGIN ISUNKNOWN:=ISSET(ADR,UNKNOWNBMSEG); END; PROCEDURE SETUNKNOWN(ADR:INTEGER);PUBLIC; (*WE KNOW THAT THIS ADDRESS IS OF AN UNKNOWN TYPE*) BEGIN SETBIT(ADR,UNKNOWNBMSEG); END; PROCEDURE CLRUNKNOWN(ADR:INTEGER);PUBLIC; (*THIS ADDRESS HAS BEEN FOUND TO BE OPCODES AND NOT DATA. THEREFORE WE NEED TO REMOVE THE FLAG DECLARING IT TO BE DATA.*) BEGIN CLRBIT(ADR,UNKNOWNBMSEG); END; PROCEDURE SETSYMADR(ADR:INTEGER);PUBLIC; (*FLAGS AN ADDRESS SYMBOL AT THIS ADDRESS*) BEGIN SETBIT(ADR,SYMADRSEG); END; FUNCTION ISSYMADR(ADR:INTEGER):BOOLEAN;PUBLIC; (*IS AN ADRESS SYMBOL FLAGED FOR THIS ADDRESS?*) BEGIN ISSYMADR:=ISSET(ADR,SYMADRSEG); END; PROCEDURE CLRSYMADR(ADR:INTEGER);PUBLIC; (*THIS CLEARS SYMADR*) BEGIN CLRBIT(ADR,SYMADRSEG); END; PROCEDURE SETSYMDAT(ADR:INTEGER);PUBLIC; (*FLAGS A DATA SYMBOL AT THIS ADDRESS*) BEGIN SETBIT(ADR,SYMDATSEG); END; FUNCTION ISSYMDAT(ADR:INTEGER):BOOLEAN;PUBLIC; (*IS A DATA SYMBOL FLAGED FOR THIS ADDRESS*) BEGIN ISSYMDAT:=ISSET(ADR,SYMDATSEG); END; PROCEDURE CLRSYMDAT(ADR:INTEGER);PUBLIC; (*THIS CLEARS SYMDAT*) BEGIN CLRBIT(ADR,SYMDATSEG); END; FUNCTION ISLOADED(ADR:INTEGER):BOOLEAN;PUBLIC; (*DID WE LOAD ANYTHING AT THIS ADDRESS? IF NOT THEN IT IS OUTSIDE OF PROGRAM*) BEGIN ISLOADED:=ISSET(ADR,LOADBMSEG); END; PROCEDURE SETLOAD(ADR:INTEGER);PUBLIC; (*FLAG A BYTE LOADED*) BEGIN SETBIT(ADR,LOADBMSEG); END; PROCEDURE CLRLOAD(ADR:INTEGER);PUBLIC; (*THIS CLEARS THE LOADED FLAG*) BEGIN CLRBIT(ADR,LOADBMSEG); END; FUNCTION ISOPCODE(ADR:INTEGER):BOOLEAN;PUBLIC; (*HAVE WE DETERMINED THAT THIS ADDRESS IS PART OF AN OPCODE?*) BEGIN ISOPCODE:=ISSET(ADR,OPCODEBMSEG); END; PROCEDURE SETOPCODE(ADR:INTEGER);PUBLIC; (*WE HAVE DETERMINED THAT THIS ADDRESS IS PART OF AN OPCODE.*) BEGIN SETBIT(ADR,OPCODEBMSEG); CLRUNKNOWN(ADR); END; PROCEDURE CLROPCODE(ADR:INTEGER);PUBLIC; (*THIS CLEARS THE OPCODE FLAG*) BEGIN CLRBIT(ADR,OPCODEBMSEG); END; FUNCTION ISOPSTART(ADR:INTEGER):BOOLEAN;PUBLIC; (*HAVE WE DETERMINED THAT THIS ADDRESS IS THE START OF AN OPCODE?*) BEGIN ISOPSTART:=ISSET(ADR,OPSTARTBMSEG); END; PROCEDURE SETOPSTART(ADR:INTEGER);PUBLIC; (*WE HAVE DETERMINED THAT THIS ADDRESS IS THE START OF AN OPCODE.*) BEGIN SETBIT(ADR,OPSTARTBMSEG); CLRUNKNOWN(ADR); END; PROCEDURE CLROPSTART(ADR:INTEGER);PUBLIC; (*THIS CLEARS THE OPSTART FLAG*) BEGIN CLRBIT(ADR,OPSTARTBMSEG); END; FUNCTION DONEIT(ADR:INTEGER):BOOLEAN;PUBLIC; (*HAVE WE ALREADY CHECKED THIS ADDRESS FOR AN OPCODE?*) BEGIN DONEIT:=ISOPSTART(ADR); END; FUNCTION ISDATA(ADR:INTEGER):BOOLEAN;PUBLIC; (*IS THIS ADDRESS KNOWN TO BE DATA?*) BEGIN ISDATA:=ISSET(ADR,DATABMSEG); END; PROCEDURE SETDATA(ADR:INTEGER);PUBLIC; (*WE KNOW THAT THIS ADDRESS IS A DATA BYTE*) BEGIN SETBIT(ADR,DATABMSEG); CLRUNKNOWN(ADR); END; PROCEDURE CLRDATA(ADR:INTEGER);PUBLIC; (*THIS CLEARS THE DATA FLAG*) BEGIN CLRBIT(ADR,DATABMSEG); END; FUNCTION ISDEFSYM(ADR:INTEGER):BOOLEAN;PUBLIC; (*IS THIS ADDRESS OF A USER DEFINED SYMBOL*) BEGIN ISDEFSYM:=ISSET(ADR,DEFSYMBMSEG); END; PROCEDURE SETDEFSYM(ADR:INTEGER);PUBLIC; (*WE KNOW THAT THIS ADDRESS IS A USER DEFINED SYMBOL*) BEGIN SETBIT(ADR,DEFSYMBMSEG); END; PROCEDURE CLRDEFSYM(ADR:INTEGER);PUBLIC; (*UNFLAG A USER DEFINED SYMBOL*) BEGIN CLRBIT(ADR,DEFSYMBMSEG); END; PROCEDURE GETOPCINIT;PUBLIC; (*THIS PROCEDURE SIMPLY INITIALIZES THE DATA FOR THE PROCEDURE GETOPC. *) BEGIN MEN[0]:='NEG FCB FCB COM LSR FCB ROR ASR LSL ROL DEC FCB INC TST JMP CLR '; MEN[1]:='FCB FCB NOP SYNCFCB FCB LBRALBSRFCB DAA ORCCFCB ANDCSEX EXG TFR '; MEN[2]:='BRA BRN BHI BLS BHS BLO BNE BEQ BVC BVS BPL BMI BGE BLT BGT BLE '; MEN[3]:='LEAXLEAYLEASLEAUPSHSPULSPSHUPULUFCB RTS ABX RTI CWAIMUL FCB SWI '; MEN[4]:='SUBACMPASBCASUBDANDABITALDA STA EORAADCAORA ADDACMPXJSR LDX STX '; MEN[5]:='SUBBCMPBSBCBADDDANDBBITBLDB STB EORBADCBORB ADDBLDD STD LDU STU '; AMODE:='5010009635963596'; OPSTRNGNUM:='0123000044445555'; RG1[0]:=',CC';RG1[1]:=',A'; RG1[2]:=',B';RG1[3]:=',DP'; RG1[4]:=',X';RG1[5]:=',Y'; RG1[6]:=',U';RG1[7]:=',PC'; RG2[0]:='D';RG2[1]:='X'; RG2[2]:='Y';RG2[3]:='U'; RG2[4]:='S';RG2[5]:='PC'; RG2[6]:='?';RG2[7]:='?'; RG2[8]:='A';RG2[9]:='B'; RG2[10]:='CC';RG2[11]:='DP'; RG2[12]:='?';RG2[13]:='?'; RG2[14]:='?';RG2[15]:='?'; RG3[0]:='X';RG3[1]:='Y'; RG3[2]:='U';RG3[3]:='S'; MASK[0]:=1;MASK[1]:=2; MASK[2]:=4;MASK[3]:=8; MASK[4]:=16;MASK[5]:=32; MASK[6]:=64;MASK[7]:=128; END; FUNCTION READBYTE(VAR ADR:INTEGER):INTEGER; VAR BANK,X:INTEGER; BEGIN BANK:=(ADR LSR 13) AND 7;X:=ADR AND $1FFF; READBYTE:=PEEK(CODESEG+BANK,X);ADR:=SUCC(ADR); END; PROCEDURE GETOPC(ADR:INTEGER; VAR VALID,VALIDADR,VALIDDAT:BOOLEAN; VAR PG,OPC,OPD,AM,LEN:INTEGER; VAR MN1,MN2:STRING(30)); PUBLIC; VAR HALF1,HALF2:INTEGER; OSN,OP1:INTEGER; HD:STRING(1); TEMPSTRING:STRING(63); PROCEDURE CALCADRMODE(VAR AM:INTEGER; VAR HD:STRING(1)); (*THIS THE ADDRESSING MODE OF THE OP CODE. THE 6809 IS VERY SYMETRIC IN IT'S OP CODE AND ADDRESSING MODES. THERE ARE ONLY A FEW EXCEPTIONS WHICH ARE HANDLED BY A CASE. IT ALSO CHECKS TO SEE IF IT IS A DIRECT PAGE ADDRESS OR IMMEDIATE AND WILL INDICATE THE CORECT HEADER SYMBOL <,# IT CHECKS TO SEE IF IT IS A LONG BRANCH AND IF SO IT WILL GIVE IT THE CORRECT ADDRESSING MODE. THE ADDRESSING MODES ARE 0: INHERENT 1: BRANCH 2: LONG BRANCH 3: 1 BYTE DATA 4: 2 BYTES DATA 5: 1 BYTE ADDRESS (DIRECT PG) 6: 2 BYTES ADDRESS 7: PSHS/PULS/PSHU/PULU 8: EXG/TFR 9: INDEXED IF BIT 4 IS SET THEN IT WILL BE [----] 0: ,R+ 1: ,R++ 2: ,-R 3: ,--R 4: ,R 5: B,R 6: A,R 7: NOT USED 8: 8 BIT,R 9: 16 BIT,R 10: NOT USED 11: D,R 12: 8 BIT,PCR 13: 16 BIT,PCR 14: NOT USED 15: INDIRECT ONLY [ADDRES] *) BEGIN AM:=ORD(AMODE[HALF1+1])-48; CASE OPC OF 22,23:AM:=2; 26,28:AM:=3; 30,31:AM:=8; 48,49,50,51:AM:=9; 52,53,54,55:AM:=7; 131,140,142,195,204,206:AM:=4; 141:AM:=1 END; (*CASE*) HD:=''; IF (AM=3) OR (AM=4) THEN HD:='#'; IF AM=5 THEN HD:='<'; IF ((PG=1) AND (OPC>32) AND (OPC<48)) THEN AM:=2; END; PROCEDURE ADRMODE(MODE:INTEGER; VAR LEN:INTEGER; VAR ADRMODESTRNG:STRING(63)); (*THE ADDRESSING MODES ARE 0: INHERENT 1: BRANCH 2: LONG BRANCH 3: 1 BYTE DATA 4: 2 BYTES DATA 5: 1 BYTE ADDRESS (DIRECT PG) 6: 2 BYTES ADDRESS 7: PSHS/PULS/PSHU/PULU 8: EXG/TFR 9: INDEXED IF BIT 4 IS SET THEN IT WILL BE [----] 0: ,R+ 1: ,R++ 2: ,-R 3: ,--R 4: ,R 5: B,R 6: A,R 7: NOT USED 8: 8 BIT,R 9: 16 BIT,R 10: NOT USED 11: D,R 12: 8 BIT,PCR 13: 16 BIT,PCR 14: NOT USED 15: INDIRECT ONLY [ADDRES] *) VAR B1,B2,B3,IAM,REG,TEMP:INTEGER; S,S2:STRING(20); INDIRECT:BOOLEAN; B12,B23:INTEGER; BEGIN VALIDADR:=FALSE;VALIDDAT:=FALSE;LEN:=0;OPD:=0; B1:=READBYTE(ADR);B2:=READBYTE(ADR);B3:=READBYTE(ADR);ADR:=ADR-2; B12:=B1*256+B2;B23:=B2*256+B3; CASE MODE OF 0:ADRMODESTRNG:=''; 1:BEGIN IF B1>127 THEN B1:=B1-256; OPD:=ADR+B1;LEN:=1;VALIDADR:=TRUE; GETASYM(OPD,2,LBHD,ADRMODESTRNG); END; 2:BEGIN OPD:=ADR+B12+1;LEN:=2;VALIDADR:=TRUE; GETASYM(OPD,2,LBHD,ADRMODESTRNG); END; 3:BEGIN OPD:=B1;LEN:=1;VALIDDAT:=TRUE; GETASYM(OPD,1,DTHD,ADRMODESTRNG); END; 4:BEGIN OPD:=B12;LEN:=2;VALIDDAT:=TRUE; GETASYM(OPD,2,DTHD,ADRMODESTRNG); END; 5:BEGIN OPD:=B1;LEN:=1;VALIDADR:=TRUE; GETASYM(OPD,1,LBHD,ADRMODESTRNG); END; 6:BEGIN OPD:=B12;LEN:=2;VALIDADR:=TRUE; GETASYM(OPD,2,LBHD,ADRMODESTRNG); END; 7:BEGIN OPD:=B1;S:='';RG1[6]:=',U';LEN:=1; IF OPC>53 THEN RG1[6]:=',S'; FOR REG:=0 TO 7 DO IF (B1 AND MASK[REG])<>0 THEN S:=S+RG1[REG]; IF S='' THEN VALID:=FALSE ELSE STRINGDELETE(S,1,1); ADRMODESTRNG:=S; END; 8:BEGIN OPD:=B1;LEN:=1; S:=RG2[B1 LSR 4]+','+RG2[B1 AND 15]; (* NOTE (SUB1 AND 8) SHOULD EQUAL (SUB2 AND 8) *) IF (S[1]='?') OR (S[3]='?') OR (S[4]='?') THEN VALID:=FALSE; ADRMODESTRNG:=S; END; 9:BEGIN LEN:=1; REG:=(B1 AND 96) LSR 5; IF B1<128 THEN BEGIN TEMP:=B1 AND 31;(*VALIDDATA:=TRUE;*) IF TEMP>15 THEN TEMP:=TEMP-32; (* GETASYM(TEMP,1,LBHD,S);*) DECODE(TEMP,3,S); (*WE DON'T WANT A SYMBOL*) S:=S+','+RG3[REG];OPD:=TEMP; END ELSE BEGIN INDIRECT:=FALSE; IF (B1 AND 16)=16 THEN INDIRECT:=TRUE; IAM:=B1 AND 15;OPD:=0; CASE IAM OF 0:S:=','+RG3[REG]+'+'; 1:S:=','+RG3[REG]+'++'; 2:S:=',-'+RG3[REG]; 3:S:=',--'+RG3[REG]; 4:S:=','+RG3[REG]; 5:S:='B,'+RG3[REG]; 6:S:='A,'+RG3[REG]; 7:VALID:=FALSE; 8:BEGIN OPD:=B2;LEN:=2;VALIDDAT:=TRUE; GETASYM(OPD,1,LBHD,S);S:=S+','+RG3[REG]; END; 9:BEGIN LEN:=3;OPD:=B23;VALIDDAT:=TRUE; GETASYM(OPD,2,DTHD,S);S:=S+','+RG3[REG]; END; 10:VALID:=FALSE; 11:S:='D,'+RG3[REG]; 12:BEGIN IF B2>127 THEN B2:=B2-256;LEN:=2; OPD:=ADR+B2+1;VALIDDAT:=TRUE; GETASYM(OPD,1,LBHD,S);S:=S+',PCR'; VALIDADR:=TRUE;END; 13:BEGIN LEN:=3;OPD:=ADR+B23+2;VALIDDAT:=TRUE; GETASYM(OPD,2,LBHD,S);S:=S+',PCR'; VALIDADR:=TRUE;END; 14:VALID:=FALSE; 15:IF B1=159 THEN BEGIN OPD:=B23;LEN:=3; GETASYM(OPD,2,LBHD,S);VALIDDAT:=TRUE; END ELSE VALID:=FALSE END; (*CASE 9*) IF INDIRECT THEN BEGIN S2:='['+S+']'; S:=S2;VALIDADR:=FALSE; IF (IAM=0) OR (IAM=2) THEN VALID:=FALSE; END; END; (*IF NOT X>127*) ADRMODESTRNG:=S; END (*BEGIN 9*) END; (*CASE *) IF NOT VALID THEN LEN:=0; ADR:=ADR+LEN-1; END; PROCEDURE PAGE0; BEGIN CALCADRMODE(AM,HD); ADRMODE(AM,LEN,TEMPSTRING); MN2:=HD+TEMPSTRING; END; PROCEDURE PAGE1; BEGIN IF (OPC>191) THEN BEGIN IF (HALF2=14) THEN MN1:='LDS' ELSE IF (HALF2=15) AND (HALF1<>12) THEN MN1:='STS' ELSE VALID:=FALSE; END ELSE IF (OPC>127) THEN BEGIN IF HALF2=3 THEN MN1:='CMPD' ELSE IF HALF2=12 THEN MN1:='CMPY' ELSE IF HALF2=14 THEN MN1:='LDY' ELSE IF (HALF2=15) AND (HALF1<>8) THEN MN1:='STY' ELSE VALID:=FALSE; END ELSE IF OPC=63 THEN MN1:='SWI2' ELSE IF (OPC>32) AND (OPC<48) THEN BEGIN MN2:='L'+MN1; MN1:=MN2; END ELSE VALID:=FALSE; IF VALID THEN PAGE0; END; PROCEDURE PAGE2; BEGIN IF (OPC>127) AND (OPC<192) THEN BEGIN IF HALF2=3 THEN MN1:='CMPU' ELSE IF HALF2=12 THEN MN1:='CMPS' ELSE VALID:=FALSE; END ELSE IF OPC=63 THEN MN1:='SWI3' ELSE VALID:=FALSE; IF VALID THEN PAGE0; END; BEGIN (*MAIN, GETOPC*) VALID:=TRUE;PG:=0;LEN:=0;HD:=''; OPC:=READBYTE(ADR);OP1:=OPC; IF (OPC=16) THEN PG:=1; IF (OPC=17) THEN PG:=2; IF PG>0 THEN OPC:=READBYTE(ADR); HALF1:=OPC LSR 4;HALF2:=OPC AND 15; OSN:=ORD(OPSTRNGNUM[HALF1+1])-48; STRINGCOPY(MEN[OSN],HALF2*4+1,4,MN1); IF MN1[4]=' ' THEN MN1[0]:=CHR(3); IF OPC=28 THEN MN1:='ANDCC'; IF OPC=141 THEN MN1:='BSR'; IF (OPC=135) OR (OPC=143) OR (OPC=199) OR (OPC=205) OR (OPC=207) THEN MN1:='FCB'; IF (HALF1=4) AND (HALF2<>14) THEN MN1:=MN1+'A'; IF (HALF1=5) AND (HALF2<>14) THEN MN1:=MN1+'B'; IF (OPC=94) OR (OPC=78) THEN MN1:='FCB'; IF MN1[1]='F' THEN VALID:=FALSE; IF MN1[1]<>'F' THEN IF PG=0 THEN PAGE0 ELSE IF PG=1 THEN PAGE1 ELSE PAGE2; IF NOT VALID THEN BEGIN MN1:='FCB'; GETASYM(OP1,1,LBHD,MN2); OPC:=OP1; OPD:=0; LEN:=1; PG:=0; END ELSE BEGIN LEN:=LEN+1; IF PG>0 THEN LEN:=LEN+1; END; END; (*END MAIN, END GETOPC*) END. ELSE PAGE2; IF NOT VALID THEN BEGIN MN1:='FCB'; GETASYM(OP1,1,LBHD,MN2); OPC:=OP1; OPD:=0; LEN:=1; PG:=0; END S+RG1[Y]; IF S='' THEN VALID:=FALSE ELSE STRINGDELETE(S,1,1); ADRMODESTRNG:=S; END; 8:BEGIN OPD:=X;LEN:=1; S:=RG2[X LSR 4]+','+RG2[X AND 15]; (* NOTE (SUB1 AND 8) SHOULD EQUAL (SUB2 AND 8) *) IF (S[1]='?') OR (S[3]='?'FUNCTION ISUNKNOWN(ADR:INTEGER):BOOLEAN;EXTERNAL; PROCEDURE SETUNKNOWN(ADR:INTEGER);EXTERNAL; PROCEDURE CLRUNKNOWN(ADR:INTEGER);EXTERNAL; PROCEDURE SETSYMADR(ADR:INTEGER);EXTERNAL; FUNCTION ISSYMADR(ADR:INTEGER):BOOLEAN;EXTERNAL; PROCEDURE CLRSYMADR(ADR:INTEGER);EXTERNAL; PROCEDURE SETSYMDAT(ADR:INTEGER);EXTERNAL; FUNCTION ISSYMDAT(ADR:INTEGER):BOOLEAN;EXTERNAL; PROCEDURE CLRSYMDAT(ADR:INTEGER);EXTERNAL; FUNCTION ISLOADED(ADR:INTEGER):BOOLEAN;EXTERNAL; PROCEDURE SETLOAD(ADR:INTEGER);EXTERNAL; PROCEDURE CLRLOAD(ADR:INTEGER);EXTERNAL; FUNCTION ISOPCODE(ADR:INTEGER):BOOLEAN;EXTERNAL; PROCEDURE SETOPCODE(ADR:INTEGER);EXTERNAL; PROCEDURE CLROPCODE(ADR:INTEGER);EXTERNAL; FUNCTION ISOPSTART(ADR:INTEGER):BOOLEAN;EXTERNAL; PROCEDURE SETOPSTART(ADR:INTEGER);EXTERNAL; PROCEDURE CLROPSTART(ADR:INTEGER);EXTERNAL; FUNCTION DONEIT(ADR:INTEGER):BOOLEAN;EXTERNAL; FUNCTION ISDATA(ADR:INTEGER):BOOLEAN;EXTERNAL; PROCEDURE SETDATA(ADR:INTEGER);EXTERNAL; PROCEDURE CLRDATA(ADR:INTEGER);EXTERNAL; FUNCTION ISDEFSYM(ADR:INTEGER):BOOLEAN;EXTERNAL; PROCEDURE SETDEFSYM(ADR:INTEGER);EXTERNAL; PROCEDURE CLRDEFSYM(ADR:INTEGER);EXTERNAL; PROCEDURE GETOPCINIT;EXTERNAL; PROCEDURE GETOPC(ADR:INTEGER; VAR VALID,VALIDADR,VALIDDAT:BOOLEAN; VAR PG,OPC,OPD,AM,LEN:INTEGER; VAR MN1,MN2:STRING(30)); EXTERNAL; EDURE CLRDEFSYM(ADR:INTEGER);EXTERNAL; PROCEDURE GETOPCINIT;EXTERNAL; PROCEDURE GETOPC(ADR:INTEGER; VAR VALID,VALIDADR,VALIDDAT:BOOLEAN; ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ STITLE /FCB DEFINITIONS/ **************************************** * FCB DEFINITIONS - MARCH 26, 1984 **************************************** FCBPOINTER EQU 0 FILE POINTER FCBNAME EQU 2 FILE NAME FCBEXT EQU 10 FILE NAME EXTENSION FCBDEVNO EQU 13 DEVICE NUMBER FCBSTATE EQU 14 STATE OF LAST OPERATION FCBTYPE EQU 15 FILE TYPE FCBGRAN EQU 16 CURRENT GRANULE FCBNEXTG EQU 17 NEXT GRANULE FCBTRACK EQU 18 TRACK NUMBER FCBSECTR EQU 19 CURRENT SECTOR FCBLSECT EQU 20 LAST SECTOR IN GRANULE FCBOPEN EQU 21 OPEN TYPE FCBINDEX EQU 22 INDEX INTO BUFFER FCBBUFSZ EQU 24 CURRENT BUFFER SIZE FCBLAST EQU 26 LAST SECTOR SIZE FCBTYPESIZE EQU 28 RECORD TYPE SIZE FCBBUFR EQU 30 BUFFER FCBBASESIZE EQU 286 BASE SIZE OF FCB FCBRECORD EQU 286 RECORD OFFSET SKIP **************************************** * FCBOPEN VALUE DEFINITION **************************************** FCBOPENREAD EQU $AA OPEN FOR SEQ READ FCBOPENWRITE EQU $CC OPEN FOR SEQ WRITE FCBOPENDIRCT EQU $BB OPEN FOR DIRECT ACC SKIP **************************************** * FCBSTATE VALUES **************************************** FCBSTOKAY EQU 0 SUCCESSFUL OPERATION FCBSTEOF EQU $FF END OF FILE FCBSTIOERR EQU $FE I/O ERROR FCBSTNOTFND EQU $FD FILE NOT FOUND FCBSTILLEGAL EQU $FC ILLEGAL OPERATION FCBSTFULL EQU $FB DEVICE FULL STITLE /INITIALIZATION/ **************************************** * * PASCAL INITIALIZATION CODE * **************************************** SKIP MAIN SKIP PSHS U,Y,X,DP,D,CC SAVE ALL REGS ORCC #$50 INHIBIT THINGS LBSR DFTDISKRESET RESET DISK CONTROLLER SKIP **************************************** * DETERMINE THE AMOUNT OF MEMORY **************************************** LDA $FFF8 Find out if running on a '3 CMPA #$FE Points to $FEXX if so BNE BACK If not, don't speed up STA $FFD9 Speed up to 2 MHz LDA #$10 Turn on lower case STA $FF22 BACK STA $FFDF Set 64K CLRA STA $8A0 Set for return to RS-DOS LDX #$FDFE X->64K TOP SKIP **************************************** * SAVE BASIC'S INTERRUPT VECTORS **************************************** STS 0,X SAVE S AT TOP OF MEMORY TFR X,S INIT STACK LDD $72 GET WARM START VECTOR PSHS D SAVE ON STACK LDX #$0112 X->END OF VECTORS SAVEVECTOR LDD ,--X GET A WORD PSHS D SAVE ON STACK CMPX #$0100 SAVED ALL OF THEM? BHI SAVEVECTOR IF NOT, CONTINUE STS STACKSAVE,PCR SAVE STACK POINTER LEAX BOOTRESTART,PCR X->WARM START RTN STX $72 SET WARM START VECTOR SKIP **************************************** * SETUP NEW DISK VECTORS **************************************** LBSR DFTDISKVECTR SETUP DISK VECTORS ANDCC #$AF ENABLE INTERRUPTS EJECT **************************************** * SETUP PASCAL INPUT/OUTPUT FCB **************************************** LEAX DFTHEAPSTART+2,PCR X->HEAP AREA STX -2,X INITIALIZE HEAP LDX #FCBBASESIZE A=ALLOCATE SIZE FCBLOOP CLR ,-S ALLOCATE A BYTE LEAX -1,X ADJUST COUNT BNE FCBLOOP ALLOCATE IT ALL SKIP LEAX 0,S X->INPUT/OUTPUT FCB LDA #-3 A=SCREEN/KEYBOARD DEV # STA FCBDEVNO,X INSERT IN FCB LDA #FCBOPENWRITE GET OPEN INDICATOR STA FCBOPEN,X INDICATE OPENNED SKIP **************************************** * SETUP INITIAL FRAME AND START PROGRAM **************************************** PSHS X PUSH FCB ADDRESS LEAU -2,S ESTABLISH 1ST BASE PSHS U STATIC LINK TO SELF LBSR DFTPSCLMAIN BEGIN EXECUTION SKIP **************************************** * RESTORE BASIC'S INTERRUPT VECTORS **************************************** ORCC #$50 INHIBIT INTERRUPTS LBSR DFTDISKRESET RESET DISK CONTROLLER LEAS FCBBASESIZE+4,S S->SAVED VECTORS LDX #$0100 X->VECTOR AREA RESTOREVECTR PULS D GET BACK A WORD STD ,X++ RESTORE CMPX #$0112 DONE? BLO RESTOREVECTR DO ALL OF THEM PULS D GET WARM START VECTOR STD $72 RESTORE VECTOR SKIP **************************************** * RETURN TO BASIC **************************************** PULS X GET OLD STACK TFR X,S RESTORE STACK STA $FFD8 Return to 1 MHz RSDOS STA $FFDE To 32K PULS CC,D,DP,X,Y,U,PC Clean up stack and return STITLE /WARM START RESET/ **************************************** * WARM START RESET VECTOR **************************************** SKIP BOOTRESTART NOP MAKE BASIC HAPPY LDX #$0100 X->VECTOR AREA TFR S,Y SAVE CURRENT STACK LDS STACKSAVE,PCR RESTORE STACK CMPS #$8000-$14 STACK IN LOWER 32K? BLO WARMRESTORE IF SO, 32K MODE STA $FFDF NO, SET 64K MODE SKIP WARMRESTORE PULS D GET BACK A WORD STD ,X++ RESTORE CMPX #$0112 DONE? BLO WARMRESTORE DO ALL OF THEM SKIP PULS X GET WARM START VECTOR STX $72 RESTORE VECTOR TFR Y,S RESTORE STACK STA $FFDE Set 32K Mode STA $FFD8 Set 1MHz JMP 0,X DO WARM START SKIP **************************************** * PASBOOT DATA AREAS **************************************** SKIP STACKSAVE RMB 2 STACK POINTER SAVE SKIP DFTPSCLMAIN EXT DFTHEAPSTART EXT DFTDISKRESET EXT DFTDISKVECTR EXT * POKE(SEG,ADR,BYTE) PARAMS ARE 16 BITS PUBLIC POKE POKE ORCC #$50 LDA $FFA2 PSHS A,B LDD 8,S ANDA #$1F ADDD #16384 TFR D,X LDD 10,S STB $FFA2 LDD 6,S STB ,X PULS A,B STA $FFA2 ANDCC #$AF RTS * RETVAR:=PEEK(SEG,ADR) PARAMS ARE 16 BITS PUBLIC PEEK PEEK ORCC #$50 LDA $FFA2 PSHS A,B LDD 6,S ANDA #$1F ADDD #16384 TFR D,X LDD 8,S STB $FFA2 LDB ,X CLRA STD 10,S PULS A,B STA $FFA2 ANDCC #$AF RTS END DCC #$AF RTS * RETVAR:=PEEK(SEG,ADR) PARAMS ARE 16 BITS PUBLIC PEEK PEEK ORCC #$50 LDA $FFA2 PSHS A,B LDD 6,S ANDA #$1F ADDD #16384 TFR D,X LDD 8,S STB $FFA2 LDB ,X CLRA STD 10,S PULS A,B STA $FFA2 ANDCC˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙PROCEDURE TRACE; VAR ADR,NEWADR:INTEGER; DONE:BOOLEAN;TEMPS:STRING(5); PROCEDURE PULLSTACK; BEGIN IF STKPTR>=0 THEN BEGIN NEWADR:=STACK[STKPTR];STKPTR:=PRED(STKPTR);END ELSE NEWADR:=INVALIDADR; END; PROCEDURE DOJUMP(OPD:INTEGER); BEGIN NEWADR:=OPD; END; PROCEDURE DOOPCODE; VAR X:INTEGER; BEGIN SETOPSTART(ADR);X:=ADR; WHILE (X<>(ADR+LEN)) DO BEGIN SETOPCODE(X); X:=X+1; END; END; FUNCTION SUBR:BOOLEAN; BEGIN SUBR:=FALSE; IF (OPC=23 ) OR (OPC=141) OR (OPC=157) OR (OPC=173) OR (OPC=189) THEN BEGIN SUBR:=TRUE; IF (NOT ISLOADED(OPD)) OR (VALIDADR=FALSE) THEN SUBR:=FALSE; END; END; FUNCTION JUMP:BOOLEAN; BEGIN JUMP:=FALSE; IF (OPC=22 ) OR (OPC=32 ) OR (OPC=110) OR (OPC=126) THEN BEGIN JUMP:=TRUE; IF (NOT ISLOADED(OPD)) OR (VALIDADR=FALSE) THEN BEGIN JUMP:=FALSE;PULLSTACK;END; END; END; FUNCTION CONDBRANCH:BOOLEAN; BEGIN CONDBRANCH:=FALSE; IF (OPC>=34) AND (OPC<=47) THEN BEGIN CONDBRANCH:=TRUE; IF (NOT ISLOADED(OPD)) OR (VALIDADR=FALSE) THEN CONDBRANCH:=FALSE; END; END; FUNCTION PULLPC:BOOLEAN; BEGIN PULLPC:=FALSE; IF ((OPC=53) OR (OPC=55)) AND ((OPD AND 128)=128) THEN PULLPC:=TRUE; END; FUNCTION RTS:BOOLEAN; BEGIN RTS:=(OPC=57); END; FUNCTION RTI:BOOLEAN; BEGIN RTI:=(OPC=59); END; FUNCTION EXGPC(OPD:INTEGER):BOOLEAN; BEGIN EXGPC:=FALSE; IF ((OPC=30 ) AND (((OPD AND 15)=5) OR ((OPD AND 240)=80))) THEN EXGPC:=TRUE; END; FUNCTION TFRPC(OPD:INTEGER):BOOLEAN; BEGIN TFRPC:=FALSE; IF ((OPC=31) AND ((OPD AND 15)=5)) THEN TFRPC:=TRUE; END; PROCEDURE INITTRACE; BEGIN ADR:=EXECADR; DONE:=FALSE; THEKEY:=0; END; PROCEDURE PULLTABLE; VAR FOUND:BOOLEAN;AT,A,B:INTEGER; BEGIN FOUND:=FALSE;ADR:=INVALIDADR; WHILE (TBLPTR>=0) AND (NOT FOUND) DO BEGIN AT:=TABLE[TBLPTR]; IF ISLOADED(AT) AND ISLOADED(AT+1) AND (*TABLE POINT IN PROG?*) NOT (ISOPCODE(AT) OR ISOPCODE(AT+1)) THEN (*TABLE IS NOT AN OPCODE*) BEGIN A:=READBYTE(AT);B:=READBYTE(AT);TABLE[TBLPTR]:=AT; A:=A*256+B; IF NOT ISLOADED(A) THEN TBLPTR:=TBLPTR-1 (*POINTS OUTSIDE*) ELSE IF (NOT ISOPCODE(A)) THEN FOUND:=TRUE; (*HAVEN'T DONE THIS ONE*) END ELSE TBLPTR:=TBLPTR-1; END; IF FOUND THEN BEGIN ADR:=A; SETDATA(AT-2);SETDATA(AT-1); CLROPCODE(AT-2);CLROPCODE(AT-1); CLROPSTART(AT-2);CLROPSTART(AT-1); END ELSE BEGIN DONE:=TRUE; ADR:=INVALIDADR; END; END; PROCEDURE NEXTADR; BEGIN ADR:=NEWADR; IF (ADR=INVALIDADR) THEN PULLTABLE; IF (ADR=INVALIDADR) THEN DONE:=TRUE; END; BEGIN (*TRACE*) INITTRACE; CURSOR(328);WRITELN('TRACING -> $ '); WHILE NOT DONE DO BEGIN HEX(@ADR,2,TEMPS);CURSOR(340);WRITELN(TEMPS); IF BREAKPRESS(NO) THEN BEGIN ERROR:=TRUE;ERRORNUM:=8;END; IF ERROR THEN EXIT; IF (NOT DONEIT(ADR)) AND (NOT ISDATA(ADR)) AND (ISLOADED(ADR)) THEN BEGIN GETOPC(ADR,VALID,VALIDADR,VALIDDAT,PG,OPC,OPD,AM,LEN,MN1,MN2); IF VALID THEN BEGIN NEWADR:=ADR+LEN; IF SUBR THEN PUSHSTACK(OPD) ELSE IF JUMP THEN DOJUMP(OPD) ELSE IF CONDBRANCH THEN PUSHSTACK(OPD) ELSE IF RTS THEN PULLSTACK ELSE IF PULLPC THEN PULLSTACK ELSE IF EXGPC(OPD) THEN PULLSTACK ELSE IF TFRPC(OPD) THEN PULLSTACK ELSE IF RTI THEN PULLSTACK; DOOPCODE; IF VALIDADR THEN SETSYMADR(OPD); IF VALIDDAT THEN SETSYMDAT(OPD); NEXTADR; END ELSE BEGIN PULLSTACK;NEXTADR;END; END(*IF NOT DONEIT*) ELSE BEGIN PULLSTACK;NEXTADR;END; END; (*WHILE*) END; (*TRACE*) ; DOOPCODE; IF VALIDADR THEN SETSYMADR(OPD); IF VALIDDAT THEN SETSYMDAT(OPD)SE BEGIN PULLSTACK;NEXTADR;END; END; (*WHILE*) END; (*TRACE*) ; DOOPCODE; IF VALIDADR THEN SETSYMADR(OPD); IF VALIDDAT THEN SETSYMDAT(OPD); NEXTADR; END ELSE BEGIN PULLSTACK;NEXTADR;END; END(*IF NOT DONEIT*) ELAD 0000 S341017FF643269308DFB98341017 YDFTREALLOAD 0000 S17 YDFTREALMUL 0000 S341017FECA326917 YDFTREALSTORE0000 S325C35C0344033643278304934103042341017 YDFTREALLOAD 0000 S3042341017 YDFTREALLOAD 0000 S17 YDFTREALMUL 0000 S17 YDFTREALSTORE0000 S325C35C0 RARCTAN 02F2 RCOS 01E6 REXP 0345 RLN 03CC RSIN 0205 RSQR 0484 RSQRT 044A PA0000 0000 JPASREAL KDECODEREAL KDFTDECODERL KDFTINTTOREAL KDFTREADREAL KDFTREALABS KDFTREALADD KDFTREALCMP KDFTREALDIV KDFTREALFRACT KDFTREALLOAD KDFTREALMUL KDFTREALNEG KDFTREALSTORE KDFTREALSUB KDFTWRTREAL KENCODEREAL CDEFT MACRO ASSEMBLER II, V4.0 CPASREAL V 4.0 S35306FE2EC243406EC223406ECA434066E8410AE6935103506EDA13506EDA13506EDA132636E84AE6417 YDFTREADFFUNCTION ISALPHABETIC(X:INTEGER):BOOLEAN; (*CHECK IF NUMBER, UPPER, LOWER, OR SYMBOLS ! "#$%&'()*+,-./:;<=>?@ WE DONT CHECK FOR BRACKEST, CURLY BRACKETS, UNDERSCORE, CARET, TILDE, OR VERTICAL LINE.*) BEGIN ISALPHABETIC:= ((X>=ORD(' ')) AND (X<=ORD('Z'))) OR ((X>=ORD('a')) AND (X<=ORD('z'))); END; FUNCTION ISALPHANUM(X:INTEGER):BOOLEAN; BEGIN ISALPHANUM:= ((X>=ORD('A')) AND (X<=ORD('Z'))) OR ((X>=ORD('a')) AND (X<=ORD('z'))) OR ((X>=ORD('0')) AND (X<=ORD('9'))); END; PROCEDURE PRINTLINE(ADR:INTEGER; (*THE ADDRESS*) HD:STRING(3); (*THE HEADER*) MN1:STRING(63);(*OPERATOR TO PRINT*) MN2:STRING(63);(*OPERAND TO PRINT*) SYM:BOOLEAN; (*LEFT ADDRESS SYMBOL*) LEN:INTEGER); (*NUMBER OF DATA BYTES TO PRINT*) PROCEDURE PRINTLINENUM; VAR TEMPS,TEMPS2:STRING(20); BEGIN DECODE(LINENUMBR,10,TEMPS); TEMPS[0]:=PRED(TEMPS[0]); REMOVEBLANKS(TEMPS); WHILE (ORD(TEMPS[0])<5) DO BEGIN TEMPS2:='0'+TEMPS;TEMPS:=TEMPS2;END; WRITE(OUTASM,TEMPS,' '); LINENUMBR:=LINENUMBR+1; END; PROCEDURE OPENNEWOUTASM; VAR X,Y:INTEGER; BEGIN IF (OUTFILE=':-3') THEN EXIT; IF (OUTFILE=':-2') THEN EXIT; X:=STRINGPOS('/',OUTFILE); Y:=STRINGPOS('.',OUTFILE); IF X=0 THEN X:=ORD(OUTFILE[0])+1; IF Y=0 THEN Y:=ORD(OUTFILE[0])+1; IF Y5 THEN LEN:=5; FOR X:=1 TO LEN DO BEGIN Y:=READBYTE(TEMPADR); HEX(@Y+1,1,TEMPS2); TEMPS:=TEMPS+TEMPS2; END; WRITE(OUTASM,TEMPS:10,' '); END; PROCEDURE PRINTADR(ADR:INTEGER); VAR TEMPS:STRING(10); BEGIN HEX(@ADR,2,TEMPS); WRITE(OUTASM,TEMPS:5); END; VAR TEMPS:STRING(63);X:INTEGER; BEGIN IF BREAKPRESS(YES) THEN BEGIN ERROR:=TRUE;ERRORNUM:=8;EXIT;END; TEMPS:=''; IF SYM AND (ISSYMADR(ADR) OR ISSYMDAT(ADR)) THEN BEGIN X:=2; IF (ADR<256) AND (ADR>=0) THEN X:=1; GETASYM(ADR,X,HD,TEMPS); END; IF (TEMPS<>'') OR (MN1<>'') OR (MN2<>'') THEN BEGIN IF LINENUMS THEN PRINTLINENUM; IF LINEADRS THEN PRINTADR(ADR); IF LINEDATA THEN PRINTDATABYTES(LEN,ADR); X:=ORD(TEMPS[0])+1;IF FORMATED THEN X:=SYMLEN+1; WRITELN(OUTASM,TEMPS:X,MN1:6,MN2); CURLINE:=CURLINE+1; IF (CURLINE=LINELIMIT) AND (OUTFILE<>':-2') AND (OUTFILE<>':-3') THEN OPENNEWOUTASM; END; IF FILEERROR(OUTASM)<>0 THEN BEGIN ERROR:=TRUE;ERRORNUM:=FILEERROR(OUTASM);END; END; PROCEDURE DOFCB(VAR ADR:INTEGER); VAR Z:INTEGER;TEMPS:STRING(63); BEGIN Z:=READBYTE(ADR);ADR:=ADR-1; IF (FCBASCII) AND ISALPHABETIC(Z) AND (Z<>32) THEN TEMPS:=''''+CHR(Z) ELSE GETASYM(Z,1,'$',TEMPS); PRINTLINE(ADR,LBHD,'FCB',TEMPS,YES,1); END; PROCEDURE DOFDB(VAR ADR:INTEGER); VAR A,Y,Z:INTEGER;SYM:SYMREC;TEMPS:STRING(63); BEGIN Y:=READBYTE(ADR);Z:=READBYTE(ADR);ADR:=ADR-2; A:=Y*256+Z;GETASYM(A,2,'$',TEMPS); IF NOT FIND(SYM,A) AND FDBASCII AND ISALPHANUM(Y) AND ISALPHANUM(Z) THEN TEMPS:='"'+CHR(Y)+CHR(Z); PRINTLINE(ADR,LBHD,'FDB',TEMPS,YES,2); ADR:=ADR+1; END; PROCEDURE DOFCBFDB(VAR ADR:INTEGER); (*THIS ROUTINE DECIDES TO DO A FCB INSTEAD OF A FDB WHEN: 1. ADR+1 IS AN OPCODE 2. ADR+1 IS A LABEL 3. ADR+1 IS NOT DATA 4. ADR+1 IS NOT LOADED 5. DATA ADR,ADR+1 IS NOT A DEFINED SYMBOL, BUT ADR+1,ADR+2 IS 7. DATA ADR IS NOT ALPHANUMERIC, BUT ADR+1, ADR+2 IS, AND ADR+2 IS NOT AN OPCODE AND ADR+2 IS NOT A LABEL AND ADR+2 IS LOADED *) (*THIS IS THE ROUTINE THAT MAKES THE DATA SECTIONS LOOK SO GOOD.*) VAR X,Y,Z:INTEGER;SYM:SYMREC; BEGIN X:=READBYTE(ADR);Y:=READBYTE(ADR);Z:=READBYTE(ADR);ADR:=ADR-3; IF ISOPCODE(ADR+1) OR ISSYMDAT(ADR+1) OR ISSYMADR(ADR+1) OR (NOT ISLOADED(ADR+1)) OR ( (NOT FIND(SYM,X*256+Y)) AND FIND(SYM,Y*256+Z)) OR ( (NOT ISALPHANUM(X)) AND (ISALPHANUM(Y) AND ISALPHANUM(Z) AND (NOT ISOPCODE(ADR+2)) AND (NOT (ISSYMDAT(ADR+2) OR ISSYMADR(ADR+2))) ) ) THEN DOFCB(ADR) ELSE DOFDB(ADR); END; PROCEDURE DOFCC(VAR ADR,LEN:INTEGER); (*THIS ALSO DOES FCS'S IF APPROPRIAT. (A FCS IS A FCC WITH THE HIGH BIT SET ON THE LAST CHAR) *) VAR DELMT:CHAR;TEMPADR,Y,Z:INTEGER;FCS:BOOLEAN;TEMPS,TEMPS2:STRING(63); BEGIN TEMPS:='';DELMT:='/'; TEMPADR:=ADR; FOR Y:=1 TO LEN DO BEGIN Z:=READBYTE(TEMPADR);TEMPS[Y]:=CHR(Z);END; TEMPS[0]:=CHR(LEN); FCS:=FCSSTRINGS AND (Z>127);TEMPS[LEN]:=CHR(ORD(TEMPS[LEN]) AND 127); Y:=STRINGPOS('/',TEMPS); Z:=STRINGPOS('''',TEMPS); IF Y=0 THEN Y:=ORD(TEMPS[0])+1; IF Z=0 THEN Z:=ORD(TEMPS[0])+1; IF Z>Y THEN BEGIN Y:=Z;DELMT:='''';END; Z:=STRINGPOS('"',TEMPS); IF Z=0 THEN Z:=ORD(TEMPS[0])+1; IF Z>Y THEN BEGIN Y:=Z;DELMT:='"';END; STRINGCOPY(TEMPS,1,Y,TEMPS2); TEMPS:=DELMT+TEMPS2+DELMT; TEMPS2:='FCC';IF FCS THEN TEMPS2:='FCS'; PRINTLINE(ADR,LBHD,TEMPS2,TEMPS,YES,LEN); ADR:=ADR+LEN-1; END; PROCEDURE DODATA(VAR ADR:INTEGER); VAR ALPHANUM,DONE:BOOLEAN;LEN,TEMPADR,Z:INTEGER; BEGIN TEMPADR:=ADR;LEN:=0;Z:=0; ALPHANUM:=TRUE;DONE:=FALSE; WHILE (LEN<>MAXFCCLEN) AND ALPHANUM AND ISLOADED(TEMPADR) AND (NOT ISOPCODE(TEMPADR)) AND (NOT DONE) DO BEGIN IF BREAKPRESS(YES) THEN BEGIN ERROR:=TRUE;ERRORNUM:=8;END; Z:=READBYTE(TEMPADR);LEN:=LEN+1; ALPHANUM:=ISALPHABETIC(Z); DONE:=(ISSYMDAT(TEMPADR) OR ISSYMADR(TEMPADR)); END; IF (LEN>=MINFCCLEN) AND (NOT ALPHANUM) AND NOT (FCSSTRINGS AND ISALPHABETIC(Z AND 127)) THEN LEN:=LEN-1; IF (LEN>=MINFCCLEN) AND FCCSTRINGS THEN DOFCC(ADR,LEN) ELSE DOFCBFDB(ADR); END; PROCEDURE DOEQU(ADR:INTEGER); VAR SYM:SYMREC;TEMPS,TEMPS2:STRING(63); BEGIN HEX(@ADR,2,TEMPS2);IF (ADR<256) AND (ADR>=0) THEN HEX(@ADR+1,1,TEMPS2); TEMPS:='$'+TEMPS2; IF ISDEFSYM(ADR) THEN PRINTLINE(ADR,LBHD,'EQU',TEMPS,YES,0) ELSE BEGIN IF ISSYMDAT(ADR) THEN PRINTLINE(ADR,DTHD,'EQU',TEMPS,YES,0); IF ISSYMADR(ADR) THEN PRINTLINE(ADR,LBHD,'EQU',TEMPS,YES,0); END; END; PROCEDURE DOORG(ADR:INTEGER); VAR TEMPS,TEMPS2:STRING(10); BEGIN HEX(@ADR,2,TEMPS);TEMPS2:='$'+TEMPS; PRINTLINE(ADR,'','ORG',TEMPS2,NO,0); END; PROCEDURE DOOPC(VAR ADR:INTEGER); VAR Z,LEN2:INTEGER; BEGIN IF ISOPSTART(ADR) THEN BEGIN GETOPC(ADR,VALID,VALIDADR,VALIDDAT,PG,OPC,OPD,AM,LEN,MN1,MN2); PRINTLINE(ADR,LBHD,MN1,MN2,YES,LEN); FOR Z:=1 TO LEN-1 DO BEGIN ADR:=ADR+1; IF ISOPSTART(ADR) THEN BEGIN IF BREAKPRESS(YES) THEN BEGIN ERROR:=TRUE;ERRORNUM:=8;END; WRITE(OUTASM,'*'); GETOPC(ADR,VALID,VALIDADR,VALIDDAT,PG,OPC,OPD,AM,LEN2,MN1,MN2); PRINTLINE(ADR,LBHD,MN1,MN2,YES,LEN2); END ELSE DOEQU(ADR); END; END ELSE DODATA(ADR); END; PROCEDURE DISASSEMBLE; VAR ADDRESS,ADDR,STARTADR,ENDADR:INTEGER; TEMPS:STRING(63); ADRSTR,ENDSTR:STRING(7); DONE:BOOLEAN; BEGIN PAGE;WRITELN(' DISASSEMBLY');WRITELN; STARTADR:=0;ENDADR:=65536;(*YES I KNOW IT WILL WRAP TO 0*) WRITE('FULL DISASSEMBLY? ');READLN(TEMPS); IF (NOT CNVRTBOOL(TEMPS)) AND (TEMPS<>'') THEN BEGIN WRITE('STARTING ADR: ');READLN(TEMPS);STARTADR:=CNVRT2NUM(TEMPS); WRITE('ENDING ADR : ');READLN(TEMPS);ENDADR:=CNVRT2NUM(TEMPS); END; ADDRESS:=STARTADR;CURLINE:=1;LINENUMBR:=STARTLINE; WRITELN('OUTPUT TO P, S, D?');GETKEYPRESS; IF THEKEY=ORD('P') THEN OUTFILE:=':-2' ELSE IF THEKEY=ORD('S') THEN OUTFILE:=':-3' ELSE IF THEKEY=ORD('D') THEN BEGIN WRITE('FILENAME: ');READLN(OUTFILE);END ELSE OUTFILE:=':-3'; REWRITE(OUTASM,OUTFILE,'ASM'); IF FILEERROR(OUTASM)<>0 THEN BEGIN CLOSE(OUTASM);ERROR:=TRUE;ERRORNUM:=FILEERROR(OUTASM);EXIT;END; IF OUTFILE=':-2' THEN BEGIN WRITELN('PRINTER BAUD VALUE:',BYTE[150]); WRITE('ENTER NEW VALUE: ');READLN(TEMPS); IF TEMPS<>'' THEN BYTE[150]:=CNVRT2NUM(TEMPS); END; THEKEY:=0;DONE:=FALSE; HEX(@ENDADR,2,ENDSTR); REPEAT IF BREAKPRESS(YES) THEN BEGIN ERROR:=TRUE;ERRORNUM:=8;END; IF ERROR THEN BEGIN CLOSE(OUTASM);EXIT;END; (*THE FOLLOWING IF STATEMENT JUST SPEEDS THINGS UP BY CHECKING 8 ADDRESSES (BITS) AT A TIME INSTEAD OF INDIVIDUALLY.*) (*IT CHECKS FOR A SYMBOL DEFINED OR A BYTE LOADED AT ADDR*) ADDR:=ADDRESS LSR 3; IF (PEEK(SYMADRSEG,ADDR)=0) AND (PEEK(SYMDATSEG,ADDR)=0) AND (PEEK(LOADBMSEG,ADDR)=0) THEN ADDRESS:=(ADDR+1)*8-1 ELSE BEGIN IF (ADDRESS=STARTADR) OR (ISLOADED(ADDRESS) AND NOT ISLOADED(ADDRESS-1) ) THEN DOORG(ADDRESS); IF ISLOADED(ADDRESS) THEN DOOPC(ADDRESS) ELSE DOEQU(ADDRESS); END; ADDRESS:=ADDRESS+1; (*THE THINGS I HAVE TO DO BECAUSE I DON'T HAVE UNSIGNED INTEGERS, SHEESH!*) IF ENDADR=0 THEN DONE:=ADDRESS=ENDADR ELSE BEGIN HEX(@ADDRESS,2,ADRSTR); DONE:=(ADRSTR>=ENDSTR); END; UNTIL DONE; CLOSE(OUTASM); IF OUTFILE=':-3' THEN BEGIN WRITE('PRESS ENTER: ');READLN(TEMPS);END; END; (*DISASSEMBLE*) INTEGERS, SHEESH!*)DR); END; PROCEDURE CLROPSTART(ADR:INTEGER); (*THIS CLEARS THE OPSTART FLAG*) BEGIN CLRBIT(ADR,OPSTARTBMSEG); END; FUNCTION DONEIT(ADR:INTEGER):BOOLEAN; (*HAVE WE ALREADY CHECKED THIS ADDRESS FOR AN OPCODE?*) BEGIN DONEIT:=ISOPSTART(ADR); END; FUNCTION PROGRAM DSTRAC31; (* JUL/17/91 2:15 PM THIS IS THE 2ND INTERACTIVE VERSION AND 1ST WITH SEPERATE COMPILATION MODULES *) %N (*THE ARE 64 BLOCKS IN A 512K COCO 3. THEY ARE USED AS: 0-7 AS THE 64K MEMORY SPACE TO LOAD THE PROGRAM. NOTE: BLOCKS 8-15 ARE 64K BIT (8K BYTE) BIT MAPS. 8 AS THE USED CODE SPACE (0-7) FLAS 9 AS THE KNOWN OPCODE BYTES FLAGS 10 AS THE KNOWN OPCODE START ADDRESS FLAGS. 11 AS THE DATA SYMBOLS DEFINED 12 AS THE ADR. SYMBOLS DEFINED 13 AS THE LOCATIONS KNOWN TO BE DATA 14 AS THE LOCATIONS OF UNKNOWN TYPE (OPCODE OR DATA) 15 AS THE LOCATIONS OF USER DEFINED SYMBOLS 16+ AS THE SYMBOL TABLE. 56+ AS THE NORMAL 64K PROGRAM AREA. (WHERE THIS PROGRAM RUNS *) (*NOTE: WE HAVE 40 BLOCKS (327680 BYTES) FOR THE SYMBOL TABLE. THE CURRENT SIZE OF THE SYMBOLS IS ONLY 16 BYTES. THAT MEANS WE COULD HAVE 20,480 DEFINED SYMBOLS. THATS A BIT EXCESIVE AND WOULD TAKE TO MUCH TIME TO INIT. ALSO THE CURRENT HASH FUNCTION REQUIRES THE SIZE TO BE A POWER OF 2. THEREFORE WE LIMIT THE SYMBOLS TO 'ONLY' 8192. (BUDDY, IF THAT AINT ENOUGH, AND YOU MANAGED TO GET THAT MANY INTO A 64K PROGRAM, THEN YOU NEED TO GET A JOB AS PROFESSIONAL ASM PROGRAMER FOR $40 AN HOUR (OR GET PSYCHIATRIC HELP). ) *) CONST PROGNAME='DISTRAC V3.2'; FLNAME='DSTRAC32.DEF'; MAXSYM=8192; MAXSYM1=8191;(*1 LESS THAN MAXSYM*) MAXSTK=2047; MAXTBL=255; INVALIDADR=$FFFF; MAXFCCLEN=16; (*LEN OF FCC STRINGS. (NO MORE THAN 63!) *) MINFCCLEN=3; (*MINIMUM LENGTH OF FCC/FCS STRINGS*) SYMLEN=12; NO=FALSE; YES=TRUE; (*BANK NUMBERS FOR DATA STRUCTURES*) CODESEG=0; LOADBMSEG=8; OPCODEBMSEG=9; OPSTARTBMSEG=10; SYMDATSEG=11; SYMADRSEG=12; DATABMSEG=13; UNKNOWNBMSEG=14; DEFSYMBMSEG=15; SYMBOLSEG=16; MAXSEG=47; TYPE SYMREC=RECORD SYMBL:STRING(SYMLEN); CMD:CHAR; ADR:INTEGER; END; STACKARRAY=ARRAY [0..MAXSTK] OF INTEGER; VAR (*RETURNED BY GETOPC*) AM:INTEGER; (*ADRESSING MODE RETURNED BY GETOPC*) LEN:INTEGER; (*LEN OF OPCODE*) OPC:INTEGER; (*THE OPCODE NUMBER FROM GETOPC*) OPD:INTEGER; (*THE OPCODE DATA FROM GETOPC*) PG:INTEGER; (*THE PAGE FROM GETOPC*) VALID:BOOLEAN; (*A VALID OPCODE RETURNED FROM GETOPC*) VALIDADR:BOOLEAN; (*A VALID ADR RETURNED FROM GETOPC*) VALIDDAT:BOOLEAN; (*VALID DATA RETURNED FROM GETOPC*) (*GLOBAL DEFAULTS*) FCBASCII:BOOLEAN; (*FCB FLAG*) FCCSTRINGS:BOOLEAN; (*FCC FLAG*) FCSSTRINGS:BOOLEAN; (*FCS FLAG. FCS STRING IS LAST CHAR HIGH BIT SET*) FDBASCII:BOOLEAN; (*FDB FLAG*) FORMATED:BOOLEAN; (*FORMATED OUTPUT*) LINEADRS:BOOLEAN; (*PRINT ADDRESS OF EACH LINE*) LINEDATA:BOOLEAN; (*PRINT OPCODE DATA ON EACH LINE*) LINELIMIT:INTEGER; (*MAX NUMBER OF LINES IN OUTPUT FILE*) LINENUMS:BOOLEAN; (*LINE NUMBERS FLAG*) SCREENCOL:INTEGER; (*THE SCREEN COLOR*) STARTLINE:INTEGER; (*THE STARTING LINE NUMBER*) (*TABLES AND STACKS*) STACK:STACKARRAY; (*THE STACK OF UNEXAMINED ADDRESSES*) STKPTR:INTEGER; (*THE STACK POINTER FOR STACK*) TABLE:ARRAY [0..MAXTBL] OF INTEGER; (*THE JUMP TABLE ADDRESSES*) TBLPTR:INTEGER; (*INDEX POINTER TO TABLE*) (*GLOBAL MISC. VARS*) CURLINE:INTEGER; (*HOW MANY LINES HAVE BEEN PRINTED TO OUTASM*) ERROR:BOOLEAN; (*ERROR FLAG*) ERRORNUM:INTEGER; (*ERROR NUMBER*) EXECADR:INTEGER; (*THE EXEC ADR OF THE PROG.*) GLOBALADDRESS:INTEGER;(*USED BY INTERACTIVE, MOD TABLE, MOD SYM*) LINENUMBR:INTEGER; (*THE CURRENT LINE NUMBER IN USE. IT MAY GET LARGE,*) MN1:STRING(63); (*PART 1 OF THE OP CODE STRING *) MN2:STRING(63); (*PART 2 OF THE OP CODE STRING *) MSG1:STRING; (*MESSAGE STRING 1*) MSG2:STRING; (*MESSAGE STRING 2*) NULL:SYMREC; (*THE NULL (EMPTY) SYMBOL RECORD*) OUTASM:TEXT; (*THE OUTPUT FILE*) OUTFILE:STRING(20); (*THE OUTPUT FILE NAME*) QUIT:BOOLEAN; (*QUIT THE PROGRAM*) SYMBOL:SYMREC; (*THE SYMBOL GOT/TO GET*) THEKEY:INTEGER; (*THE KEYPRESSED CODE*) (*GLOBAL PUBLIC VARS. PUBLIC BECAUSE USED IN LIB MODULE.*) VAR PUBLIC DTHD:STRING(8); (*THE DATA HEADER DEFAULT*) LBHD:STRING(8); (*THE ADDRESS LABEL HEADER DEFAULT*) %CLIBINT %CUTILITY %CDISASSEM %CTRACE PROCEDURE ASKDEFAULTS; VAR BOOL:ARRAY[FALSE..TRUE] OF STRING(5); DONE:BOOLEAN; TEMPFILE:TEXT; TEMPS:STRING(63); BEGIN DONE:=FALSE; REPEAT BOOL[FALSE]:=' NO';BOOL[TRUE]:='YES'; IF SCREENCOL<>0 THEN BYTE[$FF22]:=SCREENCOL; PAGE; WRITELN(' DEFAULT SELECTION MODE'); WRITELN; WRITE('A FORMATED: ',BOOL[FORMATED]); WRITELN(' B LINE ADRS ',BOOL[LINEADRS]); WRITE('C LINE DATA ',BOOL[LINEDATA]); WRITELN(' D LINE NUM ',BOOL[LINENUMS]); WRITE('E FCB ASCII ',BOOL[FCBASCII]); WRITELN(' F FDB ASCII ',BOOL[FDBASCII]); WRITE('G FCC STRNG ',BOOL[FCCSTRINGS]); WRITELN(' H FCS STRNG ',BOOL[FCSSTRINGS]); WRITELN('I SCREEN COLOR :',SCREENCOL:4); WRITELN('J LINES PER FILE : ',LINELIMIT); WRITELN('K STARTING LINE NUM : ',STARTLINE); WRITELN('L ADR LABEL HEADER: "',LBHD,'"'); WRITELN('M DAT LABEL HEADER: "',DTHD,'"'); WRITELN; WRITELN('Q QUIT R RESTORE FMTS'); WRITELN('S SAVE FORMATS T LOAD FORMATS'); WRITELN('CMD:>'); IF ERROR THEN BEGIN ERRORMESSAGE;WRITELN(MSG2);MSG2:='';END; GETKEYPRESS; CASE THEKEY OF $41,$61:FORMATED:=NOT FORMATED; $42,$62:LINEADRS:=NOT LINEADRS; $43,$63:LINEDATA:=NOT LINEDATA; $44,$64:LINENUMS:=NOT LINENUMS; $45,$65:FCBASCII:=NOT FCBASCII; $46,$66:FDBASCII:=NOT FDBASCII; $47,$67:FCCSTRINGS:=NOT FCCSTRINGS; $48,$68:FCSSTRINGS:=NOT FCSSTRINGS; $49,$69:BEGIN WRITELN('SCREEN COLOR:',SCREENCOL); WRITELN('WHAT COLOR SCREEN DO YOU WANT:'); WRITELN(' 0: DON''T SET SCREEN'); WRITELN(' 7: U/C B ON W, B BORD'); WRITELN('16: L/C B ON W, B BORD'); WRITELN('32: U/C W ON B, B BORD'); WRITELN('48: L/C W ON B, B BORD'); WRITELN('64: U/C B ON W, W BORD'); WRITELN('80: L/C B ON W, W BORD'); WRITE('ENTER CHOICE: ');READLN(SCREENCOL); END; $4A,$6A:BEGIN WRITE('LINES/FILE (0=ALL): '); READLN(LINELIMIT); END; $4B,$6B:BEGIN WRITE('STARTING LINE NUM: '); READLN(STARTLINE); END; $4C,$6C:BEGIN WRITE('ADR LABEL (MAX 8): '); READLN(TEMPS);STRINGCOPY(TEMPS,1,8,LBHD); END; $4D,$6D:BEGIN WRITE('DAT LABEL (MAX 8): '); READLN(TEMPS);STRINGCOPY(TEMPS,1,8,DTHD); END; $51,$71,3:DONE:=TRUE; $52,$72:INITDEFAULTS; $53,$73:BEGIN WRITELN('SAVING FORMAT OPTIONS'); BOOL[FALSE]:='NO'; REWRITE(TEMPFILE,FLNAME); WRITELN(TEMPFILE,BOOL[FORMATED]); WRITELN(TEMPFILE,LINELIMIT); WRITELN(TEMPFILE,BOOL[LINENUMS]); WRITELN(TEMPFILE,STARTLINE); WRITELN(TEMPFILE,BOOL[LINEADRS]); WRITELN(TEMPFILE,BOOL[LINEDATA]); WRITELN(TEMPFILE,BOOL[FCBASCII]); WRITELN(TEMPFILE,BOOL[FDBASCII]); WRITELN(TEMPFILE,BOOL[FCCSTRINGS]); WRITELN(TEMPFILE,BOOL[FCSSTRINGS]); WRITELN(TEMPFILE,SCREENCOL); WRITELN(TEMPFILE,LBHD); WRITELN(TEMPFILE,DTHD); ERRORNUM:=FILEERROR(TEMPFILE);ERROR:=ERRORNUM<>0; CLOSE(TEMPFILE); END; $54,$74:BEGIN WRITELN('LOADING DEFAULTS'); LOADDEFAULTS; END END; (*CASE*) UNTIL DONE; END; PROCEDURE MODIFYSYMBOLS; VAR TEMPS,TEMPS2:STRING(63);SYM:SYMREC; DONE,TEMPBOOL:BOOLEAN; PROCEDURE DOADR; BEGIN WRITE('ENTER NEW ADDRES :$');READLN(TEMPS);IF TEMPS='' THEN EXIT; TEMPS2:='$'+TEMPS;GLOBALADDRESS:=CNVRT2NUM(TEMPS2); END; PROCEDURE DOZAP; BEGIN WRITE('SURE YOU WANT TO CLR ALL TABLES?'); GETKEYPRESS; IF (THEKEY=$59) OR (THEKEY=$79) THEN CLRSYMTAB; END; PROCEDURE DOCLEAR; BEGIN CLRDEFSYM(GLOBALADDRESS); END; PROCEDURE DOSET; BEGIN WRITELN('ENTER SYMBOL COMMAND LINE'); WRITE(':');READLN(TEMPS); PROCESSSYM(TEMPS); END; BEGIN DONE:=FALSE; REPEAT PAGE;WRITELN(' MODIFY SYMBOLS'); WRITELN('SYMBOLS ARE ENTERED AS:'); WRITELN('S $1234 SYMBOLNAME'); WRITELN('THE FIRST LETTER IS THE CMD:'); WRITELN('C: CODE D: DATA E: EXECADR'); WRITELN('S: SYMBOL T: TABLE OF JUMP ADRS'); WRITELN('THE SYMBOL NAME CAN BE',SYMLEN:3,' LONG'); WRITELN;HEX(@GLOBALADDRESS,2,TEMPS); WRITELN('THE ADDRESS IS: $',TEMPS); TEMPBOOL:=FIND(SYM,GLOBALADDRESS); WRITELN('THE SYMBOL IS : ',SYM.SYMBL); WRITELN('THE SYM CMD IS: ',SYM.CMD); WRITELN; WRITELN('CLR SET EXIT UP/DN $ADR ZAP'); GETKEYPRESS; CASE THEKEY OF $43,$63:DOCLEAR; (* C *) $53,$73:DOSET; (* S *) $5A,$7A:DOZAP; (* Z *) $03,$45,$65:DONE:=TRUE; (* E, *) $24:DOADR; (* $ *) $5E:GLOBALADDRESS:=GLOBALADDRESS+1; (* UP *) $0A:GLOBALADDRESS:=GLOBALADDRESS-1; (* DOWN *) $5F:GLOBALADDRESS:=GLOBALADDRESS+256; (* SH/UP *) $5B:GLOBALADDRESS:=GLOBALADDRESS-256 (* SH/DOWN *) END; UNTIL DONE; END; PROCEDURE MODIFYTABLES; VAR TEMPS,TEMPS2:STRING(15);SYM:SYMREC; BOOL:ARRAY [FALSE..TRUE] OF STRING(6); DONE,TEMPBOOL:BOOLEAN; PROCEDURE DOCLEAR; BEGIN WRITELN('ENTER NUMBER TO CLEAR'); GETKEYPRESS; CASE THEKEY OF $31:CLRLOAD(GLOBALADDRESS); $32:CLROPCODE(GLOBALADDRESS); $33:CLROPSTART(GLOBALADDRESS); $34:CLRSYMDAT(GLOBALADDRESS); $35:CLRSYMADR(GLOBALADDRESS); $36:CLRDATA(GLOBALADDRESS); $37:CLRUNKNOWN(GLOBALADDRESS); $03,$0D,$30:BEGIN END END; END; PROCEDURE DOSET; BEGIN WRITELN('ENTER NUMBER TO SET'); GETKEYPRESS; CASE THEKEY OF $31:SETLOAD(GLOBALADDRESS); $32:SETOPCODE(GLOBALADDRESS); $33:SETOPSTART(GLOBALADDRESS); $34:SETSYMDAT(GLOBALADDRESS); $35:SETSYMADR(GLOBALADDRESS); $36:SETDATA(GLOBALADDRESS); $37:SETUNKNOWN(GLOBALADDRESS); $03,$0D,$30:BEGIN END END; END; PROCEDURE DOADR; BEGIN WRITELN;CURSOR(448); WRITE('ENTER NEW ADDRES :$');READLN(TEMPS);IF TEMPS='' THEN EXIT; TEMPS2:='$'+TEMPS;GLOBALADDRESS:=CNVRT2NUM(TEMPS2); END; PROCEDURE DOZAP; BEGIN WRITE('SURE YOU WANT TO CLR ALL TABLES?'); GETKEYPRESS; IF (THEKEY=$59) OR (THEKEY=$79) THEN CLEARTABLES; END; BEGIN BOOL[FALSE]:='CLEAR';BOOL[TRUE]:='SET';DONE:=FALSE; REPEAT PAGE;WRITELN(' MODIFY TABLES');HEX(@GLOBALADDRESS,2,TEMPS); WRITELN('WARNING: MODIFYING THESE TABLES'); WRITELN('CAN CAUSE ERRATIC RESULTS!');WRITELN; WRITELN('CURRENT ADDRESS: $',TEMPS); TEMPBOOL:=FIND(SYM,GLOBALADDRESS); WRITELN('USER SYMBOL IS : ',SYM.SYMBL); WRITELN('1: LOADED IS : ',BOOL[ISLOADED(GLOBALADDRESS)]); WRITELN('2: OPCODE IS : ',BOOL[ISOPCODE(GLOBALADDRESS)]); WRITELN('3: OPSTART IS : ',BOOL[ISOPSTART(GLOBALADDRESS)]); WRITELN('4: SYMDAT IS : ',BOOL[ISSYMDAT(GLOBALADDRESS)]); WRITELN('5: SYMADR IS : ',BOOL[ISSYMADR(GLOBALADDRESS)]); WRITELN('6: DATA IS : ',BOOL[ISDATA(GLOBALADDRESS)]); WRITELN('7: UNKNOWN IS : ',BOOL[ISUNKNOWN(GLOBALADDRESS)]); WRITELN; WRITELN('CLR SET EXIT $ADR UP/DN ZAP'); GETKEYPRESS;CURSOR(448); CASE THEKEY OF $43,$63:DOCLEAR; (* C *) $53,$73:DOSET; (* S *) $5A,$7A:DOZAP; (* Z *) $03,$45,$65:DONE:=TRUE; (* E, *) $24:DOADR; (* $ *) $5E:GLOBALADDRESS:=GLOBALADDRESS+1; (* UP *) $0A:GLOBALADDRESS:=GLOBALADDRESS-1; (* DOWN *) $5F:GLOBALADDRESS:=GLOBALADDRESS+256; (* SH/UP *) $5B:GLOBALADDRESS:=GLOBALADDRESS-256 (* SH/DOWN *) END; UNTIL DONE; END; PROCEDURE LOADPROG; (*DON'T FORGET TO SET EXECADR AND CHECK FOR AUTOSTART*) (*ASK IF OFFSET WANTED*) VAR A,B,C,D,E,DB:CHAR; BANK,BANKADR,COUNT,LOADADR,LEN,OFFSET,START:INTEGER; INPRG:TEXT;TEMPS:STRING(20); BEGIN PAGE;WRITELN(' FILE INPUT'); OPENFILE(64,'SOURCE FILE NAME : ',TEMPS,'BIN',INPRG,1); OFFSET:=0;IF TEMPS='' THEN EXIT; WRITELN('DO YOU WANT TO LOAD AT AN'); WRITE('OFFSET? ');READLN(TEMPS); IF CNVRTBOOL(TEMPS) THEN BEGIN WRITE('OFFSET: ');READLN(TEMPS);OFFSET:=CNVRT2NUM(TEMPS);END; READ(INPRG,A,B,C,D,E); WHILE (A=CHR(0)) DO BEGIN ERRORNUM:=FILEERROR(INPRG); IF ERRORNUM<>0 THEN BEGIN ERROR:=TRUE;EXIT;END; LEN:=ORD(B)*256+ORD(C); START:=ORD(D)*256+ORD(E); HEX(@START,2,TEMPS);WRITE('$',TEMPS,'-'); COUNT:=START;LOADADR:=START+OFFSET; WHILE (COUNT<>(START+LEN) ) DO BEGIN READ(INPRG,DB); BANK:=LOADADR LSR 13;BANKADR:=LOADADR AND $1FFF; POKE(CODESEG+BANK,BANKADR,ORD(DB)); SETLOAD(LOADADR);SETUNKNOWN(LOADADR); COUNT:=COUNT+1;LOADADR:=LOADADR+1; END; COUNT:=START+LEN;HEX(@COUNT,2,TEMPS);WRITELN('$',TEMPS); READ(INPRG,A,B,C,D,E); END; ERRORNUM:=FILEERROR(INPRG);IF ERRORNUM=-1 THEN ERRORNUM:=0;(*IGNORE EOF*) IF ERRORNUM<>0 THEN BEGIN ERROR:=TRUE;CLOSE(INPRG);EXIT;END; EXECADR:=ORD(D)*256+ORD(E)+OFFSET;GLOBALADDRESS:=EXECADR; HEX(@EXECADR,2,TEMPS);WRITELN('EXEC ADR-> ',TEMPS); CLOSE(INPRG); WRITELN; WRITELN('PROGRAM LOADED. PRESS ENTER');READLN(TEMPS); END; PROCEDURE LOADSYMBOLS; VAR X:INTEGER;LINE:STRING(63); SYMFILENAME:STRING(20);SYMFILE:TEXT; BEGIN PAGE;WRITELN(' LOAD SYMBOLS'); OPENFILE(64,'SYMBOL FILE NAME : ',SYMFILENAME,'SYM',SYMFILE,1); IF SYMFILENAME='' THEN EXIT; WHILE (NOT EOF(SYMFILE)) AND (NOT ERROR) DO BEGIN READLN(SYMFILE,LINE); CURSOR(128);WRITELN(LINE); PROCESSSYM(LINE); END; CLOSE(SYMFILE); IF EXECADR<>INVALIDADR THEN GLOBALADDRESS:=EXECADR; END; PROCEDURE LOADTABLES; VAR X,BANK:INTEGER;D:CHAR;TBLFILE:TEXT;TEMPS:STRING(63); BEGIN PAGE; WRITELN(' LOADING TABLES');WRITELN; OPENFILE(64,'TABLE FILENAME: ',TEMPS,'TBL',TBLFILE,1); IF TEMPS='' THEN EXIT; FOR BANK:=OPCODEBMSEG TO UNKNOWNBMSEG DO FOR X:=0 TO 8191 DO BEGIN ERRORNUM:=FILEERROR(TBLFILE); IF ERRORNUM<>0 THEN BEGIN CLOSE(TBLFILE); WRITELN('ERROR DURING READING :',TEMPS); WRITELN('YOU WILL NEED TO RE-START'); ERROR:=TRUE;READLN(TEMPS);EXIT; END; READ(TBLFILE,D);POKE(BANK,X,ORD(D)); END; CLOSE(TBLFILE); END; PROCEDURE LOADSTUFF; BEGIN WRITELN('LOAD PROG, SYMBOLS, TABLES?'); GETKEYPRESS; CASE THEKEY OF $50,$70:LOADPROG; $53,$73:LOADSYMBOLS; $54,$74:LOADTABLES END; END; PROCEDURE SAVESYMBOLS; VAR ADDR,ADDRESS:INTEGER;TEMPS:STRING(63);SYMFILE:TEXT; SYM:SYMREC; BEGIN PAGE;WRITELN(' SAVEING SYMBOLS');WRITELN; OPENFILE(64,'SYMBOL FILENAME :',TEMPS,'SYM',SYMFILE,2); IF TEMPS='' THEN EXIT; ADDRESS:=0; REPEAT ADDR:=ADDRESS LSR 3; IF PEEK(DEFSYMBMSEG,ADDR)=0 THEN ADDRESS:=(ADDR+1)*8-1 ELSE IF FIND(SYM,ADDRESS) THEN BEGIN HEX(@SYM.ADR,2,TEMPS); WRITELN(SYMFILE,SYM.CMD,' $',TEMPS,' ',SYM.SYMBL); END; ADDRESS:=ADDRESS+1; UNTIL ADDRESS=65536; ERRORNUM:=FILEERROR(SYMFILE); IF ERRORNUM<>0 THEN ERROR:=TRUE; CLOSE(SYMFILE); END; PROCEDURE SAVETABLES; VAR X,BANK:INTEGER;TBLFILE:TEXT;TEMPS:STRING(63); BEGIN PAGE;WRITELN(' SAVING TABLES');WRITELN; OPENFILE(64,'TABLE FILENAME :',TEMPS,'TBL',TBLFILE,2); IF TEMPS='' THEN EXIT; FOR BANK:=OPCODEBMSEG TO UNKNOWNBMSEG DO FOR X:=0 TO 8191 DO BEGIN WRITE(TBLFILE,CHR(PEEK(BANK,X))); ERRORNUM:=FILEERROR(TBLFILE); IF ERRORNUM<>0 THEN BEGIN CLOSE(TBLFILE); WRITELN('ERROR DURING WRITING :',TEMPS); READLN(TEMPS);ERROR:=TRUE;EXIT; END; END; CLOSE(TBLFILE); END; PROCEDURE WRITESTUFF; BEGIN WRITELN('SAVE SYMBOLS, TABLES?'); GETKEYPRESS; CASE THEKEY OF $53,$73:SAVESYMBOLS; $54,$74:SAVETABLES END; END; PROCEDURE EXAMINE; BEGIN PAGE; WRITELN(' EXAMINE PROGRAM'); WRITELN; WRITELN('DO YOU WANT TO ONTINUE EXAM'); WRITELN('OR E-START EXAMINATION?'); WRITELN; WRITELN('RE-START WILL CLEAR THE TABLES'); WRITELN('AND ANY CHANGES AND RE-ENTER'); WRITELN('THE SYMBOLS. YOU ONLY NEED TO'); WRITELN('DO THIS IF YOU''VE MODIFIED A'); WRITELN('SYMBOL OR CHANGED THE EXEC ADR'); WRITELN; WRITELN('IF YOU ARE JUST STARTING OR'); WRITELN('ONLY ADDED A SYMBOL, YOU CAN'); WRITELN('CONTINUE.'); GETKEYPRESS; IF (THEKEY=$52) OR (THEKEY=$72) THEN BEGIN CURSOR(328);WRITELN('WAIT...'); CLEARTABLES; REENTERSYMBOLS; END; TRACE; END; PROCEDURE ASKEXEC; VAR TEMPS:STRING(10); BEGIN HEX(@EXECADR,2,TEMPS); WRITELN('CURRENT EXEC ADR: $',TEMPS); WRITE('NEW EXEC ADR : '); READLN(TEMPS);IF TEMPS='' THEN EXIT; EXECADR:=CNVRT2NUM(TEMPS); GLOBALADDRESS:=EXECADR; END; PROCEDURE ASKQUIT; VAR TEMPS:STRING(7); BEGIN WRITE('SURE YOU WANT TO QUIT? ');READLN(TEMPS); QUIT:=CNVRTBOOL(TEMPS); END; PROCEDURE DISPLAYMENU; VAR TEMPS:STRING(5); BEGIN PAGE;HEX(@EXECADR,2,TEMPS); WRITELN(' ',PROGNAME); WRITELN; WRITELN('D: DISASSEM E: EXEC $',TEMPS); WRITELN('F: FORMAT L: LOAD'); WRITELN('Q: QUIT R: RE-START'); WRITELN('S: SYMBOLS T: TABLES'); WRITELN('W: WRITE X: EXAMINE PROG'); WRITELN; WRITELN(MSG1);MSG1:=''; WRITELN(MSG2);MSG2:=''; WRITELN('CMD: '); (*THE LAST 4 LINES, 384, 416, 448, 480 ARE FOR USER INPUT*) END; PROCEDURE INIT; VAR X,Y,Z:INTEGER; A,B,C,D,E:CHAR; BEGIN NULL.SYMBL:='*UNDEFINED*'; NULL.ADR:=INVALIDADR; NULL.CMD:=' '; MSG1:='';MSG2:='';EXECADR:=INVALIDADR;GLOBALADDRESS:=0; INITDEFAULTS; LOADDEFAULTS; TITLESCREEN; GETOPCINIT; CLRSYMTAB; CLEARTABLES; FOR X:=0 TO 8191 DO POKE(LOADBMSEG,X,0); (*CLEAR LOADED FLAGS*) FOR X:=0 TO MAXSTK DO STACK[X]:=INVALIDADR;STKPTR:=0;(*PUSH AN INVALIDADR*) FOR X:=0 TO MAXTBL DO TABLE[X]:=INVALIDADR;TBLPTR:=-1; ERROR:=FALSE;THEKEY:=0;QUIT:=FALSE;ERRORNUM:=0; END; PROCEDURE ASKRESTART; VAR TEMPS:STRING(7); BEGIN WRITE('SURE YOU WANT TO RESTART? ');READLN(TEMPS); IF CNVRTBOOL(TEMPS) THEN INIT; END; BEGIN (*MAIN DISTRAC*) INIT; WHILE NOT QUIT DO BEGIN IF ERROR THEN ERRORMESSAGE; DISPLAYMENU; GETKEYPRESS; CASE CHR(THEKEY) OF 'D':DISASSEMBLE; 'E':ASKEXEC; 'F':ASKDEFAULTS; 'L':LOADSTUFF; 'Q':ASKQUIT; 'R':ASKRESTART; 'S':MODIFYSYMBOLS; 'T':MODIFYTABLES; 'W':WRITESTUFF; 'X':EXAMINE END; END; END. PLAYMENU; GETKEYPRESS; CASVAR EXTERNAL DFTPOLLKEY:INTEGER; (*DEFT INTERNAL FUNCTION NAME*) PROCEDURE GETKEYPRESS; (*WAIT UNTIL A KEY IS PRESSED*) BEGIN REPEAT THEKEY:=CALL(@DFTPOLLKEY,0); IF (THEKEY=64) OR (THEKEY=32) THEN THEKEY:=0; (*IGNORE MULT <@> *) UNTIL THEKEY<>0; END; FUNCTION BREAKPRESS(PAUSE:BOOLEAN):BOOLEAN; (*CALLS THE DEFT PASCAL INTERNAL FUNCTION DFTPOLLKEY TO CHECK THE KEYBOARD. IF BREAK IS PRESSED THE KEY CODE IS SAVED AND BREAKPRESS IS FLAGED.*) VAR X:INTEGER; BEGIN BREAKPRESS:=FALSE; X:=CALL(@DFTPOLLKEY,0); IF X=3 THEN THEKEY:=X; IF PAUSE THEN IF (X=64) OR (X=32) THEN GETKEYPRESS; IF THEKEY=3 THEN BREAKPRESS:=TRUE; END; FUNCTION READBYTE(VAR ADR:INTEGER):INTEGER;PUBLIC; (*READ A BYTE OF THE PROGRAM AND INCREMENT ADDRESS*) VAR BANK,X:INTEGER; BEGIN BANK:=ADR LSR 13;X:=ADR AND $1FFF; READBYTE:=PEEK(CODESEG+BANK,X);ADR:=SUCC(ADR); END; FUNCTION HASH(X:INTEGER):INTEGER; BEGIN HASH:=X AND MAXSYM1; END; PROCEDURE GETSYMFMTABLE(SYMNUM:INTEGER); (*USES THE GLOBAL VARIABLE SYMBOL*) (*SYMBOL MANIPULATION HERE AND IN PUTSYM USE VERY NONSTANDARD FEATURES*) (*SYMBOLS DO NOT WRAP AROUND TO NEXT BLOCK. THE FULL SYMBOL MUST BE IN ONE SINGLE BLOCK. THERE IS A LITTLE SPACE WASTED, BUT NOT MUCH.*) VAR X,Y:INTEGER;SYMPTR:INTEGER; EXTRA,MAXSYMS,OFFSET,SEG:INTEGER; BEGIN SEG:=SYMBOLSEG;OFFSET:=0;SYMPTR:=@SYMBOL; MAXSYMS:=8192 DIV SIZEOF(SYMBOL);(*HOW MANY SYMBOLS PER BANK*) EXTRA:=SYMNUM DIV MAXSYMS; (*GET HOW MANY EXTRA BANKS*) OFFSET:=SYMNUM MOD MAXSYMS; (*GET THE SYMBOL NUMBER WITHIN THE BANK*) OFFSET:=OFFSET*SIZEOF(SYMBOL); (*CNVRT OFFSET FM # SYMBOLS TO BYTE #*) SEG:=SEG+EXTRA; (*ADD THE EXTRA BANKS*) WHILE SEG>MAXSEG DO SEG:=SEG-8; (*GET THE SYMBOL*) FOR X:=0 TO SIZEOF(SYMBOL)-1 DO BYTE[SYMPTR+X]:=PEEK(SEG,OFFSET+X); END; PROCEDURE PUTSYMINTABLE(SYMNUM:INTEGER;VAR SYMBOL:SYMREC); (*SYMBOLS DO NOT WRAP AROUND TO NEXT BLOCK. THE FULL SYMBOL MUST BE IN ONE SINGLE BLOCK. THERE IS A LITTLE SPACE WASTED, BUT NOT MUCH.*) VAR X,Y:INTEGER;SYMPTR:INTEGER; EXTRA,MAXSYMS,OFFSET,SEG:INTEGER; BEGIN SEG:=SYMBOLSEG;OFFSET:=0;SYMPTR:=@SYMBOL; MAXSYMS:=8192 DIV SIZEOF(SYMBOL);(*HOW MANY SYMBOLS PER BANK*) EXTRA:=SYMNUM DIV MAXSYMS; (*GET HOW MANY EXTRA BANKS*) OFFSET:=SYMNUM MOD MAXSYMS; (*GET THE SYMBOL NUMBER WITHIN THE BANK*) OFFSET:=OFFSET*SIZEOF(SYMBOL); (*CNVRT OFFSET FM # SYMBOLS TO BYTE #*) SEG:=SEG+EXTRA; (*ADD THE EXTRA BANKS*) WHILE SEG>MAXSEG DO SEG:=SEG-8; (*PUT THE SYMBOL*) FOR X:=0 TO SIZEOF(SYMBOL)-1 DO POKE(SEG,OFFSET+X,BYTE[SYMPTR+X]); END; FUNCTION HASHUSED(ADR:INTEGER):BOOLEAN; VAR Y,Z:INTEGER;USED:BOOLEAN; BEGIN USED:=FALSE; Z:=(16384 DIV MAXSYM)*4-1;(*NUM OF ADRS HASHED TO SAME ADDRESS?*) FOR Y:=0 TO Z DO USED:=USED OR ISDEFSYM(ADR+Y*MAXSYM); HASHUSED:=USED; END; FUNCTION INSERT(VAR SYM:SYMREC):BOOLEAN; VAR HASHADR,STARTADR:INTEGER;DONE:BOOLEAN; BEGIN INSERT:=TRUE;DONE:=TRUE; IF SYM=NULL THEN EXIT; HASHADR:=HASH(SYM.ADR);STARTADR:=HASHADR; REPEAT IF NOT HASHUSED(HASHADR) THEN BEGIN PUTSYMINTABLE(HASHADR,SYM);DONE:=TRUE;END ELSE BEGIN GETSYMFMTABLE(HASHADR); IF SYMBOL.ADR=SYM.ADR THEN BEGIN PUTSYMINTABLE(HASHADR,SYM);DONE:=TRUE;END ELSE BEGIN HASHADR:=HASHADR+1; IF HASHADR=MAXSYM THEN HASHADR:=0; IF HASHADR=STARTADR THEN BEGIN INSERT:=FALSE;DONE:=TRUE;END; DONE:=FALSE; END; END; UNTIL DONE; END; FUNCTION FIND(VAR SYM:SYMREC; ADR:INTEGER):BOOLEAN; VAR HASHADR,STARTADR:INTEGER;DONE,FOUND:BOOLEAN; BEGIN HASHADR:=HASH(ADR);STARTADR:=HASHADR; FIND:=FALSE;FOUND:=FALSE;DONE:=FALSE;SYM:=NULL; IF NOT ISDEFSYM(ADR) THEN EXIT; REPEAT IF NOT HASHUSED(HASHADR) THEN DONE:=TRUE ELSE BEGIN GETSYMFMTABLE(HASHADR); IF SYMBOL.ADR=ADR THEN BEGIN DONE:=TRUE;FOUND:=TRUE;END ELSE BEGIN HASHADR:=HASHADR+1; IF HASHADR=MAXSYM THEN HASHADR:=0; IF HASHADR=STARTADR THEN DONE:=TRUE; END; END; UNTIL DONE; IF FOUND THEN SYM:=SYMBOL ELSE SYM:=NULL; FIND:=FOUND; END; PROCEDURE REMOVEBLANKS(VAR LINE:STRING(63)); VAR L,X:INTEGER; BEGIN L:=ORD(LINE[0]);X:=1; WHILE (X<=L) AND (LINE[X]=' ') DO X:=X+1; IF X>1 THEN STRINGDELETE(LINE,1,X-1); END; FUNCTION CNVRT2NUM(VAR TEMPS:STRING):INTEGER; VAR NUM,X,Y,Z:INTEGER; BEGIN NUM:=0;CNVRT2NUM:=0;REMOVEBLANKS(TEMPS);IF TEMPS='' THEN EXIT; IF TEMPS[1]='$' THEN BEGIN Y:=5; (*CHECK FOR SPACE ALSO*) IF ORD(TEMPS[0])<5 THEN Y:=ORD(TEMPS[0]); IF TEMPS[Y]=' ' THEN Y:=Y-1; (*NOT 5, MAKE 4*) IF TEMPS[Y]=' ' THEN Y:=Y-1; (*NOT 4, MAKE 3*) IF TEMPS[Y]=' ' THEN Y:=Y-1; (*NOT 3, MAKE 2*) FOR Z:=2 TO Y DO BEGIN X:=ORD(TEMPS[Z])-48; IF X>9 THEN X:=X-7; NUM:=NUM*16+X; END; END ELSE NUM:=ENCODE(TEMPS); CNVRT2NUM:=NUM; END; FUNCTION SEPERATE(VAR LINE:STRING(63); VAR CMD:CHAR; VAR ADR:INTEGER; VAR SYM:STRING(15)):BOOLEAN; VAR X:INTEGER; TEMPS:STRING(63); ADRSTR:STRING(6); BEGIN CMD:=' ';ADR:=INVALIDADR;TEMPS:=LINE;SEPERATE:=FALSE; IF TEMPS='' THEN EXIT;REMOVEBLANKS(TEMPS);IF TEMPS='' THEN EXIT; CMD:=TEMPS[1]; STRINGDELETE(TEMPS,1,1); ADR:=CNVRT2NUM(TEMPS); IF TEMPS='' THEN ADR:=INVALIDADR; HEX(@ADR,2,ADRSTR);IF (ADR<256) AND (ADR>=0) THEN HEX(@ADR+1,1,ADRSTR);SYM:='$'+ADRSTR; X:=STRINGPOS(' ',TEMPS); IF X=0 THEN X:=ORD(TEMPS[0]); STRINGDELETE(TEMPS,1,X); REMOVEBLANKS(TEMPS);IF TEMPS='' THEN EXIT; IF ORD(TEMPS[0])>12 THEN TEMPS[0]:=CHR(12); SYM:=TEMPS;SEPERATE:=TRUE; END; PROCEDURE PUSHSTACK(ADR:INTEGER); BEGIN IF STKPTR>=MAXSTK THEN BEGIN ERROR:=TRUE;ERRORNUM:=1;END ELSE BEGIN STKPTR:=SUCC(STKPTR);STACK[STKPTR]:=ADR;END; END; PROCEDURE PUSHTABLE(ADR:INTEGER); BEGIN IF TBLPTR>=MAXTBL THEN BEGIN ERROR:=TRUE;ERRORNUM:=9;END ELSE BEGIN TBLPTR:=SUCC(TBLPTR);TABLE[TBLPTR]:=ADR;END; END; PROCEDURE DOCMDSYM(VAR SYM:SYMREC); VAR CMD:CHAR;ADR:INTEGER; BEGIN CMD:=SYM.CMD;ADR:=SYM.ADR; (*THE FOLLOWING ASSUME A VALID SYMBOL IS DEFINED FOR THIS ADDRESS*) IF (CMD='C') THEN BEGIN PUSHSTACK(ADR);SETSYMADR(ADR);END; IF (CMD='D') THEN BEGIN SETDATA(ADR);SETSYMDAT(ADR);END; IF (CMD='E') THEN BEGIN SETSYMADR(ADR);EXECADR:=ADR;END; IF (CMD='S') THEN BEGIN SETSYMDAT(ADR);SETSYMADR(ADR);END; IF (CMD='T') THEN BEGIN PUSHTABLE(ADR);SETDATA(ADR);SETSYMADR(ADR);END; IF NOT INSERT(SYM) THEN BEGIN ERROR:=TRUE;ERRORNUM:=3;END; SETDEFSYM(ADR); END; PROCEDURE REENTERSYMBOLS; (*WE NEED TO RE-ENTER ALL THE INFO FROM THE SYMBOLS AGAIN. WE'VE CLEARED THE TABLES, NOW WE HAVE TO SET EVERYTHING TO UNKNOWN AND INIT THE STACK AND TABLE*) VAR ADDRESS,ADDR:INTEGER;SYM:SYMREC; BEGIN STKPTR:=0;STACK[0]:=INVALIDADR; TBLPTR:=-1; FOR ADDRESS:=0 TO 8191 DO POKE(UNKNOWNBMSEG,ADDRESS,PEEK(LOADBMSEG,ADDRESS)); ADDRESS:=0; REPEAT ADDR:=ADDRESS LSR 3; IF PEEK(DEFSYMBMSEG,ADDR)=0 THEN ADDRESS:=(ADDR+1)*8-1 ELSE IF FIND(SYM,ADDRESS) THEN DOCMDSYM(SYM); ADDRESS:=ADDRESS+1; UNTIL ADDRESS=65536; END; PROCEDURE PROCESSSYM(VAR LINE:STRING); VAR CMD:CHAR;ADR:INTEGER;SYMB:STRING; SYM:SYMREC;VALID:BOOLEAN; BEGIN VALID:=SEPERATE(LINE,CMD,ADR,SYMB); CMD:=CHR(ORD(CMD) AND $5F); (*MAKE UPPER CASE*) IF (CMD='S') OR (CMD='C') OR (CMD='T') OR (CMD='D') OR (CMD='E') THEN BEGIN SYM.SYMBL:=SYMB;SYM.ADR:=ADR;SYM.CMD:=CMD; DOCMDSYM(SYM);GLOBALADDRESS:=ADR; END; END; PROCEDURE GETASYM(ADR,LEN:INTEGER;HD:STRING(63);VAR S:STRING(15));PUBLIC; VAR SYM:SYMREC;TEMPS:STRING(10); BEGIN HEX(@ADR,2,TEMPS);IF LEN=1 THEN HEX(@ADR+1,1,TEMPS); S:=HD+TEMPS; IF FIND(SYM,ADR) THEN S:=SYM.SYMBL; END; FUNCTION CNVRTBOOL(VAR T:STRING):BOOLEAN; BEGIN REMOVEBLANKS(T); IF (ORD(T[0])=0) THEN BEGIN CNVRTBOOL:=FALSE;EXIT;END; IF (T[1]='N') OR (T[1]='n') THEN CNVRTBOOL:=FALSE; IF (T[1]='Y') OR (T[1]='y') THEN CNVRTBOOL:=TRUE; END; PROCEDURE ERRORMESSAGE; BEGIN CASE ERRORNUM OF -5:MSG2:='DISK FULL'; -4:MSG2:='DISK REQUEST ERROR'; -3:MSG2:='FILE NOT FOUND'; -2:MSG2:='I/O ERROR'; -1:MSG2:='END OF FILE'; 0:MSG2:='NO ERR # GIVEN'; 1:MSG2:='SUBROUTINE STACK OVERFLOW'; 2:MSG2:='ERROR IN DEFAULT FILE '+FLNAME; 3:MSG2:='SYMBOL TABLE OVERFLOW'; 4:MSG2:='NO CODE LOADED.'; 8:MSG2:='BREAK PRESS INTERUPT'; 9:MSG2:='JUMP TABLE OVERFLOW' ELSE BEGIN DECODE(ERRORNUM,6,MSG1);MSG2:='ERROR #'+MSG1;END END; (*CASE*) ERROR:=FALSE;ERRORNUM:=0; MSG1:='AN ERROR OCCURED:'; END; PROCEDURE OPENFILE(POS:INTEGER;VAR MSG:STRING; VAR THEFILENAME,EXT:STRING;VAR THEFILE:TEXT; FTYPE:INTEGER); LABEL 1; VAR SUCCESSFUL:BOOLEAN; BEGIN REPEAT CURSOR(POS);SUCCESSFUL:=TRUE; WRITE(MSG);READLN(THEFILENAME); IF THEFILENAME='' THEN GOTO 1; WRITELN;CURSOR(POS+32); IF (FTYPE=1) THEN RESET(THEFILE,THEFILENAME,EXT) ELSE REWRITE(THEFILE,THEFILENAME,EXT); ERRORNUM:=FILEERROR(THEFILE); IF ERRORNUM<>0 THEN BEGIN ERRORMESSAGE;WRITELN(MSG2);MSG1:='';MSG2:='';END; CURSOR(POS);WRITELN;CURSOR(POS); UNTIL FILEERROR(THEFILE)=0; 1: WRITELN(MSG,THEFILENAME); END; PROCEDURE INITDEFAULTS; BEGIN FORMATED:=FALSE; LINELIMIT:=1400; LINENUMS:=FALSE; STARTLINE:=10; LINEADRS:=FALSE; LINEDATA:=FALSE; FCBASCII:=FALSE; FDBASCII:=TRUE; FCCSTRINGS:=TRUE; FCSSTRINGS:=TRUE; SCREENCOL:=0; LBHD:='LB'; DTHD:='DT'; END; PROCEDURE CLRSYMTAB; VAR X:INTEGER; BEGIN FOR X:=0 TO 8191 DO POKE(DEFSYMBMSEG,X,0);(*CLEAR USER DEFINED SYMBOL FLAGS*) END; PROCEDURE CLEARTABLES; VAR X:INTEGER; BEGIN FOR X:=0 TO 8191 DO BEGIN POKE(OPCODEBMSEG,X,0);(*CLEAR OPCODE FLAGS*) POKE(OPSTARTBMSEG,X,0);(*CLEAR OPCODE START FLAGS*) POKE(SYMADRSEG,X,0); (*CLEAR ADR. SYMBOLS DEFINED FLAGS*) POKE(SYMDATSEG,X,0); (*CLEAR DATA SYMBOLS DEFINED FLAGS*) POKE(DATABMSEG,X,0); (*CLEAR DATA FLAGS*) POKE(UNKNOWNBMSEG,X,0);(*CLEAR UNKNOWN TYPE FLAGS*) END; END; PROCEDURE TITLESCREEN; VAR X:INTEGER; BEGIN IF SCREENCOL<>0 THEN BYTE[$FF22]:=SCREENCOL; PAGE; (* 12345678901234567890123456789012*) WRITELN(' ',PROGNAME); WRITELN(' BETA TEST VERSION 1.1'); WRITELN; WRITELN(' (C) COPYRIGHT JULY 1991 BY'); WRITELN; WRITELN(' Carey Bloodworth'); WRITELN(' 1601 N. HILLS BLVD'); WRITELN(' VAN BUREN AR 72956'); WRITELN; WRITELN(' THIS PROGRAM IS SHAREWARE.'); WRITELN(' PLEASE DISTRIBUTE FREELY'); WRITELN; WRITELN(' ANY DONATIONS, SUGGESTIONS OR'); WRITELN(' BUG REPORTS WOULD BE WELCOMED'); FOR X:=1 TO 10000 DO BEGIN END; (*DELAY SOME*) END; PROCEDURE LOADDEFAULTS; VAR TEMPF:TEXT;TEMPS:STRING(20); BEGIN RESET(TEMPF,FLNAME); IF NOT EOF(TEMPF) THEN BEGIN READLN(TEMPF,TEMPS);FORMATED:=CNVRTBOOL(TEMPS); READLN(TEMPF,LINELIMIT); READLN(TEMPF,TEMPS);LINENUMS:=CNVRTBOOL(TEMPS); READLN(TEMPF,STARTLINE); READLN(TEMPF,TEMPS);LINEADRS:=CNVRTBOOL(TEMPS); READLN(TEMPF,TEMPS);LINEDATA:=CNVRTBOOL(TEMPS); READLN(TEMPF,TEMPS);FCBASCII:=CNVRTBOOL(TEMPS); READLN(TEMPF,TEMPS);FDBASCII:=CNVRTBOOL(TEMPS); READLN(TEMPF,TEMPS);FCCSTRINGS:=CNVRTBOOL(TEMPS); READLN(TEMPF,TEMPS);FCSSTRINGS:=CNVRTBOOL(TEMPS); READLN(TEMPF,SCREENCOL); READLN(TEMPF,TEMPS);STRINGCOPY(TEMPS,1,8,LBHD); IF EOF(TEMPF) THEN BEGIN ERROR:=TRUE;ERRORNUM:=2;END; READLN(TEMPF,TEMPS);STRINGCOPY(TEMPS,1,8,DTHD); END; CLOSE(TEMPF); END; EMPF,TEMPS);FCSSTRINGS:DOCLEAR; (* C *) $53,$73:DOSET; (* S *) $03,$45,$65:DONE:=TRUE;(* E, *) $24:DOADR; (* $ *) $5E:ADR:=ADR+1; (* UP *) $0A:ADR:=ADR-1; (* DOWN *) $5F:ADR:=ADR+256; (* SH/UP *) $5B:ADR:=NO 0 NO 10 YES NO NO YES YES YES 80 $ $ ˙˙˙˙˙˙˙˙˙˙˙BASIC TBL˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙BASIC BIN$ ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙S $0100 SWI3JMP S $0103 SWI2JMP S $0106 SWIJMP S $0109 NMIJMP S $010C IRQJMP S $010F FIRQJMP S $0112 USR S $A000 POLCAT S $A002 CHROUT S $A004 CSRDON S $A006 BLKIN S $A008 BLKOUT S $A00A JOYIN S $A00C WRTLDR C $A00E INITIALIZE S $A027 STARTUP C $A074 BASICSTARTUP C $A0E8 RESET C $A0F6 CARTINTERUPT S $A0FC ROMPACKTST C $A108 GOOROMPAK S $A10D RAMDIRPAGE S $A147 COPYRIGHT S $A171 INPUTROUTINE S $A199 FLASHCURSOR S $A1B1 GETKEYBFLASH S $A1C1 CHECKKEYB S $A1CB STROBEKEYB S $A22E CHECKSHIFT S $A238 DECODEKEYB S $A245 DECODESPCL S $A26E KEYBKTBLE S $A282 PRINTDV S $A2BF RS232BYTEOUT S $A2FB RS232BITOUT S $A30A PRINTTOVIDEO S $A35F INITOUTPARAM S $A384 SETCASSPARAM S $A38D IPCHARTOBUFF S $A3ED CHKFILEOPEN S $A406 CHKFILE4OUTP S $A416 CLOSEN S $A426 CLOSE S $A43D FLSHCASOPBUF S $A44C CSAVE S $A498 CLOAD S $A4FE CLOADM S $A53E EXEC S $A549 CHECK4PAUSE S $A554 SETCRSPRNTAT S $A564 INKEY S $A578 EVALFILENAME S $A59A CPYBYTESXTOU S $A5A2 GETDEVNUM S $A5C5 GETFILENAME S $A5CE EOF S $A5EC SKIPF S $A5F6 OPEN S $A624 OPENFORINPUT S $A658 OPENFOROUTPT S $A681 SRCHCASFLNAM S $A6F3 FLSHLHSCHAR S $A70B LOADCASBLK S $A749 INPCASSBYTE S $A755 INPBIT2CARRY S $A75D GETWAVELEN S $A76C TIMECASSINP S $A77C GETCASTIMPLS S $A7AD CHKCASPLSWID S $A7BD MOTORONOFF S $A7D8 STRTTAP4WRT S $A7E5 COMPLTTAPOUT S $A7F4 OPCASSBLOCK S $A828 OPBYTE2CAS S $A85C WAVESHAPTABL S $A880 SET S $A8B1 BASICRESET S $A8F5 POINT S $A910 CLS S $A92D CLR2EOLN S $A94B SOUND S $A974 AUDIOOFF S $A985 TIMDOPTHRDA S $A990 AUDIOONOFF S $A9A2 RESETPIA C $A9B3 IRQ S $A9C6 JOYSTK S $A9DE READJYSTK C $AA1A CHKNUM0TO9 T $AA29 BASICFUNCTBL T $AA31 FUNCJMPTBL2 S $AA51 MATHPRCEDJMP S $AA66 BASICWORDCMD T $AB67 BASCMDJMPTBL S $ABAF BASICERRMSGS S $ABE1 MSGERROR S $ABE8 MSGIN S $ABED MSGOK S $ABF2 MSGBREAK S $ABF9 SCNSTK4FORPT S $AC1E OPNGAP4NEWLN S $AC33 CHKMEM S $AC46 ERRORPROCSNG S $AC73 DIRECTMODE S $ACA0 OUTPTROUTINE S $ACA5 INSTNEWLINE S $ACEF RSTBASICPTRS S $AD01 FNDBASLNNUM S $AD17 NEW S $AD19 INITBASCOLD S $AD47 FOR C $AD7F FORPRT2 S $AD9E BETWNSTMTS S $ADC0 INTERPRET S $ADE4 RESTORE S $ADEB KEYBTWNSTMT S $AE02 END S $AE09 STOP S $AE30 CONT S $AE41 CLEAR S $AE75 RUN S $AE86 GOTOGOSUB S $AEA4 GOTO S $AEC0 RETURN S $AEE0 DATA S $AEE3 GETNEXTLINE S $AEE5 REM S $AEE8 SCANROUTINE S $AF14 IF S $AF42 ON S $AF67 ASCII2INTGR S $AF89 ASSIGNVARLET S $AFA6 ASSGNSTRING S $AFCF MSGREDO S $AFD6 INPTREAD S $AFF5 INPUT S $B046 READ S $B0B9 GETNXTDATA S $B0E8 MSGXTRAIGNOR S $B0F8 NEXT S $B141 EVALEXPR S $B156 COMPUTEXPR S $B172 LESEQUGREAT S $B1C6 BCKOFFBASPTR S $B1CB CMPOPPRIOADR S $B1CE CMPOPPRIO S $B1D4 PSHOPUNDRVAR S $B1E2 FPAC1TOSTK S $B223 CHKOPERAND S $B24E NOT S $B277 SNERROR S $B27C UNARYMINUS S $B284 VARTOFPAC1 S $B290 RHSFUNCS C $B2D4 ANDOR C $B2F4 COMPARISONS S $B34B MULTIPLEDIM S $B34E DIM S $B357 NEWDIMVAR S $B3A2 CHKA2Z S $B3AB NEWVAR S $B3DF FPCON32767 S $B3E4 INT16BIT2D S $B401 FNDARRAYVAR S $B44F NEWARRAY S $B4CE MUL16BTUNSGN S $B4EE MEM S $B4FD BASVALTOSTR S $B50D OPNSTRNGSPC S $B516 BUILDSTRING S $B56D GNRLSTRNGOP S $B591 GARBAGECOLEC S $B60F STRNGCONCAT S $B643 STRNG2MEM S $B654 CLENSTRNGSPC S $B675 CLENTEMPSTRN S $B681 LEN S $B68C BASICCHR S $B6A0 BASICASC S $B6A4 STRNGROUTINE S $B6AB BASICLEFT S $B6C8 BASICRIGHT S $B6CF BASICMIDCMD S $B6F5 GETSTRNGPARM S $B70B GETNUM0TO255 S $B716 BASICVAL S $B734 FORPEEKPOKE S $B73D FPACTOD16BIT S $B750 PEEK S $B757 POKE S $B75E LLIST S $B764 LIST S $B7C2 UNTOKENIZE S $B814 CHARTOBUFF S $B821 TOKENIZE S $B86B COPYLITERAL S $B8F7 PRINT S $B8FE PRINTATDEV S $B95C PRINTCR S $B966 COLUMNTAB S $B99C PRNTEACHCHAR S $B9B4 FPAC1PLS1HAF S $B9B9 XMINUSFPAC1 S $B9BC FPA2MINFPAC1 S $B9C5 FPA2PLSFPAC1 S $BA18 NORMALIZEFP1 S $BA44 SHIFTFPAC1 S $BA79 NEGATEFPAC1A S $BA92 OVERROR S $BA97 SHIFTFPAC3 S $BAC5 FPCON1 S $BACA XTIMESFPAC1 S $BACC FPA2TMSFPAC1 S $BB2F XTOFPAC2 S $BB37 SGNOFFP2XFP1 S $BB48 EXPO1PLSEXP2 C $BB5C CHKFOROV S $BB6A FPAC1TMS10 S $BB7D FPCON10 S $BB8F XDIVFPAC1 S $BB93 FPA2DIVFPA1 S $BC06 DIVBY0ERROR S $BC0B RES2FPAC1 S $BC14 XTOFPAC1 S $BC2F FPA1TOSCRTCH S $BC33 FPA1TOX S $BC4A FPAC2TOFPAC1 S $BC5F FPAC1TOFPAC2 S $BC6D GETSGNFPAC1 S $BC7A BASICSGN S $BC93 BASICABS S $BC96 CMPRFPAC1VAR S $BCC8 FPAC1TOINT S $BCEE BASICINT S $BD09 CLRFPA1MANTI S $BD12 ASCIITOFPAC1 S $BD86 FPAC1X10PLSB S $BD99 BPLUSFPAC1 S $BDA5 BUILDEXPONET S $BDB6 FPCON999999! S $BDBB FPCON99999! S $BDC0 FPCON1E09 S $BDC5 PRNTFPACINT S $BDD9 FPAC1TOASCII S $BEC0 FPCON1HALF S $BEC5 FPCONVCONSTS S $BEE9 NEGATEFPAC1B S $BEF0 SUMMATION C $BEFF DOSERIES S $BF1F BASICRND S $BF3B BASICRND0 S $BF40 DORND S $BF74 RNDCONSTANTS S $BF78 SIN S $BFBD SINCON2PI S $BFC2 SINCON1QUART S $BFC7 SINCONSTATNS S $BFF0 ROMREFLECTNS Á"#É˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ÈĈ Ä ĊÈÉÈÁ !Á#$%&'()*+,-./ÉÂĊ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙PASCALIBEXT˙1ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙LIB PAS˙q˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙LIBINT PAS˙T˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙PASBOOT ASM˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙TRACE PAS˙ Ÿ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙DISASSEMPAS˙ ì˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙DIS PAS˙à˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙UTILITY PAS˙é˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙DSTRAC32DEF˙5˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙BASIC SYM˙ ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙RUNTIME LIB˙"´˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙LOADER PAS˙0˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĊÈĈ Ä ĊÈÉÈÁ !Á#$%&'()*+,-./É˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙KWPASCALIBEXT˙ÇLIB PAS˙qLIBINT PAS˙TPASBOOT ASM˙TRACE PAS˙ ŸDISASSEMPAS˙ ìDIS PAS˙àUTILITY PAS˙éDSTRAC32DEF˙5BASIC SYM˙ RUNTIME LIB˙"´˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙JPASDISK KDFTCLOSEDSK KDFTDISKREAD KDFTDISKRESET KDFTDISKVECTR KDFTDISKWRITE KDFTRDNXTDSK KDFTRETRYCNT KDFTREWRTDSK KDFTSRCHDIR KDFTWRITEDSK CDEFT MACRO ASSEMBLER II, V4.1 CPASDISK Version 4.1 S308D001BBF010A308D0022BF010D397F09827F09857FFF407F0986170157397D09822708BE0983AF6A7F09823B7DFF032A187DFF027D098527107A0985260BB609868430B70986B7FF403B3436B7FFD8868020073436B7FFD886A0C60334067F0985A60D318D0125A6A68A28E68812C1162D028A10F60986B70986B7FF40C5 S08260A108E00001700FF1700FC1700D61026008C108E097EA60DE6A6F7FF49E188122723E68812F7FF4BE7A6121212128616B7FF481E881E881700AA102600608518265C1700BEA68813B7FF4A318D004610BF098330881E108E0000B6FF48B609868A80B70986E6E47309821A50C180260EF7FF48B7FF4012F6FF4BE78020 SF9F7FF48B7FF4012E680F7FF4B20F97F09821CAF8D6120091CAFB6FF48847C272F108E097EA60D6FA612121212AE6486FEA70E6A612719108E097EA60D6FA68602B7FF488D218D3E85101027FF1386FEAE64A70E8678B709853262B6FFF881FE2603B7FFD935B6108E0000313F2708B6FF48850126F53986D0B7FF481E881E S887DFF48868039108E2616313F26FC390102414234166FE28611A788128603A7881317FEA96D0E26238608A7E431881E860B17 YDFTEQUALNAME0000 S271931A8206AE426F46C8813A68813810C2DDA86FDA70E32613596A62DA78811EC2EED881AA62BA70F20EC34068D11A68811A788108B1EE686E788118D13358634028602A788138611A7881217FE4A35823406A6881047A78812A6881081222D036C8812840127028609A788138B09A78814A6881181432308840FAB8813A7 S8814358634066D0E263A6C8813A68813A188142F0BA688118143222A8D8E20E617FDF7CC0100ED88184FED8816A6881181432310A68813A188142608EC881AED88182702358686FFA70E20F88D0A6D0E26058D3617FF7B39340617FF03A60E270881FD26236F0E201FA62D34026FA417FDB117FF4C350431881EA6A56FA56A SA51F894D2AF517FD9B358634368D5A6D0E26318611A788128603A7881317FD7B6D0E2620C60831881EA6A427194C271631A8205A26F36C8813A68813810C2DDD86FDA70E35B6C60B3002A680A7A05A26F9AE623135A60FA72BE72CA68810A72D6F2E6F2F17FD3D35B6342617FED46FE2862031881E8D3127206CE4ABE48D29 S27186CE46CE46CE4A0E44A2AE986FBA70E326135A6E68810A7A5A78810C6C9E78811E7A617FCFE20E8E6A65C27058A01E6A65C39342617FE8A6FE231881EA6881081202C088D2227CC8D0C20068D0827C48D1627C020B63406E6A65C27074C81432FF635863261358434068DBC27F680032AF8358634066D0E261D6C881317 SFCA46D0E26134F5FED8818A68813A188142D0617FF9F17FE3C358634266D0E26236C881317FC7FA6881317FE176D0E261331881E80092E028B098AC0E68810A7A517FC62A60F17FD9A6D0E2611A72B5F4A26015AE72CEC8818ED2E17FC4835A6 RDFTCLOSEDSK 03C9 RDFTDISKREAD 004B RDFTDISKRESET000F RDFTDISKVECTR0000 RDFTDISKWRITE0054 RDFTRDNXTDSK 0235 RDFTRETRYCNT 005B RDFTREWRTDSK 027D RDFTSRCHDIR 0191 RDFTWRITEDSK 03A4 PA0000 0000 JPASIO KCLOSE KDFTCLOSE KDFTEQUALNAME KDFTREADCHAR KDFTREADFIELD KDFTREADINT KDFTREADLN KDFTREADSTRG KDFTREADTYPE KDFTRESET KDFTREWRITE KDFTWRITELN KDFTWRTCHAR KDFTWRTINT KDFTWRTSTRG KDFTWRTTYPE KEOF KEOLN KFILEERROR KFILETYPE KGET KPAGE KPUT KSETFILETYPE CDEFT MACRO ASSEMBLER II, V4.0 CPASIO V 4.0 S8D536F8815A60D2A134C102700094C2B1186FCA70E201C17 YDFTRESETTAPE0000 S200617 YDFTSRCHDIR 0000 S1702BE86AAA78815EC881C27073416170145326410AEE4326A6EA4170018A60D2A084C260F17 YDFTREWRTTAPE0000 S200A17 YDFTREWRTDSK 0000 S6D0E27036F881520DEAE6A1F123189011E10AF81C61A318D0084A6A0A7805A26F910AE66AE6AEC64ED881C300AE6A0270DC1032302C603A6A0A7805A26F910AE68AE6A8602A7E2A6A0A7E2274EA6A0813A271E812F2704812E2606860AA761200AE661C10D2C04A7856C616AE426DE202AA6E44A2725E6A0C12B2707C12D27 S034F20074A27151F98E6A0C0302B0DC1032E09812D260150AE6CE70D32623920202020202020202020200000010000000000CC000000000000AE64E60E1DED66398601A767AE64E60E1701212703E70E396D0E26026F67396F67AE64E60E1701032703E70E396D0E2614EC881610A388182C0BC3001EA68B810D26026C6739 SAE646F0EA6881581CC270586FCA70E396F8815A60D102A YDFTCLOSEDSK 0000 S4C260F6D88192705C60117 YDFTWRITETAPE0000 SC6FF17 YDFTWRITETAPE0000 S39AE641700BD262786FCA70E10AE881C271D6F0E34203189011E10AF8417012D260BA7A0ECE4830001EDE426F0326239352032713430170081263C17010F2637812027F7810D27F3812C27EF31646FA0E664C10E2704A7A06C641700F0261581202708810D2704812C26E5EC8816830001ED88164F35903530326F6EA4AE66 S8DAF261C1F41343617 YENCODE 0000 S32643506326FAE628C00012705EDF8042003E7F804351032646E84AE648D11260817009F2603A7F8021700B035306E843406EC881C261335063406A60EE60DC1FD2709E68815C1AA270286FCA70E3586AE628DDC26088D6B2604810D26F817007B35306E84AE6410AE62EC881C271EEDE33089011EA680A7A0ECE4830001ED SE426F33262AE64341617FEEC326435306E84AE6610AE646FA08D96261F8D25261B810D270EE6F804E16324F1A7A06CF80420EAEC8816830001ED88168D1F351032646E8434068D1A2611EC8816C30001ED8816C3001DA68BA7E45F3586A60D4C2B18EC881610A388182D0E6D0E260BA60D2A084C270A17 YDFTREADKEYBD0000 S5F3917 YDFTRDNXTDSK 0000 S20E217 YDFTREADTAPE 0000 S20DD344033624F5FA3422A1A32EBEC421F4134041F02EC4417 YDFTDECIMAL 0000 S1F4110AE464F5F34368D2F325E354016005410AE6630648601A784EC6234368D19351632646E8410AE62308D000A4F5F34368D0635366E84010DAE6610AE64A6A0E6632707E03F2403A6635F4D27098D1C261331214A26F75D270B318D000D8D0C26035A20F2351032646E84203476A6881581CC270686FCA70E203EE60D5C S2B2A6D0E2635EC881833881E33CBA6A4A7C45CE78819270F6D0D2A1FC1FF261BC60117 YDFTWRITETAPE0000 S201417 YDFTWRITEDSK 0000 S200F6F0EA6A45C270517 YDFTSCREENOUT0000 S200317 YDFTRS232OUT 0000 S35166D0E35E0AE6410AE62EC881C271EEDE33089011EA6A0A780ECE4830001EDE426F33262AE643416170006326435306E84AE646D0E261E86FCA70EEC881C27156F0E3189011E10AF8417FF662607312183000126F43910AE648E000CCC0001343617FEF33586AE64E60F4FED6639AE66EC64E70F3934364D270B3002E680 SE1A026034A26F735B6 RCLOSE 014A RDFTCLOSE 014C RDFTEQUALNAME044C RDFTREADCHAR 021A RDFTREADFIELD01A5 RDFTREADINT 01F2 RDFTREADLN 024F RDFTREADSTRG 0290 RDFTREADTYPE 0264 RDFTRESET 0000 RDFTREWRITE 003A RDFTWRITELN 0343 RDFTWRTCHAR 032E RDFTWRTINT 0303 RDFTWRTSTRG 0356 RDFTWRTTYPE 03DC REOF 010C REOLN 0123 RFILEERROR 0104 RFILETYPE 043D RGET 0176 RPAGE 042D RPUT 0408 RSETFILETYPE 0445 PA0000 0000 JPASKEYBD KCURSOR KDFTDELAY KDFTPOLLKEY KDFTREADKEYBD KDFTRS232OUT KDFTSCREENOUT CDEFT MACRO ASSEMBLER II, V4.0 CPASKEYBD V 4.0 S3416B7FFD8327C6F63DC76830001DD762606CC00411700D28E01524F4AA7E4A762A6624910240080A7626CE417009FA761A884A484E661E7805C27E56C634D27E0C6F8CB084424FB308D00BFEBE42730C11A2F1F308D006BC1202F24308D0045C1302C1C8D78C12B2F0288404D2619CB102015CA408D67BA011A260CCA2020 S08588D5B27015CE685E7648E055E17007D86FF8D3A4C2611A6628D33A1612609C112261973011A20126D632708DC76108302BB2606CC02BC1700306F6432643401B6FFF881FE2603B7FFD935013596B7FF02B6FF008A807DFF022B028A4039867FB7FF02B6FF0043844039DD7686FFC6088E0152A7805A26FB395E5F0A5B08 S15095D202030120D0D0C5C03034013301F26FC393436327E6F0EC68FE7E46F6131881E4F5FED8816ED8818A6E48B10810F2602869FA7E48D766F6117FEC4260A6A612BF786088D6720E181032603 B S20EA340286088D583502810D27418108271781152721810C272FE688195C27BCA7A06C88198D3920B36D881927AE313F6A88198D2B20A56D88191027FF9E313F6A881986088D1920EE86FFA70E860DA7A08D0DEC8818C30001ED8818326235B634169E888108271F810D2726810C27428120254D4D2B0C81402D0681602D04 S84DF8840A78020158C040027358660A782200A8660A7801F10C51F26F69F888C0600251E8E0400EC8820ED818C05E025F620038E0400CC60609F88ED818C05FF25F97FFF02B6FF004348271017FDE5270B8113260717FDDC27FB20F53596EC648401C30400DD8839B7FFD83416C6083405F6FF22C40126F91A508D265F8D25 S5F44598D206A6126F78D183505A6E4810D26049E978D14B6FFF881FE2603B7FFD93596C60158F7FF209E95341017FE92351017FE8D39 RCURSOR 022A RDFTDELAY 010D RDFTPOLLKEY 0000 RDFTREADKEYBD0112 RDFTRS232OUT 0234 RDFTSCREENOUT01AD PA0000 0000 JPASCASST KDFTREADTAPE KDFTRESETTAPE KDFTREWRTTAPE KDFTWRITETAPE CDEFT MACRO ASSEMBLER II, V4.0 CPASCASST V 4.0 S34268D55A60E270481FF26206D881026F1A6028120270A860831881E17 YDFTEQUALNAME0000 S26E18D366D0E260586AAA7881535A6343631881ECC000FED8818C6083002A680A7A05A26F9C6076FA05A26FBAE62CCFFFFED88275F17010F35B634068D308D471700C38D144F5FED88166D0E26096D88102A0486FFA70E3586B6FF2184F7B7FF211CAFB6FFF881FE2603B7FFD9393422B6FF218A08B7FF21B7FFD8108E0000 S313F26FC1A5035A234066F88118D498D2F22108D2525106A8811A6881181A0271420EA8D1522E88D1725E86C8811A68811806026D8A7881235860F818D1E20040F818D21D681C1182203C10A396F8811390F816D881226098D1025FC8D0C24FC398D0724FC8D0325FC390C81F6FF2056398608A788148D07466A881426F839 S8DD0D68112C113393426327E31881E4F8DEE46813C26F98DD9A788108DD4A788196F8818A7E4AB8810A7616DE4270C8DC1A7A0AB61A7616AE426F48DB5A061270286FEA70E326235A63426E7881017FF1FCC559034048D346AE426FA3261863C8D2A5FA688108D24A688198D1F4D270C31881EA6A08D156A881926F71F988D S0C86558D0817FED46F881835A63426EBE4E761318D005B3420318D00333420C601A68811B7FF2010AEE4E564260CA6A0B7FF2010AC6223F6200AA6A1B7FF2010AC6225F6A6A0A788115824D5326435A68292AABACADAEAF2FAFAFAF2EADACABAAA927A6A52423222120A0202020A12223242526A RDFTREADTAPE 0059 RDFTRESETTAPE0000 RDFTREWRTTAPE002E RDFTWRITETAPE0166 PA0000 0000 JPASSTRNG KDFTCHRSTRAPP KDFTCHRSTRCPY KDFTSTRSTRAPP KDFTSTRSTRCMP KDFTSTRSTRCPY KSTRINGCOPY KSTRINGDELETE KSTRINGINSERT KSTRINGPOS CDEFT MACRO ASSEMBLER II, V4.0 CPASSTRNG V 4.0 S10AE6410AC62271F6FA4AE6210AE64E6A43404EB84E7A035044F31ABE6802707A680A7A05A26F9AEE432646E846FF80410AE646CA4E6A44F31ABA663A7A420E73406AE6610AE64E6A0E1802302E61F5D2709A6A0A18026095A20F4A6F804A1F806351632646E8410AE646FA06D672718E669AE6A4F308BE1F80A220CA680A7 SA06CF8045C6A6726EF39AE68E6844FA3662D29C3000110A3642C02ED64A36427133404EC67308BEC65318B3502E6A0E7804A26F9E6F808A364E7F80839327E10AE68E6672706E1A42303E6A45C4F30ABAFE4E6A030ABEBF80AE73F31ABACE42306A682A7A220F6AE6AE680270A10AEE4A680A7A05A26F9326239327E6F6A6F S6B10AE66E6A44F31AB10AFE410AE66312110AF66AE68E68027106C6B10ACE4220CA680A1A026E55A26F23262396F6B20F9 RDFTCHRSTRAPP0030 RDFTCHRSTRCPY002D RDFTSTRSTRAPP000A RDFTSTRSTRCMP0040 RDFTSTRSTRCPY0000 RSTRINGCOPY 0067 RSTRINGDELETE0089 RSTRINGINSERT00BC RSTRINGPOS 00F9 PA0000 0000 JPASRUNTM KDECODE KDFTDECIMAL KDFTDIVIDE KDFTHEX KDFTMULTIPLY KDFTNEW KDFTSTRCTLOAD KDFTSTRUCTCMP KDFTSTRUCTMOV KENCODE KHEX KMARK KMEMAVAIL KRELEASE CDEFT MACRO ASSEMBLER II, V4.0 CPASUNTM V 4.0 S3440EE66AE6810AE64A6C0A1802604313F26F63540351032666E8435361E014353C3000132EB3410344033641F01A6A0A7C0300126F835C03440EE66AE6810AE64A6C0A780313F26F820C86D662A086C634F5FA366ED666D682A086A634F5FA368ED68396FE26FE28DE16FE2A666E6683DEDE4A665E6683DEBE4E7E4A666E6 S673DEBE4E7E46D6227064F5FA3E4EDE4ECE4AE6332696E846FE26FE26D662A026CE48DA834108E00104F5F68696968594910A3662504A3666C69301F26ED3510ED64A6E027064F5FA363ED63A6E027064F5FA364ED643934366FE24D2A086CE44F5FA361ED618620E66627313404A7805A26FB10AE62CC000A34268D9BA661 S2A01408B30A782CC000AEDE46A64270CEC6226E86D652704862DA7823265326135B6E667AE64E780EC6810AE668DA939AE6810AE64EC6658495849E366C3000144565AE7A0A6678D013934366FE24D271FE684545454548D1CE680C40F8D164A270EE6E4C8FFE7E426E7C620E7A020E13261353639CA30C1392F02CB07E7A0 S396F666F67AE64A6806FE2A7E22740A680812026066AE426F62034812D26046A61201C80302B1E8109221AA7E2EC695849ED6958495849E369EBE08900ED68A6806AE426DE6D6127064F5FA368ED68326239EC8D YDFTHEAPSTART0000 SEDF804E362ED8D YDFTHEAPSTART0000 S351032646E84EC8D YDFTHEAPSTART0000 SEDF80439EC64ED8D YDFTHEAPSTART0000 S391F40830064A38D YDFTHEAPSTART0000 S23072A07CC7FFF20024F5FED6439 RDECODE 0120 RDFTDECIMAL 00D6 RDFTDIVIDE 0097 RDFTHEX 0148 RDFTMULTIPLY 0064 RDFTNEW 01CF RDFTSTRCTLOAD001B RDFTSTRUCTCMP0000 RDFTSTRUCTMOV0038 RENCODE 017E RHEX 012E RMARK 01E2 RMEMAVAIL 01F1 RRELEASE 01EA PA0000 0000 JDSLIBRAR KCLRBIT KISUNKNOWN KSETUNKNOWN KCLRUNKNOWN KSETSYMADR KISSYMADR KCLRSYMADR KSETSYMDAT KISSYMDAT KCLRSYMDAT KISLOADED KSETLOAD KCLRLOAD KISOPCODE KSETOPCODE KCLROPCODE KISOPSTART KSETOPSTART KCLROPSTART KDONEIT KISDATA KSETDATA KCLRDATA KISDEFSYM KSETDEFSYM KCLRDEFSYM KGETOPCINIT KGETOPC CDEFT PASCAL II V4.1 D0014 D0010 D01E6 D0015 D0030 D0060 D0018 S34403364327AEC443406CC0007A4E0E4E0ED5AEC443406CC00031F025D350627064456313F26FAED56327EEC423406EC563406AEC4341017 YPEEK 0000 S32663506ED58EC583406EC5A5849308DFD01EC8BA4E0E4E034064F5F1F025F10ACE127015CE747325C35C034403364327AEC443406CC0007A4E0E4E0ED5AEC443406CC00031F025D350627064456313F26FAED56327EEC423406EC563406AEC4341017 YPEEK 0000 S32663506ED58EC583406EC5A5849308DFC9CEC8BAAE0EAE0ED58EC423406EC563406EC583406AEC4341017 YPOKE 0000 S3268325C35C0 RCLRBIT 0399 S34403364327AEC443406CC0007A4E0E4E0ED5AEC443406CC00031F025D350627064456313F26FAED56327EEC423406EC563406AEC4341017 YPEEK 0000 S32663506ED58EC583406CC00FF3406EC5A5849308DFC2AEC8B3406EC62A3E13262A4E0E4E0ED58EC423406EC563406EC583406AEC4341017 YPOKE 0000 S3268325C35C0 RISUNKNOWN 0413 S34403364327EEC423406CC000E3406AEC4341017FE9E32663506E745325C35C0 RSETUNKNOWN 0433 S34403364EC423406CC000E3406AEC4341017FEE53266325C35C0 RCLRUNKNOWN 044D S34403364EC423406CC000E3406AEC4341017FF383266325C35C0 RSETSYMADR 0467 S34403364EC423406CC000C3406AEC4341017FEB13266325C35C0 RISSYMADR 0481 S34403364327EEC423406CC000C3406AEC4341017FE3032663506E745325C35C0 RCLRSYMADR 04A1 S34403364EC423406CC000C3406AEC4341017FEE43266325C35C0 RSETSYMDAT 04BB S34403364EC423406CC000B3406AEC4341017FE5D3266325C35C0 RISSYMDAT 04D5 S34403364327EEC423406CC000B3406AEC4341017FDDC32663506E745325C35C0 RCLRSYMDAT 04F5 S34403364EC423406CC000B3406AEC4341017FE903266325C35C0 RISLOADED 050F S34403364327EEC423406CC00083406AEC4341017FDA232663506E745325C35C0 RSETLOAD 052F S34403364EC423406CC00083406AEC4341017FDE93266325C35C0 RCLRLOAD 0549 S34403364EC423406CC00083406AEC4341017FE3C3266325C35C0 RISOPCODE 0563 S34403364327EEC423406CC00093406AEC4341017FD4E32663506E745325C35C0 RSETOPCODE 0583 S34403364EC423406CC00093406AEC4341017FD953266EC423406AEC4341017FEA93264325C35C0 RCLROPCODE 05AA S34403364EC423406CC00093406AEC4341017FDDB3266325C35C0 RISOPSTART 05C4 S34403364327EEC423406CC000A3406AEC4341017FCED32663506E745325C35C0 RSETOPSTART 05E4 S34403364EC423406CC000A3406AEC4341017FD343266EC423406AEC4341017FE483264325C35C0 RCLROPSTART 060B S34403364EC423406CC000A3406AEC4341017FD7A3266325C35C0 RDONEIT 0625 S34403364327EEC423406AEC434108D8F32643506E745325C35C0 RISDATA 063F S34403364327EEC423406CC000D3406AEC4341017FC7232663506E745325C35C0 RSETDATA 065F S34403364EC423406CC000D3406AEC4341017FCB93266EC423406AEC4341017FDCD3264325C35C0 RCLRDATA 0686 S34403364EC423406CC000D3406AEC4341017FCFF3266325C35C0 RISDEFSYM 06A0 S34403364327EEC423406CC000F3406AEC4341017FC1132663506E745325C35C0 RSETDEFSYM 06C0 S34403364EC423406CC000F3406AEC4341017FC583266325C35C0 RCLRDEFSYM 06DA S34403364EC423406CC000F3406AEC4341017FCAB3266325C35C0 RGETOPCINIT 06F4 S344033644F5F3406CC0051340617 YDFTMULTIPLY 0000 S308DF91C308B34108D41404E4547204643422046434220434F4D204C53522046434220524F5220415352204C534C20524F4C204445432046434220494E4320545354204A4D5020434C522017 YDFTSTRSTRCPY0000 S3262CC00013406CC0051340617 YDFTMULTIPLY 0000 S308DF8BF308B34108D414046434220464342204E4F502053594E4346434220464342204C4252414C42535246434220444141204F52434346434220414E444353455820455847205446522017 YDFTSTRSTRCPY0000 S3262CC00023406CC0051340617 YDFTMULTIPLY 0000 S308DF862308B34108D41404252412042524E2042484920424C532042485320424C4F20424E452042455120425643204256532042504C20424D492042474520424C542042475420424C452017 YDFTSTRSTRCPY0000 S3262CC00033406CC0051340617 YDFTMULTIPLY 0000 S308DF805308B34108D41404C4541584C4541594C4541534C4541555053485350554C535053485550554C5546434220525453204142582052544920435741494D554C20464342205357492017 YDFTSTRSTRCPY0000 S3262CC00043406CC0051340617 YDFTMULTIPLY 0000 S308DF7A8308B34108D414053554241434D50415342434153554244414E4441424954414C44412053544120454F5241414443414F52412041444441434D50584A5352204C4458205354582017 YDFTSTRSTRCPY0000 S3262CC00053406CC0051340617 YDFTMULTIPLY 0000 S308DF74B308B34108D414053554242434D50425342434241444444414E4442424954424C44422053544220454F5242414443424F524220414444424C444420535444204C4455205354552017 YDFTSTRSTRCPY0000 S3262308DF6D734108D11103530313030303936333539363335393617 YDFTSTRSTRCPY0000 S3262308DF8C334108D11103031323330303030343434343535353517 YDFTSTRSTRCPY0000 S32624F5F3406CC0006340617 YDFTMULTIPLY 0000 S308DF8AE308B34108D04032C434317 YDFTSTRSTRCPY0000 S3262CC00013406CC0006340617 YDFTMULTIPLY 0000 S308DF88E308B34108D03022C4117 YDFTSTRSTRCPY0000 S3262CC00023406CC0006340617 YDFTMULTIPLY 0000 S308DF86F308B34108D03022C4217 YDFTSTRSTRCPY0000 S3262CC00033406CC0006340617 YDFTMULTIPLY 0000 S308DF850308B34108D04032C445017 YDFTSTRSTRCPY0000 S3262CC00043406CC0006340617 YDFTMULTIPLY 0000 S308DF830308B34108D03022C5817 YDFTSTRSTRCPY0000 S3262CC00053406CC0006340617 YDFTMULTIPLY 0000 S308DF811308B34108D03022C5917 YDFTSTRSTRCPY0000 S3262CC00063406CC0006340617 YDFTMULTIPLY 0000 S308DF7F2308B34108D03022C5517 YDFTSTRSTRCPY0000 S3262CC00073406CC0006340617 YDFTMULTIPLY 0000 S308DF7D3308B34108D04032C504317 YDFTSTRSTRCPY0000 S32624F5F3406CC0006340617 YDFTMULTIPLY 0000 S308DF7E4308B3410CC0044340617 YDFTCHRSTRCPY0000 S3262CC00013406CC0006340617 YDFTMULTIPLY 0000 S308DF7C5308B3410CC0058340617 YDFTCHRSTRCPY0000 S3262CC00023406CC0006340617 YDFTMULTIPLY 0000 S308DF7A6308B3410CC0059340617 YDFTCHRSTRCPY0000 S3262CC00033406CC0006340617 YDFTMULTIPLY 0000 S308DF787308B3410CC0055340617 YDFTCHRSTRCPY0000 S3262CC00043406CC0006340617 YDFTMULTIPLY 0000 S308DF768308B3410CC0053340617 YDFTCHRSTRCPY0000 S3262CC00053406CC0006340617 YDFTMULTIPLY 0000 S308DF749308B34108D0302504317 YDFTSTRSTRCPY0000 S3262CC00063406CC0006340617 YDFTMULTIPLY 0000 S308DF72A308B3410CC003F340617 YDFTCHRSTRCPY0000 S3262CC00073406CC0006340617 YDFTMULTIPLY 0000 S308DF70B308B3410CC003F340617 YDFTCHRSTRCPY0000 S3262CC00083406CC0006340617 YDFTMULTIPLY 0000 S308DF6EC308B3410CC0041340617 YDFTCHRSTRCPY0000 S3262CC00093406CC0006340617 YDFTMULTIPLY 0000 S308DF6CD308B3410CC0042340617 YDFTCHRSTRCPY0000 S3262CC000A3406CC0006340617 YDFTMULTIPLY 0000 S308DF6AE308B34108D0302434317 YDFTSTRSTRCPY0000 S3262CC000B3406CC0006340617 YDFTMULTIPLY 0000 S308DF68F308B34108D0302445017 YDFTSTRSTRCPY0000 S3262CC000C3406CC0006340617 YDFTMULTIPLY 0000 S308DF670308B3410CC003F340617 YDFTCHRSTRCPY0000 S3262CC000D3406CC0006340617 YDFTMULTIPLY 0000 S308DF651308B3410CC003F340617 YDFTCHRSTRCPY0000 S3262CC000E3406CC0006340617 YDFTMULTIPLY 0000 S308DF632308B3410CC003F340617 YDFTCHRSTRCPY0000 S3262CC000F3406CC0006340617 YDFTMULTIPLY 0000 S308DF613308B3410CC003F340617 YDFTCHRSTRCPY0000 S32624F5F3406CC0006340617 YDFTMULTIPLY 0000 S308DF655308B3410CC0058340617 YDFTCHRSTRCPY0000 S3262CC00013406CC0006340617 YDFTMULTIPLY 0000 S308DF636308B3410CC0059340617 YDFTCHRSTRCPY0000 S3262CC00023406CC0006340617 YDFTMULTIPLY 0000 S308DF617308B3410CC0055340617 YDFTCHRSTRCPY0000 S3262CC00033406CC0006340617 YDFTMULTIPLY 0000 S308DF5F8308B3410CC0053340617 YDFTCHRSTRCPY0000 S32624F5F58493406CC00011F023506308DF33E308B1F20ED84CC000158493406CC00021F023506308DF326308B1F20ED84CC000258493406CC00041F023506308DF30E308B1F20ED84CC000358493406CC00081F023506308DF2F6308B1F20ED84CC000458493406CC00101F023506308DF2DE308B1F20ED84CC0005584934 S06CC00201F023506308DF2C6308B1F20ED84CC000658493406CC00401F023506308DF2AE308B1F20ED84CC000758493406CC00801F023506308DF296308B1F20ED84325C35C034403364327CECD8023406CC000D1F025D350627064456313F26FA3406CC0007A4E0E4E0ED5AECD8023406CC1FFFA4E0E4E0ED58327E4F5F34 S06EC5AE3E13406EC583406AEC4341017 YPEEK 0000 S32663506ED44ECD802C30001EDD802325C35C0 RGETOPC 0DE6 S16000134403364AEC4EC1A3406CC0001E3E1308DF204E68B4F3406CC00303406EC62A3E13262EDD804AEC4EC980C10830016102700021083001710260003 F0E1A SCC0002EDD804160004 F0E22 S1083001A102700051083001C10260006 F0E33 SCC0003EDD804160007 F0E3B S1083001E102700081083001F10260009 F0E4C SCC0008EDD80416000A F0E54 S108300301027000B108300311027000C108300321027000D108300331026000E F0E75 F0E6D F0E65 SCC0009EDD80416000F F0E7D S1083003410270010108300351027001110830036102700121083003710260013 F0E9E F0E96 F0E8E SCC0007EDD804160014 F0EA6 S10830083102700151083008C102700161083008E10270017108300C310270018108300CC10270019108300CE1026001A F0ED7 F0ECF F0EC7 F0EBF F0EB7 SCC0004EDD80416001B F0EDF S1083008D1026001CCC0001EDD804 F0EF0 F0EE8 F0EAF F0E86 F0E5D F0E44 F0E2B S30D80234108D010017 YDFTSTRSTRCPY0000 S3262ECD8043406CC00031F025F10ACE126015C4F3406ECD8043406CC00041F025F10ACE126015CAAE0EAE05D1027001D30D8023410CC0023340617 YDFTCHRSTRCPY0000 S3262 F0F31 SECD8043406CC000510A3E11026001E30D8023410CC003C340617 YDFTCHRSTRCPY0000 S3262 F0F4F SAEC4EC980E3406CC00011F025F10ACE126015C4F3406EC980C3406CC00201F025F10ACE12C015CA4E0E4E04F3406EC980C3406CC00301F025F10ACE12F015CA4E0E4E05D1027001FCC0002EDD804 F0FA6 S325C35C03440336432E8C54F5FAEC4E798124F5FE798104F5FEDD8044F5FED980A327E3088163410AEC4AE84341017FDA932643506ED5A327EAEC43088163410AEC4AE84341017FD9132643506ED58327EAEC43088163410AEC4AE84341017FD7932643506ED56AEC4EC88163406CC00023406EC62A3E13262ED8816EC5A34 S06CC0100340617 YDFTMULTIPLY 0000 S3406EC58E3E1EDC8C3EC583406CC0100340617 YDFTMULTIPLY 0000 S3406EC56E3E1EDC8C1EC46108300001026002030D80234108D010017 YDFTSTRSTRCPY0000 S3262160021 F105C S1083000110260022EC5A3406CC007F10A3E1102C0023EC5A3406CC01003406EC62A3E13262ED5A F1082 SAEC4EC88163406EC5AE3E1ED980ACC0001EDD804CC0001E79812EC980A3406CC00023406308D YLBHD 0000 S3410CC0040340617 YDFTSTRCTLOAD0000 S30D8023410AEC4AE84341017 YGETASYM 0000 S32E848160024 F1074 S1083000210260025AEC4EC88163406ECC8C3E3E13406CC0001E3E1ED980ACC0002EDD804CC0001E79812EC980A3406CC00023406308D YLBHD 0000 S3410CC0040340617 YDFTSTRCTLOAD0000 S30D8023410AEC4AE84341017 YGETASYM 0000 S32E848160026 F10E1 S1083000310260027EC5AAEC4ED980ACC0001EDD804CC0001E79810EC980A3406CC00013406308D YDTHD 0000 S3410CC0040340617 YDFTSTRCTLOAD0000 S30D8023410AEC4AE84341017 YGETASYM 0000 S32E848160028 F1137 S1083000410260029ECC8C3AEC4ED980ACC0002EDD804CC0001E79810EC980A3406CC00023406308D YDTHD 0000 S3410CC0040340617 YDFTSTRCTLOAD0000 S30D8023410AEC4AE84341017 YGETASYM 0000 S32E84816002A F117E S108300051026002BEC5AAEC4ED980ACC0001EDD804CC0001E79812EC980A3406CC00013406308D YLBHD 0000 S3410CC0040340617 YDFTSTRCTLOAD0000 S30D8023410AEC4AE84341017 YGETASYM 0000 S32E84816002C F11C6 S108300061026002DECC8C3AEC4ED980ACC0002EDD804CC0001E79812EC980A3406CC00023406308D YLBHD 0000 S3410CC0040340617 YDFTSTRCTLOAD0000 S30D8023410AEC4AE84341017 YGETASYM 0000 S32E84816002E F120D S108300071026002FEC5AAEC4ED980A30C8DB34108D010017 YDFTSTRSTRCPY0000 S3262CC00063406CC0006340617 YDFTMULTIPLY 0000 S308DEFA3308B34108D03022C5517 YDFTSTRSTRCPY0000 S3262CC0001EDD804AEC4EC980C3406CC003510A3E1102C0030CC00063406CC0006340617 YDFTMULTIPLY 0000 S308DEF6D308B34108D03022C5317 YDFTSTRSTRCPY0000 S3262 F129F S4F5FED52CC00073406EC5210A3E4102E0031EC5A3406EC525849308DED36EC8BA4E0E4E034064F5F10A3E11027003230C8DB341030C8DB341017 YDFTSTRSTRCPY0000 SEC523406CC0006340617 YDFTMULTIPLY 0000 S308DEF13308B341017 YDFTSTRSTRAPP0000 S3262 F12ED SEC52C30001ED5220AB F12D0 S326230C8DB34108D010017 YDFTSTRSTRCMP0000 S102600334F5FAEC4E79814160034 F132D S30C8DB3410CC00013406CC00013406AEC4AE84341017 YSTRINGDELETE0000 S3268 F1337 S30D802341030C8DB341017 YDFTSTRSTRCPY0000 S3262160035 F1255 S1083000810260036EC5AAEC4ED980ACC0001EDD80430C8DB3410EC5A3406CC00041F025D350627064456313F26FA3406CC0006340617 YDFTMULTIPLY 0000 S308DEEAE308B341017 YDFTSTRSTRCPY0000 SCC002C340617 YDFTCHRSTRAPP0000 SEC5A3406CC000FA4E0E4E03406CC0006340617 YDFTMULTIPLY 0000 S308DEE86308B341017 YDFTSTRSTRAPP0000 S3262CC000130C8DBE68B4F3406CC003F1F025F10ACE126015C4F3406CC000330C8DBE68B4F3406CC003F1F025F10ACE126015CAAE0EAE04F3406CC000430C8DBE68B4F3406CC003F1F025F10ACE126015CAAE0EAE05D102700374F5FAEC4E79814 F1428 S30D802341030C8DB341017 YDFTSTRSTRCPY0000 S3262160038 F136B S1083000910260039CC0001EDD804EC5A3406CC0060A4E0E4E03406CC00051F025D350627064456313F26FAED52EC5A3406CC008010A3E1102F003AEC5A3406CC001FA4E0E4E0ED50EC503406CC000F10A3E1102C003BEC503406CC00203406EC62A3E13262ED50 F1497 SEC503406CC0003340630C8DB3410AEC4AE84341017 YDECODE 0000 S326830C8DB341030C8DB341017 YDFTSTRSTRCPY0000 SCC002C340617 YDFTCHRSTRAPP0000 SEC523406CC0006340617 YDFTMULTIPLY 0000 S308DEDC7308B341017 YDFTSTRSTRAPP0000 S3262EC50AEC4ED980A16003C F147C S4F5FE7C8C5EC5A3406CC0010A4E0E4E03406CC001010A3E11026003DCC0001E7C8C5 F1515 SEC5A3406CC000FA4E0E4E0ED544F5FAEC4ED980AEC54108300001026003E30C8DB3410CC002C340617 YDFTCHRSTRCPY0000 SEC523406CC0006340617 YDFTMULTIPLY 0000 S308DED57308B341017 YDFTSTRSTRAPP0000 SCC002B340617 YDFTCHRSTRAPP0000 S326216003F F1539 S108300011026004030C8DB3410CC002C340617 YDFTCHRSTRCPY0000 SEC523406CC0006340617 YDFTMULTIPLY 0000 S308DED1E308B341017 YDFTSTRSTRAPP0000 S8D03022B2B17 YDFTSTRSTRAPP0000 S3262160041 F1572 S108300021026004230C8DB34108D03022C2D17 YDFTSTRSTRCPY0000 SEC523406CC0006340617 YDFTMULTIPLY 0000 S308DECE5308B341017 YDFTSTRSTRAPP0000 S3262160043 F15AB S108300031026004430C8DB34108D04032C2D2D17 YDFTSTRSTRCPY0000 SEC523406CC0006340617 YDFTMULTIPLY 0000 S308DECB3308B341017 YDFTSTRSTRAPP0000 S3262160045 F15DC S108300041026004630C8DB3410CC002C340617 YDFTCHRSTRCPY0000 SEC523406CC0006340617 YDFTMULTIPLY 0000 S308DEC82308B341017 YDFTSTRSTRAPP0000 S3262160047 F160E S108300051026004830C8DB34108D0302422C17 YDFTSTRSTRCPY0000 SEC523406CC0006340617 YDFTMULTIPLY 0000 S308DEC51308B341017 YDFTSTRSTRAPP0000 S3262160049 F163F S108300061026004A30C8DB34108D0302412C17 YDFTSTRSTRCPY0000 SEC523406CC0006340617 YDFTMULTIPLY 0000 S308DEC20308B341017 YDFTSTRSTRAPP0000 S326216004B F1670 S108300071026004C4F5FAEC4E7981416004D F16A1 S108300081026004EEC58AEC4ED980ACC0002EDD804CC0001E79810EC980A3406CC00013406308D YLBHD 0000 S3410CC0040340617 YDFTSTRCTLOAD0000 S30C8DB3410AEC4AE84341017 YGETASYM 0000 S32E84830C8DB341030C8DB341017 YDFTSTRSTRCPY0000 SCC002C340617 YDFTCHRSTRAPP0000 SEC523406CC0006340617 YDFTMULTIPLY 0000 S308DEB99308B341017 YDFTSTRSTRAPP0000 S326216004F F16B3 S1083000910260050CC0003EDD804ECC8C1AEC4ED980ACC0001E79810EC980A3406CC00023406308D YDTHD 0000 S3410CC0040340617 YDFTSTRCTLOAD0000 S30C8DB3410AEC4AE84341017 YGETASYM 0000 S32E84830C8DB341030C8DB341017 YDFTSTRSTRCPY0000 SCC002C340617 YDFTCHRSTRAPP0000 SEC523406CC0006340617 YDFTMULTIPLY 0000 S308DEB23308B341017 YDFTSTRSTRAPP0000 S3262160051 F1728 S1083000A102600524F5FAEC4E79814160053 F179E S1083000B1026005430C8DB34108D0302442C17 YDFTSTRSTRCPY0000 SEC523406CC0006340617 YDFTMULTIPLY 0000 S308DEAE0308B341017 YDFTSTRSTRAPP0000 S3262160055 F17B0 S1083000C10260056EC583406CC007F10A3E1102C0057EC583406CC01003406EC62A3E13262ED58 F17EF SCC0002EDD804AEC4EC88163406EC58E3E13406CC0001E3E1ED980ACC0001E79810EC980A3406CC00013406308D YLBHD 0000 S3410CC0040340617 YDFTSTRCTLOAD0000 S30C8DB3410AEC4AE84341017 YGETASYM 0000 S32E84830C8DB341030C8DB341017 YDFTSTRSTRCPY0000 S8D05042C50435217 YDFTSTRSTRAPP0000 S3262CC0001AEC4E79812160058 F17E1 S1083000D10260059CC0003EDD804AEC4EC88163406ECC8C1E3E13406CC0002E3E1ED980ACC0001E79810EC980A3406CC00023406308D YLBHD 0000 S3410CC0040340617 YDFTSTRCTLOAD0000 S30C8DB3410AEC4AE84341017 YGETASYM 0000 S32E84830C8DB341030C8DB341017 YDFTSTRSTRCPY0000 S8D05042C50435217 YDFTSTRSTRAPP0000 S3262CC0001AEC4E7981216005A F1876 S1083000E1026005B4F5FAEC4E7981416005C F18ED S1083000F1026005DEC5A3406CC009F10A3E11026005EECC8C1AEC4ED980ACC0003EDD804EC980A3406CC00023406308D YLBHD 0000 S3410CC0040340617 YDFTSTRCTLOAD0000 S30C8DB3410AEC4AE84341017 YGETASYM 0000 S32E848CC0001AEC4E7981016005F F190D S4F5FAEC4E79814 F194F F18FF F18F7 F18E5 F186E F17D9 F17A8 F1796 F1720 F16AB F1699 F1668 F1637 F1606 F15D4 F15A3 F156A SE6C8C55D1027006030C8C63410CC005B340617 YDFTCHRSTRCPY0000 S30C8DB341017 YDFTSTRSTRAPP0000 SCC005D340617 YDFTCHRSTRAPP0000 S326230C8DB341030C8C6341017 YDFTSTRSTRCPY0000 S32624F5FAEC4E79812EC5434064F5F1F025F10ACE126015C4F3406EC543406CC00021F025F10ACE126015CAAE0EAE05D102700614F5FE79814 F19BE F195E F14F9 S30D802341030C8DB341017 YDFTSTRSTRCPY0000 S3262 F1449 F1441 F1363 F124D F1205 F11BE F1176 F112F F10D9 F106C SAEC4E698144353C30001C300015D102700624F5FEDD804 F19E4 SAEC4EC88163406ECD804E3E13406CC00013406EC62A3E13262ED8816325C35C034403364AEC43098083410AEC430123410AEC4341017F3C63266AEC4EC980834063098063410AEC43088B23410AEC4341017F5733268AEC43098023410AEC43012341017 YDFTSTRSTRCPY0000 SAEC43088B2341017 YDFTSTRSTRAPP0000 S3262325C35C034403364AEC4EC980C3406CC00BF1F025F10ACE12C015C5D10270063EC183406CC000E1F025F10ACE126015C5D1027006430980434108D04034C445317 YDFTSTRSTRCPY0000 S3262160065 F1A90 SAEC4EC183406CC000F1F025F10ACE126015C4F3406EC1A3406CC000C1F025F10ACE127015CA4E0E4E05D1027006630980434108D040353545317 YDFTSTRSTRCPY0000 S3262160067 F1AD1 S4F5FAEC4E79814 F1AE4 F1AA3 S160068 F1A7B SAEC4EC980C3406CC007F1F025F10ACE12C015C5D10270069EC183406CC000310A3E11026006A30980434108D0504434D504417 YDFTSTRSTRCPY0000 S326216006B F1B14 SAEC4EC183406CC000C10A3E11026006C30980434108D0504434D505917 YDFTSTRSTRCPY0000 S326216006D F1B38 SAEC4EC183406CC000E10A3E11026006E30980434108D04034C445917 YDFTSTRSTRCPY0000 S326216006F F1B5C SAEC4EC183406CC000F1F025F10ACE126015C4F3406EC1A3406CC00081F025F10ACE127015CA4E0E4E05D1027007030980434108D040353545917 YDFTSTRSTRCPY0000 S3262160071 F1B9D S4F5FAEC4E79814 F1BB0 F1B6F F1B4C F1B28 S160072 F1B06 SAEC4EC980C3406CC003F10A3E11026007330980434108D05045357493217 YDFTSTRSTRCPY0000 S3262160074 F1BCB SAEC4EC980C3406CC00201F025F10ACE12C015C4F3406EC980C3406CC00301F025F10ACE12F015CA4E0E4E05D102700753098023410CC004C340617 YDFTCHRSTRCPY0000 SAEC4309804341017 YDFTSTRSTRAPP0000 S3262AEC43098043410AEC4309802341017 YDFTSTRSTRCPY0000 S3262160076 F1C0F S4F5FAEC4E79814 F1C3E F1BDF F1BBA F1AEE SAEC4E698145D10270077341017FDB53262 F1C4F S325C35C034403364AEC4EC980C3406CC007F1F025F10ACE12C015C4F3406EC980C3406CC00C01F025F10ACE12F015CA4E0E4E05D10270078EC183406CC000310A3E11026007930980434108D0504434D505517 YDFTSTRSTRCPY0000 S326216007A F1C9C SAEC4EC183406CC000C10A3E11026007B30980434108D0504434D505317 YDFTSTRSTRCPY0000 S326216007C F1CC0 S4F5FAEC4E79814 F1CD4 F1CB0 S16007D F1C8E SAEC4EC980C3406CC003F10A3E11026007E30980434108D05045357493317 YDFTSTRSTRCPY0000 S326216007F F1CEF S4F5FAEC4E79814 F1D03 F1CDE SAEC4E698145D10270080341017FCF03262 F1D14 S325C35C0 F0DE7 S3440336432E8B6CC0001E7D8144F5FEDD80E4F5FEDD806305234108D010017 YDFTSTRSTRCPY0000 S3262327E30C8163410AEC4341017F03632643506EDD80CECD80CED54ECD80C3406CC00101F025F10ACE126015C5D10270081CC0001EDD80E F1D72 SECD80C3406CC00111F025F10ACE126015C5D10270082CC0002EDD80E F1D8E SECD80E34064F5F10A3E1102C0083327E30C8163410AEC4341017EFD632643506EDD80C F1DA2 SECD80C3406CC00041F025D350627064456313F26FAED5AECD80C3406CC000FA4E0E4E0ED58EC5A3406CC0001E3E1308DE41FE68B4F3406CC00303406EC62A3E13262ED56EC563406CC0051340617 YDFTMULTIPLY 0000 S308DE217308B3410EC583406CC0004340617 YDFTMULTIPLY 0000 S3406CC0001E3E13406CC0004340630D8043410AEC4341017 YSTRINGCOPY 0000 S326ACC000430D804E68B4F3406CC002010A3E1102600844F5F3406CC00031F02350630D804308B1F20E784 F1E4C SECD80C3406CC001C10A3E11026008530D80434108D0605414E44434317 YDFTSTRSTRCPY0000 S3262 F1E6F SECD80C3406CC008D10A3E11026008630D80434108D040342535217 YDFTSTRSTRCPY0000 S3262 F1E90 SECD80C3406CC00871F025F10ACE126015C4F3406ECD80C3406CC008F1F025F10ACE126015CAAE0EAE04F3406ECD80C3406CC00C71F025F10ACE126015CAAE0EAE04F3406ECD80C3406CC00CD1F025F10ACE126015CAAE0EAE04F3406ECD80C3406CC00CF1F025F10ACE126015CAAE0EAE05D1027008730D80434108D040346 S434217 YDFTSTRSTRCPY0000 S3262 F1F16 SEC5A3406CC00041F025F10ACE126015C4F3406EC583406CC000E1F025F10ACE127015CA4E0E4E05D1027008830D804341030D804341017 YDFTSTRSTRCPY0000 SCC0041340617 YDFTCHRSTRAPP0000 S3262 F1F52 SEC5A3406CC00051F025F10ACE126015C4F3406EC583406CC000E1F025F10ACE127015CA4E0E4E05D1027008930D804341030D804341017 YDFTSTRSTRCPY0000 SCC0042340617 YDFTCHRSTRAPP0000 S3262 F1F95 SECD80C3406CC005E1F025F10ACE126015C4F3406ECD80C3406CC004E1F025F10ACE126015CAAE0EAE05D1027008A30D80434108D040346434217 YDFTSTRSTRCPY0000 S3262 F1FDA SCC000130D804E68B4F3406CC004610A3E11026008B4F5FE7D814 F1FFF SCC000130D804E68B4F3406CC004610A3E11027008CECD80E34064F5F10A3E11026008D344017F9DD326216008E F2027 SECD80E3406CC000110A3E11026008F344017FA1A3262160090 F2040 S344017FC0B3262 F204A F2031 F2019 SE6D8144353C30001C300015D1027009130D80434108D040346434217 YDFTSTRSTRCPY0000 S3262EC543406CC00013406308D YLBHD 0000 S3410CC0040340617 YDFTSTRCTLOAD0000 S30D8023410AEC4341017 YGETASYM 0000 S32E848EC54EDD80C4F5FEDD80ACC0001EDD8064F5FEDD80E160092 F2061 SECD8063406CC0001E3E1EDD806ECD80E34064F5F10A3E1102C0093ECD8063406CC0001E3E1EDD806 F20CA F20AF S325C35C0 PP0133 0000 0 S3410CC0040340617 YDFTSTRCTLOAD0000 S30D8023410AEC4341017 YGETASYM 000PROGRAM LOADER; %N (*THIS PROGRAM USES THE TCELOAD TO LOAD ML PROGRAMS THAT WOULD EXTEND BEYOND THE 32K BOUNDRY. IT LOADS THE PROGRAM DSTRAC32.EXE *) VAR X:INTEGER;NAME:STRING; BEGIN NAME:='DSTRAC32EXE'; FOR X:=1 TO 11 DO BYTE[$8A0+X-1]:=ORD(NAME[X]); END. LOADER; %N (*THIS PROGRAM USES THE TCELOAD TO LOAD ML PROGRAMS THAT WOULD EXTEND BEYOND THE 32K BOUNDRY. IT LOADS THE PROGRAM DSTRAC32.EXE *) VAR X:INTEGER;NAME:STRING; BEGIN NAME:='DSTRAC32EXE'; FOR X:=1 TO 11 DO BYTE[$8A0+X-1]:=ORD(NAME[X]˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙%N (*********************************************** * * DEFT Pascal Version 3.0 * (C) Copyright 1984 DEFT Systems, Inc. * Standard Run-time Package * ************************************************) INTERFACE DFT_STANDARD; FUNCTION ENCODE (VAR ASCII : STRING) : INTEGER; PROCEDURE DECODE (NUMBER, SIZE : INTEGER; VAR ASCII : STRING); PROCEDURE HEX (ADDRESS : INTEGER; BYTECOUNT : INTEGER; VAR ASCII : STRING); PROCEDURE STRINGCOPY (VAR SOURCE : STRING; INDEX, LENGTH : INTEGER; VAR DESTINATION : STRING); PROCEDURE STRINGDELETE (VAR SOURCE : STRING; INDEX, LENGTH : INTEGER); PROCEDURE STRINGINSERT (VAR SOURCE : STRING; VAR DESTINATION : STRING; INDEX : INTEGER); FUNCTION STRINGPOS (VAR IMAGE, TARGET : STRING) : INTEGER; PROCEDURE PAGE (VAR FILEVAR : TEXT); FUNCTION EOF (VAR FILEVAR : TEXT) : BOOLEAN; FUNCTION FILEERROR (VAR FILEVAR : TEXT) : INTEGER; PROCEDURE CLOSE (VAR FILEVAR : TEXT); PROCEDURE CURSOR (POSITION : INTEGER); FUNCTION PEEK (SEG : INTEGER; ADR : INTEGER) : INTEGER; PROCEDURE POKE (SEG, ADR, DATA : INTEGER); END; %L XT) : BOOLE˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙