From 29afb2e6078883dc0ec5ab4f066af55e5cced036 Mon Sep 17 00:00:00 2001 From: dschmenk Date: Tue, 16 Aug 2016 18:26:32 -0700 Subject: [PATCH 1/3] Use DOS order for sectors. Will detect proper oder shortly --- src/inc/fileio.plh | 16 +++- src/libsrc/fileio.pla | 9 +++ src/makefile | 7 +- src/samplesrc/fatget.pla | 4 +- src/samplesrc/fatput.pla | 147 ++++++++++++++++++++++++++++++++++ src/samplesrc/fatreaddsk.pla | 24 ++++-- src/samplesrc/fatwritedsk.pla | 25 ++++-- 7 files changed, 218 insertions(+), 14 deletions(-) create mode 100644 src/samplesrc/fatput.pla diff --git a/src/inc/fileio.plh b/src/inc/fileio.plh index d8e107a..46c3841 100644 --- a/src/inc/fileio.plh +++ b/src/inc/fileio.plh @@ -22,9 +22,23 @@ import fileio // const sysbuf = $0800 // + // File info struc + struc t_fileinfo + byte file_access + byte file_type + word aux_type + byte storage_type + word blocks_used + word mod_date + word mod_time + word create_date + word create_time + end + // // File functions // - predef getpfx, setpfx, open, close, read, write, create, destroy, newline + predef getpfx, setpfx, getfileinfo + predef open, close, read, write, create, destroy, newline // // Block level I/O functions // diff --git a/src/libsrc/fileio.pla b/src/libsrc/fileio.pla index 198664c..91860c6 100644 --- a/src/libsrc/fileio.pla +++ b/src/libsrc/fileio.pla @@ -23,6 +23,15 @@ export def setpfx(path) perr = syscall($C6, @params) return path end +export def getfileinfo(path, fileinfo) + byte params[18] + + params.0 = 10 + params:1 = path + perr = syscall($C4, @params) + memcpy(fileinfo, @params + 3, 15) + return perr +end export def open(path, buf) byte params[6] diff --git a/src/makefile b/src/makefile index cb64096..36ec4bb 100644 --- a/src/makefile +++ b/src/makefile @@ -14,6 +14,7 @@ SPIPORT = SPIPORT\#FE1000 SDFAT = SDFAT\#FE1000 FATCAT = FATCAT\#FE1000 FATGET = FATGET\#FE1000 +FATPUT = FATPUT\#FE1000 FATWDSK = FATWRITEDSK\#FE1000 FATRDSK = FATREADDSK\#FE1000 FILEIO = FILEIO\#FE1000 @@ -61,7 +62,7 @@ TXTTYPE = .TXT #SYSTYPE = \#FF2000 #TXTTYPE = \#040000 -all: $(PLASM) $(PLVM) $(PLVM01) $(PLVM02) $(PLVM03) $(CMD) $(ARGS) $(MEMMGR) $(MEMTEST) $(FIBER) $(SB) $(MON) $(ROD) $(SIEVE) $(UTHERNET2) $(UTHERNET) $(ETHERIP) $(INET) $(DHCP) $(HTTPD) $(ROGUE) $(ROGUEMAP) $(ROGUECOMBAT) $(ROGUEIO) $(HGR1) $(TONE) $(DGR) $(DGRTEST) $(FILEIO) $(PORTIO) $(SPIPORT) $(SDFAT) $(FATCAT) $(FATGET) $(FATWDSK) $(FATRDSK) +all: $(PLASM) $(PLVM) $(PLVM01) $(PLVM02) $(PLVM03) $(CMD) $(ARGS) $(MEMMGR) $(MEMTEST) $(FIBER) $(SB) $(MON) $(ROD) $(SIEVE) $(UTHERNET2) $(UTHERNET) $(ETHERIP) $(INET) $(DHCP) $(HTTPD) $(ROGUE) $(ROGUEMAP) $(ROGUECOMBAT) $(ROGUEIO) $(HGR1) $(TONE) $(DGR) $(DGRTEST) $(FILEIO) $(PORTIO) $(SPIPORT) $(SDFAT) $(FATCAT) $(FATGET) $(FATPUT) $(FATWDSK) $(FATRDSK) clean: -rm *FE1000 *FF2000 $(PLASM) $(PLVM) $(PLVM01) $(PLVM02) $(PLVM03) @@ -186,6 +187,10 @@ $(FATGET): samplesrc/fatget.pla $(PLVM02) $(PLASM) ./$(PLASM) -AM < samplesrc/fatget.pla > samplesrc/fatget.a acme --setpc 4094 -o $(FATGET) samplesrc/fatget.a +$(FATPUT): samplesrc/fatput.pla $(PLVM02) $(PLASM) + ./$(PLASM) -AM < samplesrc/fatput.pla > samplesrc/fatput.a + acme --setpc 4094 -o $(FATPUT) samplesrc/fatput.a + $(FATWDSK): samplesrc/fatwritedsk.pla $(PLVM02) $(PLASM) ./$(PLASM) -AM < samplesrc/fatwritedsk.pla > samplesrc/fatwritedsk.a acme --setpc 4094 -o $(FATWDSK) samplesrc/fatwritedsk.a diff --git a/src/samplesrc/fatget.pla b/src/samplesrc/fatget.pla index 2ad90a4..81d9958 100644 --- a/src/samplesrc/fatget.pla +++ b/src/samplesrc/fatget.pla @@ -103,7 +103,7 @@ def bigFatRead(buf, len) fatLen = len fin fatLen = sdFAT:fileRead(buf, fatLen) - if fatLen > 0 and fatLen <= 512 + if fatLen > 0 xferLen = xferLen + fatLen len = len - fatLen buf = buf + fatLen @@ -174,7 +174,7 @@ end arg = argNext(argFirst) if ^arg mkProName(arg, @proname, @protype, @proaux) - puts(arg);puts("==>");puts(@proname) + puts(arg);puts(" ==> ");puts(@proname) putc(' ');putByte(protype);putc(',');putWord(proaux);putln fatCopyFrom(arg, @proname, protype, proaux) else diff --git a/src/samplesrc/fatput.pla b/src/samplesrc/fatput.pla new file mode 100644 index 0000000..d16d690 --- /dev/null +++ b/src/samplesrc/fatput.pla @@ -0,0 +1,147 @@ +include "inc/cmdsys.plh" +include "inc/fileio.plh" +include "inc/args.plh" +include "inc/sdfat.plh" + +const COPY_BUF_SIZE = 8192 // 8K +const LOWER_DIFF = 'a' - 'A' + +word arg +byte[24] fatName + +def putByte(val) + byte c + c = ((val >> 4) & $0F) + '0' + if c > '9' + c = c + 7 + fin + putc(c) + c = (val & $0F) + '0' + if c > '9' + c = c + 7 + fin + return putc(c) +end + +def hexChars(cptr, b) + byte h + + h = ((b >> 4) & $0F) + '0' + if h > '9' + h = h + 7 + fin + ^cptr = h + cptr++ + h = (b & $0F) + '0' + if h > '9' + h = h + 7 + fin + ^cptr = h +end + +def mkFatName(proName, fatName) + word l, n + byte fileinfo[t_fileinfo] + + if !getfileinfo(proName, @fileinfo) + // + // Scan backward looking for dir seperator + // + l = ^proName + for n = l downto 1 + if ^(proName + n) == '/' + break + fin + next + memcpy(fatName + 1, proName + 1 + n, l - n) + ^fatName = l - n + 7 + // + // Build CiderPress style extension + // + n = fatName + ^fatName - 6 + ^n = '#' + hexChars(n + 1, fileinfo.file_type) + hexChars(n + 3, fileinfo.aux_type.1) + hexChars(n + 5, fileinfo.aux_type) + else + // + // Error getting info on file + // + puts("Error reading "); puts(proName); putln + fin +end + +def getYN(prompt) + byte yn + + puts(prompt) + yn = getc + return yn == 'Y' or yn == 'y' +end + +def bigFatWrite(buf, len) + word xferLen, fatLen + + xferLen = 0 + repeat + if len > MAX_FAT_BUF_SIZE + fatLen = MAX_FAT_BUF_SIZE + else + fatLen = len + fin + fatLen = sdFAT:fileWrite(buf, fatLen) + if fatLen > 0 + xferLen = xferLen + fatLen + len = len - fatLen + buf = buf + fatLen + else + len = 0 + fin + until len == 0 + return xferLen +end + +def fatCopyTo(src, dst) + word copyBuf, copyLen, freeAddr + byte ref + + copyBuf = heapallocalign(COPY_BUF_SIZE, 8, @freeAddr) + if not copyBuf + puts("Not enough free memory!\n"); putln + return -1 + fin + ref = open(src, sysbuf) + if not ref + puts("Error opening file: "); puts(src); putln + puts("Open file error: "); putByte(perr); putln + return -1 + fin + // + // Copy file over in big chunks + // + if sdFAT:fileOpen(dst, O_READ | O_WRITE | O_CREAT) + repeat + copyLen = read(ref, copyBuf, COPY_BUF_SIZE) + if copyLen + copyLen = bigFatWrite(copyBuf, copyLen) + if !copyLen + fin + fin + until copyLen == 0 + sdFAT:fileClose() + else + puts("Error opening FAT file:"); puts(dst); putln + fin + close(ref) + heaprelease(freeAddr) +end + +arg = argNext(argFirst) +if ^arg + mkFatName(arg, @fatName) + puts(arg); puts(" ==> "); puts(@fatName); putln + fatCopyTo(arg, @fatName) +else + puts("Usage: +FATPUT "); putln +fin +done \ No newline at end of file diff --git a/src/samplesrc/fatreaddsk.pla b/src/samplesrc/fatreaddsk.pla index 2d0264d..7822f6f 100644 --- a/src/samplesrc/fatreaddsk.pla +++ b/src/samplesrc/fatreaddsk.pla @@ -12,6 +12,10 @@ const LOWER_DIFF = 'a' - 'A' word arg, image byte unit = DRIVE1 +// +// DOS to ProDOS sector ordering +// +byte[] secOrder = $0,$E,$D,$C,$B,$A,$9,$8,$7,$6,$5,$4,$3,$2,$1,$F def putb(b) byte c @@ -75,6 +79,14 @@ def getYN(prompt) return yn == 'Y' or yn == 'y' end +def trkSecToBlk(bufSec, bufBlk) + byte sector + + for sector = 0 to 15 + memcpy(bufBlk + (sector << 8), bufSec + (secOrder[sector] << 8), 256) + next +end + def bigFatWrite(buf, len) word xferLen, fatLen @@ -98,14 +110,15 @@ def bigFatWrite(buf, len) end def fatReadImage(src, drv) - word copyBuf, copyLen, freeAddr + word inBuf, outBuf, copyLen, freeAddr word blocknum, bufblk - copyBuf = heapallocalign(COPY_BUF_SIZE, 8, @freeAddr) - if not copyBuf + inBuf = heapallocalign(COPY_BUF_SIZE * 2, 8, @freeAddr) + if not inBuf puts("Not enough free memory!\n"); putln return -1 fin + outBuf = inBuf + COPY_BUF_SIZE // // Copy FAT image over one track at a time // @@ -116,13 +129,14 @@ def fatReadImage(src, drv) ^$24=^$20 // Move cursor to left edge puts("Reading blocks: "); puti(blocknum) for bufblk = 0 to COPY_BLK_CNT - if readblock(drv, copyBuf + (bufblk << 9), blocknum + bufblk) + if readblock(drv, inBuf + (bufblk << 9), blocknum + bufblk) puts("Read disk error: $"); putb(perr); putln break fin next fin - copyLen = bigFatWrite(copyBuf, COPY_BUF_SIZE) + trkSecToBlk(inBuf, outBuf) + copyLen = bigFatWrite(outBuf, COPY_BUF_SIZE) if copyLen <> COPY_BUF_SIZE puts("Write image file error\n"); fin diff --git a/src/samplesrc/fatwritedsk.pla b/src/samplesrc/fatwritedsk.pla index 31e7832..376d74d 100644 --- a/src/samplesrc/fatwritedsk.pla +++ b/src/samplesrc/fatwritedsk.pla @@ -13,6 +13,11 @@ const LOWER_DIFF = 'a' - 'A' word arg, image byte unit = DRIVE1 +// +// DOS to ProDOS sector ordering +// +byte[] secOrder = $0,$E,$D,$C,$B,$A,$9,$8,$7,$6,$5,$4,$3,$2,$1,$F + def putb(b) byte c c = ((b >> 4) & $0F) + '0' @@ -75,6 +80,14 @@ def getYN(prompt) return yn == 'Y' or yn == 'y' end +def trkSecToBlk(bufSec, bufBlk) + byte sector + + for sector = 0 to 15 + memcpy(bufBlk + (sector << 8), bufSec + (secOrder[sector] << 8), 256) + next +end + def bigFatRead(buf, len) word xferLen, fatLen @@ -98,27 +111,29 @@ def bigFatRead(buf, len) end def fatWriteImage(src, drv) - word copyBuf, copyLen, freeAddr + word inBuf, outBuf, copyLen, freeAddr word blocknum, bufblk - copyBuf = heapallocalign(COPY_BUF_SIZE, 8, @freeAddr) - if not copyBuf + outBuf = heapallocalign(COPY_BUF_SIZE * 2, 8, @freeAddr) + if not outBuf puts("Not enough free memory!\n"); putln return -1 fin + inBuf = outBuf + COPY_BUF_SIZE // // Copy FAT image over one track at a time // if sdFAT:fileOpen(src, O_READ) if !drv; putc(7); fin for blocknum = 0 to 279 step COPY_BLK_SIZE - copyLen = bigFatRead(copyBuf, COPY_BUF_SIZE) + copyLen = bigFatRead(inBuf, COPY_BUF_SIZE) if copyLen == COPY_BUF_SIZE if drv ^$24=^$20 // Move cursor to left edge puts("Writing blocks: "); puti(blocknum) + trkSecToBlk(inBuf, outBuf) for bufblk = 0 to COPY_BLK_CNT - if writeblock(drv, copyBuf + (bufblk << 9), blocknum + bufblk) + if writeblock(drv, outBuf + (bufblk << 9), blocknum + bufblk) puts("Write disk error: $"); putb(perr); putln break fin From 10618711b861905824b233884808e246f85c5197 Mon Sep 17 00:00:00 2001 From: dschmenk Date: Tue, 16 Aug 2016 18:53:44 -0700 Subject: [PATCH 2/3] Use file extension for sector order --- src/samplesrc/fatreaddsk.pla | 33 ++++++++++++++++++++++++++++----- src/samplesrc/fatwritedsk.pla | 33 ++++++++++++++++++++++++++++----- 2 files changed, 56 insertions(+), 10 deletions(-) diff --git a/src/samplesrc/fatreaddsk.pla b/src/samplesrc/fatreaddsk.pla index 7822f6f..089f213 100644 --- a/src/samplesrc/fatreaddsk.pla +++ b/src/samplesrc/fatreaddsk.pla @@ -9,9 +9,15 @@ const COPY_BLK_CNT = COPY_BLK_SIZE-1 const DRIVE1 = $60 // drive 1, slot 6 const DRIVE2 = $D0 // drive 2, slot 6 const LOWER_DIFF = 'a' - 'A' +// +// Track sector order +// +const ORDER_DOS = 0 +const ORDER_PRODOS = 1 word arg, image byte unit = DRIVE1 +byte order // // DOS to ProDOS sector ordering // @@ -109,7 +115,7 @@ def bigFatWrite(buf, len) return xferLen end -def fatReadImage(src, drv) +def fatReadImage(src, drv, order) word inBuf, outBuf, copyLen, freeAddr word blocknum, bufblk @@ -118,7 +124,11 @@ def fatReadImage(src, drv) puts("Not enough free memory!\n"); putln return -1 fin - outBuf = inBuf + COPY_BUF_SIZE + if order == ORDER_DOS + outBuf = inBuf + COPY_BUF_SIZE + else + outBuf = inBuf + fin // // Copy FAT image over one track at a time // @@ -135,7 +145,9 @@ def fatReadImage(src, drv) fin next fin - trkSecToBlk(inBuf, outBuf) + if order == ORDER_DOS + trkSecToBlk(inBuf, outBuf) + fin copyLen = bigFatWrite(outBuf, COPY_BUF_SIZE) if copyLen <> COPY_BUF_SIZE puts("Write image file error\n"); @@ -174,8 +186,19 @@ if ^arg else puts("Speed test writing 143K to SD card"); fin - if getYN("\nContinue? (Y/N)") - fatReadImage(image, unit) + // + // Figure sector ordering from filename + // + puts("\nUsing ") + if charUpper(^(image + ^image)) == 'O' and charUpper(^(image + ^image - 1)) == 'P' + order = ORDER_PRODOS + puts("ProDOS") + else + order = ORDER_DOS + puts("DOS 3.3") + fin + if getYN(" order. Continue? (Y/N)") + fatReadImage(image, unit, order) fin else puts("Read DSK image from floppy disk drive\n") diff --git a/src/samplesrc/fatwritedsk.pla b/src/samplesrc/fatwritedsk.pla index 376d74d..2c786af 100644 --- a/src/samplesrc/fatwritedsk.pla +++ b/src/samplesrc/fatwritedsk.pla @@ -9,9 +9,15 @@ const COPY_BLK_CNT = COPY_BLK_SIZE-1 const DRIVE1 = $60 // drive 1, slot 6 const DRIVE2 = $D0 // drive 2, slot 6 const LOWER_DIFF = 'a' - 'A' +// +// Track sector order +// +const ORDER_DOS = 0 +const ORDER_PRODOS = 1 word arg, image byte unit = DRIVE1 +byte order // // DOS to ProDOS sector ordering @@ -110,7 +116,7 @@ def bigFatRead(buf, len) return xferLen end -def fatWriteImage(src, drv) +def fatWriteImage(src, drv, order) word inBuf, outBuf, copyLen, freeAddr word blocknum, bufblk @@ -119,7 +125,11 @@ def fatWriteImage(src, drv) puts("Not enough free memory!\n"); putln return -1 fin - inBuf = outBuf + COPY_BUF_SIZE + if order == ORDER_DOS + inBuf = outBuf + COPY_BUF_SIZE + else + inBuf = outBuf + fin // // Copy FAT image over one track at a time // @@ -131,7 +141,9 @@ def fatWriteImage(src, drv) if drv ^$24=^$20 // Move cursor to left edge puts("Writing blocks: "); puti(blocknum) - trkSecToBlk(inBuf, outBuf) + if order == ORDER_DOS + trkSecToBlk(inBuf, outBuf) + fin for bufblk = 0 to COPY_BLK_CNT if writeblock(drv, outBuf + (bufblk << 9), blocknum + bufblk) puts("Write disk error: $"); putb(perr); putln @@ -176,8 +188,19 @@ if ^arg else puts("Speed test reading 143K from SD card"); fin - if getYN("\nContinue? (Y/N)") - fatWriteImage(image, unit) + // + // Figure sector ordering from filename + // + puts("\nUsing ") + if charUpper(^(image + ^image)) == 'O' and charUpper(^(image + ^image - 1)) == 'P' + order = ORDER_PRODOS + puts("ProDOS") + else + order = ORDER_DOS + puts("DOS 3.3") + fin + if getYN(" order. Continue? (Y/N)") + fatWriteImage(image, unit, order) fin else puts("Write DSK image to floppy disk drive\n") From 10c37a2e8adc5f714fc6ba9c18a2e8f2dd59838e Mon Sep 17 00:00:00 2001 From: David Schmenk Date: Thu, 18 Aug 2016 08:26:52 -0700 Subject: [PATCH 3/3] SDAFAT tools disk image --- SDFAT.PO | Bin 0 -> 143360 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100755 SDFAT.PO diff --git a/SDFAT.PO b/SDFAT.PO new file mode 100755 index 0000000000000000000000000000000000000000..9996f265b44d4abe4a0f56f4f38ee0c365f86038 GIT binary patch literal 143360 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]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%0D|m^NhwDzUc=A#HnSR^i%d&RN3zHYqYQP*F3h z>Hb+k>TQ#yaObqFnpt)hX|^ejKn-$i_q~%|{6JfAURzV~3vI<4+KM-|75}Ae^VIb} zYg_+P+xqgh_1oJla~HMfq*0i@SGKqpwIr{sl%n{~R!KKFXNbown0>JPFYwhr@2g+y zt6zuq&46o%b7pLwz5c-#N!u){{dzmL0rZyd9=+|~GHdbn7Ju)+yFqwQh`ulsN#7X) z8BgM{LHW?Kg?Jg|vTL`n(2KXbKD!!&`}V8!eUx>f%J%NC{^j5Jg@6Jsup z-W=LRL^VKqniU|V!byfVk5INzit%IwUqzg@jKSM$mCCD#Wq2i#l&xWGTH#WRz{Cn{ zEDnc-^FNI#j|o0V{Tc>7&t)+^Vn6US^~87{=Idfy6NHPDrslpFj~NF>ZsRvPahL&# z*xPbB{~S_*eT>@Zu@%NkZYCC6m`v*{4<@mHufhAws5FM7`5Jgh1f z*mebCu)Ggqo!0Gg6JBb-Nd>}h|Fg(!uXth%Z+E*n-XA5Y@g=JA&2S-j7HurxpNPRZ zX2O?5&~wZ$#B^)T7di7%4!miW9;nBwdN{$?EX`S8!1NX{UkUZ*uTMVo)ifsh@&F`g}(wdl< z$eLfI?>AEBjt6rQ+yhRWbE{&(Q1B0(gEa73g9m7`tF7i=MJIVK;}t;L*!rz8=ppGE zddQ+JFiY2*TIzJPMYx78BQ|VW)7p`z6z&_5+k6zF-lg&k$n;U+Ys!X3^hrWclt(UOD#65WigFKNnz~~=OWY@8 zg!3`BLy*-=F{u4=3|}4NnH!YW(^OiKtg_*xrR}ioi1X_Z2{Ow^kClv_u=ltioBkNy!I_q+rC0AySfOxZ@_t9_Zi4)vLt=B{c8xSL&e~y6{ zR~dsYItD@PG22;ZkMxi~-p;t1$NDpNJWhYzX=09x2=}NE0B)%@FDu z2)iDypB{u1HwQ=6#V(boMO0Ly5k2Og(uQn58{;{%`54-YjHa5CinJdOO8c=o3*q(; zbkL4q2VtoJ-J^7lBHpKBk~}p7jMxaW6dA9pr80i{8n%eAUu!#6q)R+?{m*vN6{lZ% z%61B(e$sXvqAvV4Wb?72)T3uH34xcj79$4%_-%;uE|bH+Pmi(M?&9B$0g0fGcg1Ww zPQ_hRyGk*BzzB@B{us;N#@4pIyFPNX96fdPaG&EUmGqAsTYHW<_I-T{Q3(G>j!zFA zK1rfRws+_w73m)}ApMZ~!IxZTPoMFX(QWk!_WjAb1*?y~>*T`13%_zUg1*7@74Nq1 zM~>A>S8`a=S+TaWj=%!YI)V;mU4-3>$V4PsQ?FP^R_5HS>5Jy1&!4|2ac<_EfpzwG zPdz`R{sVBpFd^mkiFf=15b^^F|0NtKmtQX@>jSFQ_=H5V(QgzdyA!=TIWLYpjQ8%0 z_DU0~?)2hK=Hzq!_auDRq0cy?PI(bpVxjTeoEPr}y74~Ec<-(|y$e%b@ZrzZU<-Be zwlD`-t8s}oZB1y2hWcT{y0uO%&NqL(HWYr>u$oXTXK;iMO6{{x_$oSEcEDy-H{lxv zu9?bxu5zD6@5Kd75PMw#Q+f=}hzn+pgD(43TR}@n%a)eKtxH<-Tc2yqYAtFlZFRNQ zwfb96wwAZ(+orW8x2+xIN)@3ehQ7PS4mZCRV8V@1b|j{7@aYj?M|w4ZC=+J3lw zSO?oNrsJ88mpV>%OgZqx0owtITx^Tl_q%-?_MO-lzW>Pn3;WmZe`Eg#`#;|w)qY2N zZu_s=aY|QZ>$5H+wtnYVCg&lO^RVrZ^N8&$Op~JRviTg|5AC+vj$uEr+ty!*TVLTf z0snWwT5OkB;{yP|i1(JR|Ei90b;syu9l(*M;(#jUc`V)P9GtcQlM-GCPs#PA-0w^I zx$=3AsJce3^lJi8M@(HCS1RI7x(nd{j<-0`NGCr#CnmW!a>8qLzHEM#6Gsf>#=sIe zrR34lF;g2J)Z0FJqs3-{<@8+`s5M<-gXa|8>L0hFbC0 zdp7RrF-xSjA+_I!ggyP@K!Q(qkN7R1wMQLXZ9`_j)?K>?_hT-yu_5DFUbiQF1JJ-KqD`T=6SZ0PF20^r()%)RNKV zIUWo-yEmffM$y@2+>ey=K9M;uB2bIKK5?H9L08}bN?qUqP)Bnbeyp(J$AfHWh*#qA z*W&;On*grxZSB!oA2#K5?>B7N;~*Ovj%zBUFok&WQn3945ZwEFHZ=GO9K^0F+^`34 z*;Yv5wR`*p%kvxHsu^TftuJ1r-tx@AM&AHE@p}L`ki4;Buyf+Y_y**Jx&nh~&9x01 zeYJanrF^DZ(M0>T*}74*Zln!uMsEdiHaCe(cYjSE?Gy$4M#5kYWkoO*Um57LDWDZg z`)&Oj#hSi~Z)M`hEX_hjWk&OkQ#K( z22qibZzne)@7p=}K+26WRHM>v9K?1#bD(4}f1owklsrV+y7VihwF9YZk5)9-DCq-L zeJi~QnL!$E%0NAXWl)7e``_j&CBKzz>mGm`Y7C_qZLfwSKSRb z1>YcOZ37+07>GXF8ztR6L3tfarirz_lJ2Hj@p|5kwj$?H5dNEK6#6?ezQrqAUV*(i z{U#<|C+hFyf0Md@1L)t#R$8dQ)cV>Q#8I_k+a7VKE6_7I25G9Kq@Hk*>!}TG7;gPy z4wG5H?KO7OvbAFW9vU}(%I&*3&i&Q6z4j(}V>!2_r*?O|SHuT8Fcy^?1Ui^@%GnQ1 z*QX@vf7xg2b{dfR+rL+$Q1QQ9rm_0-bnb|qRRexgKcclV3N_qehi zkm3btyN#PUyR%RKYoD#p+5c7ga}Ea8Q&d(c02^MvT>6#mh}DL#e|%-3$xb9XZzO%6vGNa=cjsMq|LDi} z{3P|>e=xd!Am=}a1Fp$8t<|`1uhn?*Yu5z;++qt`dwA_P?SIa^cFZe5A~htOkWhTk z9p8KpojZM|DRWjBf-|R^&1&U_kEzcL!Ofhl#(jYr-(a6fZwoZ0^yxWsr_Y}gNdthN z2l&j{+1l&TAv82U-JCvsL3-%i^tlVtbLnGd&Z3aa1rN;5RqpBZZdStP^su?}W|`+r zpGBYP3)5%PCqB|XUrj$HA2$7g+U}6K&ugi@Af#i}^9PA!ZV{CT1FU zBxV-3KK@~DU))?SCq9qc82=Pk68$u{HM)SiJ9Zs6B(|7KkNqQeOYA1DW0-@xb4&$y zWav0d79bxhTVz{kD4d3x9VGcVg}cyx&^1xeJz{Y9n2rqB+4C+!a_xU~p608u){=_}@z#fV!#VV7Y-F zfENYaffuDF)L)SNTvLh0)4vJkl?HYL1PP=Cdujj<-<3m~hgQ^tf=wdYuW+ldL?iaq zgbtKQehweV2=)Kg!yLb5BPBanMJ*O06xqf-HZ9P&-Y(JTYC@Yl7yqUb)S;2MJ)vSu zlg`suqrpczG!@n$K{T&hBSq;v7hKFzjZI^3>DGF7L)=c|W3dZERC$D~G^kcFc_g1T ze3r!I4v$_P!R3*~!R+f<+rO2iV+`ynHA;o#G5KL+mDbRdqz)EdqE!m3Rl&lmSi_FN z!qx~*$%|wS>Q$k6WK|eSYx30jI+7o5Xif?ps6JeQQjsLGJd9HhphGa9!7Yz4&xCQy zLpTE$XC6!Pm=uzhn;wgt6vF4;9Xr+>MUa%wWFkZO=hP3|qR$VnmU>r`q6sSJWLgP`GqpqlHT;ok&J8w5=o1pN*+ z1+f+kf?5Vazk^KxrKEYUw=~En+QbwRo_i!V*kRzl#Q=n($nqg*qh%!?VAnG=LfJ-g zz6^XLCy#lGg0K_>0kSeEg|WbkPWd$UCgcNY&&3*%BMwz6j7No#!B1oJnA|@Elk}7Z zb1s3LLROKj$$cmmHB-vCIE4&L9+NiKJRaSfyLxDTXkI999!3mnFbE9OavzH^qR56A zV{TrIF)ws6O0bmh%0Q4b4MgKn6jJAf8bX+-@`yQ-AgE$eI@zakh75%Fu}>k9Ux^zF zp`?)zh9Ek~C&psn)663w$^dvYkEEGH5Qh8#E}zNi8mR3OWyHN`fidac6r#yp8b|w? z%rdXTBk5^FLGIgeXy?=Up-Io=^Le3kR7K{g4eD8WzfJl50W@D^?9LrdWvGYS11^ z5e>~7ifYukTceG6L-S+uV)E1s9!y?L3gLonRFf=oPasGnI(BI8#i4+u*z|e2JUvtb zr^dJ(nitCCkH{O5pOBZ3KQ?cy#T-uZ#u|WbY|hyLLLg==W+IEh7-ul1(VkbWO3F*f z)2MU*9G@STr^z3Yqa_4s8pIMTW;emzz@(XnlO+HIf=Bao>by86X-w{8!;CpEAYVz; zQ<7sq8I;KrN+Apd9m$J%G@r`}!_$(_QB=@j@g$GS8;f!*W62#di~&F*O&VwhhoGWW zqG_UrR+cv^_uXN^@&j1&xTh4XdE81MLIV?W?neVH<_FN={6wH1JJ4;E4F*jd?QGiq zM+d8+)DBjI(2Z(h@)Gl6FrtirhxCulaRrtnnPW&E*n=Jfm(}XrDKSRK$DouD&=zT) zPgxXs6MG&+G89KzhWQR;nK?3;`;3;$LC*}pqQ^K$98@mHVI1awYg|ge8;8;(ayP~s z^MaE|7%?!b&^Icm{d~sIm_&lJ2aT%9wcm)c^8id%^Xh&J3o2Q`Fia8Roa z9Fwok*@OS@91f&oKf{J^Zc?XmtPkSVD$xMv#l-qdAs#z&xaZgVf$3L1sCogl!EG75xj3w!* zuY%-E%c|K+W@EH2nGMQUnE+v0nU_gxMv4??5Yw(VWr+zSt}^BPgydzSDHcOO$-A94 zb1)B@C736tVQw@`xGB#NyTqi%f2%eroJ1OUnt_2~%$q}}xIxNtegWpJnwb+q2-4>8 z=Fx#AGpKr?S~18qs{1WLeQMxmjWyo_-hnRM7^;Gmp&VqVdSy;q07(k72Z|vI!uhPR zRDE6tJ4(R@aU$>Ez!@Zjh1Kymtul2C7)h2e3StHC5(bT0X@qT)^97nX2v4Z-llzxZ zNU>0Jg3@iFX@8IYAoLPt(o1RgVw$47NLlD527PWxGz}ScuS|K;Yf!Bu%H&VYEQ|RS zl2QP)2m*7EBe~aTwF7d*EMd$~f?_H@fdJKWZ0?HD#yr-%2!&7W9fH41F*;Z04acOSOc5}5455!AJu!*{ zCZIIpk;rmXNiQE3{U~Nz`nZvY806$ps$*zS%{((KI%i)Xu@=gL4zbm>oVAw2L^p!q z3AD;ow>pxhQr_pxAQQua|HTe9<$7a`hKW?3t*96gDytK9Sf%nA^V8EOja7!R zKQ4E7FpJO$UuCW()=190fh0z9xwntbt%)_%( z%>o5KCWZ$oWX}j=PBJmvK9Kdt(Z-w+7;#ghl!Dhr<=#2Qn4=*<+d@&9Bgw=NoXrSQ z1O`%KDK$`g6PbB)2GvbsJqP_mW1!9OQSOl#Fo9~OtN?lVKgTceLoNR~9C(ZT{s1A- z9E<9jxpzFEP-lKYl2gl5Yn1iIudOC(jWgGw;@W+gZr+5rj?ieU+(UP;4L zAwsR^v?%&eS)?Er$%>7f8_g|F!R~cHr6iG+2qEoZCYmEKQV3JTk&+*is5O5eWX&5O zc4x!ZCjTt>Tk!S&eGPjTaQM$2+FECF41Mg#MuYHNz^Tb+jYtilj|E&P+1jwf%!ScH zN=QSR8XLr&4SVNsS|y0@&g1{A*x~;yo6}uSn8^)M!uSs@8XH>Dx$t1lz6QUUiy%82 zceXUo#18$h%!N ztOVcaTXQ$!_u#q@*DPH34`G#xZ(ea<8E5o^cnw& z)%{S_KNtrdR#W|d4~!juY*7Ex|Cq`@@86mQ6eH1~9tEF)!N{z_deU(3EVGu{d0|SF z>Nc!vzbAV!Y``U|+TB%Jt zSR10SBL{NWC9ENs!y3ZWt7ud`VhJ-eh&=ag&Y&3qR17>O91`J8gEJ7`Q38LeWtDb` z)(|!e#;TSvgu;_^8;oBpbK%aVDIsbU0&FnGs&l)!r)U8+E%&&_pqdm76nZs=C}x!w&Q`@=p<)26WGmbX2H}ZTm`jszDUDr}2EIO>maurC zhN13dtlODc@bKZ0ABqVEI~yP?FLe1(@*wpqE6Z2V4UZ&%^Fr0|tsK3Jy zDLCj8o>k>;*h(oz*qlfv#?E|d=_A0Ax9sty{L-hMdh)4B3O*}lU`R}`#EtrSvzbhc zOQ&%BlPi}#vFwRoC`E&Xf;G@G6Qk!L_xrFaErYNvkAcmwn&fG~o?Le{9N0SZVl)yy zNF6Zc>1LScfXrZ(w7u7>4AMsLN{ulODa`nuh7gJz9kL;?oZ2N=(@z}s&8Fag5Dzv- z!A)%t1$U6;L2i=8NX6eXKjN1E2*%071dl|XOT3dyyo<}d0>j})94$C8gum~;sR}cZ zO;g~D!`*r(M>%Uqp^@b%@=TD;K{UvvX)>GuAaC>ozk1{sODFO4zc$A`U3umvW;Hdv>MDk)W|OUhIsB|BA#C0a&TGLcc2+{LgZ)0hz@bC{7OKSlfzM!jYQ zLrU_Q@RHvnZ!L36iJci!@)zX2%iOl+ugKeibT7(uA*~zN3B*;bx+H|XZHqEppVMms1W5Y|D*|8-% z*>P(`maJ*PbpY2vTwS;h`z9+v^v?MPpsR+l`aX8#+nh_QATw=aaH)DjHn>1tk?r*>_h2Xkq+*qF_Y zAX|6r#^QV=+1rS<^(eA`ufH{&8;!RC8ygT9L$={VCVO`;;%*_k8u#z;?@GrZcjRsR z6ifa&+^tH1#$Y6Yh>d&abGK33ENG^Uy>6zB8!*!n|G}p6|08l{rDyyfmHVO4e-931 zvDE&X1ee&Mn17G`M_d0NVgrW27`b6bs+Xt->_|1WBdO&@y@%o0MrQ_W$?pV#%`^-q z4mQvU{tMQpVLDo1`KX`3esRz$gYolCtL%mihAe7$1f80}AnL}>avlR;By1-bREFE= zjymi$ZSLaY6VQQ@%(Q3zjXh)}0Z5tIt ztWy}Bq7`SHG6OQSe>k17b*c{iopX1SH3h#$Eu~NN;huBu_ivYbp1kKhm&iv%mNATl zZcW%!W9`)hC!6dv{?l9{l+AFDv4HCWQ%lWq@vQiwJs;B-Ss!U&^LZHX=FS;*;!plx zoAQ^X@I{jx7USyt%yt}6_A%!tD#rV0wZs#1F&2?xy z>cZWuL$Ba)7UFQeg?18kNfH%l#L;{O&9u>zM1C=@=E_(+zl!A=+|7fyo4v7Qz8q&V z3}-SDr*bysbJ2O!+gN@bC$k7A(?R{4?zsH-+|ju^sXsvZIo7|3cCl_ZuIP1~&|bGb zzt0_;JK#FGzoNgRx6wQ3J@z}q_DNhw6)q&eg&ZG`=W1~%qtTaXn?~CV-gtBD#@+uf zUB>ymAMV)b$#fT=hQP!jQT)eqdOsxo)9yG`l@-I1L%s5{Aqn0~HT*N_`-jEoV>%u3 zZz>taHV@uT$2S>s4gSd{1<@>%wtgV)(T6z=2jaFKW<7ccC(K5*q(|h!36rK~a@2+! zx6o+21F~f3#X1vCbDe2Ue6X27iES?XV6#_f_DY&LzCGfHg{jQIX`%b*v1cc0GZ4BV z53h?j(BwMCNnL!7H;OwPH_p!{uqIR*oS50UWsgY@`lvw9C-(!@aT3)+x2zcJu|4d^ zj`bwyhb!rhIR;6nCgfCRnU{9wqsUiHnQ@kKb05x%s)iA<$$xV~4<|LN%L(hlRQt-b zKf7R#uITDseAVhggr>@b8=Mt>SU!20;X|0s4~Igis?#?pO;oDd?3v0gU42zCB2;fq zR1y+05x1upUp7}uCKm}~nI$Cl5ySB_ciR{arRfZ4r$#SKkY_yVxJS2+`qZBD4xSXYNLY`LsJ8%J;!X;|E*~p z6w4`imeXUHk+pTkz_5AI$)t^wF;UTQ;?$%Q?z*PlZ>e>{%v7$0e6=3ZLLAdZ)rC^M zKkIBK?G@?U%ZuDjx`H5I_wrQps-Vc| zHQ~%NE=u)ur&^m+ix;iRnggcGE9a~(8sBAHa2+FC?U}|PytJuUB@e*1v=CgaA<%Zs zSU+9XvZ}lJ(pGbbmgBf;n#!rC&PbnO4?7~&y(-(WDxEs7dj%iD)g9-iY(Oz{VZh&N zj?4uw8S7`>#H_VD>2dap(%gDc^kGGJ*V)y*a^z={$ZKJ-!jpyFL zx8ddT!|`Rc@sskCSx!aMi9pSXyZQMnFDEi}18wWjt<-NPDs^|fKEIi$)IIpRAE5`) z!{`w_-Y;l>jPm2?Df9y3pV`eFU|ng1Do7-9#}j!PlW_AF5Ph0Uy^Uzp?eB7o@k0{wmS21X>tbFF{AqlH_Bl2PH1_+yJLUfx z3vTg$!2f;nfxf~1?~{%775txZQiUPM$bm=WWMdBJ{NA$8&p5^b@6|NxCcOEqZ}*!) zW5bML_)jx9$izk7aJuz|-XL$th}3bBpZh3t_~fC+mN9rbYY+xpSmY-Mo4}?;*R9~U{GJ;{V>5cuxY)YHH}A~`x_g56$U&Uw|4~d zH@?LDT{ioI%#5SK{WanKE_K~p7I(K12iS|#+d{d|t;_Gh1-^j`+)I5wPO$=KSA+YT z#BvI1!sWH%{w`y=0QYwtZ8xEtsed2$cNgw&6E2T;UFUv?wxFM&pW^U-M*A-*{|fyE zJ&#^T`&su7B7^^8`98<0#Ki@;wo$mhuj1S?)aT*k7NAAwO0*2EM%T05t*pO;<-IJQ zr0r?66>Uc^(Ebj`I8E;FzcYS0yY<-cF}jOSN1)f{|5lUI-k<;P9B!&Mzmx~QNyQpc zm}<=wZZl82zrDr{lhGvYa4R!oqjvX{1k?D!;ikJ;LWcjm!%yY58#9%gJTDv=QL(~2 zZrg76JMtv%=tLE5^A5ksADHLezsZ*vRO}&AxP}a@o?)Gdo(iH^m7H=olL(zP)nT6< zE#pq@NlR|^>Ef+McM)eoI`Ky{rJUoD02b~jp2u!bQL+JHGUl9zH+<9vxzY{XYKD-~ zXr>uTLhI2MWQLXwqFTZY6HzPbA?z^D@p7j+PJSxOX)NcmoX@g@DHBUs-bkI~n*0w~ z-b+%=k17A2@-r;=vfRhgk9oP{7?!FbEO9DjlX!DFfRg_my{s!gSC~u^E z$1$C#YZ5`cz>h|UylOwnLGjY2rI>@_&GbzUir3}a-{8IVzR5xHw)i#&#oO*jIVj#i zzmS9C)dqze6mMeCpM&DH24;sS2gT!K{rrFC%>De&p)(x41Rk}||7LQ}9|&IFwPV-L zmokNEV9ow=f1SVHzuoWkH~BmL*Zh5cB1i_81nYwh!NwpT+!^!+n}W^3{Q;vvB&tTw zc^k1z zjiSuja+_J}hPBaVp*Q*i+cR22y~gIznlxN;Yooj51_vLbxGpriaLNxkRvVKmOa2Q_ zGJ7D}LYrJm*_po3W!9U!9IZp9U$`ChqD^QgdJXME3HpX4x&*C98_-6SMv6Q@?n-tR>{4>wtLyuOi=kJ?e8Q0-JE=RES4XGPDbO=1lrC* z=MzfLk~Xo7w$kL5!wABmMYe79eHZre-G{FzKZ<_zxI@$$AmHZy0C z(o5T(oy+_uO3}mjPcxZ3Xxm8*q>?a|t=nFFdcHrT*goIypGs(F9eUAh!=Z)Ahsh{K z&>Q)=&D-Of@R|I~!zAeE|Chiet{MMd8+gw7h5SEfLtCGDjg}vKe)GJ(4NX+47WIW+ zK=mN!*|4B5jNVM;@$##okN5EoFE;r0h zK9O7ox+>;B+Zil}rt`{=#%#QezH}`koUb#dByReKkdfms>Dj&~Dkp83O`Xgwf$7k~ zN(zN;#};hW^jB}wL9)K$Nb7r9kFoFJ;sQTxnx1v)d5cQcsp{dJ_B!4?ly%w~7WB0@ zW=^PHm^ruFbWUsONNz#9(H`_JI-%NeSxW{#bGOmY`Q_o)JeaqlU9nj1Roec74x+cv zJBWXPEtf<*nR6r2NoW$9fi7_QWz|gNcFgnkJRakAuJ^#yZywmir#;ra`1tnL8jE8d z{N635WFGw9Zc{2g_`N+*yM6F`?-ncby%VbK_RRD4xDow`fCz|y2#A0Ph=2%)fCz|y z2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y2#A0P zh=2%)fCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%) zfCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y z2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y2#A0P zh=2%)fCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%) zfCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y z2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y2#A0P zh=2%)fCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%) zfCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y z2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y2#A0P jh=2%)fCz|y2#A0Ph=2%)fCz|y2#A0Ph=2$jvjqMP#Pow* literal 0 HcmV?d00001