From dd2972d6999aa93891d9e13cbcbe0673a0e49ab5 Mon Sep 17 00:00:00 2001 From: mrdudz Date: Sun, 28 Feb 2016 22:23:40 +0100 Subject: [PATCH 01/28] initial commit from old source --- libsrc/atari/cpeekchar.s | 41 ++++++++++++++++++++++ libsrc/atmos/cpeekchar.s | 36 +++++++++++++++++++ libsrc/c128/cpeekchar.s | 74 +++++++++++++++++++++++++++++++++++++++ libsrc/c128/cpeekcol.s | 67 +++++++++++++++++++++++++++++++++++ libsrc/cbm/cpeekchar.s | 39 +++++++++++++++++++++ libsrc/cbm/cpeekcol.s | 21 +++++++++++ libsrc/cbm510/cpeekchar.s | 32 +++++++++++++++++ libsrc/cbm510/cpeekcol.s | 31 ++++++++++++++++ libsrc/cbm610/cpeekchar.s | 45 ++++++++++++++++++++++++ libsrc/nes/cpeekchar.s | 40 +++++++++++++++++++++ 10 files changed, 426 insertions(+) create mode 100644 libsrc/atari/cpeekchar.s create mode 100644 libsrc/atmos/cpeekchar.s create mode 100644 libsrc/c128/cpeekchar.s create mode 100644 libsrc/c128/cpeekcol.s create mode 100644 libsrc/cbm/cpeekchar.s create mode 100644 libsrc/cbm/cpeekcol.s create mode 100644 libsrc/cbm510/cpeekchar.s create mode 100644 libsrc/cbm510/cpeekcol.s create mode 100644 libsrc/cbm610/cpeekchar.s create mode 100644 libsrc/nes/cpeekchar.s diff --git a/libsrc/atari/cpeekchar.s b/libsrc/atari/cpeekchar.s new file mode 100644 index 000000000..b551ed0df --- /dev/null +++ b/libsrc/atari/cpeekchar.s @@ -0,0 +1,41 @@ + + .export _cpeekchar + .export _cpeekcharxy + + .import _gotoxy + .import mul40 + .importzp ptr4 + + .include "atari/atari.inc" + + .segment "CODE" + +_cpeekcharxy: + + jsr _gotoxy ; Set cursor + +_cpeekchar: + + lda ROWCRS + jsr mul40 ; destroys tmp4 + clc + adc SAVMSC ; add start of screen memory + sta ptr4 + txa + adc SAVMSC+1 + sta ptr4+1 + + ldy COLCRS + lda (ptr4),y ; get char + tax + + ;; convert to asc + + ;; ugly hack here to make tetris fx work :=P + lda #' ' + cpx #0 + beq @l + lda #0 +@l: + ldx #0 + rts diff --git a/libsrc/atmos/cpeekchar.s b/libsrc/atmos/cpeekchar.s new file mode 100644 index 000000000..a1d6d4474 --- /dev/null +++ b/libsrc/atmos/cpeekchar.s @@ -0,0 +1,36 @@ + + .include "atmos.inc" + +.import _gotoxy +.export _cpeekchar,_cpeekcharxy + +_cpeekcharxy: + + jsr _gotoxy ; Will pop x parameter + +_cpeekchar: + + ldy CURS_Y + ldx ScrTabLo,y + stx @l+1 + ldx ScrTabHi,y + stx @l+2 + ldx CURS_X +@l: + lda $bb80,x +;; inc COORDX_TEXT + ldx #0 + rts + + ; FIXME: is that table available elsewhere? +.rodata +ScrTabLo: + .repeat 28, Line + .byte <(SCREEN + Line * 40) + .endrep + +ScrTabHi: + .repeat 28, Line + .byte >(SCREEN + Line * 40) + .endrep + diff --git a/libsrc/c128/cpeekchar.s b/libsrc/c128/cpeekchar.s new file mode 100644 index 000000000..e6e7e4a12 --- /dev/null +++ b/libsrc/c128/cpeekchar.s @@ -0,0 +1,74 @@ + + .export _cpeekchar + .export _cpeekcharxy + + .import _gotoxy + + .import plot,popa + + + .include "zeropage.inc" + .include "c128/c128.inc" + + .segment "CODE" + +_cpeekcharxy: + + jsr _gotoxy ; Set cursor + +_cpeekchar: + + lda MODE + bmi @c80 + + ldy CURS_X + lda (SCREEN_PTR),y ; get char + +@return: + ; convert to asc + and #$7f + + ; 0 - $1f +$40 + ; $20 - $3f + ; $40 - $7e +$80 + + cmp #$1f + bcs @sk1 +;; clc + adc #$40 + rts + +@sk1: + cmp #$40 + bcc @end + clc + adc #$80 +@end: + ldx #0 + rts + +@c80: + lda SCREEN_PTR + ldy SCREEN_PTR+1 + clc + adc CURS_X + bcc @s + iny +@s: + ; get byte from vdc mem + ldx #VDC_DATA_LO + stx VDC_ADDR_REG +@L0: bit VDC_ADDR_REG + bpl @L0 + sta VDC_DATA_REG + dex + tya + stx VDC_ADDR_REG + sta VDC_DATA_REG + + ldx #VDC_DATA_RW + stx VDC_ADDR_REG +@L1: bit VDC_ADDR_REG + bpl @L1 + lda VDC_DATA_REG + jmp @return diff --git a/libsrc/c128/cpeekcol.s b/libsrc/c128/cpeekcol.s new file mode 100644 index 000000000..95f31c7cb --- /dev/null +++ b/libsrc/c128/cpeekcol.s @@ -0,0 +1,67 @@ + + .export _cpeekcol + .export _cpeekcolxy + + .import _gotoxy + + .include "c128/c128.inc" + + .segment "CODE" + +_cpeekcolxy: + + jsr _gotoxy ; Set cursor + +_cpeekcol: + + bit MODE + bmi @c80 + + ldy CURS_X + lda (CRAM_PTR),y ; get col + and #$0f + ldx #0 + rts + +@c80: + lda CRAM_PTR + ldy CRAM_PTR+1 + clc + adc CURS_X + bcc @s + iny +@s: + ; get byte from vdc mem + ldx #VDC_DATA_LO + stx VDC_ADDR_REG +@L0: bit VDC_ADDR_REG + bpl @L0 + sta VDC_DATA_REG + dex + ;;tya + stx VDC_ADDR_REG + sty VDC_DATA_REG + + ldx #VDC_DATA_RW + stx VDC_ADDR_REG +@L1: bit VDC_ADDR_REG + bpl @L1 + lda VDC_DATA_REG + + + and #$0f + +; translate vdc->vic colour + +vdctovic: + ldy #16 +@L2: cmp $CE5C-1,y + beq @L3 + dey + bne @L2 +@L3: + dey + tya + + ldx #0 + rts diff --git a/libsrc/cbm/cpeekchar.s b/libsrc/cbm/cpeekchar.s new file mode 100644 index 000000000..e8ebcdbc3 --- /dev/null +++ b/libsrc/cbm/cpeekchar.s @@ -0,0 +1,39 @@ + + .export _cpeekchar + .export _cpeekcharxy + + .import _gotoxy + + .include "cbm/cbm.inc" + + .segment "CODE" + +_cpeekcharxy: + + jsr _gotoxy ; Set cursor + +_cpeekchar: + + ldy CURS_X + lda (SCREEN_PTR),y ; get char + ldx #0 + + and #$7f + + ; 0 - $1f +$40 + ; $20 - $3f + ; $40 - $7e +$80 + + cmp #$1f + bcs @sk1 +;; clc + adc #$40 + rts + +@sk1: + cmp #$40 + bcc @end + clc + adc #$80 +@end: + rts diff --git a/libsrc/cbm/cpeekcol.s b/libsrc/cbm/cpeekcol.s new file mode 100644 index 000000000..0e88daf04 --- /dev/null +++ b/libsrc/cbm/cpeekcol.s @@ -0,0 +1,21 @@ + + .export _cpeekcol + .export _cpeekcolxy + + .import _gotoxy + + .include "cc65/conio.inc" + + .segment "CODE" + +_cpeekcolxy: + + jsr _gotoxy ; Set cursor + +_cpeekcol: + + ldy CURS_X + lda (CRAM_PTR),y ; get color + and #$0f + ldx #0 + rts diff --git a/libsrc/cbm510/cpeekchar.s b/libsrc/cbm510/cpeekchar.s new file mode 100644 index 000000000..dc5963d2b --- /dev/null +++ b/libsrc/cbm510/cpeekchar.s @@ -0,0 +1,32 @@ + + .export _cpeekchar + .export _cpeekcharxy + + .import _gotoxy + + .include "cbm510/cbm510.inc" + + .segment "CODE" + +_cpeekcharxy: + + jsr _gotoxy ; Set cursor + +_cpeekchar: + lda #0 + ldx #0 + rts + + ;; ?!?! + + ldx IndReg + ldy #$0F + sty IndReg + + ldy CURS_X + lda (SCREEN_PTR),y ; get char + + stx IndReg + + ldx #0 + rts diff --git a/libsrc/cbm510/cpeekcol.s b/libsrc/cbm510/cpeekcol.s new file mode 100644 index 000000000..332d0aaf8 --- /dev/null +++ b/libsrc/cbm510/cpeekcol.s @@ -0,0 +1,31 @@ + + .export _cpeekcol + .export _cpeekcolxy + + .import _gotoxy + + .include "cbm510/cbm510.inc" + + .segment "CODE" + +_cpeekcolxy: + + jsr _gotoxy ; Set cursor + +_cpeekcol: + + lda #0 + ldx #0 + rts + + ;; why the HELL doesnt this work ?!? + lda #$0F + ldy CURS_X + sei + ldx IndReg + sta IndReg + lda (CRAM_PTR),y ; get color + stx IndReg + cli + ldx #0 + rts diff --git a/libsrc/cbm610/cpeekchar.s b/libsrc/cbm610/cpeekchar.s new file mode 100644 index 000000000..8cf4bd57d --- /dev/null +++ b/libsrc/cbm610/cpeekchar.s @@ -0,0 +1,45 @@ + + .export _cpeekchar + .export _cpeekcharxy + + .import _gotoxy + + .include "cbm610/cbm610.inc" + + .segment "CODE" + +_cpeekcharxy: + + jsr _gotoxy ; Set cursor + +_cpeekchar: + + ldx IndReg + ldy #$0F + sty IndReg + + ldy CURS_X + lda (CharPtr),y ; get char + ; convert to asc + and #$7f + + ; 0 - $1f +$40 + ; $20 - $3f + ; $40 - $7e +$80 + + cmp #$1f + bcs @sk1 +;; clc + adc #$40 + jmp @end + +@sk1: + cmp #$40 + bcc @end + clc + adc #$80 + +@end: + stx IndReg + ldx #0 + rts diff --git a/libsrc/nes/cpeekchar.s b/libsrc/nes/cpeekchar.s new file mode 100644 index 000000000..292a4591f --- /dev/null +++ b/libsrc/nes/cpeekchar.s @@ -0,0 +1,40 @@ + + .export _cpeekchar + .export _cpeekcharxy + + .import _gotoxy + .import ppubuf_waitempty + + .include "nes.inc" + + .segment "CODE" + +_cpeekcharxy: + + jsr _gotoxy ; Set cursor + +_cpeekchar: + + ; wait until all console data has been written + jsr ppubuf_waitempty + + ldy SCREEN_PTR+1 + ldx SCREEN_PTR + +; waiting for vblank is incredibly slow :// +vwait: +; lda $2002 ;wait +; bpl vwait + + lda #0 + sty $2006 + stx $2006 + ldy $2007 ; first read is invalid + ldy $2007 ; get data + sta $2006 + sta $2006 + + tya + and #$7f ; ?!?! + rts + From b523f070f3933e060f927d7d76026159b7355377 Mon Sep 17 00:00:00 2001 From: mrdudz Date: Sat, 17 Jun 2017 03:01:31 +0200 Subject: [PATCH 02/28] fixed a few things, compiles again :) --- asminc/c128.inc | 9 +++++++-- libsrc/atari/cpeekchar.s | 2 +- libsrc/c128/cpeekchar.s | 18 +++++++++--------- libsrc/c128/cpeekcol.s | 18 +++++++++--------- libsrc/cbm/cpeekchar.s | 39 --------------------------------------- libsrc/cbm/cpeekcol.s | 21 --------------------- libsrc/cbm510/cpeekchar.s | 5 +++-- libsrc/cbm510/cpeekcol.s | 3 ++- libsrc/cbm610/cpeekchar.s | 3 ++- 9 files changed, 33 insertions(+), 85 deletions(-) delete mode 100644 libsrc/cbm/cpeekchar.s delete mode 100644 libsrc/cbm/cpeekcol.s diff --git a/asminc/c128.inc b/asminc/c128.inc index e6c89b07b..e17bae4ce 100644 --- a/asminc/c128.inc +++ b/asminc/c128.inc @@ -163,8 +163,13 @@ SID_Read3 := $D41C ; --------------------------------------------------------------------------- ; I/O: VDC (128 only) -VDC_INDEX := $D600 -VDC_DATA := $D601 +VDC_INDEX := $D600 ; VDC address +VDC_DATA := $D601 ; VDC data + +VDC_DATA_HI := 18 +VDC_DATA_LO := 19 +VDC_CSET := 28 +VDC_DATA_RW := 31 ; --------------------------------------------------------------------------- ; I/O: CIAs diff --git a/libsrc/atari/cpeekchar.s b/libsrc/atari/cpeekchar.s index b551ed0df..6697ce230 100644 --- a/libsrc/atari/cpeekchar.s +++ b/libsrc/atari/cpeekchar.s @@ -6,7 +6,7 @@ .import mul40 .importzp ptr4 - .include "atari/atari.inc" + .include "atari.inc" .segment "CODE" diff --git a/libsrc/c128/cpeekchar.s b/libsrc/c128/cpeekchar.s index e6e7e4a12..cf82dd529 100644 --- a/libsrc/c128/cpeekchar.s +++ b/libsrc/c128/cpeekchar.s @@ -8,7 +8,7 @@ .include "zeropage.inc" - .include "c128/c128.inc" + .include "c128.inc" .segment "CODE" @@ -57,18 +57,18 @@ _cpeekchar: @s: ; get byte from vdc mem ldx #VDC_DATA_LO - stx VDC_ADDR_REG -@L0: bit VDC_ADDR_REG + stx VDC_INDEX +@L0: bit VDC_INDEX bpl @L0 - sta VDC_DATA_REG + sta VDC_DATA dex tya - stx VDC_ADDR_REG - sta VDC_DATA_REG + stx VDC_INDEX + sta VDC_DATA ldx #VDC_DATA_RW - stx VDC_ADDR_REG -@L1: bit VDC_ADDR_REG + stx VDC_INDEX +@L1: bit VDC_INDEX bpl @L1 - lda VDC_DATA_REG + lda VDC_DATA jmp @return diff --git a/libsrc/c128/cpeekcol.s b/libsrc/c128/cpeekcol.s index 95f31c7cb..d96563574 100644 --- a/libsrc/c128/cpeekcol.s +++ b/libsrc/c128/cpeekcol.s @@ -4,7 +4,7 @@ .import _gotoxy - .include "c128/c128.inc" + .include "c128.inc" .segment "CODE" @@ -33,20 +33,20 @@ _cpeekcol: @s: ; get byte from vdc mem ldx #VDC_DATA_LO - stx VDC_ADDR_REG -@L0: bit VDC_ADDR_REG + stx VDC_INDEX +@L0: bit VDC_INDEX bpl @L0 - sta VDC_DATA_REG + sta VDC_DATA dex ;;tya - stx VDC_ADDR_REG - sty VDC_DATA_REG + stx VDC_INDEX + sty VDC_DATA ldx #VDC_DATA_RW - stx VDC_ADDR_REG -@L1: bit VDC_ADDR_REG + stx VDC_INDEX +@L1: bit VDC_INDEX bpl @L1 - lda VDC_DATA_REG + lda VDC_DATA and #$0f diff --git a/libsrc/cbm/cpeekchar.s b/libsrc/cbm/cpeekchar.s deleted file mode 100644 index e8ebcdbc3..000000000 --- a/libsrc/cbm/cpeekchar.s +++ /dev/null @@ -1,39 +0,0 @@ - - .export _cpeekchar - .export _cpeekcharxy - - .import _gotoxy - - .include "cbm/cbm.inc" - - .segment "CODE" - -_cpeekcharxy: - - jsr _gotoxy ; Set cursor - -_cpeekchar: - - ldy CURS_X - lda (SCREEN_PTR),y ; get char - ldx #0 - - and #$7f - - ; 0 - $1f +$40 - ; $20 - $3f - ; $40 - $7e +$80 - - cmp #$1f - bcs @sk1 -;; clc - adc #$40 - rts - -@sk1: - cmp #$40 - bcc @end - clc - adc #$80 -@end: - rts diff --git a/libsrc/cbm/cpeekcol.s b/libsrc/cbm/cpeekcol.s deleted file mode 100644 index 0e88daf04..000000000 --- a/libsrc/cbm/cpeekcol.s +++ /dev/null @@ -1,21 +0,0 @@ - - .export _cpeekcol - .export _cpeekcolxy - - .import _gotoxy - - .include "cc65/conio.inc" - - .segment "CODE" - -_cpeekcolxy: - - jsr _gotoxy ; Set cursor - -_cpeekcol: - - ldy CURS_X - lda (CRAM_PTR),y ; get color - and #$0f - ldx #0 - rts diff --git a/libsrc/cbm510/cpeekchar.s b/libsrc/cbm510/cpeekchar.s index dc5963d2b..11787fe1e 100644 --- a/libsrc/cbm510/cpeekchar.s +++ b/libsrc/cbm510/cpeekchar.s @@ -3,8 +3,9 @@ .export _cpeekcharxy .import _gotoxy - - .include "cbm510/cbm510.inc" + + .include "cbm510.inc" + .include "extzp.inc" .segment "CODE" diff --git a/libsrc/cbm510/cpeekcol.s b/libsrc/cbm510/cpeekcol.s index 332d0aaf8..bbe7c5632 100644 --- a/libsrc/cbm510/cpeekcol.s +++ b/libsrc/cbm510/cpeekcol.s @@ -4,7 +4,8 @@ .import _gotoxy - .include "cbm510/cbm510.inc" + .include "cbm510.inc" + .include "extzp.inc" .segment "CODE" diff --git a/libsrc/cbm610/cpeekchar.s b/libsrc/cbm610/cpeekchar.s index 8cf4bd57d..217532ab5 100644 --- a/libsrc/cbm610/cpeekchar.s +++ b/libsrc/cbm610/cpeekchar.s @@ -4,7 +4,8 @@ .import _gotoxy - .include "cbm610/cbm610.inc" + .include "cbm610.inc" + .include "extzp.inc" .segment "CODE" From dd14f15f948b9684afe4c352a0a10d5a6777eadf Mon Sep 17 00:00:00 2001 From: mrdudz Date: Sat, 17 Jun 2017 03:46:53 +0200 Subject: [PATCH 03/28] added fixed files for c64/c16/plus4/vic20/pet --- libsrc/c16/cpeekchar.s | 39 ++++++++++++ libsrc/c16/cpeekcol.s | 21 +++++++ libsrc/c64/cpeekchar.s | 39 ++++++++++++ libsrc/c64/cpeekcol.s | 21 +++++++ libsrc/c64/soft80_cpeekchar.s | 113 ++++++++++++++++++++++++++++++++++ libsrc/c64/soft80_cpeekcol.s | 21 +++++++ libsrc/pet/cpeekchar.s | 39 ++++++++++++ libsrc/plus4/cpeekchar.s | 39 ++++++++++++ libsrc/plus4/cpeekcol.s | 21 +++++++ libsrc/vic20/cpeekchar.s | 39 ++++++++++++ libsrc/vic20/cpeekcol.s | 21 +++++++ 11 files changed, 413 insertions(+) create mode 100644 libsrc/c16/cpeekchar.s create mode 100644 libsrc/c16/cpeekcol.s create mode 100644 libsrc/c64/cpeekchar.s create mode 100644 libsrc/c64/cpeekcol.s create mode 100644 libsrc/c64/soft80_cpeekchar.s create mode 100644 libsrc/c64/soft80_cpeekcol.s create mode 100644 libsrc/pet/cpeekchar.s create mode 100644 libsrc/plus4/cpeekchar.s create mode 100644 libsrc/plus4/cpeekcol.s create mode 100644 libsrc/vic20/cpeekchar.s create mode 100644 libsrc/vic20/cpeekcol.s diff --git a/libsrc/c16/cpeekchar.s b/libsrc/c16/cpeekchar.s new file mode 100644 index 000000000..5d89570f1 --- /dev/null +++ b/libsrc/c16/cpeekchar.s @@ -0,0 +1,39 @@ + + .export _cpeekchar + .export _cpeekcharxy + + .import _gotoxy + + .include "c16.inc" + + .segment "CODE" + +_cpeekcharxy: + + jsr _gotoxy ; Set cursor + +_cpeekchar: + + ldy CURS_X + lda (SCREEN_PTR),y ; get char + ldx #0 + + and #$7f + + ; 0 - $1f +$40 + ; $20 - $3f + ; $40 - $7e +$80 + + cmp #$1f + bcs @sk1 +;; clc + adc #$40 + rts + +@sk1: + cmp #$40 + bcc @end + clc + adc #$80 +@end: + rts diff --git a/libsrc/c16/cpeekcol.s b/libsrc/c16/cpeekcol.s new file mode 100644 index 000000000..41fed7b9f --- /dev/null +++ b/libsrc/c16/cpeekcol.s @@ -0,0 +1,21 @@ + + .export _cpeekcol + .export _cpeekcolxy + + .import _gotoxy + + .include "c16.inc" + + .segment "CODE" + +_cpeekcolxy: + + jsr _gotoxy ; Set cursor + +_cpeekcol: + + ldy CURS_X + lda (CRAM_PTR),y ; get color + ;and #$0f is this ok? + ldx #0 + rts diff --git a/libsrc/c64/cpeekchar.s b/libsrc/c64/cpeekchar.s new file mode 100644 index 000000000..33d0284e7 --- /dev/null +++ b/libsrc/c64/cpeekchar.s @@ -0,0 +1,39 @@ + + .export _cpeekchar + .export _cpeekcharxy + + .import _gotoxy + + .include "c64.inc" + + .segment "CODE" + +_cpeekcharxy: + + jsr _gotoxy ; Set cursor + +_cpeekchar: + + ldy CURS_X + lda (SCREEN_PTR),y ; get char + ldx #0 + + and #$7f + + ; 0 - $1f +$40 + ; $20 - $3f + ; $40 - $7e +$80 + + cmp #$1f + bcs @sk1 +;; clc + adc #$40 + rts + +@sk1: + cmp #$40 + bcc @end + clc + adc #$80 +@end: + rts diff --git a/libsrc/c64/cpeekcol.s b/libsrc/c64/cpeekcol.s new file mode 100644 index 000000000..60fb45c7b --- /dev/null +++ b/libsrc/c64/cpeekcol.s @@ -0,0 +1,21 @@ + + .export _cpeekcol + .export _cpeekcolxy + + .import _gotoxy + + .include "c64.inc" + + .segment "CODE" + +_cpeekcolxy: + + jsr _gotoxy ; Set cursor + +_cpeekcol: + + ldy CURS_X + lda (CRAM_PTR),y ; get color + and #$0f + ldx #0 + rts diff --git a/libsrc/c64/soft80_cpeekchar.s b/libsrc/c64/soft80_cpeekchar.s new file mode 100644 index 000000000..21a9fc5e7 --- /dev/null +++ b/libsrc/c64/soft80_cpeekchar.s @@ -0,0 +1,113 @@ + + .export _cpeekchar + .export _cpeekcharxy + + .import _gotoxy + .import soft80_hi_charset + .import soft80_lo_charset + + .include "c64.inc" + + .macpack longbranch + + .segment "CODE" + +readdirect: +; sei +; dec $01 ;; assumed = $36 +; dec $01 ;; assumed = $36 + lda (SCREEN_PTR),y +; inc $01 +; inc $01 +; cli + rts + +_cpeekcharxy: + + jsr _gotoxy ; Set cursor + +_cpeekchar: + +;;rts + sei + ;;dec $01 ;; assumed = $36 + ;;dec $01 ;; assumed = $36 + lda #$34 + sta $01 + + lda CURS_X + and #$01 + + jne @l1a + +;; inc $d020 + +;;jmp * + + ldx #0 +@l2aa: + ldy #0 + +;; stx $d020 + + .repeat 8,line +;; jsr readdirect + lda (SCREEN_PTR),y + and #$f0 + sta $e100,y + cmp soft80_hi_charset+(line*$80),x +; cmp #0 + bne @l2b + .if (line < 7) + iny + .endif + .endrepeat + + +@backok: +;inc $d020 +; inc $01 +; inc $01 + lda #$36 + sta $01 + cli + txa + ; sec +; sbc #$20 + ldx #$00 + rts +@l2b: +;jmp * + inx + cpx #$80 + jne @l2aa +@backerr: + ;; inc $01 +;; inc $01 + lda #$36 + sta $01 + cli + ldx #0 + txa + rts + +@l1a: + ldx #0 +@l1aa: + ldy #0 + .repeat 8,line +;; jsr readdirect + lda (SCREEN_PTR),y + and #$0f + eor soft80_lo_charset+(line*$80),x + bne @l2bb + .if line < 7 + iny + .endif + .endrepeat + jmp @backok +@l2bb: + inx + cpx #$80 + bne @l1aa + jmp @backerr diff --git a/libsrc/c64/soft80_cpeekcol.s b/libsrc/c64/soft80_cpeekcol.s new file mode 100644 index 000000000..9891ab28a --- /dev/null +++ b/libsrc/c64/soft80_cpeekcol.s @@ -0,0 +1,21 @@ + + .export _cpeekcol + .export _cpeekcolxy + + .import _gotoxy + + .include "c64.inc" + + .segment "CODE" + +_cpeekcolxy: + + jsr _gotoxy ; Set cursor + +_cpeekcol: + + ldy #0 + lda (CRAM_PTR),y ; get char + and #$0f + ldx #0 + rts diff --git a/libsrc/pet/cpeekchar.s b/libsrc/pet/cpeekchar.s new file mode 100644 index 000000000..c846beb56 --- /dev/null +++ b/libsrc/pet/cpeekchar.s @@ -0,0 +1,39 @@ + + .export _cpeekchar + .export _cpeekcharxy + + .import _gotoxy + + .include "pet.inc" + + .segment "CODE" + +_cpeekcharxy: + + jsr _gotoxy ; Set cursor + +_cpeekchar: + + ldy CURS_X + lda (SCREEN_PTR),y ; get char + ldx #0 + + and #$7f + + ; 0 - $1f +$40 + ; $20 - $3f + ; $40 - $7e +$80 + + cmp #$1f + bcs @sk1 +;; clc + adc #$40 + rts + +@sk1: + cmp #$40 + bcc @end + clc + adc #$80 +@end: + rts diff --git a/libsrc/plus4/cpeekchar.s b/libsrc/plus4/cpeekchar.s new file mode 100644 index 000000000..1d47c6d64 --- /dev/null +++ b/libsrc/plus4/cpeekchar.s @@ -0,0 +1,39 @@ + + .export _cpeekchar + .export _cpeekcharxy + + .import _gotoxy + + .include "plus4.inc" + + .segment "CODE" + +_cpeekcharxy: + + jsr _gotoxy ; Set cursor + +_cpeekchar: + + ldy CURS_X + lda (SCREEN_PTR),y ; get char + ldx #0 + + and #$7f + + ; 0 - $1f +$40 + ; $20 - $3f + ; $40 - $7e +$80 + + cmp #$1f + bcs @sk1 +;; clc + adc #$40 + rts + +@sk1: + cmp #$40 + bcc @end + clc + adc #$80 +@end: + rts diff --git a/libsrc/plus4/cpeekcol.s b/libsrc/plus4/cpeekcol.s new file mode 100644 index 000000000..0f3258eb3 --- /dev/null +++ b/libsrc/plus4/cpeekcol.s @@ -0,0 +1,21 @@ + + .export _cpeekcol + .export _cpeekcolxy + + .import _gotoxy + + .include "plus4.inc" + + .segment "CODE" + +_cpeekcolxy: + + jsr _gotoxy ; Set cursor + +_cpeekcol: + + ldy CURS_X + lda (CRAM_PTR),y ; get color + ;and #$0f is this ok? + ldx #0 + rts diff --git a/libsrc/vic20/cpeekchar.s b/libsrc/vic20/cpeekchar.s new file mode 100644 index 000000000..fae7ec1b4 --- /dev/null +++ b/libsrc/vic20/cpeekchar.s @@ -0,0 +1,39 @@ + + .export _cpeekchar + .export _cpeekcharxy + + .import _gotoxy + + .include "vic20.inc" + + .segment "CODE" + +_cpeekcharxy: + + jsr _gotoxy ; Set cursor + +_cpeekchar: + + ldy CURS_X + lda (SCREEN_PTR),y ; get char + ldx #0 + + and #$7f + + ; 0 - $1f +$40 + ; $20 - $3f + ; $40 - $7e +$80 + + cmp #$1f + bcs @sk1 +;; clc + adc #$40 + rts + +@sk1: + cmp #$40 + bcc @end + clc + adc #$80 +@end: + rts diff --git a/libsrc/vic20/cpeekcol.s b/libsrc/vic20/cpeekcol.s new file mode 100644 index 000000000..59bf057ff --- /dev/null +++ b/libsrc/vic20/cpeekcol.s @@ -0,0 +1,21 @@ + + .export _cpeekcol + .export _cpeekcolxy + + .import _gotoxy + + .include "vic20.inc" + + .segment "CODE" + +_cpeekcolxy: + + jsr _gotoxy ; Set cursor + +_cpeekcol: + + ldy CURS_X + lda (CRAM_PTR),y ; get color + and #$0f + ldx #0 + rts From 74098077d3bb93be8943b45a5c8cdf6810fbd74a Mon Sep 17 00:00:00 2001 From: mrdudz Date: Sun, 24 Jul 2022 03:36:19 +0200 Subject: [PATCH 04/28] bleh --- asminc/c128.inc | 224 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 224 insertions(+) create mode 100644 asminc/c128.inc diff --git a/asminc/c128.inc b/asminc/c128.inc new file mode 100644 index 000000000..749b4168c --- /dev/null +++ b/asminc/c128.inc @@ -0,0 +1,224 @@ +; +; C128 generic definitions. Stolen from Elite128 +; + + +; --------------------------------------------------------------------------- +; Zero page, Commodore stuff + +TXTPTR := $3D ; Pointer into BASIC source code +STATUS := $90 ; Kernal I/O completion status +TIME := $A0 ; 60HZ clock +FNAM_LEN := $B7 ; Length of filename +SECADR := $B9 ; Secondary address +DEVNUM := $BA ; Device number +FNAM := $BB ; Address of filename +FNAM_BANK := $C7 ; Bank for filename +KEY_COUNT := $D0 ; Number of keys in input buffer +FKEY_COUNT := $D1 ; Characters for function key +MODE := $D7 ; 40-/80-column mode (bit 7: 80 columns) +GRAPHM := $D8 ; Graphics mode flags (bits 5-7) +CHARDIS := $D9 ; Bit 2 shadow for location $01 +CURS_X := $EC ; Cursor column +CURS_Y := $EB ; Cursor row +SCREEN_PTR := $E0 ; Pointer to current char in text screen +CRAM_PTR := $E2 ; Pointer to current char in color RAM + +CHARCOLOR := $F1 +RVS := $F3 ; Reverse output flag +SCROLL := $F8 ; Disable scrolling flag + +BASIC_BUF := $0200 ; Location of command-line +BASIC_BUF_LEN = 162 ; Maximum length of command-line + +FETCH := $02A2 ; Fetch subroutine in RAM +FETVEC := $02AA ; Vector patch location for FETCH +STASH := $02AF ; Stash routine in RAM +STAVEC := $02B9 ; Vector patch location for STASH +IRQInd := $02FD ; JMP $0000 -- used as indirect IRQ vector +PALFLAG := $0A03 ; $FF=PAL, $00=NTSC +INIT_STATUS := $0A04 ; Flags: Reset/Restore initiation status +VM2 := $0A2D ; VIC-IIe shadow for $D018 -- graphics mode +FKEY_LEN := $1000 ; Function key lengths +FKEY_TEXT := $100A ; Function key texts + +KBDREPEAT := $028a +KBDREPEATRATE := $028b +KBDREPEATDELAY := $028c + +; --------------------------------------------------------------------------- +; Vectors + +IRQVec := $0314 +BRKVec := $0316 +NMIVec := $0318 +KeyStoreVec := $033C + +; --------------------------------------------------------------------------- +; I/O: VIC + +VIC := $D000 +VIC_SPR0_X := $D000 +VIC_SPR0_Y := $D001 +VIC_SPR1_X := $D002 +VIC_SPR1_Y := $D003 +VIC_SPR2_X := $D004 +VIC_SPR2_Y := $D005 +VIC_SPR3_X := $D006 +VIC_SPR3_Y := $D007 +VIC_SPR4_X := $D008 +VIC_SPR4_Y := $D009 +VIC_SPR5_X := $D00A +VIC_SPR5_Y := $D00B +VIC_SPR6_X := $D00C +VIC_SPR6_Y := $D00D +VIC_SPR7_X := $D00E +VIC_SPR7_Y := $D00F +VIC_SPR_HI_X := $D010 +VIC_SPR_ENA := $D015 +VIC_SPR_EXP_Y := $D017 +VIC_SPR_EXP_X := $D01D +VIC_SPR_MCOLOR := $D01C +VIC_SPR_BG_PRIO := $D01B + +VIC_SPR_MCOLOR0 := $D025 +VIC_SPR_MCOLOR1 := $D026 + +VIC_SPR0_COLOR := $D027 +VIC_SPR1_COLOR := $D028 +VIC_SPR2_COLOR := $D029 +VIC_SPR3_COLOR := $D02A +VIC_SPR4_COLOR := $D02B +VIC_SPR5_COLOR := $D02C +VIC_SPR6_COLOR := $D02D +VIC_SPR7_COLOR := $D02E + +VIC_CTRL1 := $D011 +VIC_CTRL2 := $D016 + +VIC_HLINE := $D012 + +VIC_LPEN_X := $D013 +VIC_LPEN_Y := $D014 + +VIC_VIDEO_ADR := $D018 + +VIC_IRR := $D019 ; Interrupt request register +VIC_IMR := $D01A ; Interrupt mask register + +VIC_BORDERCOLOR := $D020 +VIC_BG_COLOR0 := $D021 +VIC_BG_COLOR1 := $D022 +VIC_BG_COLOR2 := $D023 +VIC_BG_COLOR3 := $D024 + +; 128 stuff: +VIC_KBD_128 := $D02F ; Extended kbd bits (visible in 64 mode) +VIC_CLK_128 := $D030 ; Clock rate register (visible in 64 mode) + + +; --------------------------------------------------------------------------- +; I/O: SID + +SID := $D400 +SID_S1Lo := $D400 +SID_S1Hi := $D401 +SID_PB1Lo := $D402 +SID_PB1Hi := $D403 +SID_Ctl1 := $D404 +SID_AD1 := $D405 +SID_SUR1 := $D406 + +SID_S2Lo := $D407 +SID_S2Hi := $D408 +SID_PB2Lo := $D409 +SID_PB2Hi := $D40A +SID_Ctl2 := $D40B +SID_AD2 := $D40C +SID_SUR2 := $D40D + +SID_S3Lo := $D40E +SID_S3Hi := $D40F +SID_PB3Lo := $D410 +SID_PB3Hi := $D411 +SID_Ctl3 := $D412 +SID_AD3 := $D413 +SID_SUR3 := $D414 + +SID_FltLo := $D415 +SID_FltHi := $D416 +SID_FltCtl := $D417 +SID_Amp := $D418 +SID_ADConv1 := $D419 +SID_ADConv2 := $D41A +SID_Noise := $D41B +SID_Read3 := $D41C + +; --------------------------------------------------------------------------- +; I/O: VDC (128 only) + +VDC_INDEX := $D600 ; register address port +VDC_DATA := $D601 ; data port + +; Registers +VDC_DATA_HI = 18 ; video RAM address (big endian) +VDC_DATA_LO = 19 +VDC_CSET = 28 +VDC_RAM_RW = 31 ; RAM port + +; --------------------------------------------------------------------------- +; I/O: Complex Interface Adapters + +CIA1 := $DC00 +CIA1_PRA := $DC00 ; Port A +CIA1_PRB := $DC01 ; Port B +CIA1_DDRA := $DC02 ; Data direction register for port A +CIA1_DDRB := $DC03 ; Data direction register for port B +CIA1_TA := $DC04 ; 16-bit timer A +CIA1_TB := $DC06 ; 16-bit timer B +CIA1_TOD10 := $DC08 ; Time-of-day tenths of a second +CIA1_TODSEC := $DC09 ; Time-of-day seconds +CIA1_TODMIN := $DC0A ; Time-of-day minutes +CIA1_TODHR := $DC0B ; Time-of-day hours +CIA1_SDR := $DC0C ; Serial data register +CIA1_ICR := $DC0D ; Interrupt control register +CIA1_CRA := $DC0E ; Control register for timer A +CIA1_CRB := $DC0F ; Control register for timer B + +CIA2 := $DD00 +CIA2_PRA := $DD00 +CIA2_PRB := $DD01 +CIA2_DDRA := $DD02 +CIA2_DDRB := $DD03 +CIA2_TA := $DD04 +CIA2_TB := $DD06 +CIA2_TOD10 := $DD08 +CIA2_TODSEC := $DD09 +CIA2_TODMIN := $DD0A +CIA2_TODHR := $DD0B +CIA2_SDR := $DD0C +CIA2_ICR := $DD0D +CIA2_CRA := $DD0E +CIA2_CRB := $DD0F + +; --------------------------------------------------------------------------- +; I/O: MMU + +MMU_CR := $FF00 +MMU_CFG_CC65 := %00001110 ; Bank 0 with kernal ROM +MMU_CFG_RAM0 := %00111111 ; Bank 0 full RAM +MMU_CFG_RAM1 := %01111111 ; Bank 1 full RAM +MMU_CFG_RAM2 := %10111111 ; Bank 2 full RAM +MMU_CFG_RAM3 := %11111111 ; Bank 3 full RAM +MMU_CFG_IFROM := %01010111 ; Bank 1 with Internal Function RAM/ROM +MMU_CFG_EFROM := %01101011 ; Bank 1 with External Function RAM/ROM + +; --------------------------------------------------------------------------- +; Super CPU + +SCPU_VIC_Bank1 := $D075 +SCPU_Slow := $D07A +SCPU_Fast := $D07B +SCPU_EnableRegs := $D07E +SCPU_DisableRegs:= $D07F +SCPU_Detect := $D0BC From 6dae5324ddbea4dcbb19c913109f4bc4d5fbfde5 Mon Sep 17 00:00:00 2001 From: mrdudz Date: Sun, 24 Jul 2022 03:59:19 +0200 Subject: [PATCH 05/28] cleanup --- libsrc/c128/cpeekcol.s | 67 ------------------------------------ libsrc/c16/cpeekcol.s | 11 ++---- libsrc/c64/cpeekcol.s | 23 +++++-------- libsrc/c64/soft80_cpeekcol.s | 21 ----------- libsrc/cbm510/cpeekcol.s | 32 ----------------- libsrc/plus4/cpeekcol.s | 23 +++++-------- libsrc/vic20/cpeekcol.s | 23 +++++-------- 7 files changed, 26 insertions(+), 174 deletions(-) delete mode 100644 libsrc/c128/cpeekcol.s delete mode 100644 libsrc/c64/soft80_cpeekcol.s delete mode 100644 libsrc/cbm510/cpeekcol.s diff --git a/libsrc/c128/cpeekcol.s b/libsrc/c128/cpeekcol.s deleted file mode 100644 index d96563574..000000000 --- a/libsrc/c128/cpeekcol.s +++ /dev/null @@ -1,67 +0,0 @@ - - .export _cpeekcol - .export _cpeekcolxy - - .import _gotoxy - - .include "c128.inc" - - .segment "CODE" - -_cpeekcolxy: - - jsr _gotoxy ; Set cursor - -_cpeekcol: - - bit MODE - bmi @c80 - - ldy CURS_X - lda (CRAM_PTR),y ; get col - and #$0f - ldx #0 - rts - -@c80: - lda CRAM_PTR - ldy CRAM_PTR+1 - clc - adc CURS_X - bcc @s - iny -@s: - ; get byte from vdc mem - ldx #VDC_DATA_LO - stx VDC_INDEX -@L0: bit VDC_INDEX - bpl @L0 - sta VDC_DATA - dex - ;;tya - stx VDC_INDEX - sty VDC_DATA - - ldx #VDC_DATA_RW - stx VDC_INDEX -@L1: bit VDC_INDEX - bpl @L1 - lda VDC_DATA - - - and #$0f - -; translate vdc->vic colour - -vdctovic: - ldy #16 -@L2: cmp $CE5C-1,y - beq @L3 - dey - bne @L2 -@L3: - dey - tya - - ldx #0 - rts diff --git a/libsrc/c16/cpeekcol.s b/libsrc/c16/cpeekcol.s index 41fed7b9f..446079ddd 100644 --- a/libsrc/c16/cpeekcol.s +++ b/libsrc/c16/cpeekcol.s @@ -1,18 +1,11 @@ - .export _cpeekcol - .export _cpeekcolxy - - .import _gotoxy + .export _cpeekcolor .include "c16.inc" .segment "CODE" -_cpeekcolxy: - - jsr _gotoxy ; Set cursor - -_cpeekcol: +_cpeekcolor: ldy CURS_X lda (CRAM_PTR),y ; get color diff --git a/libsrc/c64/cpeekcol.s b/libsrc/c64/cpeekcol.s index 60fb45c7b..8e87cff23 100644 --- a/libsrc/c64/cpeekcol.s +++ b/libsrc/c64/cpeekcol.s @@ -1,21 +1,14 @@ - .export _cpeekcol - .export _cpeekcolxy + .export _cpeekcolor - .import _gotoxy + .include "c64.inc" - .include "c64.inc" + .segment "CODE" - .segment "CODE" +_cpeekcolor: -_cpeekcolxy: - - jsr _gotoxy ; Set cursor - -_cpeekcol: - - ldy CURS_X - lda (CRAM_PTR),y ; get color - and #$0f + ldy CURS_X + lda (CRAM_PTR),y ; get color + and #$0f ldx #0 - rts + rts diff --git a/libsrc/c64/soft80_cpeekcol.s b/libsrc/c64/soft80_cpeekcol.s deleted file mode 100644 index 9891ab28a..000000000 --- a/libsrc/c64/soft80_cpeekcol.s +++ /dev/null @@ -1,21 +0,0 @@ - - .export _cpeekcol - .export _cpeekcolxy - - .import _gotoxy - - .include "c64.inc" - - .segment "CODE" - -_cpeekcolxy: - - jsr _gotoxy ; Set cursor - -_cpeekcol: - - ldy #0 - lda (CRAM_PTR),y ; get char - and #$0f - ldx #0 - rts diff --git a/libsrc/cbm510/cpeekcol.s b/libsrc/cbm510/cpeekcol.s deleted file mode 100644 index bbe7c5632..000000000 --- a/libsrc/cbm510/cpeekcol.s +++ /dev/null @@ -1,32 +0,0 @@ - - .export _cpeekcol - .export _cpeekcolxy - - .import _gotoxy - - .include "cbm510.inc" - .include "extzp.inc" - - .segment "CODE" - -_cpeekcolxy: - - jsr _gotoxy ; Set cursor - -_cpeekcol: - - lda #0 - ldx #0 - rts - - ;; why the HELL doesnt this work ?!? - lda #$0F - ldy CURS_X - sei - ldx IndReg - sta IndReg - lda (CRAM_PTR),y ; get color - stx IndReg - cli - ldx #0 - rts diff --git a/libsrc/plus4/cpeekcol.s b/libsrc/plus4/cpeekcol.s index 0f3258eb3..b98b0124e 100644 --- a/libsrc/plus4/cpeekcol.s +++ b/libsrc/plus4/cpeekcol.s @@ -1,21 +1,14 @@ - .export _cpeekcol - .export _cpeekcolxy + .export _cpeekcolor - .import _gotoxy + .include "plus4.inc" - .include "plus4.inc" + .segment "CODE" - .segment "CODE" +_cpeekcolor: -_cpeekcolxy: - - jsr _gotoxy ; Set cursor - -_cpeekcol: - - ldy CURS_X - lda (CRAM_PTR),y ; get color - ;and #$0f is this ok? + ldy CURS_X + lda (CRAM_PTR),y ; get color + ;and #$0f is this ok? ldx #0 - rts + rts diff --git a/libsrc/vic20/cpeekcol.s b/libsrc/vic20/cpeekcol.s index 59bf057ff..31fa4612a 100644 --- a/libsrc/vic20/cpeekcol.s +++ b/libsrc/vic20/cpeekcol.s @@ -1,21 +1,14 @@ - .export _cpeekcol - .export _cpeekcolxy + .export _cpeekcolor - .import _gotoxy + .include "vic20.inc" - .include "vic20.inc" + .segment "CODE" - .segment "CODE" +_cpeekcolor: -_cpeekcolxy: - - jsr _gotoxy ; Set cursor - -_cpeekcol: - - ldy CURS_X - lda (CRAM_PTR),y ; get color - and #$0f + ldy CURS_X + lda (CRAM_PTR),y ; get color + and #$0f ldx #0 - rts + rts From 7890f4102e30bad2d76c8888b6dcd0487598bf95 Mon Sep 17 00:00:00 2001 From: mrdudz Date: Sun, 24 Jul 2022 04:14:48 +0200 Subject: [PATCH 06/28] cleanup --- libsrc/c128/cpeekchar.s | 74 ---------------------- libsrc/c64/soft80_cpeekchar.s | 113 ---------------------------------- libsrc/cbm610/cpeekchar.s | 46 -------------- 3 files changed, 233 deletions(-) delete mode 100644 libsrc/c128/cpeekchar.s delete mode 100644 libsrc/c64/soft80_cpeekchar.s delete mode 100644 libsrc/cbm610/cpeekchar.s diff --git a/libsrc/c128/cpeekchar.s b/libsrc/c128/cpeekchar.s deleted file mode 100644 index cf82dd529..000000000 --- a/libsrc/c128/cpeekchar.s +++ /dev/null @@ -1,74 +0,0 @@ - - .export _cpeekchar - .export _cpeekcharxy - - .import _gotoxy - - .import plot,popa - - - .include "zeropage.inc" - .include "c128.inc" - - .segment "CODE" - -_cpeekcharxy: - - jsr _gotoxy ; Set cursor - -_cpeekchar: - - lda MODE - bmi @c80 - - ldy CURS_X - lda (SCREEN_PTR),y ; get char - -@return: - ; convert to asc - and #$7f - - ; 0 - $1f +$40 - ; $20 - $3f - ; $40 - $7e +$80 - - cmp #$1f - bcs @sk1 -;; clc - adc #$40 - rts - -@sk1: - cmp #$40 - bcc @end - clc - adc #$80 -@end: - ldx #0 - rts - -@c80: - lda SCREEN_PTR - ldy SCREEN_PTR+1 - clc - adc CURS_X - bcc @s - iny -@s: - ; get byte from vdc mem - ldx #VDC_DATA_LO - stx VDC_INDEX -@L0: bit VDC_INDEX - bpl @L0 - sta VDC_DATA - dex - tya - stx VDC_INDEX - sta VDC_DATA - - ldx #VDC_DATA_RW - stx VDC_INDEX -@L1: bit VDC_INDEX - bpl @L1 - lda VDC_DATA - jmp @return diff --git a/libsrc/c64/soft80_cpeekchar.s b/libsrc/c64/soft80_cpeekchar.s deleted file mode 100644 index 21a9fc5e7..000000000 --- a/libsrc/c64/soft80_cpeekchar.s +++ /dev/null @@ -1,113 +0,0 @@ - - .export _cpeekchar - .export _cpeekcharxy - - .import _gotoxy - .import soft80_hi_charset - .import soft80_lo_charset - - .include "c64.inc" - - .macpack longbranch - - .segment "CODE" - -readdirect: -; sei -; dec $01 ;; assumed = $36 -; dec $01 ;; assumed = $36 - lda (SCREEN_PTR),y -; inc $01 -; inc $01 -; cli - rts - -_cpeekcharxy: - - jsr _gotoxy ; Set cursor - -_cpeekchar: - -;;rts - sei - ;;dec $01 ;; assumed = $36 - ;;dec $01 ;; assumed = $36 - lda #$34 - sta $01 - - lda CURS_X - and #$01 - - jne @l1a - -;; inc $d020 - -;;jmp * - - ldx #0 -@l2aa: - ldy #0 - -;; stx $d020 - - .repeat 8,line -;; jsr readdirect - lda (SCREEN_PTR),y - and #$f0 - sta $e100,y - cmp soft80_hi_charset+(line*$80),x -; cmp #0 - bne @l2b - .if (line < 7) - iny - .endif - .endrepeat - - -@backok: -;inc $d020 -; inc $01 -; inc $01 - lda #$36 - sta $01 - cli - txa - ; sec -; sbc #$20 - ldx #$00 - rts -@l2b: -;jmp * - inx - cpx #$80 - jne @l2aa -@backerr: - ;; inc $01 -;; inc $01 - lda #$36 - sta $01 - cli - ldx #0 - txa - rts - -@l1a: - ldx #0 -@l1aa: - ldy #0 - .repeat 8,line -;; jsr readdirect - lda (SCREEN_PTR),y - and #$0f - eor soft80_lo_charset+(line*$80),x - bne @l2bb - .if line < 7 - iny - .endif - .endrepeat - jmp @backok -@l2bb: - inx - cpx #$80 - bne @l1aa - jmp @backerr diff --git a/libsrc/cbm610/cpeekchar.s b/libsrc/cbm610/cpeekchar.s deleted file mode 100644 index 217532ab5..000000000 --- a/libsrc/cbm610/cpeekchar.s +++ /dev/null @@ -1,46 +0,0 @@ - - .export _cpeekchar - .export _cpeekcharxy - - .import _gotoxy - - .include "cbm610.inc" - .include "extzp.inc" - - .segment "CODE" - -_cpeekcharxy: - - jsr _gotoxy ; Set cursor - -_cpeekchar: - - ldx IndReg - ldy #$0F - sty IndReg - - ldy CURS_X - lda (CharPtr),y ; get char - ; convert to asc - and #$7f - - ; 0 - $1f +$40 - ; $20 - $3f - ; $40 - $7e +$80 - - cmp #$1f - bcs @sk1 -;; clc - adc #$40 - jmp @end - -@sk1: - cmp #$40 - bcc @end - clc - adc #$80 - -@end: - stx IndReg - ldx #0 - rts From d40def3d2d9b74eb5d326d35367f8f974a70b256 Mon Sep 17 00:00:00 2001 From: mrdudz Date: Sun, 24 Jul 2022 04:42:44 +0200 Subject: [PATCH 07/28] cleanup --- libsrc/c16/cpeekcol.s | 14 -------------- libsrc/c64/cpeekcol.s | 14 -------------- libsrc/plus4/cpeekcol.s | 14 -------------- libsrc/vic20/cpeekcol.s | 14 -------------- 4 files changed, 56 deletions(-) delete mode 100644 libsrc/c16/cpeekcol.s delete mode 100644 libsrc/c64/cpeekcol.s delete mode 100644 libsrc/plus4/cpeekcol.s delete mode 100644 libsrc/vic20/cpeekcol.s diff --git a/libsrc/c16/cpeekcol.s b/libsrc/c16/cpeekcol.s deleted file mode 100644 index 446079ddd..000000000 --- a/libsrc/c16/cpeekcol.s +++ /dev/null @@ -1,14 +0,0 @@ - - .export _cpeekcolor - - .include "c16.inc" - - .segment "CODE" - -_cpeekcolor: - - ldy CURS_X - lda (CRAM_PTR),y ; get color - ;and #$0f is this ok? - ldx #0 - rts diff --git a/libsrc/c64/cpeekcol.s b/libsrc/c64/cpeekcol.s deleted file mode 100644 index 8e87cff23..000000000 --- a/libsrc/c64/cpeekcol.s +++ /dev/null @@ -1,14 +0,0 @@ - - .export _cpeekcolor - - .include "c64.inc" - - .segment "CODE" - -_cpeekcolor: - - ldy CURS_X - lda (CRAM_PTR),y ; get color - and #$0f - ldx #0 - rts diff --git a/libsrc/plus4/cpeekcol.s b/libsrc/plus4/cpeekcol.s deleted file mode 100644 index b98b0124e..000000000 --- a/libsrc/plus4/cpeekcol.s +++ /dev/null @@ -1,14 +0,0 @@ - - .export _cpeekcolor - - .include "plus4.inc" - - .segment "CODE" - -_cpeekcolor: - - ldy CURS_X - lda (CRAM_PTR),y ; get color - ;and #$0f is this ok? - ldx #0 - rts diff --git a/libsrc/vic20/cpeekcol.s b/libsrc/vic20/cpeekcol.s deleted file mode 100644 index 31fa4612a..000000000 --- a/libsrc/vic20/cpeekcol.s +++ /dev/null @@ -1,14 +0,0 @@ - - .export _cpeekcolor - - .include "vic20.inc" - - .segment "CODE" - -_cpeekcolor: - - ldy CURS_X - lda (CRAM_PTR),y ; get color - and #$0f - ldx #0 - rts From 193b7b9ee7f75c11c3ce2bbb73a2802146cf09de Mon Sep 17 00:00:00 2001 From: mrdudz Date: Sun, 24 Jul 2022 04:54:34 +0200 Subject: [PATCH 08/28] cleanup --- libsrc/c16/cpeekchar.s | 39 --------------------------------------- libsrc/c64/cpeekchar.s | 39 --------------------------------------- libsrc/cbm510/cpeekchar.s | 33 --------------------------------- libsrc/pet/cpeekchar.s | 39 --------------------------------------- libsrc/plus4/cpeekchar.s | 39 --------------------------------------- libsrc/vic20/cpeekchar.s | 39 --------------------------------------- 6 files changed, 228 deletions(-) delete mode 100644 libsrc/c16/cpeekchar.s delete mode 100644 libsrc/c64/cpeekchar.s delete mode 100644 libsrc/cbm510/cpeekchar.s delete mode 100644 libsrc/pet/cpeekchar.s delete mode 100644 libsrc/plus4/cpeekchar.s delete mode 100644 libsrc/vic20/cpeekchar.s diff --git a/libsrc/c16/cpeekchar.s b/libsrc/c16/cpeekchar.s deleted file mode 100644 index 5d89570f1..000000000 --- a/libsrc/c16/cpeekchar.s +++ /dev/null @@ -1,39 +0,0 @@ - - .export _cpeekchar - .export _cpeekcharxy - - .import _gotoxy - - .include "c16.inc" - - .segment "CODE" - -_cpeekcharxy: - - jsr _gotoxy ; Set cursor - -_cpeekchar: - - ldy CURS_X - lda (SCREEN_PTR),y ; get char - ldx #0 - - and #$7f - - ; 0 - $1f +$40 - ; $20 - $3f - ; $40 - $7e +$80 - - cmp #$1f - bcs @sk1 -;; clc - adc #$40 - rts - -@sk1: - cmp #$40 - bcc @end - clc - adc #$80 -@end: - rts diff --git a/libsrc/c64/cpeekchar.s b/libsrc/c64/cpeekchar.s deleted file mode 100644 index 33d0284e7..000000000 --- a/libsrc/c64/cpeekchar.s +++ /dev/null @@ -1,39 +0,0 @@ - - .export _cpeekchar - .export _cpeekcharxy - - .import _gotoxy - - .include "c64.inc" - - .segment "CODE" - -_cpeekcharxy: - - jsr _gotoxy ; Set cursor - -_cpeekchar: - - ldy CURS_X - lda (SCREEN_PTR),y ; get char - ldx #0 - - and #$7f - - ; 0 - $1f +$40 - ; $20 - $3f - ; $40 - $7e +$80 - - cmp #$1f - bcs @sk1 -;; clc - adc #$40 - rts - -@sk1: - cmp #$40 - bcc @end - clc - adc #$80 -@end: - rts diff --git a/libsrc/cbm510/cpeekchar.s b/libsrc/cbm510/cpeekchar.s deleted file mode 100644 index 11787fe1e..000000000 --- a/libsrc/cbm510/cpeekchar.s +++ /dev/null @@ -1,33 +0,0 @@ - - .export _cpeekchar - .export _cpeekcharxy - - .import _gotoxy - - .include "cbm510.inc" - .include "extzp.inc" - - .segment "CODE" - -_cpeekcharxy: - - jsr _gotoxy ; Set cursor - -_cpeekchar: - lda #0 - ldx #0 - rts - - ;; ?!?! - - ldx IndReg - ldy #$0F - sty IndReg - - ldy CURS_X - lda (SCREEN_PTR),y ; get char - - stx IndReg - - ldx #0 - rts diff --git a/libsrc/pet/cpeekchar.s b/libsrc/pet/cpeekchar.s deleted file mode 100644 index c846beb56..000000000 --- a/libsrc/pet/cpeekchar.s +++ /dev/null @@ -1,39 +0,0 @@ - - .export _cpeekchar - .export _cpeekcharxy - - .import _gotoxy - - .include "pet.inc" - - .segment "CODE" - -_cpeekcharxy: - - jsr _gotoxy ; Set cursor - -_cpeekchar: - - ldy CURS_X - lda (SCREEN_PTR),y ; get char - ldx #0 - - and #$7f - - ; 0 - $1f +$40 - ; $20 - $3f - ; $40 - $7e +$80 - - cmp #$1f - bcs @sk1 -;; clc - adc #$40 - rts - -@sk1: - cmp #$40 - bcc @end - clc - adc #$80 -@end: - rts diff --git a/libsrc/plus4/cpeekchar.s b/libsrc/plus4/cpeekchar.s deleted file mode 100644 index 1d47c6d64..000000000 --- a/libsrc/plus4/cpeekchar.s +++ /dev/null @@ -1,39 +0,0 @@ - - .export _cpeekchar - .export _cpeekcharxy - - .import _gotoxy - - .include "plus4.inc" - - .segment "CODE" - -_cpeekcharxy: - - jsr _gotoxy ; Set cursor - -_cpeekchar: - - ldy CURS_X - lda (SCREEN_PTR),y ; get char - ldx #0 - - and #$7f - - ; 0 - $1f +$40 - ; $20 - $3f - ; $40 - $7e +$80 - - cmp #$1f - bcs @sk1 -;; clc - adc #$40 - rts - -@sk1: - cmp #$40 - bcc @end - clc - adc #$80 -@end: - rts diff --git a/libsrc/vic20/cpeekchar.s b/libsrc/vic20/cpeekchar.s deleted file mode 100644 index fae7ec1b4..000000000 --- a/libsrc/vic20/cpeekchar.s +++ /dev/null @@ -1,39 +0,0 @@ - - .export _cpeekchar - .export _cpeekcharxy - - .import _gotoxy - - .include "vic20.inc" - - .segment "CODE" - -_cpeekcharxy: - - jsr _gotoxy ; Set cursor - -_cpeekchar: - - ldy CURS_X - lda (SCREEN_PTR),y ; get char - ldx #0 - - and #$7f - - ; 0 - $1f +$40 - ; $20 - $3f - ; $40 - $7e +$80 - - cmp #$1f - bcs @sk1 -;; clc - adc #$40 - rts - -@sk1: - cmp #$40 - bcc @end - clc - adc #$80 -@end: - rts From 10c2ce205b77c979ea396eb92bd503d5d9f75281 Mon Sep 17 00:00:00 2001 From: mrdudz Date: Sun, 24 Jul 2022 04:59:45 +0200 Subject: [PATCH 09/28] cleanup --- libsrc/atari/cpeekchar.s | 50 ++++++++++++++++++---------------------- libsrc/atmos/cpeekchar.s | 43 +++++++++++++++------------------- libsrc/nes/cpeekchar.s | 40 ++++++++++++++------------------ 3 files changed, 58 insertions(+), 75 deletions(-) diff --git a/libsrc/atari/cpeekchar.s b/libsrc/atari/cpeekchar.s index 6697ce230..c895059db 100644 --- a/libsrc/atari/cpeekchar.s +++ b/libsrc/atari/cpeekchar.s @@ -1,41 +1,35 @@ - .export _cpeekchar - .export _cpeekcharxy + .export _cpeekchar - .import _gotoxy - .import mul40 - .importzp ptr4 + .import mul40 + .importzp ptr4 - .include "atari.inc" + .include "atari.inc" - .segment "CODE" - -_cpeekcharxy: - - jsr _gotoxy ; Set cursor + .segment "CODE" _cpeekchar: - lda ROWCRS - jsr mul40 ; destroys tmp4 - clc - adc SAVMSC ; add start of screen memory - sta ptr4 - txa - adc SAVMSC+1 - sta ptr4+1 + lda ROWCRS + jsr mul40 ; destroys tmp4 + clc + adc SAVMSC ; add start of screen memory + sta ptr4 + txa + adc SAVMSC+1 + sta ptr4+1 - ldy COLCRS - lda (ptr4),y ; get char - tax + ldy COLCRS + lda (ptr4),y ; get char + tax - ;; convert to asc + ;; convert to asc - ;; ugly hack here to make tetris fx work :=P - lda #' ' - cpx #0 + ;; FIXME: ugly hack here to make tetris fx work :=P + lda #' ' + cpx #0 beq @l - lda #0 + lda #0 @l: ldx #0 - rts + rts diff --git a/libsrc/atmos/cpeekchar.s b/libsrc/atmos/cpeekchar.s index a1d6d4474..a03bdb6a7 100644 --- a/libsrc/atmos/cpeekchar.s +++ b/libsrc/atmos/cpeekchar.s @@ -1,36 +1,31 @@ - .include "atmos.inc" + .include "atmos.inc" -.import _gotoxy -.export _cpeekchar,_cpeekcharxy - -_cpeekcharxy: - - jsr _gotoxy ; Will pop x parameter + .export _cpeekchar _cpeekchar: - ldy CURS_Y - ldx ScrTabLo,y - stx @l+1 - ldx ScrTabHi,y - stx @l+2 - ldx CURS_X + ldy CURS_Y + ldx ScrTabLo,y + stx @l+1 + ldx ScrTabHi,y + stx @l+2 + ldx CURS_X @l: - lda $bb80,x -;; inc COORDX_TEXT - ldx #0 - rts + lda $bb80,x +;; inc COORDX_TEXT + ldx #0 + rts - ; FIXME: is that table available elsewhere? + ; FIXME: is that table available elsewhere? .rodata ScrTabLo: - .repeat 28, Line - .byte <(SCREEN + Line * 40) - .endrep + .repeat 28, Line + .byte <(SCREEN + Line * 40) + .endrep ScrTabHi: - .repeat 28, Line - .byte >(SCREEN + Line * 40) - .endrep + .repeat 28, Line + .byte >(SCREEN + Line * 40) + .endrep diff --git a/libsrc/nes/cpeekchar.s b/libsrc/nes/cpeekchar.s index 292a4591f..995e01bc1 100644 --- a/libsrc/nes/cpeekchar.s +++ b/libsrc/nes/cpeekchar.s @@ -1,40 +1,34 @@ - .export _cpeekchar - .export _cpeekcharxy + .export _cpeekchar - .import _gotoxy - .import ppubuf_waitempty + .import ppubuf_waitempty - .include "nes.inc" + .include "nes.inc" - .segment "CODE" - -_cpeekcharxy: - - jsr _gotoxy ; Set cursor + .segment "CODE" _cpeekchar: - ; wait until all console data has been written - jsr ppubuf_waitempty + ; wait until all console data has been written + jsr ppubuf_waitempty + + ldy SCREEN_PTR+1 + ldx SCREEN_PTR - ldy SCREEN_PTR+1 - ldx SCREEN_PTR - ; waiting for vblank is incredibly slow :// vwait: -; lda $2002 ;wait -; bpl vwait +; lda $2002 ;wait +; bpl vwait - lda #0 - sty $2006 + lda #0 + sty $2006 stx $2006 - ldy $2007 ; first read is invalid - ldy $2007 ; get data + ldy $2007 ; first read is invalid + ldy $2007 ; get data sta $2006 sta $2006 tya - and #$7f ; ?!?! - rts + and #$7f ; ?!?! + rts From aeb13b60a71efb71624d63b753bf828acb3fef0b Mon Sep 17 00:00:00 2001 From: mrdudz Date: Sun, 24 Jul 2022 19:10:27 +0200 Subject: [PATCH 10/28] rename --- libsrc/atari/cpeekchar.s | 4 ++-- libsrc/atmos/cpeekchar.s | 4 ++-- libsrc/nes/cpeekchar.s | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/libsrc/atari/cpeekchar.s b/libsrc/atari/cpeekchar.s index c895059db..ff502074d 100644 --- a/libsrc/atari/cpeekchar.s +++ b/libsrc/atari/cpeekchar.s @@ -1,5 +1,5 @@ - .export _cpeekchar + .export _cpeekc .import mul40 .importzp ptr4 @@ -8,7 +8,7 @@ .segment "CODE" -_cpeekchar: +_cpeekc: lda ROWCRS jsr mul40 ; destroys tmp4 diff --git a/libsrc/atmos/cpeekchar.s b/libsrc/atmos/cpeekchar.s index a03bdb6a7..2139989c3 100644 --- a/libsrc/atmos/cpeekchar.s +++ b/libsrc/atmos/cpeekchar.s @@ -1,9 +1,9 @@ .include "atmos.inc" - .export _cpeekchar + .export _cpeekc -_cpeekchar: +_cpeekc: ldy CURS_Y ldx ScrTabLo,y diff --git a/libsrc/nes/cpeekchar.s b/libsrc/nes/cpeekchar.s index 995e01bc1..b4e3c34fd 100644 --- a/libsrc/nes/cpeekchar.s +++ b/libsrc/nes/cpeekchar.s @@ -1,5 +1,5 @@ - .export _cpeekchar + .export _cpeekc .import ppubuf_waitempty @@ -7,7 +7,7 @@ .segment "CODE" -_cpeekchar: +_cpeekc: ; wait until all console data has been written jsr ppubuf_waitempty From a998d3490713e29f8ce16ecc7967cede6227a733 Mon Sep 17 00:00:00 2001 From: mrdudz Date: Sun, 24 Jul 2022 19:16:15 +0200 Subject: [PATCH 11/28] remove tabs --- libsrc/atmos/cpeekchar.s | 3 +-- libsrc/nes/cpeekchar.s | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/libsrc/atmos/cpeekchar.s b/libsrc/atmos/cpeekchar.s index 2139989c3..fba51bf72 100644 --- a/libsrc/atmos/cpeekchar.s +++ b/libsrc/atmos/cpeekchar.s @@ -1,5 +1,5 @@ - .include "atmos.inc" + .include "atmos.inc" .export _cpeekc @@ -28,4 +28,3 @@ ScrTabHi: .repeat 28, Line .byte >(SCREEN + Line * 40) .endrep - diff --git a/libsrc/nes/cpeekchar.s b/libsrc/nes/cpeekchar.s index b4e3c34fd..55230edbc 100644 --- a/libsrc/nes/cpeekchar.s +++ b/libsrc/nes/cpeekchar.s @@ -3,7 +3,7 @@ .import ppubuf_waitempty - .include "nes.inc" + .include "nes.inc" .segment "CODE" From 3f618d7de96ce32e41544d8a1e7e67f010168cf9 Mon Sep 17 00:00:00 2001 From: Sven Michael Klose Date: Sun, 18 Aug 2024 21:57:06 +0200 Subject: [PATCH 12/28] Add Plus/4 wrapper for KERNAL's GETIN. --- libsrc/plus4/kgetin.s | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 libsrc/plus4/kgetin.s diff --git a/libsrc/plus4/kgetin.s b/libsrc/plus4/kgetin.s new file mode 100644 index 000000000..14919f750 --- /dev/null +++ b/libsrc/plus4/kgetin.s @@ -0,0 +1,14 @@ +.export GETIN + +.include "plus4.inc" + +KERNAL_GETIN := $FFE4 + +.segment "LOWCODE" ; Stay out of ROM area. + +.proc GETIN + sta ENABLE_ROM + jsr KERNAL_GETIN + sta ENABLE_RAM + rts +.endproc From 1b85ab698545c14f14da2b975984f4c9270ced2f Mon Sep 17 00:00:00 2001 From: Gorilla Sapiens Date: Tue, 6 May 2025 03:02:18 +0000 Subject: [PATCH 13/28] C style character translation in ca65 --- libsrc/common/fgets.s | 17 +----- src/ca65/scanner.c | 131 +++++++++++++++++++++++++++++++++--------- 2 files changed, 104 insertions(+), 44 deletions(-) diff --git a/libsrc/common/fgets.s b/libsrc/common/fgets.s index d5ea900d0..c25664f19 100644 --- a/libsrc/common/fgets.s +++ b/libsrc/common/fgets.s @@ -90,22 +90,7 @@ read_loop: bne :+ inc ptr4+1 - ; The next code line: - ; - ; .byte $c9, "\n" - ; - ; corresponds to a CMP #imm with the target-specific newline value as its operand. - ; This works because (with the 'string_escapes' feature enabled), the "\n" string - ; assembles to the target-specific value for the newline character. - ; - ; It would be better if we could just write: - ; - ; cmp #'\n' - ; - ; Unfortunately, ca65 doesn't currently handle escape characters in character - ; constants. In the longer term, fixing that would be the preferred solution. - -: .byte $c9, "\n" ; cmp #'\n' +: cmp #'\n' ; #'\n' should get translated properly beq done bne read_loop diff --git a/src/ca65/scanner.c b/src/ca65/scanner.c index 89ff851fc..8b910e672 100644 --- a/src/ca65/scanner.c +++ b/src/ca65/scanner.c @@ -46,6 +46,7 @@ #include "check.h" #include "filestat.h" #include "fname.h" +#include "tgttrans.h" #include "xmalloc.h" /* ca65 */ @@ -788,14 +789,33 @@ static void ReadIdent (void) static void ReadStringConst (int StringTerm) /* Read a string constant into SVal. */ { + int NeedNext; + /* Skip the leading string terminator */ NextChar (); /* Read the string */ while (1) { + int Cooked = 1; + NeedNext = 1; + + if (StringTerm == 0 && SB_GetLen(&CurTok.SVal) == 1) { + if (C == '\'') { + break; + } + else if (MissingCharTerm) { + NeedNext = 0; + break; + } + else { + Error ("Illegal character constant"); + } + } + if (C == StringTerm) { break; } + if (C == '\n' || C == EOF) { Error ("Newline in string constant"); break; @@ -808,20 +828,74 @@ static void ReadStringConst (int StringTerm) case EOF: Error ("Unterminated escape sequence in string constant"); break; - case '\\': - case '\'': - case '"': + case '?': + C = '\?'; break; - case 't': - C = '\x09'; + case 'a': + C = '\a'; + break; + case 'b': + C = '\b'; + break; + case 'e': + C = '\x1B'; /* see comments in cc65/scanner.c */ + break; + case 'f': + C = '\f'; break; case 'r': - C = '\x0D'; + C = '\r'; break; case 'n': - C = '\x0A'; + C = '\n'; break; + case 't': + C = '\t'; + break; + case 'v': + C = '\v'; + break; + case '\\': + C = '\\'; /* unnecessary but more readable */ + break; + case '\'': + C = '\''; /* unnecessary but more readable */ + if (StringTerm == 0) { + /* special case used by character constants + ** when LooseStringTerm not set. this will + ** cause '\' to be a valid character constant + */ + C = '\\'; + NeedNext = 0; + } + break; + case '\"': + C = '\"'; /* unnecessary but more readable */ + break; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + { /* brace needed for scoping */ + int Count = 1; + int Final = DigitVal(C); + Cooked = 0; + NextChar (); + while (IsODigit (C) && Count++ < 3) { + Final = (Final << 3) | DigitVal(C); + NextChar(); + } + if (C >= 256) + Error ("Octal character constant out of range"); + } + break; + case 'X': case 'x': + Cooked = 0; NextChar (); if (IsXDigit (C)) { char high_nibble = DigitVal (C) << 4; @@ -839,14 +913,19 @@ static void ReadStringConst (int StringTerm) } /* Append the char to the string */ - SB_AppendChar (&CurTok.SVal, C); + SB_AppendCharCooked (&CurTok.SVal, C, Cooked); - /* Skip the character */ - NextChar (); + if (NeedNext) { + /* Skip the character */ + NextChar (); + NeedNext = 1; + } } - /* Skip the trailing terminator */ - NextChar (); + if (NeedNext) { + /* Skip the trailing terminator */ + NextChar (); + } /* Terminate the string */ SB_Terminate (&CurTok.SVal); @@ -1465,12 +1544,13 @@ CharAgain: return; case '\'': - /* Hack: If we allow ' as terminating character for strings, read - ** the following stuff as a string, and check for a one character - ** string later. - */ if (LooseStringTerm) { + /* Hack: If we allow ' as terminating character for strings, read + ** the following stuff as a string, and check for a one character + ** string later. + */ ReadStringConst ('\''); + TgtTranslateStrBuf(&CurTok.SVal); if (SB_GetLen (&CurTok.SVal) == 1) { CurTok.IVal = SB_AtUnchecked (&CurTok.SVal, 0); CurTok.Tok = TOK_CHARCON; @@ -1478,22 +1558,17 @@ CharAgain: CurTok.Tok = TOK_STRCON; } } else { - /* Always a character constant */ - NextChar (); - if (C == EOF || IsControl (C)) { + /* Always a character constant + ** Hack: Pass 0 to ReadStringConst for special handling. + */ + ReadStringConst(0); + TgtTranslateStrBuf(&CurTok.SVal); + if (SB_GetLen(&CurTok.SVal) != 1) { Error ("Illegal character constant"); goto CharAgain; } - CurTok.IVal = C; + CurTok.IVal = SB_AtUnchecked (&CurTok.SVal, 0); CurTok.Tok = TOK_CHARCON; - NextChar (); - if (C != '\'') { - if (!MissingCharTerm) { - Error ("Illegal character constant"); - } - } else { - NextChar (); - } } return; From cfbfaa559cbc75c6af62294dcbaaa4f9dada3306 Mon Sep 17 00:00:00 2001 From: Colin Leroy-Mira Date: Tue, 13 May 2025 21:26:47 +0200 Subject: [PATCH 14/28] Add ZX02 and LZSA (1,2) decompressors --- doc/funcref.sgml | 79 +++++++ include/lzsa.h | 56 +++++ include/zx02.h | 44 ++++ libsrc/common/lzsa1.s | 207 ++++++++++++++++++ libsrc/common/lzsa2.s | 308 +++++++++++++++++++++++++++ libsrc/common/zx02.s | 148 +++++++++++++ test/val/lzsa1.c | 478 ++++++++++++++++++++++++++++++++++++++++++ test/val/lzsa2.c | 438 ++++++++++++++++++++++++++++++++++++++ test/val/zx02.c | 416 ++++++++++++++++++++++++++++++++++++ 9 files changed, 2174 insertions(+) create mode 100644 include/lzsa.h create mode 100644 include/zx02.h create mode 100644 libsrc/common/lzsa1.s create mode 100644 libsrc/common/lzsa2.s create mode 100644 libsrc/common/zx02.s create mode 100644 test/val/lzsa1.c create mode 100644 test/val/lzsa2.c create mode 100644 test/val/zx02.c diff --git a/doc/funcref.sgml b/doc/funcref.sgml index eec04b929..e534b47be 100644 --- a/doc/funcref.sgml +++ b/doc/funcref.sgml @@ -521,6 +521,14 @@ see also testcode/lib/em-test.c and samples/multidemo.c. +

+ + + + + + +

@@ -893,6 +901,13 @@ communication, see also testcode/lib/ser-test.c. (incomplete) +

+ + + + + + Alphabetical function reference

_DE_ISDIR

@@ -3381,6 +3396,70 @@ used in presence of a prototype. Use LZ4_compress_HC with compression level 16 for best compression. +Your program will need to know the uncompressed size of the buffer as +there is no end-of-stream marker. +LZ4 is the biggest and second-slowest decompressor shipped in cc65 runtime. +It is also the least efficient compression algorithm. + + + + + +decompress_lzsa1

+ + + +/ + +Use The project and compressor can be found at +LZSA1 is the fastest decompressor shipped in cc65 runtime, but data is less +compressed than with LZSA2 and ZX02. + + + + + +decompress_lzsa2

+ + + +/ + +Use The project and compressor can be found at +LZSA2 is the second fastest decompressor shipped in cc65 runtime, but data is less +compressed than with ZX02. + + + + + +decompress_zx02

+ + + +/ + +Use The project and compressor can be found at +ZX02 is the slowest decompressor shipped with cc65 runtime, but is also the +smallest and has the best compression ratio. +#include +#include + +/* The sample data is the original lz4.h, compressed with: + * lzsa -r -f 1 lz4.h lz4.lzsa1 + * + * We reused lz4.h from the LZ4 test to have a matching adler32 sum. + */ +static const unsigned char compressed[] = { + 0x71, 0x22, 0x2f, 0x2a, 0x0a, 0x20, 0x20, 0x20, 0x4c, 0x5a, 0x34, 0x20, 0x2d, 0x20, 0x46, 0x61, + 0x73, 0x74, 0x20, 0x4c, 0x5a, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x20, 0x61, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0xd9, 0x71, 0x04, 0x48, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x20, 0x46, 0x69, 0x6c, 0x65, 0xf1, 0x70, 0x16, 0x43, 0x6f, 0x70, 0x79, + 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, 0x43, 0x29, 0x20, 0x32, 0x30, 0x31, 0x31, 0x2d, 0x32, + 0x30, 0x31, 0x35, 0x2c, 0x20, 0x59, 0x61, 0x6e, 0x6e, 0xe2, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x2e, + 0x0a, 0xd6, 0x73, 0x2a, 0x42, 0x53, 0x44, 0x20, 0x32, 0x2d, 0x43, 0x6c, 0x61, 0x75, 0x73, 0x65, + 0x20, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x20, 0x28, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, + 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, + 0x6f, 0x72, 0x67, 0x2f, 0x6c, 0xdd, 0x64, 0x73, 0x2f, 0x62, 0x73, 0x64, 0x2d, 0xf3, 0x52, 0x2e, + 0x70, 0x68, 0x70, 0x29, 0xb2, 0x72, 0x04, 0x52, 0x65, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, + 0x75, 0x74, 0x5d, 0x31, 0x6e, 0x64, 0x20, 0xa8, 0x33, 0x69, 0x6e, 0x20, 0xbd, 0x02, 0xee, 0x70, + 0x08, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2c, 0x20, 0x77, + 0x3d, 0x32, 0x20, 0x6f, 0x72, 0xf8, 0x31, 0x6f, 0x75, 0x74, 0xba, 0x71, 0x01, 0x6d, 0x6f, 0x64, + 0x69, 0x66, 0x69, 0x63, 0x61, 0xbc, 0x70, 0x0f, 0x2c, 0x20, 0x61, 0x72, 0x65, 0x20, 0x70, 0x65, + 0x72, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0xf7, 0x40, + 0x74, 0x68, 0x61, 0x74, 0xfb, 0x30, 0x65, 0x20, 0x66, 0x32, 0xd0, 0x6f, 0x77, 0x69, 0x6e, 0x67, + 0xe2, 0xfe, 0x31, 0x6e, 0x64, 0x69, 0xcb, 0x11, 0x73, 0xcb, 0x02, 0xb6, 0x30, 0x65, 0x74, 0x3a, + 0x67, 0x03, 0xff, 0x1c, 0x2a, 0x61, 0x44, 0x73, 0x20, 0x6f, 0x66, 0x68, 0x00, 0xc5, 0xd0, 0x64, + 0x65, 0x20, 0x6d, 0x75, 0x9a, 0xfe, 0x62, 0x72, 0x65, 0x74, 0x61, 0x69, 0x6e, 0xa6, 0x40, 0x61, + 0x62, 0x6f, 0x76, 0xe5, 0x84, 0xb4, 0xfe, 0x02, 0x65, 0x30, 0x6e, 0x6f, 0x74, 0x0c, 0x10, 0x2c, + 0xe1, 0x40, 0x69, 0x73, 0x20, 0x6c, 0xb3, 0x00, 0xbc, 0x0a, 0x88, 0x2c, 0x6e, 0x64, 0x6b, 0x00, + 0x8e, 0x7f, 0x01, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x65, 0x72, 0x2e, 0x77, 0x08, 0xa9, 0x69, 0x6e, + 0xea, 0xfe, 0x05, 0x77, 0x00, 0x14, 0x46, 0x64, 0x75, 0x63, 0x65, 0x74, 0x01, 0x2d, 0x07, 0x71, + 0x0f, 0x74, 0x2b, 0x01, 0xb6, 0x04, 0x1a, 0xf5, 0x02, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x61, 0x4d, 0xfe, 0x50, 0x2f, 0x6f, 0x72, 0x20, 0x6f, 0xe6, 0xf6, 0x04, 0x72, 0x20, 0x6d, + 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x73, 0x89, 0xfe, 0x83, 0x51, 0xfe, 0x22, 0x74, 0x68, + 0x75, 0x09, 0x3c, 0x83, 0xb2, 0xfd, 0x71, 0x3c, 0x54, 0x48, 0x49, 0x53, 0x20, 0x53, 0x4f, 0x46, + 0x54, 0x57, 0x41, 0x52, 0x45, 0x20, 0x49, 0x53, 0x20, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x44, 0x45, + 0x44, 0x20, 0x42, 0x59, 0x20, 0x54, 0x48, 0x45, 0x20, 0x43, 0x4f, 0x50, 0x59, 0x52, 0x49, 0x47, + 0x48, 0x54, 0x20, 0x48, 0x4f, 0x4c, 0x44, 0x45, 0x52, 0x53, 0x20, 0x41, 0x4e, 0x44, 0x20, 0x43, + 0x4f, 0x4e, 0x54, 0x52, 0x49, 0x42, 0x55, 0x54, 0x4f, 0x52, 0x53, 0xb9, 0x30, 0x22, 0x41, 0x53, + 0xc3, 0x12, 0x22, 0xe4, 0x70, 0x0d, 0x41, 0x4e, 0x59, 0x20, 0x45, 0x58, 0x50, 0x52, 0x45, 0x53, + 0x53, 0x20, 0x4f, 0x52, 0x20, 0x49, 0x4d, 0x50, 0x4c, 0x49, 0xb0, 0x00, 0x9f, 0x70, 0x0d, 0x52, + 0x41, 0x4e, 0x54, 0x49, 0x45, 0x53, 0x2c, 0x20, 0x49, 0x4e, 0x43, 0x4c, 0x55, 0x44, 0x49, 0x4e, + 0x47, 0x2c, 0x20, 0xbc, 0xc2, 0x20, 0x4e, 0x4f, 0x54, 0xc6, 0xfc, 0x40, 0x49, 0x4d, 0x49, 0x54, + 0xd6, 0x32, 0x54, 0x4f, 0x2c, 0x85, 0x0e, 0xc6, 0x00, 0xb0, 0x72, 0x0a, 0x46, 0x20, 0x4d, 0x45, + 0x52, 0x43, 0x48, 0x41, 0x4e, 0x54, 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x8d, 0x41, 0x46, + 0x49, 0x54, 0x4e, 0x91, 0x31, 0x46, 0x4f, 0x52, 0xb7, 0x71, 0x0e, 0x41, 0x20, 0x50, 0x41, 0x52, + 0x54, 0x49, 0x43, 0x55, 0x4c, 0x41, 0x52, 0x20, 0x50, 0x55, 0x52, 0x50, 0x4f, 0x53, 0x45, 0x20, + 0x20, 0x70, 0x04, 0x44, 0x49, 0x53, 0x43, 0x4c, 0x41, 0x49, 0x4d, 0x45, 0x44, 0x2e, 0x7c, 0x00, + 0x88, 0x7a, 0x05, 0x20, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x20, 0x53, 0x48, 0x41, 0x4c, 0x4c, 0x11, + 0x02, 0x6f, 0x50, 0x4f, 0x57, 0x4e, 0x45, 0x52, 0x3c, 0x0a, 0x11, 0x30, 0x20, 0x42, 0x45, 0x56, + 0x41, 0x41, 0x42, 0x4c, 0x45, 0x91, 0x02, 0x12, 0x61, 0x44, 0x49, 0x52, 0x45, 0x43, 0x54, 0x29, + 0x07, 0xf6, 0x40, 0x43, 0x49, 0x44, 0x45, 0x5b, 0x21, 0x4c, 0x2c, 0xb7, 0x50, 0x53, 0x50, 0x45, + 0x43, 0x49, 0xf4, 0x60, 0x20, 0x45, 0x58, 0x45, 0x4d, 0x50, 0x6a, 0x24, 0x59, 0x2c, 0xa9, 0x40, + 0x53, 0x45, 0x51, 0x55, 0xd8, 0x00, 0xe3, 0x60, 0x20, 0x44, 0x41, 0x4d, 0x41, 0x47, 0x1c, 0x9f, + 0x28, 0xe2, 0xfe, 0x0f, 0x81, 0x5b, 0xfe, 0x51, 0x43, 0x55, 0x52, 0x45, 0x4d, 0x44, 0xf2, 0x0b, + 0x4f, 0x46, 0x20, 0x53, 0x55, 0x42, 0x53, 0x54, 0x49, 0x54, 0x55, 0x54, 0x45, 0x20, 0x47, 0x4f, + 0x4f, 0x44, 0x89, 0xfe, 0xf2, 0x06, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x53, 0x3b, 0x20, + 0x4c, 0x4f, 0x53, 0xc7, 0xfe, 0x32, 0x55, 0x53, 0x45, 0x73, 0x41, 0x44, 0x41, 0x54, 0x41, 0x81, + 0x01, 0xba, 0x51, 0x46, 0x49, 0x54, 0x53, 0x3b, 0xf4, 0xc2, 0x42, 0x55, 0x53, 0x49, 0xbd, 0xfe, + 0x70, 0x0d, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x52, 0x55, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x29, 0x20, + 0x48, 0x4f, 0x57, 0x45, 0x56, 0x45, 0x56, 0x10, 0x41, 0xc2, 0x92, 0x44, 0x94, 0xfe, 0x21, 0x4f, + 0x4e, 0x0c, 0x83, 0xc4, 0xfd, 0x41, 0x45, 0x4f, 0x52, 0x59, 0xa5, 0xa4, 0x4c, 0x49, 0x72, 0xfe, + 0x50, 0x2c, 0x20, 0x57, 0x48, 0x45, 0xe8, 0x10, 0x52, 0xb8, 0x83, 0xca, 0xfe, 0x91, 0x41, 0xf1, + 0xfe, 0x69, 0x53, 0x54, 0x52, 0x49, 0x43, 0x54, 0xd9, 0x20, 0x4f, 0x52, 0x37, 0x11, 0x52, 0x27, + 0x08, 0x10, 0x71, 0x04, 0x20, 0x4e, 0x45, 0x47, 0x4c, 0x49, 0x47, 0x45, 0x4e, 0x43, 0x45, 0xdf, + 0x11, 0x4f, 0xb7, 0xd0, 0x57, 0x49, 0x53, 0x45, 0x29, 0x43, 0xfe, 0x21, 0x49, 0x53, 0xdf, 0x12, + 0x49, 0x83, 0x30, 0x20, 0x57, 0x41, 0x89, 0x11, 0x55, 0x04, 0x01, 0x7b, 0x01, 0x26, 0x82, 0x51, + 0xfe, 0x9b, 0x46, 0x31, 0xfd, 0x92, 0x2c, 0x22, 0xfe, 0x70, 0x01, 0x20, 0x49, 0x46, 0x20, 0x41, + 0x44, 0x56, 0x49, 0x40, 0x05, 0xd0, 0x53, 0x50, 0x4f, 0x53, 0x53, 0x49, 0x76, 0x83, 0xc1, 0xfe, + 0xa4, 0x43, 0x48, 0x82, 0xfe, 0x83, 0xeb, 0xfc, 0xf1, 0x00, 0x59, 0x6f, 0x75, 0x20, 0x63, 0x61, + 0x6e, 0x65, 0xfc, 0xc3, 0x74, 0x61, 0x63, 0x74, 0x31, 0xfc, 0xe0, 0x75, 0x74, 0x68, 0x6f, 0x72, + 0x20, 0x3d, 0xfb, 0x11, 0x3a, 0xdd, 0x91, 0x2d, 0x18, 0xfa, 0x84, 0x74, 0xfb, 0x81, 0x07, 0xfc, + 0xd0, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0xf2, 0xfb, 0xa1, 0x3a, 0x20, 0x76, 0xfa, 0x77, 0x14, 0x73, + 0x3a, 0x2f, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x43, 0x79, + 0x61, 0x6e, 0x34, 0x39, 0x37, 0x33, 0x2f, 0x6c, 0x7a, 0x34, 0xc3, 0xe1, 0x70, 0x75, 0x62, 0x6c, + 0x69, 0x63, 0xc0, 0xfb, 0x29, 0x75, 0x6d, 0xc8, 0x72, 0x05, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0xc1, 0x02, 0xde, 0x32, 0x2f, 0x23, 0x21, 0xf8, 0x01, 0xbc, + 0x71, 0x20, 0x63, 0x0a, 0x2a, 0x2f, 0x0a, 0x23, 0x70, 0x72, 0x61, 0x67, 0x6d, 0x61, 0x20, 0x6f, + 0x6e, 0x63, 0x65, 0x0a, 0x0a, 0x23, 0x69, 0x66, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, + 0x20, 0x28, 0x5f, 0x5f, 0x63, 0x70, 0x6c, 0x75, 0x73, 0xfc, 0xf1, 0x10, 0x29, 0x0a, 0x65, 0x78, + 0x74, 0x65, 0x72, 0x6e, 0x20, 0x22, 0x43, 0x22, 0x20, 0x7b, 0x0a, 0x23, 0x65, 0x6e, 0x64, 0x69, + 0x66, 0x0a, 0x0a, 0x55, 0xf9, 0x20, 0x2a, 0x20, 0xb5, 0xa5, 0x2e, 0x68, 0xd6, 0xfb, 0xfa, 0x00, + 0x73, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0xf9, 0xc2, 0x66, 0x75, 0x6e, 0x63, 0x65, 0xfb, + 0x92, 0x2c, 0x64, 0xfb, 0x50, 0x67, 0x69, 0x76, 0x65, 0x73, 0xeb, 0xf2, 0x02, 0x6c, 0x6c, 0x20, + 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0xde, 0xfe, 0x61, 0x72, 0x6f, 0x6c, 0x20, 0x74, 0x6f, 0xb9, + 0xc3, 0x67, 0x72, 0x61, 0x6d, 0xc9, 0xfa, 0xe0, 0x2a, 0x20, 0x49, 0x66, 0x20, 0x79, 0xb9, 0xfe, + 0x41, 0x6e, 0x65, 0x65, 0x64, 0xe2, 0xf1, 0x00, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0xa6, + 0xf9, 0x00, 0x71, 0x30, 0x2d, 0x6f, 0x70, 0xf2, 0x36, 0x62, 0x6c, 0x65, 0x92, 0x00, 0xda, 0x60, + 0x64, 0x61, 0x74, 0x61, 0x20, 0x28, 0xf3, 0x20, 0x70, 0x65, 0x8b, 0xa2, 0x6e, 0x67, 0xdb, 0xfe, + 0x10, 0x66, 0xad, 0x21, 0x65, 0x20, 0xed, 0x86, 0x9f, 0xf9, 0x20, 0x29, 0x2c, 0xa0, 0x01, 0x70, + 0x82, 0x5c, 0xfe, 0xa3, 0x6c, 0x65, 0x60, 0xfe, 0xc1, 0x6c, 0x69, 0x62, 0x72, 0x71, 0xfa, 0x10, + 0x68, 0xe7, 0x10, 0x6c, 0x99, 0xf1, 0x0e, 0x74, 0x73, 0x20, 0x6f, 0x77, 0x6e, 0x20, 0x6d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x2c, 0x20, 0x70, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x24, 0xf9, 0x01, 0x0a, + 0x02, 0xaa, 0x20, 0x2e, 0x68, 0x73, 0xe1, 0x73, 0x74, 0x65, 0x61, 0x64, 0x2e, 0xb0, 0xfe, 0x3f, + 0x0a, 0x2f, 0x2a, 0xff, 0x13, 0xf1, 0x00, 0x0a, 0x2a, 0x20, 0x20, 0x56, 0x65, 0x72, 0xe0, 0xfe, + 0x1f, 0x0a, 0xce, 0x14, 0xb3, 0x2f, 0x0a, 0x23, 0x65, 0xfe, 0x01, 0x2e, 0xd0, 0x5f, 0x56, 0x45, + 0x52, 0x53, 0xa4, 0xfc, 0xe1, 0x5f, 0x4d, 0x41, 0x4a, 0x4f, 0x52, 0xa3, 0xf9, 0x11, 0x31, 0xfb, + 0xa1, 0x2f, 0x2a, 0xf7, 0xfd, 0x60, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x04, 0x83, 0xd9, 0xfe, + 0xa1, 0x66, 0x61, 0x17, 0xf9, 0x00, 0x2e, 0x5f, 0x67, 0x65, 0x73, 0x20, 0x20, 0xb8, 0x06, 0x23, + 0x49, 0x4e, 0xb8, 0x18, 0x37, 0xb8, 0x75, 0x02, 0x6e, 0x65, 0x77, 0x20, 0x28, 0x6e, 0x6f, 0x6e, + 0x2d, 0xaf, 0x19, 0x29, 0xae, 0xe0, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x8b, 0xf9, 0x2f, 0x65, + 0x73, 0xaa, 0x06, 0x7b, 0x00, 0x52, 0x45, 0x4c, 0x45, 0x41, 0x53, 0x45, 0x62, 0x20, 0x74, 0x77, + 0xb3, 0xa0, 0x73, 0x2c, 0x03, 0xfe, 0x60, 0x67, 0x2d, 0x66, 0x69, 0x78, 0x65, 0xf5, 0x00, 0xea, + 0xf1, 0x00, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x6e, 0xf9, 0x0f, 0xb2, 0x06, 0xc0, 0x4e, + 0x55, 0x4d, 0x42, 0xec, 0xfb, 0x1f, 0x28, 0x00, 0x00, 0x41, 0x2a, 0x31, 0x30, 0x30, 0xfc, 0x2f, + 0x20, 0x2b, 0x2b, 0x01, 0x06, 0xe7, 0x0e, 0x68, 0x20, 0x29, 0x0a, 0x31, 0x02, 0xe7, 0x93, 0x76, + 0x75, 0xfe, 0xff, 0x07, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x28, 0x76, 0x6f, 0x69, 0x64, + 0x29, 0x3b, 0x33, 0xfe, 0x1b, 0xb1, 0x54, 0x75, 0x6e, 0x8e, 0xfe, 0xa1, 0x70, 0x61, 0xeb, 0xfd, + 0xbf, 0x74, 0x65, 0x72, 0x2a, 0xfe, 0x16, 0x83, 0xbb, 0xfc, 0x02, 0x7b, 0xb0, 0x4d, 0x45, 0x4d, + 0xf6, 0xfa, 0xb0, 0x5f, 0x55, 0x53, 0xbd, 0xfb, 0x21, 0x20, 0x3a, 0xea, 0x92, 0x4d, 0x88, 0xfd, + 0xe2, 0x20, 0x75, 0x73, 0x61, 0x67, 0x65, 0xdd, 0xf7, 0x71, 0x25, 0x75, 0x6c, 0x61, 0x20, 0x3a, + 0x20, 0x4e, 0x2d, 0x3e, 0x32, 0x5e, 0x4e, 0x20, 0x42, 0x79, 0x74, 0x65, 0x73, 0x20, 0x28, 0x65, + 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x20, 0x3a, 0x20, 0x31, 0x30, 0x20, 0x2d, 0x3e, 0x20, + 0x31, 0x4b, 0x42, 0x3b, 0x20, 0x31, 0x32, 0xf5, 0x40, 0x34, 0x4b, 0x42, 0x20, 0xf4, 0x11, 0x36, + 0xf4, 0x21, 0x36, 0x34, 0xe8, 0x13, 0x32, 0xdd, 0x10, 0x4d, 0xf5, 0xd2, 0x65, 0x74, 0x63, 0x2e, + 0x29, 0x9a, 0xfc, 0x61, 0x6e, 0x63, 0x72, 0x65, 0x61, 0x73, 0x40, 0x19, 0x6d, 0x8e, 0xa1, 0x69, + 0x6d, 0x2a, 0xfc, 0xaa, 0x65, 0x73, 0x32, 0xfc, 0x91, 0x72, 0xc1, 0xfc, 0x93, 0x0a, 0x33, 0xf7, + 0x4b, 0x75, 0x63, 0x65, 0x64, 0xcd, 0x34, 0x63, 0x61, 0x6e, 0xc9, 0x82, 0x90, 0xfc, 0xe0, 0x65, + 0x64, 0x2c, 0x20, 0x64, 0x75, 0x35, 0xf7, 0x10, 0x6f, 0xe6, 0xd0, 0x63, 0x68, 0x65, 0x20, 0x65, + 0x0f, 0xfc, 0x21, 0x63, 0x74, 0xc1, 0x70, 0x05, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, + 0x76, 0x61, 0x6c, 0x75, 0x95, 0x51, 0x73, 0x20, 0x31, 0x34, 0x2c, 0x1c, 0x00, 0x52, 0xa0, 0x4b, + 0x42, 0xe0, 0xf5, 0xe0, 0x68, 0x69, 0x63, 0x68, 0x20, 0x6e, 0x16, 0xf7, 0xe1, 0x6c, 0x79, 0x20, + 0x66, 0x69, 0x74, 0xd3, 0xf6, 0x20, 0x74, 0x6f, 0x55, 0x73, 0x03, 0x74, 0x65, 0x6c, 0x20, 0x78, + 0x38, 0x36, 0x20, 0x4c, 0x31, 0xad, 0x99, 0x0a, 0xd1, 0xfd, 0x8e, 0xb9, 0xfe, 0xbf, 0x31, 0x34, + 0x0a, 0x39, 0xfe, 0x1b, 0xa1, 0x53, 0x69, 0xb4, 0xfe, 0xa5, 0x20, 0x46, 0x4d, 0xfb, 0x8f, 0x39, + 0xfe, 0x17, 0x86, 0xb5, 0xfd, 0x85, 0xd4, 0xfe, 0x23, 0x5f, 0x64, 0x1f, 0x20, 0x28, 0x63, 0xb9, + 0x91, 0x74, 0x7f, 0xfc, 0xa4, 0x72, 0x2a, 0x15, 0xfa, 0x14, 0x2c, 0xf2, 0x51, 0x64, 0x65, 0x73, + 0x74, 0x2c, 0x28, 0x04, 0xe8, 0x43, 0x53, 0x69, 0x7a, 0x65, 0xf0, 0x40, 0x6d, 0x61, 0x78, 0x44, + 0xe3, 0x01, 0xef, 0x26, 0x29, 0x3b, 0xa5, 0x26, 0x64, 0x65, 0xa3, 0x5f, 0x73, 0x61, 0x66, 0x65, + 0x20, 0xa5, 0x12, 0x88, 0xe4, 0xfa, 0x0c, 0xa1, 0x0b, 0xe7, 0x83, 0x11, 0xfd, 0x1f, 0x0a, 0x3e, + 0x03, 0x93, 0x29, 0x52, 0xf9, 0x25, 0x20, 0x43, 0xce, 0x37, 0x73, 0x20, 0x27, 0x4e, 0xb2, 0x27, + 0x20, 0x62, 0x77, 0xfd, 0xc4, 0x66, 0x72, 0x6f, 0x6d, 0x2e, 0xfa, 0x05, 0xe1, 0x11, 0x27, 0xc9, + 0x83, 0x47, 0xfe, 0xb0, 0x61, 0x6c, 0x72, 0xdc, 0xfa, 0x10, 0x79, 0xf8, 0xc1, 0x6c, 0x6f, 0x63, + 0x61, 0x2d, 0xf4, 0x11, 0x27, 0x5c, 0x14, 0x27, 0xce, 0x82, 0x6c, 0xf4, 0x00, 0xb3, 0x28, 0x20, + 0x27, 0x05, 0x2a, 0x27, 0x2e, 0x89, 0xb1, 0x69, 0x6f, 0x6e, 0xd8, 0xfd, 0xa0, 0x67, 0x75, 0x9c, + 0xfc, 0xa4, 0x6e, 0x74, 0xed, 0xf9, 0x41, 0x73, 0x75, 0x63, 0x63, 0xf5, 0x2b, 0x69, 0x66, 0xc5, + 0xba, 0x20, 0x3e, 0x3d, 0x71, 0xfe, 0x67, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x28, 0x4a, 0x13, 0x29, + 0xa4, 0x20, 0x49, 0x74, 0x6e, 0x60, 0x73, 0x6f, 0x20, 0x72, 0x75, 0x6e, 0x3e, 0xa0, 0x61, 0x73, + 0x46, 0xfc, 0x20, 0x2c, 0x20, 0xf0, 0xb0, 0x69, 0x74, 0x27, 0xb6, 0xf4, 0xa1, 0x20, 0x72, 0xda, + 0xfe, 0xb1, 0x6d, 0x65, 0x6e, 0xfd, 0xf4, 0xb1, 0x73, 0x65, 0x74, 0xaf, 0xf9, 0x04, 0xc8, 0x91, + 0x66, 0x9c, 0xf4, 0x86, 0x25, 0xf9, 0x81, 0x08, 0xfd, 0xa7, 0x6e, 0x6f, 0x93, 0xfe, 0x86, 0xff, + 0xfe, 0x04, 0x03, 0xc1, 0x20, 0x6d, 0x6f, 0x72, 0xa2, 0xf9, 0x2a, 0x6d, 0x69, 0x06, 0xc2, 0x64, + 0x67, 0x65, 0x74, 0xb2, 0xf6, 0x8a, 0x9e, 0xfc, 0xc0, 0x73, 0x74, 0x6f, 0x70, 0xad, 0xfa, 0x10, + 0x69, 0x87, 0xc0, 0x64, 0x69, 0x61, 0x74, 0xff, 0xfc, 0x92, 0x2a, 0xc6, 0xf8, 0x0b, 0x8e, 0x00, + 0xd2, 0xb1, 0x75, 0x6c, 0x74, 0xef, 0xfe, 0x43, 0x7a, 0x65, 0x72, 0x6f, 0x6a, 0x11, 0x41, 0x4c, + 0x81, 0xeb, 0xfd, 0xd0, 0x65, 0x71, 0x75, 0x65, 0x6e, 0xf2, 0xfd, 0x04, 0x95, 0x82, 0x9e, 0xf8, + 0x22, 0x65, 0x6e, 0xd2, 0xa2, 0x6e, 0x6f, 0x8c, 0xfc, 0x23, 0x69, 0x64, 0xcd, 0x47, 0x54, 0x68, + 0x69, 0x73, 0xab, 0xc0, 0x6e, 0x65, 0x76, 0x65, 0x6c, 0xf2, 0xa1, 0x72, 0x69, 0x2f, 0xfe, 0xc0, + 0x6f, 0x75, 0x74, 0x73, 0x2d, 0xf8, 0x8b, 0x57, 0xfe, 0x10, 0x2c, 0xbf, 0xa1, 0x72, 0x20, 0x34, + 0xfe, 0x05, 0xe0, 0x05, 0x14, 0x03, 0xde, 0x88, 0x10, 0xf3, 0x88, 0x2a, 0xfd, 0x90, 0x20, 0x63, + 0xfb, 0xb0, 0x4d, 0x61, 0x78, 0x52, 0xfe, 0xc0, 0x70, 0x70, 0x6f, 0x72, 0xfc, 0xfe, 0x86, 0x09, + 0xfc, 0x83, 0x4d, 0xfc, 0x75, 0x07, 0x41, 0x58, 0x5f, 0x49, 0x4e, 0x50, 0x55, 0x54, 0x5f, 0x56, + 0x41, 0x4c, 0x55, 0x45, 0xbf, 0x89, 0xf9, 0xfc, 0xa3, 0x20, 0x3a, 0xcd, 0xf7, 0xa1, 0x6f, 0x72, + 0x9c, 0xfa, 0xc3, 0x74, 0x69, 0x61, 0x6c, 0xd0, 0xfd, 0x24, 0x6f, 0x66, 0x89, 0x05, 0x59, 0x92, + 0x28, 0xc6, 0xfb, 0x83, 0xb4, 0xf2, 0xaf, 0x62, 0x65, 0x88, 0xfd, 0x00, 0x16, 0x29, 0xa2, 0xc0, + 0x72, 0x65, 0x74, 0x75, 0x2c, 0xf7, 0x92, 0x3a, 0xa8, 0xfe, 0x93, 0x6e, 0x05, 0xfa, 0xa4, 0x6f, + 0x66, 0x32, 0xfd, 0xa1, 0x77, 0x72, 0x87, 0xf1, 0x92, 0x6e, 0x40, 0xfe, 0x0d, 0x9e, 0xb0, 0x6e, + 0x65, 0x63, 0x55, 0xfe, 0xb0, 0x61, 0x72, 0x69, 0x65, 0xfb, 0x21, 0x3c, 0x3d, 0x5a, 0x52, 0x4f, + 0x75, 0x74, 0x70, 0x75, 0x58, 0x00, 0xa1, 0x09, 0xff, 0x01, 0x50, 0xcb, 0x30, 0x20, 0x69, 0x66, + 0xef, 0xf6, 0xef, 0x61, 0x69, 0x6c, 0x73, 0x0a, 0x0a, 0x2d, 0xfc, 0x01, 0x85, 0x95, 0xfc, 0x88, + 0x4a, 0xfc, 0x04, 0x03, 0x22, 0x69, 0x73, 0x59, 0x00, 0xeb, 0xc1, 0x63, 0x69, 0x73, 0x65, 0xf4, + 0xfe, 0x86, 0xff, 0xfe, 0x01, 0xe7, 0x08, 0xcf, 0x83, 0x7e, 0xf6, 0xa6, 0x2e, 0x0a, 0xbf, 0xfe, + 0x0f, 0xb4, 0x05, 0x06, 0xc1, 0x01, 0x2a, 0xa2, 0x69, 0x6e, 0xf8, 0xf1, 0x86, 0x1b, 0xfe, 0x8f, + 0xbb, 0xfe, 0x0d, 0xaf, 0x2e, 0x0a, 0xbf, 0xfe, 0x0f, 0x18, 0x64, 0x88, 0x82, 0xba, 0xfe, 0x0f, + 0x98, 0x01, 0x8e, 0xb5, 0xfe, 0x0e, 0x50, 0x8e, 0xaf, 0xfe, 0x1f, 0x49, 0x50, 0x02, 0x85, 0x28, + 0xfd, 0xc0, 0x6c, 0x61, 0x72, 0x67, 0x9c, 0xf9, 0x62, 0x6e, 0x6f, 0x75, 0x67, 0x68, 0x2c, 0x7e, + 0x91, 0x64, 0x2b, 0xf9, 0xc2, 0x77, 0x69, 0x6c, 0x6c, 0xaa, 0xfc, 0x82, 0xba, 0xfc, 0x92, 0x6f, + 0x54, 0xfe, 0x00, 0xf5, 0xe3, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0xfc, 0xef, 0x5d, 0x28, 0x3c, + 0x30, 0x29, 0x2e, 0x96, 0x01, 0x28, 0x85, 0x62, 0xf4, 0x61, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x97, 0xe1, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x07, 0xf9, 0xa1, 0x61, 0x6c, 0x6c, 0xf8, 0xba, + 0x65, 0x64, 0x2c, 0x66, 0xfc, 0x07, 0x91, 0x06, 0x7e, 0x01, 0x88, 0x85, 0xd2, 0xfe, 0x50, 0x61, + 0x20, 0x6e, 0x65, 0x67, 0x43, 0xa4, 0x76, 0x65, 0x3d, 0xfc, 0x09, 0x89, 0x8e, 0x6f, 0xfc, 0x92, + 0x69, 0x7c, 0xf0, 0x04, 0x8f, 0xb1, 0x61, 0x67, 0x61, 0x94, 0xf5, 0x86, 0xcd, 0xfa, 0xc0, 0x76, + 0x65, 0x72, 0x66, 0x1d, 0xf0, 0xe0, 0x20, 0x65, 0x78, 0x70, 0x6c, 0x6f, 0xdd, 0xf8, 0x81, 0x23, + 0xfa, 0x31, 0x63, 0x6c, 0x75, 0x8e, 0x01, 0x63, 0xe3, 0x69, 0x63, 0x69, 0x6f, 0x75, 0x73, 0xee, + 0xf4, 0x7d, 0x00, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x1d, 0x9f, 0x74, 0x0e, 0xfc, 0x03, + 0x84, 0xdd, 0xfe, 0x8e, 0x0e, 0xfc, 0x07, 0xdf, 0x27, 0x69, 0x6e, 0xe0, 0x81, 0x08, 0xf5, 0x8f, + 0x9b, 0xf8, 0x1c, 0xd0, 0x41, 0x64, 0x76, 0x61, 0x6e, 0xc5, 0xf7, 0x87, 0x99, 0xf8, 0x8f, 0xfc, + 0xf4, 0x1e, 0x8c, 0xca, 0xfb, 0x45, 0x53, 0x49, 0x5a, 0x45, 0x2c, 0x52, 0x30, 0x78, 0x37, 0x45, + 0x30, 0xff, 0x83, 0x8d, 0xf5, 0xf4, 0x06, 0x32, 0x20, 0x31, 0x31, 0x33, 0x20, 0x39, 0x32, 0x39, + 0x20, 0x32, 0x31, 0x36, 0x64, 0xfd, 0x0c, 0xb7, 0xb2, 0x43, 0x4f, 0x4d, 0x97, 0xef, 0xf1, 0x01, + 0x42, 0x4f, 0x55, 0x4e, 0x44, 0x28, 0x69, 0x73, 0x8a, 0xfd, 0xc0, 0x20, 0x20, 0x28, 0x28, 0xec, + 0xf9, 0x65, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x29, 0xec, 0x27, 0x3e, 0x20, 0xec, 0x0f, 0x7e, 0x01, + 0x65, 0x3f, 0x20, 0x30, 0x20, 0x3a, 0x20, 0xd3, 0x34, 0x2b, 0x20, 0x28, 0xf5, 0x41, 0x2f, 0x32, + 0x35, 0x35, 0xf0, 0xb2, 0x31, 0x36, 0x29, 0x9b, 0xf8, 0x8e, 0x68, 0xf9, 0x86, 0x09, 0xfc, 0x95, + 0x50, 0xba, 0xf2, 0xb1, 0x74, 0x68, 0x65, 0xf3, 0xfc, 0xc2, 0x69, 0x6d, 0x75, 0x6d, 0x58, 0xfc, + 0x82, 0x08, 0xed, 0x01, 0x53, 0x8a, 0xb7, 0xfb, 0xb5, 0x6d, 0x61, 0x79, 0x54, 0xfe, 0x91, 0x69, + 0xa6, 0xfd, 0xc1, 0x22, 0x77, 0x6f, 0x72, 0xef, 0xf7, 0xe0, 0x61, 0x73, 0x65, 0x22, 0x20, 0x73, + 0x5b, 0xec, 0xe2, 0x61, 0x72, 0x69, 0x6f, 0x20, 0x28, 0x52, 0xfe, 0x83, 0xf8, 0xfd, 0x89, 0x5b, + 0xf9, 0xef, 0x69, 0x62, 0x6c, 0x65, 0x29, 0x0a, 0x8c, 0xfd, 0x05, 0xa3, 0x69, 0x6d, 0x6b, 0xfc, + 0xe1, 0x75, 0x73, 0x65, 0x66, 0x75, 0x6c, 0x67, 0xf6, 0x83, 0x17, 0xf6, 0x85, 0xfb, 0xfb, 0x02, + 0xd6, 0xe1, 0x70, 0x75, 0x72, 0x70, 0x6f, 0x73, 0x7b, 0xf5, 0x8f, 0x6c, 0xfc, 0x01, 0x97, 0x73, + 0x9a, 0xf8, 0xdf, 0x4d, 0x61, 0x63, 0x72, 0x6f, 0x95, 0xfe, 0x01, 0x10, 0x29, 0x94, 0x82, 0x80, + 0xf8, 0x86, 0x97, 0xed, 0x01, 0x97, 0x02, 0x5f, 0x22, 0x69, 0x6c, 0xb3, 0xc0, 0x2d, 0x74, 0x69, + 0x6d, 0x2e, 0xfc, 0x81, 0xd2, 0xf9, 0x03, 0xa3, 0x6f, 0x28, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x74, + 0x00, 0x02, 0xc7, 0x83, 0xf5, 0xf4, 0x05, 0x8a, 0xb4, 0x4e, 0x6f, 0x74, 0xc8, 0xfe, 0x8f, 0x2a, + 0xf7, 0x05, 0x04, 0xed, 0x85, 0x07, 0xf8, 0xd2, 0x20, 0x77, 0x68, 0x65, 0x6e, 0xa2, 0xfb, 0x09, + 0x3d, 0x00, 0x5d, 0x8f, 0xb4, 0xf7, 0x05, 0xaa, 0x72, 0x63, 0x60, 0xfb, 0x83, 0xeb, 0xfc, 0x85, + 0x12, 0xf9, 0x9f, 0x6d, 0x12, 0xf9, 0x05, 0x8e, 0xca, 0xfd, 0x8e, 0x71, 0xf9, 0x85, 0x08, 0xfe, + 0x84, 0x26, 0xfe, 0x02, 0x7b, 0x8f, 0x21, 0xfe, 0x09, 0x8f, 0x90, 0xf9, 0x01, 0x43, 0x2c, 0x20, + 0x69, 0x66, 0x72, 0x06, 0x3e, 0xb4, 0x74, 0x6f, 0x6f, 0xe2, 0xfa, 0x3f, 0x28, 0x20, 0x3e, 0x7a, + 0x01, 0xc3, 0x29, 0x0a, 0x2a, 0x2f, 0x3d, 0xf5, 0x0e, 0x18, 0x00, 0xea, 0x03, 0x25, 0x8f, 0xd9, + 0xf5, 0x06, 0xb7, 0x66, 0x61, 0x73, 0xdc, 0xf5, 0x91, 0x53, 0x96, 0xf0, 0xaf, 0x61, 0x73, 0x8d, + 0xfe, 0x05, 0x81, 0x0a, 0xf2, 0x92, 0x74, 0x4a, 0xfe, 0xa2, 0x77, 0x73, 0x42, 0xf6, 0xc2, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0xfa, 0x40, 0x22, 0x61, 0x63, 0x63, 0xf3, 0x92, 0x72, 0x33, 0xfe, 0xd0, + 0x22, 0x20, 0x66, 0x61, 0x63, 0xf6, 0xee, 0x85, 0x5d, 0xf7, 0x13, 0x65, 0x44, 0x92, 0x72, 0xbc, + 0xee, 0x09, 0xd7, 0x83, 0xa7, 0xfe, 0x83, 0x80, 0xfa, 0x01, 0x79, 0x03, 0xdd, 0x87, 0xdc, 0xe8, + 0x05, 0x90, 0xa3, 0x73, 0x6f, 0x21, 0xf0, 0x00, 0x73, 0x03, 0xdd, 0x89, 0xb9, 0xfc, 0x84, 0xf6, + 0xf5, 0x83, 0x0e, 0xf6, 0xa0, 0x74, 0x72, 0xae, 0xe8, 0x50, 0x2d, 0x6f, 0x66, 0x66, 0x2e, 0xee, + 0x82, 0x31, 0xf3, 0xb2, 0x62, 0x65, 0x20, 0xd6, 0xfb, 0xd4, 0x74, 0x75, 0x6e, 0x65, 0x64, 0x47, + 0xe9, 0xc2, 0x65, 0x61, 0x63, 0x68, 0x85, 0xf5, 0x01, 0xbe, 0x23, 0x76, 0x65, 0x79, 0x83, 0x3b, + 0xfd, 0x82, 0x82, 0xfa, 0x91, 0x72, 0x7e, 0xf9, 0x80, 0xc2, 0xfc, 0x42, 0x2b, 0x7e, 0x33, 0x25, + 0x18, 0xa5, 0x70, 0x65, 0xcb, 0xf8, 0x2f, 0x41, 0x6e, 0x3e, 0x00, 0x82, 0x79, 0xf8, 0xb6, 0x22, + 0x31, 0x22, 0x66, 0xf8, 0x84, 0xbb, 0xfe, 0x40, 0x72, 0x65, 0x67, 0x75, 0x06, 0x8f, 0xb3, 0xfe, + 0x05, 0x02, 0xb1, 0x11, 0x56, 0xc1, 0x91, 0x73, 0xc4, 0xf8, 0x93, 0x30, 0x87, 0xf9, 0x92, 0x62, + 0xb6, 0xed, 0xb1, 0x6c, 0x61, 0x63, 0xf6, 0xf7, 0xd0, 0x79, 0x20, 0x41, 0x43, 0x43, 0x13, 0xf1, + 0xb1, 0x52, 0x41, 0x54, 0x08, 0xf1, 0xf2, 0x05, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x20, + 0x28, 0x73, 0x65, 0x65, 0x48, 0xee, 0xa4, 0x63, 0x29, 0x15, 0xf8, 0x82, 0x7f, 0xf2, 0x95, 0x2e, + 0xfb, 0xfd, 0x8e, 0x21, 0xfe, 0x9f, 0x20, 0x3a, 0xf3, 0x2a, 0x06, 0xef, 0x0a, 0x07, 0xbf, 0x29, + 0x3b, 0x0a, 0xb5, 0xfd, 0x04, 0xe0, 0x5f, 0x65, 0x78, 0x74, 0x53, 0x74, 0x9a, 0xf7, 0x8a, 0xac, + 0xfd, 0x8f, 0xae, 0xed, 0x03, 0xb1, 0x2c, 0x20, 0x6a, 0x5e, 0xf7, 0xa3, 0x75, 0x73, 0x9c, 0xf8, + 0x93, 0x20, 0x5a, 0xed, 0xb6, 0x61, 0x6c, 0x6c, 0x98, 0xf3, 0x87, 0x60, 0xf1, 0xd2, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x74, 0xfe, 0x3b, 0x74, 0x6f, 0x72, 0xb1, 0x11, 0x73, 0x92, 0x83, 0x62, 0xfe, + 0xa3, 0x55, 0x73, 0xed, 0xf9, 0x81, 0xc8, 0xfc, 0x24, 0x6f, 0x66, 0x79, 0x01, 0xca, 0x60, 0x6b, + 0x6e, 0x6f, 0x77, 0x20, 0x68, 0xfc, 0x44, 0x6d, 0x75, 0x63, 0x68, 0xac, 0x85, 0xe0, 0xf6, 0x07, + 0x93, 0x83, 0x33, 0xf4, 0x36, 0x61, 0x6e, 0x64, 0xed, 0x40, 0x20, 0x69, 0x74, 0x20, 0x9d, 0xa3, + 0x38, 0x2d, 0x86, 0xf9, 0x91, 0x62, 0xad, 0xfc, 0xb1, 0x61, 0x72, 0x69, 0xcc, 0xfa, 0x03, 0x49, + 0x12, 0x6d, 0xd6, 0x01, 0x9b, 0x41, 0x79, 0x70, 0x69, 0x63, 0x44, 0x96, 0x29, 0x09, 0xfd, 0xa4, + 0x6e, 0x2c, 0xe7, 0xfa, 0x02, 0xb9, 0xc1, 0x61, 0x73, 0x20, 0x27, 0x66, 0xef, 0x13, 0x2a, 0x4f, + 0x10, 0x27, 0x69, 0x8f, 0xea, 0xfe, 0x03, 0x85, 0x39, 0xfe, 0x0e, 0x37, 0x01, 0xc3, 0x84, 0xb1, + 0xf1, 0x8f, 0x8a, 0xfe, 0x08, 0x28, 0x20, 0x28, 0x9c, 0xaf, 0x2c, 0x20, 0x08, 0xfe, 0x0e, 0x86, + 0xe2, 0xfb, 0x8f, 0x09, 0xfe, 0x2a, 0x13, 0x64, 0xd1, 0x87, 0x0e, 0xfe, 0xa1, 0x52, 0x65, 0x6e, + 0xee, 0x93, 0x65, 0x4b, 0xfc, 0xd0, 0x6f, 0x67, 0x69, 0x63, 0x2c, 0x34, 0xfd, 0x05, 0x13, 0x83, + 0x12, 0xfe, 0x92, 0x73, 0x76, 0xfe, 0x82, 0x2a, 0xf9, 0x01, 0xf3, 0xa3, 0x70, 0x6f, 0x2f, 0xf9, + 0x82, 0x79, 0xf1, 0x8d, 0x6d, 0xf3, 0x8f, 0x79, 0xf1, 0x09, 0x8b, 0x24, 0xf4, 0x87, 0x79, 0xf1, + 0x91, 0x74, 0x8f, 0xfb, 0x99, 0x74, 0x76, 0xf1, 0x8e, 0xd8, 0xf8, 0xa1, 0x65, 0x69, 0xd2, 0xe6, + 0x06, 0x6a, 0x84, 0x4a, 0xf8, 0xd6, 0x65, 0x6e, 0x74, 0x69, 0x72, 0xeb, 0xf2, 0x86, 0x85, 0xf2, + 0x02, 0x81, 0x05, 0x9a, 0xa2, 0x69, 0x66, 0x9f, 0xf1, 0x8b, 0x50, 0xf5, 0x94, 0x0a, 0x41, 0xfa, + 0xc9, 0x66, 0x69, 0x6c, 0x6c, 0xe3, 0xf0, 0x04, 0x9d, 0xa1, 0x6c, 0x65, 0xf6, 0xf1, 0x82, 0x81, + 0xfb, 0x0f, 0x03, 0x15, 0x87, 0x13, 0xf6, 0x97, 0x2a, 0x66, 0xfc, 0xd5, 0x50, 0x74, 0x72, 0x20, + 0x3a, 0xd6, 0xfb, 0x84, 0x8d, 0xe4, 0x83, 0xb6, 0xf0, 0xc1, 0x69, 0x6e, 0x64, 0x69, 0x4e, 0xfd, + 0x83, 0x1a, 0xfd, 0xb5, 0x61, 0x6e, 0x79, 0xf6, 0xf2, 0x00, 0x1b, 0x92, 0x65, 0x0e, 0xf2, 0x0b, + 0xa1, 0x00, 0xcc, 0x08, 0x54, 0x08, 0x92, 0x0e, 0xff, 0xb7, 0x4e, 0x65, 0x77, 0xfe, 0xf8, 0x8c, + 0x0e, 0xf4, 0xa4, 0x6f, 0x6c, 0xe2, 0xf8, 0x9f, 0x2e, 0xf7, 0xf8, 0x00, 0xaf, 0x4e, 0x62, 0x73, + 0xf2, 0x01, 0x8f, 0x7a, 0xf2, 0x06, 0x86, 0x4f, 0xfe, 0x8f, 0x79, 0xf2, 0x1c, 0x88, 0x0d, 0xfb, + 0x8e, 0x70, 0xfd, 0x8f, 0x9e, 0xee, 0x14, 0xaa, 0x2a, 0x20, 0xa2, 0xfe, 0x02, 0xec, 0x0c, 0x72, + 0x89, 0x0b, 0xfd, 0xaf, 0x64, 0x65, 0xc7, 0xf8, 0x04, 0xd0, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x44, + 0xfb, 0x8a, 0x5c, 0xf2, 0x06, 0xea, 0x85, 0x00, 0xf0, 0xb1, 0x72, 0x65, 0x66, 0x42, 0xfb, 0xa7, + 0x75, 0x6e, 0xa3, 0xf2, 0x82, 0x4f, 0xfd, 0x8f, 0x70, 0xf2, 0x0f, 0x87, 0x3f, 0xfe, 0x88, 0x2a, + 0xf3, 0x86, 0x79, 0xf2, 0xa4, 0x69, 0x6e, 0x05, 0xe4, 0xd3, 0x77, 0x6f, 0x72, 0x64, 0x73, 0xb0, + 0xf8, 0x0c, 0x9e, 0x9f, 0x29, 0xe2, 0xf2, 0x73, 0x9e, 0x44, 0x98, 0xf5, 0x8f, 0x5b, 0xf1, 0x09, + 0x42, 0x20, 0x49, 0x74, 0x73, 0x44, 0x07, 0xdc, 0xc3, 0x20, 0x6d, 0x69, 0x6e, 0xa3, 0xf6, 0xb5, + 0x66, 0x20, 0x27, 0x8d, 0xfe, 0x88, 0x3a, 0xed, 0x03, 0x91, 0x91, 0x6e, 0xc6, 0xf5, 0x9c, 0x3a, + 0x11, 0xfc, 0xa1, 0x66, 0x75, 0xa8, 0xf9, 0x84, 0xa6, 0xe7, 0x84, 0xfe, 0xf9, 0x89, 0x30, 0xfa, + 0x91, 0x66, 0x65, 0xef, 0x91, 0x72, 0x6c, 0xe7, 0x00, 0xd9, 0x03, 0x05, 0x8d, 0x67, 0xe7, 0x0a, + 0x33, 0xa2, 0x49, 0x74, 0x02, 0xf5, 0xc7, 0x20, 0x62, 0x69, 0x74, 0x44, 0xf7, 0xbf, 0x61, 0x6e, + 0x20, 0xe9, 0xef, 0x03, 0x0a, 0xc6, 0xb1, 0x48, 0x6f, 0x77, 0xe0, 0xfa, 0x91, 0x2c, 0xeb, 0xf9, + 0xb2, 0x64, 0x6f, 0x65, 0x04, 0xf1, 0x86, 0xd7, 0xf9, 0xb3, 0x61, 0x6e, 0x79, 0xcd, 0xf1, 0x02, + 0x4a, 0x86, 0xcc, 0xf1, 0x92, 0x69, 0x7a, 0xfb, 0xa2, 0x69, 0x6f, 0xe2, 0xf8, 0x84, 0x08, 0xfc, + 0x04, 0x6a, 0x85, 0x42, 0xfe, 0x96, 0x28, 0xcc, 0xf1, 0x83, 0x2e, 0xfa, 0x0b, 0x8b, 0x91, 0x55, + 0x71, 0xfa, 0x8b, 0xd8, 0xf3, 0x50, 0x6e, 0x20, 0x74, 0x72, 0x75, 0x47, 0x90, 0x64, 0x3d, 0xfb, + 0xd2, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x42, 0xe8, 0x20, 0x6f, 0x6e, 0x9f, 0x12, 0x28, 0xa7, 0xa3, + 0x74, 0x6f, 0x1b, 0xfe, 0x82, 0xb3, 0xfd, 0x85, 0xdd, 0xeb, 0x15, 0x61, 0xca, 0x84, 0xc3, 0xfd, + 0x9a, 0x29, 0x50, 0xf9, 0xaf, 0x64, 0x65, 0x87, 0xf7, 0x20, 0x86, 0xc4, 0xfc, 0x8a, 0x5e, 0xf5, + 0x8e, 0xba, 0xfe, 0x94, 0x5f, 0xc7, 0xed, 0x83, 0x8d, 0xfc, 0x8e, 0x31, 0xfa, 0x07, 0xd2, 0xae, + 0x20, 0x61, 0xb1, 0xee, 0x87, 0xe7, 0xf9, 0x8b, 0x62, 0xef, 0x91, 0x27, 0x34, 0xe4, 0x81, 0x48, + 0xe4, 0x01, 0xbd, 0x8a, 0x09, 0xeb, 0x8e, 0x0c, 0xef, 0x8f, 0x96, 0xf9, 0x06, 0x8c, 0x0c, 0xef, + 0x89, 0x91, 0xf9, 0x89, 0xc8, 0xfc, 0x92, 0x74, 0x9b, 0xfd, 0xa5, 0x74, 0x6f, 0xc4, 0xfc, 0x89, + 0xf3, 0xf8, 0xa5, 0x6f, 0x70, 0xb2, 0xf5, 0x52, 0x61, 0x73, 0x20, 0x73, 0x6f, 0xf8, 0x85, 0x3d, + 0xf9, 0x87, 0x65, 0xed, 0x30, 0x27, 0x20, 0x68, 0xe9, 0xe1, 0x62, 0x65, 0x65, 0x6e, 0x20, 0x72, + 0x3f, 0xf5, 0x85, 0x51, 0xf7, 0x91, 0x72, 0x37, 0xe8, 0x00, 0xb9, 0x08, 0xab, 0x02, 0x8f, 0xbf, + 0x69, 0x6d, 0x65, 0x18, 0xee, 0x15, 0xb4, 0x64, 0x65, 0x64, 0xa9, 0xdf, 0x8f, 0x1b, 0xee, 0x2e, + 0x92, 0x4e, 0x86, 0xfc, 0x82, 0x97, 0xfd, 0x04, 0x96, 0x85, 0x7c, 0xf4, 0x1f, 0x3c, 0x2f, 0x02, + 0xef, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0xff, 0xec, 0x03, 0x87, 0x83, 0xfd, 0x01, 0xc2, 0x91, + 0x73, 0x99, 0xf6, 0xac, 0x65, 0x72, 0xb2, 0xfb, 0xe5, 0x41, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x80, + 0xe3, 0x8e, 0x07, 0xf9, 0x35, 0x65, 0x72, 0x65, 0x21, 0x8f, 0xe4, 0xed, 0x81, 0x8f, 0x45, 0xee, + 0x05, 0x9c, 0x66, 0x42, 0xee, 0x01, 0xa0, 0x02, 0xd5, 0x8d, 0x3c, 0xee, 0xab, 0x6f, 0x66, 0x39, + 0xee, 0x83, 0x6f, 0xfb, 0x88, 0x9b, 0xf9, 0x8e, 0x87, 0xed, 0x8f, 0xab, 0xed, 0x04, 0x86, 0xbd, + 0xf8, 0x8f, 0x8d, 0xfc, 0x09, 0x8f, 0x55, 0xe7, 0x28, 0x89, 0x0c, 0xfe, 0x8f, 0x3f, 0xe7, 0x0d, + 0x8a, 0x7b, 0xed, 0x8f, 0x0d, 0xe6, 0x19, 0x82, 0x42, 0xfe, 0xb9, 0x69, 0x6e, 0x67, 0x97, 0xe7, + 0x8f, 0x65, 0xed, 0x02, 0x8f, 0x5c, 0xed, 0x22, 0xe1, 0x53, 0x54, 0x52, 0x45, 0x41, 0x4d, 0x9e, + 0xf0, 0xc0, 0x5f, 0x55, 0x36, 0x34, 0xee, 0xed, 0xed, 0x31, 0x20, 0x3c, 0x3c, 0x20, 0x28, 0x58, + 0xe5, 0xb1, 0x2d, 0x33, 0x29, 0xdf, 0xed, 0x2f, 0x34, 0x29, 0xc3, 0x01, 0x86, 0x23, 0xed, 0x1f, + 0x28, 0xaf, 0x01, 0xa3, 0x2a, 0x20, 0x1f, 0xf4, 0x30, 0x28, 0x6c, 0x6f, 0x3f, 0x01, 0xfb, 0xa8, + 0x29, 0x29, 0xad, 0xe3, 0x83, 0x66, 0xfd, 0x92, 0x5f, 0x8f, 0xe4, 0xa1, 0x69, 0x6e, 0x6e, 0xfd, + 0x83, 0x66, 0xfc, 0x00, 0xe8, 0xd2, 0x75, 0x63, 0x74, 0x75, 0x72, 0xef, 0xf2, 0xa1, 0x74, 0x72, + 0xae, 0xee, 0x83, 0x86, 0xf9, 0x84, 0x34, 0xfd, 0x12, 0x2e, 0xcf, 0x91, 0x6d, 0x42, 0xef, 0xb1, + 0x61, 0x6e, 0x74, 0x71, 0xf7, 0xb2, 0x6e, 0x69, 0x74, 0x6a, 0xfc, 0x07, 0xc5, 0x86, 0x26, 0xf5, + 0x93, 0x62, 0xd1, 0xfd, 0xd2, 0x66, 0x69, 0x72, 0x73, 0x74, 0xe4, 0xe0, 0x10, 0x21, 0xc2, 0x85, + 0xbc, 0xf8, 0xaa, 0x6f, 0x6e, 0x73, 0xf2, 0x60, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0xed, 0x38, + 0x74, 0x68, 0x65, 0xb5, 0x93, 0x69, 0x18, 0xe0, 0xb2, 0x61, 0x72, 0x65, 0x88, 0xf3, 0x83, 0xf8, + 0xf2, 0xd4, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x3d, 0xe0, 0x00, 0xae, 0x86, 0x84, 0xfc, 0x06, 0xd4, + 0x84, 0x07, 0xf2, 0xe1, 0x6c, 0x69, 0x62, 0x6c, 0x7a, 0x34, 0x0d, 0xfb, 0xda, 0x61, 0x20, 0x44, + 0x4c, 0x4c, 0x59, 0xe0, 0x51, 0x62, 0x65, 0x6c, 0x6f, 0x77, 0x56, 0x03, 0x94, 0x82, 0xcb, 0xec, + 0xe6, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x73, 0x49, 0xe0, 0x82, 0xbf, 0xe3, 0xc0, 0x74, 0x79, 0x70, + 0x65, 0x86, 0xfe, 0x04, 0x6d, 0xb6, 0x20, 0x7b, 0x20, 0xb0, 0xfe, 0xa1, 0x20, 0x74, 0x9d, 0xdf, + 0x9f, 0x5b, 0x84, 0xfe, 0x00, 0xca, 0x5d, 0x3b, 0x20, 0x7d, 0x9b, 0xfe, 0xa8, 0x3b, 0x0a, 0x86, + 0xfe, 0xd3, 0x72, 0x65, 0x73, 0x65, 0x74, 0xa5, 0xfd, 0x01, 0xed, 0x8e, 0xc2, 0xf8, 0x83, 0x8e, + 0xf4, 0x91, 0x69, 0x04, 0xef, 0x87, 0xe1, 0xfe, 0x0a, 0xb1, 0x87, 0xe1, 0xfe, 0x02, 0x5e, 0x81, + 0x6a, 0xf2, 0x0d, 0xa6, 0x29, 0x20, 0x28, 0xcf, 0x94, 0x2a, 0x43, 0xfe, 0x4a, 0x50, 0x74, 0x72, + 0x29, 0x74, 0x81, 0x22, 0xe2, 0x23, 0x74, 0x65, 0xcd, 0x82, 0x7e, 0xfb, 0x05, 0x8e, 0x82, 0x67, + 0xd8, 0x02, 0x79, 0x51, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0xf1, 0x0f, 0x7d, 0x05, 0x05, 0xb5, 0x35, + 0x66, 0x72, 0x65, 0xb7, 0xa2, 0x72, 0x65, 0x99, 0xfe, 0x91, 0x73, 0xda, 0xde, 0x84, 0xf1, 0xf6, + 0x83, 0x4c, 0xde, 0x81, 0xf7, 0xf9, 0x84, 0xe2, 0xfd, 0x91, 0x78, 0x63, 0xd9, 0x83, 0x69, 0xfe, + 0xa3, 0x20, 0x28, 0x58, 0xfe, 0x9a, 0x29, 0x60, 0xfe, 0x20, 0x74, 0x68, 0x32, 0x86, 0x6d, 0xfe, + 0xc5, 0x72, 0x61, 0x74, 0x68, 0xf9, 0xf6, 0xa5, 0x74, 0x68, 0xf4, 0xfd, 0x04, 0x7a, 0x02, 0xa3, + 0xc2, 0x54, 0x68, 0x65, 0x79, 0x05, 0xfe, 0x92, 0x6d, 0x8d, 0xfd, 0xb3, 0x75, 0x74, 0x75, 0x57, + 0xfb, 0xa1, 0x6f, 0x66, 0xe7, 0xfb, 0x82, 0xe5, 0xec, 0x02, 0x8e, 0x83, 0x0f, 0xdf, 0x01, 0xf4, + 0x0c, 0x2f, 0x00, 0x1a, 0x83, 0x0e, 0xfe, 0x09, 0xe9, 0x8f, 0xd9, 0xfe, 0x00, 0x89, 0xd4, 0xf0, + 0x06, 0xff, 0x86, 0xfe, 0xfe, 0x8f, 0x82, 0xfe, 0x1b, 0xff, 0x01, 0x6c, 0x6f, 0x61, 0x64, 0x44, + 0x69, 0x63, 0x74, 0xf9, 0xfd, 0x07, 0x01, 0xdf, 0x25, 0x20, 0x61, 0x13, 0x22, 0x64, 0x69, 0xe7, + 0xb2, 0x61, 0x72, 0x79, 0xbe, 0xf7, 0x02, 0x41, 0x88, 0x6b, 0xfc, 0x92, 0x41, 0x21, 0xf6, 0xa6, + 0x65, 0x76, 0x7a, 0xfa, 0x86, 0x34, 0xf2, 0xd1, 0x66, 0x6f, 0x72, 0x67, 0x6f, 0xd9, 0xf2, 0x93, + 0x2c, 0x8b, 0xfc, 0x17, 0x27, 0xb6, 0x13, 0x27, 0xdb, 0xd1, 0x72, 0x65, 0x6d, 0x61, 0x69, 0x48, + 0xf6, 0x89, 0x51, 0xfe, 0xb3, 0x4c, 0x6f, 0x61, 0x79, 0xf9, 0x86, 0xf0, 0xe5, 0xc3, 0x30, 0x20, + 0x69, 0x73, 0x5c, 0xec, 0x22, 0x65, 0x64, 0xdd, 0x94, 0x52, 0x00, 0xf8, 0x09, 0x64, 0x94, 0x73, + 0x74, 0xfa, 0x83, 0xd4, 0xf8, 0x8e, 0x1c, 0xf8, 0xd0, 0x36, 0x34, 0x20, 0x4b, 0x42, 0xa3, 0xdf, + 0x83, 0xe5, 0xf9, 0x8a, 0xf8, 0xfe, 0x8f, 0xc9, 0xfe, 0x07, 0x8a, 0x93, 0xef, 0x08, 0x94, 0x82, + 0x0d, 0xfa, 0x01, 0xf0, 0x88, 0x7e, 0xeb, 0x02, 0x46, 0x8e, 0x3c, 0xef, 0x81, 0x8c, 0xfd, 0xb1, + 0x69, 0x6e, 0x75, 0x52, 0xfd, 0x86, 0x33, 0xfa, 0x84, 0x9b, 0xdb, 0x86, 0x52, 0xfb, 0xe3, 0x27, + 0x73, 0x72, 0x63, 0x27, 0x2c, 0xc5, 0xfb, 0x82, 0xbf, 0xfe, 0x82, 0x6a, 0xf5, 0x86, 0xac, 0xfe, + 0xae, 0x6c, 0x79, 0xb6, 0xf7, 0x49, 0x73, 0x20, 0x61, 0x73, 0x05, 0xa6, 0x74, 0x6f, 0x1d, 0xdf, + 0x8e, 0xe7, 0xde, 0x83, 0xfe, 0xfc, 0x88, 0xc7, 0xfa, 0x99, 0x50, 0x54, 0xfe, 0x06, 0xb0, 0x91, + 0x72, 0x21, 0xec, 0xb4, 0x73, 0x75, 0x6d, 0x3c, 0xe1, 0x94, 0x74, 0x3d, 0xfe, 0x01, 0xb4, 0x00, + 0x5c, 0x83, 0xbf, 0xd4, 0x95, 0x6e, 0x5b, 0xf4, 0x83, 0xb0, 0xfa, 0xdf, 0x27, 0x64, 0x73, 0x74, + 0x27, 0x0c, 0xf3, 0x0f, 0x84, 0xca, 0xda, 0x82, 0xdf, 0xf8, 0x83, 0x3c, 0xf1, 0x8f, 0x43, 0xe9, + 0x0c, 0xbf, 0x2c, 0x20, 0x63, 0xa2, 0xe0, 0x11, 0x82, 0xbb, 0xf7, 0x89, 0xdc, 0xe0, 0x05, 0x99, + 0x33, 0x6e, 0x6f, 0x74, 0xe4, 0xad, 0x69, 0x66, 0x7b, 0xda, 0x85, 0xed, 0xe0, 0xa3, 0x66, 0x69, + 0x04, 0xef, 0x0a, 0x3f, 0x84, 0xc1, 0xfd, 0x8e, 0x0a, 0xe1, 0x02, 0xb3, 0x89, 0x1c, 0xe1, 0xb1, + 0x74, 0x75, 0x72, 0x2d, 0xd5, 0x85, 0x1c, 0xe1, 0x8d, 0x60, 0xeb, 0x8e, 0x06, 0xfe, 0x8f, 0xa3, + 0xfd, 0x15, 0x00, 0x01, 0x86, 0x81, 0xf7, 0x86, 0x42, 0xeb, 0xab, 0x72, 0x63, 0x9f, 0xf7, 0x8f, + 0x3d, 0xed, 0x09, 0x89, 0x9d, 0xf8, 0xb5, 0x61, 0x76, 0x65, 0x21, 0xfc, 0xaf, 0x49, 0x66, 0xb8, + 0xfd, 0x04, 0x88, 0x03, 0xfe, 0x84, 0x55, 0xe3, 0x8b, 0x98, 0xfe, 0x85, 0x66, 0xfc, 0xd2, 0x61, + 0x76, 0x61, 0x69, 0x6c, 0x2e, 0xd9, 0xa8, 0x61, 0x74, 0xa9, 0xfa, 0x95, 0x20, 0x1b, 0xe7, 0x01, + 0x9c, 0x01, 0x90, 0x95, 0x20, 0xac, 0xfe, 0x10, 0x61, 0xf1, 0x81, 0xb1, 0xfe, 0x82, 0x10, 0xea, + 0x22, 0x20, 0x28, 0x23, 0x02, 0xed, 0x92, 0x42, 0x99, 0xfe, 0x81, 0x22, 0xdc, 0x84, 0xad, 0xf4, + 0x82, 0xcc, 0xf8, 0xd6, 0x64, 0x6f, 0x6e, 0x27, 0x74, 0xb2, 0xd8, 0x81, 0x9b, 0xf8, 0x8a, 0x66, + 0xfc, 0xd0, 0x28, 0x29, 0x20, 0x61, 0x66, 0x22, 0xfe, 0xa1, 0x77, 0x61, 0xfb, 0xef, 0x87, 0x8d, + 0xf8, 0x8a, 0x6c, 0xfb, 0xa8, 0x73, 0x20, 0x67, 0xdf, 0x31, 0x20, 0x75, 0x73, 0x51, 0xb3, 0x2c, + 0x20, 0x79, 0x13, 0xd7, 0x87, 0xc2, 0xf5, 0x02, 0xa2, 0x8f, 0x57, 0xfe, 0x09, 0xa9, 0x28, 0x29, + 0xa6, 0xfb, 0x02, 0x2a, 0x9d, 0x64, 0xa0, 0xfb, 0x8f, 0xa1, 0xfb, 0x07, 0x87, 0xf3, 0xfb, 0x95, + 0x2c, 0x26, 0xee, 0x83, 0x33, 0xe2, 0x8a, 0xde, 0xfd, 0x01, 0xac, 0x8f, 0x8f, 0xfb, 0x0d, 0x8d, + 0xcf, 0xfe, 0x86, 0x95, 0xfb, 0x89, 0x49, 0xee, 0x8f, 0xac, 0xf5, 0x2b, 0xbf, 0x44, 0x65, 0x63, + 0xaa, 0xf5, 0x32, 0x00, 0x29, 0x8f, 0xe5, 0xf5, 0x01, 0xe6, 0x44, 0x45, 0x43, 0x4f, 0x44, 0x45, + 0xf3, 0xf5, 0x2f, 0x20, 0x34, 0xdc, 0x07, 0x87, 0xbb, 0xf5, 0x0d, 0xc2, 0x8e, 0xb5, 0xf5, 0x86, + 0x1d, 0xe3, 0x99, 0x20, 0xac, 0xf5, 0x8e, 0xdf, 0xf6, 0x0a, 0xda, 0x8e, 0xd6, 0xf6, 0x0e, 0x9f, + 0x8e, 0xd0, 0xf6, 0x92, 0x44, 0xa7, 0xf2, 0xb3, 0x5f, 0x74, 0x3b, 0x51, 0xf5, 0x0e, 0xe6, 0x8f, + 0x4b, 0xf5, 0x24, 0x8f, 0x57, 0xf5, 0x09, 0x84, 0xd8, 0xe7, 0x03, 0x97, 0x38, 0x65, 0x74, 0x53, + 0x94, 0x93, 0x20, 0x22, 0xe3, 0x00, 0xea, 0xaf, 0x28, 0x29, 0x31, 0xf5, 0x04, 0x8f, 0x27, 0xf7, + 0x12, 0x85, 0x28, 0xf7, 0xe4, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0xef, 0xd8, 0xaf, 0x6f, 0x66, + 0x82, 0xf5, 0x03, 0x83, 0x67, 0xf5, 0x8f, 0x2d, 0xf7, 0x26, 0x8e, 0xd4, 0xfe, 0x87, 0xda, 0xe3, + 0x25, 0x74, 0x68, 0xbc, 0x9b, 0x2e, 0x01, 0xf6, 0x09, 0x10, 0x8f, 0xfb, 0xf5, 0x0e, 0x0e, 0x9f, + 0x8f, 0xf5, 0xf5, 0x05, 0x0a, 0xab, 0x8f, 0xef, 0xf5, 0x06, 0x2f, 0x2f, 0x0a, 0xb2, 0x00, 0x0f, + 0x67, 0x05, 0x8a, 0x5d, 0xe7, 0x0c, 0xff, 0x0f, 0x8c, 0x04, 0x1f, 0x28, 0xa4, 0x01, 0x08, 0x42, + 0x89, 0x55, 0xfa, 0x8e, 0x0a, 0xfe, 0x8f, 0x68, 0xf4, 0x09, 0x03, 0x13, 0x83, 0x05, 0xe9, 0x83, + 0x18, 0xe9, 0x83, 0x81, 0xda, 0x86, 0x5e, 0xfb, 0x84, 0xc3, 0xf6, 0xcf, 0x53, 0x65, 0x74, 0x74, + 0xc3, 0xf6, 0x08, 0xd5, 0x20, 0x28, 0x73, 0x61, 0x6d, 0x0c, 0xd7, 0x83, 0x30, 0xe4, 0x00, 0x7d, + 0x9b, 0x29, 0xac, 0xf6, 0x91, 0x31, 0x43, 0xfb, 0xbf, 0x4f, 0x4b, 0x2c, 0x3a, 0xfb, 0x07, 0x2f, + 0x65, 0x74, 0x0e, 0x10, 0x0d, 0xec, 0x8f, 0xb5, 0xf6, 0x1b, 0x96, 0x2a, 0x6b, 0xfa, 0x88, 0xe6, + 0xec, 0x00, 0x56, 0x86, 0x5d, 0xef, 0x86, 0x3e, 0xd2, 0x04, 0x26, 0x8b, 0xd7, 0xed, 0x01, 0x0a, + 0xd0, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0xc7, 0xd6, 0x85, 0x1f, 0xf7, 0xd5, 0x69, 0x6e, 0x20, 0x22, + 0x73, 0xfc, 0xfa, 0x91, 0x22, 0x91, 0xeb, 0x84, 0xb5, 0xed, 0x96, 0x50, 0xe1, 0xf8, 0x03, 0xa2, + 0x87, 0x9c, 0xf6, 0x91, 0x2a, 0x2c, 0xf7, 0x9f, 0x2a, 0xf6, 0xf8, 0x03, 0xb4, 0x74, 0x68, 0x65, + 0xf6, 0xf8, 0x86, 0x95, 0xec, 0x85, 0x65, 0xfe, 0xba, 0x68, 0x65, 0x79, 0x58, 0xee, 0xc0, 0x20, + 0x28, 0x75, 0x70, 0x4f, 0xfe, 0x86, 0x80, 0xf5, 0xa4, 0x20, 0x20, 0x49, 0xfc, 0x88, 0xb8, 0xfc, + 0x10, 0x72, 0x2d, 0x84, 0x78, 0xf7, 0x97, 0x73, 0xda, 0xdb, 0x8c, 0xa5, 0xf6, 0x84, 0x22, 0xe6, + 0x84, 0xf0, 0xfe, 0xd2, 0x2d, 0x20, 0x45, 0x78, 0x61, 0x48, 0xf1, 0xb4, 0x73, 0x61, 0x6d, 0xc6, + 0xda, 0x5a, 0x61, 0x73, 0x20, 0x65, 0x6e, 0xc4, 0x83, 0xe3, 0xe1, 0x03, 0xdd, 0xb1, 0x75, 0x70, + 0x64, 0xa5, 0xfc, 0x20, 0x72, 0x75, 0x3d, 0x12, 0x28, 0x1d, 0x89, 0xd4, 0xe9, 0x22, 0x61, 0x74, + 0xda, 0x06, 0x31, 0x11, 0x73, 0x55, 0x03, 0x53, 0x83, 0x70, 0xe2, 0x01, 0x51, 0x83, 0x28, 0xe1, + 0x07, 0x5f, 0x16, 0x26, 0x90, 0x07, 0x3d, 0x84, 0xe0, 0xec, 0xb2, 0x68, 0x61, 0x76, 0x06, 0xea, + 0x02, 0x66, 0x89, 0xf9, 0xdb, 0xc3, 0x76, 0x65, 0x72, 0x79, 0x03, 0xed, 0xb1, 0x20, 0x6f, 0x6e, + 0xb7, 0xf8, 0xa4, 0x20, 0x3c, 0xe4, 0xfe, 0x14, 0x2e, 0x27, 0x95, 0x4c, 0xa6, 0xe0, 0x00, 0xb9, + 0x0e, 0x30, 0xab, 0x62, 0x79, 0xcd, 0xe8, 0x41, 0x6d, 0x61, 0x78, 0x42, 0x34, 0xb3, 0x53, 0x69, + 0x7a, 0x50, 0xfb, 0x89, 0xca, 0xe8, 0x1b, 0x20, 0xe1, 0xb2, 0x69, 0x73, 0x20, 0xb3, 0xd4, 0x87, + 0x9b, 0xcb, 0xb1, 0x64, 0x65, 0x70, 0xb5, 0xd6, 0xb3, 0x6e, 0x74, 0x2e, 0x92, 0xe0, 0x8e, 0x1b, + 0xdd, 0xb3, 0x79, 0x6f, 0x75, 0x57, 0xe9, 0x99, 0x64, 0x24, 0xe3, 0x86, 0x15, 0xf7, 0x00, 0x66, + 0x85, 0x9d, 0xfd, 0x9f, 0x2e, 0xd0, 0xfe, 0x04, 0xa7, 0x65, 0x6e, 0xab, 0xec, 0x8d, 0x26, 0xfe, + 0xc0, 0x73, 0x20, 0x64, 0x6f, 0x85, 0xf6, 0x86, 0x00, 0xf7, 0x82, 0xe9, 0xeb, 0xc0, 0x79, 0x6e, + 0x63, 0x68, 0x47, 0xe9, 0xa3, 0x69, 0x7a, 0xf3, 0xea, 0x84, 0x42, 0xe2, 0x8f, 0x97, 0xfe, 0x20, + 0x8f, 0x9c, 0xfe, 0x0c, 0xe1, 0x5f, 0x41, 0x74, 0x20, 0x6c, 0x65, 0x01, 0xf7, 0x03, 0xe7, 0xc4, + 0x20, 0x2b, 0x20, 0x38, 0x26, 0xf7, 0x9a, 0x2b, 0xcb, 0xfe, 0x0f, 0x29, 0x7f, 0x97, 0x6c, 0xe2, + 0xfd, 0x0d, 0x87, 0x03, 0x54, 0xb2, 0x57, 0x68, 0x65, 0xa3, 0xeb, 0x83, 0x36, 0xf0, 0x8c, 0x74, + 0xc8, 0x01, 0x68, 0x86, 0x63, 0xe3, 0x93, 0x2c, 0x45, 0xf5, 0x92, 0x74, 0x32, 0xde, 0xa2, 0x73, + 0x74, 0x70, 0xd1, 0x33, 0x20, 0x6f, 0x66, 0xa9, 0x84, 0xdc, 0xf4, 0x89, 0x2a, 0xf5, 0x04, 0x99, + 0x86, 0xad, 0xe0, 0x86, 0x5f, 0xe3, 0x84, 0x04, 0xfc, 0x91, 0x69, 0x51, 0xeb, 0x83, 0xc7, 0xf5, + 0x8f, 0x26, 0xf8, 0x08, 0xaf, 0x28, 0x29, 0x62, 0xeb, 0x09, 0x85, 0xca, 0xf3, 0x8f, 0xab, 0xfa, + 0x17, 0x8f, 0x90, 0xd2, 0x3b, 0x8f, 0x0d, 0xe7, 0x06, 0x0f, 0x6a, 0x3a, 0x8e, 0xde, 0xe6, 0x89, + 0x72, 0xe3, 0x85, 0x79, 0xd8, 0x8f, 0x18, 0xfa, 0x02, 0xc2, 0x3a, 0x0a, 0x2a, 0x5f, 0xab, 0xfe, + 0x81, 0xe8, 0xf3, 0x8f, 0xe9, 0xf9, 0x10, 0xc9, 0x77, 0x6f, 0x72, 0x6b, 0x46, 0xdd, 0x01, 0xd2, + 0x83, 0xba, 0xe6, 0x95, 0x62, 0xf3, 0xe7, 0xaf, 0x6f, 0x66, 0x60, 0xfe, 0x04, 0x84, 0x58, 0xc7, + 0x82, 0x52, 0xdd, 0x8d, 0xf1, 0xfe, 0x98, 0x78, 0xd1, 0xf3, 0x05, 0x7f, 0x95, 0x79, 0xda, 0xeb, + 0xd0, 0x6e, 0x64, 0x2d, 0x61, 0x6c, 0x8f, 0xfc, 0x12, 0x2e, 0xea, 0x89, 0x24, 0xf3, 0xb3, 0x6e, + 0x6f, 0x72, 0x80, 0xfa, 0x8f, 0x34, 0xf7, 0x0f, 0x9f, 0x2e, 0xe2, 0xfd, 0x09, 0x07, 0x00, 0x8f, + 0x97, 0xd0, 0x3b, 0x8e, 0x65, 0xf8, 0x81, 0x89, 0xde, 0xa7, 0x72, 0x74, 0x66, 0xf8, 0x8f, 0xe2, + 0xfd, 0x0c, 0x06, 0x6a, 0x8f, 0xe5, 0xe4, 0x1d, 0x0f, 0x85, 0x1a, 0x8f, 0x32, 0xd6, 0x1c, 0xc0, + 0x4f, 0x62, 0x73, 0x6f, 0x63, 0xdf, 0x8f, 0xcb, 0xce, 0x22, 0x91, 0x2f, 0xf9, 0xcd, 0x00, 0x24, + 0x82, 0x2a, 0xfc, 0xb1, 0x57, 0x61, 0x72, 0xbd, 0xcc, 0x23, 0x73, 0x20, 0xe7, 0x96, 0x53, 0x25, + 0xe6, 0x45, 0x73, 0x65, 0x20, 0x77, 0xe4, 0xb1, 0x6d, 0x65, 0x73, 0xa9, 0xf4, 0x93, 0x73, 0x33, + 0xe2, 0xc0, 0x70, 0x72, 0x6f, 0x62, 0x9f, 0xf9, 0x81, 0xdd, 0xfb, 0x83, 0xf1, 0xfb, 0x84, 0xde, + 0xc9, 0xb7, 0x6c, 0x6c, 0x79, 0xec, 0xde, 0xa1, 0x74, 0x6f, 0x4e, 0xc5, 0x12, 0x61, 0xf5, 0x13, + 0x68, 0xd3, 0x83, 0x58, 0xf8, 0x65, 0x2d, 0x57, 0x6e, 0x6f, 0x2d, 0x64, 0x80, 0x10, 0x64, 0xf5, + 0xb3, 0x63, 0x6c, 0x61, 0x1d, 0xf0, 0x83, 0x32, 0xe2, 0xc3, 0x67, 0x63, 0x63, 0x0a, 0xc4, 0xdf, + 0xb0, 0x5f, 0x43, 0x52, 0xd8, 0xd8, 0x91, 0x45, 0xd1, 0xc6, 0xc0, 0x5f, 0x4e, 0x4f, 0x5f, 0xe8, + 0xc7, 0xd1, 0x4e, 0x49, 0x4e, 0x47, 0x53, 0x18, 0xf7, 0xe9, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6c, + 0x81, 0xd7, 0x98, 0x2e, 0x02, 0xc8, 0x83, 0x84, 0xd9, 0x88, 0x6b, 0xf2, 0xb0, 0x44, 0x45, 0x50, + 0x23, 0xc6, 0x35, 0x41, 0x54, 0x45, 0xbb, 0x81, 0x6b, 0xda, 0xe2, 0x42, 0x4c, 0x4f, 0x43, 0x4b, + 0x2e, 0x69, 0xd5, 0x30, 0x69, 0x66, 0x6e, 0xd2, 0x0f, 0xd5, 0x0d, 0x34, 0x0a, 0x23, 0x20, 0xac, + 0x0f, 0xd7, 0x1c, 0xb5, 0x47, 0x43, 0x43, 0xfc, 0xca, 0x81, 0x20, 0xc8, 0xe0, 0x47, 0x4e, 0x55, + 0x43, 0x5f, 0x5f, 0x73, 0xf5, 0x83, 0xde, 0xca, 0x03, 0xef, 0x83, 0xca, 0xca, 0x31, 0x5f, 0x5f, + 0x29, 0xc4, 0x4d, 0x69, 0x66, 0x20, 0x28, 0xc7, 0xd0, 0x3e, 0x3d, 0x20, 0x34, 0x30, 0x30, 0xd5, + 0xa5, 0x7c, 0x7c, 0xd4, 0xc7, 0x81, 0xd5, 0xc7, 0x44, 0x6c, 0x61, 0x6e, 0x67, 0xcb, 0x0f, 0x64, + 0x04, 0xa4, 0x44, 0x28, 0x44, 0xfe, 0x10, 0x29, 0x97, 0xa3, 0x61, 0x74, 0xbe, 0xc3, 0xd7, 0x65, + 0x5f, 0x5f, 0x28, 0x28, 0x7d, 0xfe, 0x06, 0xdd, 0x12, 0x29, 0xb7, 0x2f, 0x65, 0x6c, 0x80, 0x05, + 0x3f, 0x33, 0x30, 0x31, 0x96, 0x2d, 0x07, 0x9f, 0x07, 0x3b, 0x22, 0x4d, 0x53, 0x9b, 0x0f, 0xa6, + 0x16, 0x81, 0xd1, 0xfd, 0x81, 0xf4, 0xdf, 0x0f, 0x40, 0x01, 0x05, 0xa2, 0x23, 0x73, 0x65, 0xb4, + 0x84, 0x9b, 0xc6, 0x04, 0xe2, 0xa4, 0x28, 0x22, 0x59, 0xfe, 0xb7, 0x3a, 0x20, 0x59, 0x23, 0xc7, + 0x87, 0xd3, 0xf6, 0x0c, 0x8c, 0x83, 0xcb, 0xc8, 0xb4, 0x68, 0x69, 0x73, 0xe8, 0xd4, 0x3f, 0x65, + 0x72, 0x22, 0x5d, 0x12, 0x02, 0x7d, 0x82, 0x57, 0xc6, 0x84, 0x50, 0xc6, 0xbf, 0x20, 0x2f, 0x2a, + 0xd2, 0xfd, 0x0d, 0x93, 0x20, 0x3f, 0xc7, 0x85, 0x2e, 0xfc, 0x8f, 0x8c, 0xd8, 0x04, 0x84, 0x60, + 0xfc, 0x83, 0xf4, 0xf9, 0x07, 0xea, 0x83, 0x50, 0xc0, 0xc5, 0x6c, 0x61, 0x6e, 0x6e, 0x2c, 0xeb, + 0xb5, 0x61, 0x72, 0x74, 0x4f, 0xc6, 0x88, 0x3f, 0xfc, 0x90, 0x62, 0xbd, 0xde, 0xe0, 0x31, 0x33, + 0x31, 0x20, 0x61, 0x70, 0x43, 0xfc, 0xb2, 0x78, 0x69, 0x6d, 0xb9, 0xed, 0x8f, 0x28, 0xec, 0x02, + 0x8b, 0x02, 0xf2, 0x8f, 0x7f, 0xd7, 0x1e, 0x8f, 0x19, 0xd9, 0x02, 0x84, 0x81, 0xcc, 0x82, 0xb4, + 0xe3, 0x8f, 0x2e, 0xd7, 0x28, 0x03, 0xc1, 0x0f, 0x9c, 0x06, 0x81, 0xa7, 0xfb, 0x82, 0xb9, 0xd8, + 0x0b, 0x41, 0x8f, 0xab, 0xd8, 0x26, 0x0f, 0x35, 0x13, 0x07, 0x8b, 0x0f, 0x99, 0x26, 0x0f, 0x1f, + 0x18, 0x87, 0x63, 0xf7, 0x0d, 0x1f, 0x8f, 0xb0, 0xe6, 0x00, 0x86, 0x84, 0xea, 0x0f, 0x0f, 0x3e, + 0x06, 0x7b, 0x0f, 0x89, 0x0c, 0x8f, 0xff, 0xfe, 0x32, 0x8b, 0xf0, 0xfc, 0xaf, 0x64, 0x65, 0xee, + 0xfc, 0x18, 0xd2, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0xe9, 0xfc, 0x89, 0x41, 0xd8, 0x87, 0xd4, 0xfb, + 0x81, 0x2d, 0xf5, 0x83, 0x93, 0xf1, 0xa2, 0x6e, 0x6f, 0xc1, 0xec, 0xc2, 0x65, 0x72, 0x20, 0x62, + 0xeb, 0xe4, 0xb8, 0x64, 0x2e, 0x0a, 0x15, 0xf7, 0x82, 0x33, 0xe6, 0x87, 0xe0, 0xd0, 0x81, 0x05, + 0xf5, 0x86, 0xdb, 0xd0, 0xb2, 0x61, 0x74, 0x69, 0x7d, 0xc4, 0x94, 0x79, 0xb1, 0xbc, 0xc5, 0x6c, + 0x64, 0x65, 0x72, 0xbd, 0xc2, 0x96, 0x73, 0x1f, 0xf2, 0xb7, 0x5a, 0x34, 0x5f, 0xd0, 0xd9, 0x8c, + 0x9d, 0xd3, 0x8f, 0x9d, 0xf7, 0x02, 0x0f, 0xc8, 0x03, 0x00, 0xf5, 0x81, 0xfd, 0xd4, 0x97, 0x6e, + 0xe3, 0xfe, 0x0e, 0xb6, 0x8e, 0xbd, 0xf6, 0x81, 0x6a, 0xd9, 0x8c, 0xea, 0xfe, 0x82, 0xab, 0xdf, + 0x91, 0x6f, 0xb3, 0xeb, 0x85, 0xdf, 0xf3, 0x95, 0x77, 0x62, 0xf8, 0xa3, 0x64, 0x3b, 0x29, 0xd9, + 0x81, 0xfd, 0xfa, 0x82, 0x56, 0xf8, 0x02, 0x06, 0x85, 0xe5, 0xe1, 0xa1, 0x72, 0x65, 0x2a, 0xf8, + 0x82, 0xd3, 0xfa, 0x02, 0xe3, 0xa6, 0x2e, 0x0a, 0xbd, 0xda, 0xa1, 0x68, 0x69, 0x94, 0xd2, 0x89, + 0x54, 0xc8, 0x85, 0xd9, 0xdc, 0x83, 0xe8, 0xf3, 0x83, 0xbc, 0xf7, 0x08, 0x86, 0x83, 0x85, 0xfe, + 0xa1, 0x69, 0x67, 0x66, 0xfb, 0x01, 0xd5, 0x81, 0x8e, 0xef, 0xa2, 0x74, 0x61, 0x0a, 0xc1, 0xb5, + 0x6f, 0x6e, 0x65, 0x31, 0xfe, 0x00, 0xec, 0x8c, 0xc4, 0xfe, 0x8f, 0x8e, 0xf6, 0x15, 0x88, 0xc1, + 0xfd, 0x07, 0xb5, 0x8f, 0xb1, 0xfe, 0x0f, 0x0f, 0xa3, 0x14, 0xaf, 0x69, 0x73, 0x56, 0xfd, 0x06, + 0x8c, 0x43, 0xfa, 0x85, 0x6a, 0xdd, 0x8a, 0x58, 0xf4, 0x92, 0x3b, 0x30, 0xeb, 0x34, 0x6e, 0x65, + 0x77, 0xe3, 0x8b, 0xdc, 0xc1, 0x94, 0x77, 0x35, 0xf2, 0x86, 0xc5, 0xf6, 0x01, 0xad, 0x8c, 0xa3, + 0xf9, 0x11, 0x22, 0xbf, 0x8e, 0xd3, 0xe2, 0x95, 0x29, 0xb3, 0xe0, 0xb2, 0x22, 0x29, 0x20, 0x7e, + 0xfb, 0x07, 0xdd, 0x85, 0x6a, 0xe7, 0x83, 0x98, 0xfc, 0x84, 0x69, 0xe7, 0x1f, 0x3b, 0xa9, 0x20, + 0x82, 0xee, 0xeb, 0x88, 0x2e, 0xd3, 0x03, 0xdd, 0x87, 0x28, 0xd3, 0x0f, 0xac, 0x04, 0x89, 0xcf, + 0xe0, 0x0e, 0xad, 0x03, 0xac, 0x07, 0xdd, 0x08, 0xad, 0x8b, 0xb8, 0xfa, 0x0f, 0x3f, 0x15, 0x8a, + 0x8b, 0xe7, 0x0b, 0x96, 0x23, 0x20, 0x20, 0xbb, 0x03, 0xdd, 0x57, 0x6c, 0x69, 0x64, 0x65, 0x49, + 0xb2, 0x8a, 0x4a, 0xfa, 0xaf, 0x29, 0x3b, 0x3a, 0xfe, 0x05, 0x8f, 0x89, 0xf2, 0x01, 0x8f, 0x60, + 0xfe, 0x05, 0x8f, 0x33, 0xf3, 0x08, 0x0e, 0x67, 0x8f, 0x05, 0xf3, 0x05, 0x82, 0xae, 0xf9, 0xb0, + 0x50, 0x72, 0x65, 0x61, 0xc0, 0xdf, 0x36, 0x34, 0x6b, 0x20, 0x28, 0xc5, 0xe4, 0x06, 0x8f, 0x05, + 0xf3, 0x0e, 0x85, 0x02, 0xd5, 0x0f, 0x5a, 0x0e, 0x8e, 0x23, 0xf3, 0x0e, 0x5a, 0x0f, 0xd2, 0x02, + 0x0f, 0x5a, 0x1c, 0x8e, 0xfc, 0xf0, 0x8f, 0x11, 0xbd, 0x0a, 0x95, 0x7d, 0x1c, 0xbd, 0x0f, 0x00, + 0xee, 0x00, 0x00, +}; + +static unsigned char buf[18830]; + +int main() { + + unsigned long cksum = adler32(0, NULL, 0); + + decompress_lzsa1(compressed, buf); + cksum = adler32(cksum, buf, 18830); + + return cksum == 0xf748269d ? 0 : 1; +} diff --git a/test/val/lzsa2.c b/test/val/lzsa2.c new file mode 100644 index 000000000..5babbb38c --- /dev/null +++ b/test/val/lzsa2.c @@ -0,0 +1,438 @@ +/* + !!DESCRIPTION!! lzsa2 decompression + !!ORIGIN!! cc65 regression tests + !!LICENCE!! BSD 2-clause + !!AUTHOR!! Colin Leroy-Mira +*/ + +#include +#include +#include + +/* The sample data is the original lz4.h, compressed with: + * lzsa -r -f 1 lz4.h lz4.lzsa1 + * + * We reused lz4.h from the LZ4 test to have a matching adler32 sum. + */ +static const unsigned char compressed[] = { + 0x19, 0xda, 0x2f, 0x2a, 0x0a, 0x20, 0x20, 0x20, 0x4c, 0x5a, 0x34, 0x20, 0x2d, 0x20, 0x46, 0x61, + 0x73, 0x74, 0x5a, 0xf8, 0x04, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x20, 0x61, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0xd9, 0x1a, 0x48, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x20, 0x46, 0x69, 0x6c, 0x65, 0x81, 0x38, 0x43, 0x6f, 0x70, 0x79, 0x2a, 0x19, + 0x67, 0x68, 0x74, 0x20, 0x28, 0x43, 0x29, 0x20, 0x32, 0x30, 0x31, 0x31, 0x2d, 0xd4, 0x39, 0x35, + 0x2c, 0x20, 0x59, 0x61, 0x6e, 0x6e, 0x13, 0x5a, 0x6c, 0x6c, 0x65, 0x74, 0x2e, 0x0a, 0xd6, 0x38, + 0x00, 0x42, 0x53, 0x44, 0x39, 0xac, 0x2d, 0x43, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x20, 0x4c, 0x69, + 0x63, 0x65, 0x6e, 0x18, 0x6f, 0x28, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x48, 0x2e, + 0xb6, 0x01, 0x60, 0x38, 0x6f, 0x75, 0x72, 0x3a, 0x00, 0x5c, 0x13, 0x72, 0x67, 0x2f, 0x6c, 0xdd, + 0x1d, 0x73, 0x2f, 0x62, 0x73, 0x64, 0x2d, 0x92, 0x5b, 0x2e, 0x70, 0x68, 0x70, 0x29, 0xb2, 0x5b, + 0x80, 0x52, 0x65, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x5d, 0x5a, 0x6e, 0x64, + 0x20, 0xa8, 0x08, 0x69, 0xa7, 0x44, 0xbd, 0x23, 0x08, 0x62, 0x89, 0x59, 0x61, 0x72, 0x79, 0x20, + 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2c, 0x20, 0x77, 0x3d, 0x08, 0x20, 0xac, 0x23, 0x48, 0x6f, 0xc9, + 0x42, 0xba, 0xf0, 0x6d, 0x6f, 0x48, 0x66, 0x75, 0x4a, 0x61, 0xbc, 0x50, 0x2c, 0x20, 0xd4, 0xf8, + 0x10, 0x65, 0x20, 0x70, 0x65, 0x20, 0x48, 0x74, 0xa2, 0x20, 0xb2, 0x19, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0xb0, 0x30, 0x74, 0x68, 0x01, 0xd2, 0x20, 0x49, 0x66, 0x32, 0x50, 0x6f, 0x77, 0x9d, 0x69, + 0x67, 0xe2, 0x48, 0x6e, 0x81, 0x42, 0xcb, 0xea, 0x73, 0x43, 0xb6, 0x40, 0x19, 0xe9, 0x3a, 0x04, + 0xf6, 0x4f, 0x2a, 0x61, 0x48, 0x73, 0x89, 0x4e, 0x66, 0x68, 0x48, 0x63, 0x8d, 0x00, 0xd2, 0x71, + 0x6d, 0x75, 0x9a, 0x68, 0x72, 0xe6, 0x48, 0x61, 0x50, 0x43, 0xa6, 0x50, 0x61, 0x62, 0x94, 0x01, + 0x65, 0xb4, 0x43, 0x65, 0x79, 0x00, 0x6e, 0x6f, 0x74, 0xdc, 0x09, 0x2c, 0x48, 0x69, 0xc1, 0x49, + 0x6c, 0x14, 0x41, 0xbc, 0x47, 0x88, 0x4b, 0x20, 0x47, 0x6b, 0x6f, 0x61, 0xef, 0x50, 0x63, 0x6c, + 0xae, 0x48, 0x6d, 0x3e, 0x4f, 0x2e, 0x77, 0x02, 0x77, 0x69, 0x6e, 0xea, 0x3f, 0x46, 0x77, 0x41, + 0x14, 0x51, 0x64, 0x75, 0x63, 0x46, 0x74, 0x63, 0x25, 0xee, 0x63, 0x47, 0x74, 0x25, 0x62, 0x99, + 0x45, 0x1a, 0x38, 0x17, 0x64, 0x6f, 0x63, 0x75, 0x48, 0x6e, 0x0a, 0x66, 0x4d, 0x69, 0x2f, 0x72, + 0x29, 0x6f, 0x3d, 0x20, 0x28, 0x6d, 0x6d, 0x20, 0x7f, 0x10, 0x69, 0x61, 0x6c, 0x73, 0x89, 0x64, + 0x51, 0x00, 0x13, 0x43, 0x75, 0x67, 0x14, 0x84, 0xfb, 0xb2, 0x39, 0x54, 0x48, 0x49, 0x53, 0x20, + 0x53, 0x4f, 0x46, 0x54, 0x57, 0x41, 0x52, 0x45, 0x20, 0xa8, 0x19, 0x50, 0x52, 0x4f, 0x56, 0x49, + 0x44, 0x45, 0x44, 0x20, 0x42, 0x59, 0x16, 0x00, 0x38, 0xa4, 0x43, 0x4f, 0x50, 0x59, 0x52, 0x49, + 0x47, 0x48, 0x54, 0x20, 0x48, 0x4f, 0x4c, 0x39, 0x35, 0x52, 0x53, 0x20, 0x41, 0x4e, 0x44, 0xf0, + 0x4e, 0x54, 0x18, 0x17, 0x42, 0x55, 0x54, 0x4f, 0x42, 0xb9, 0x59, 0x02, 0x22, 0x41, 0x53, 0xc3, + 0x2a, 0x22, 0x21, 0x06, 0x40, 0xc6, 0x50, 0x45, 0x58, 0xb8, 0x30, 0x45, 0x53, 0x00, 0x04, 0x00, + 0x59, 0x12, 0x4d, 0x50, 0x4c, 0x49, 0xb0, 0x41, 0x9f, 0x08, 0x52, 0x10, 0x54, 0x49, 0x46, 0x28, + 0x2c, 0x38, 0x2d, 0x4e, 0x43, 0x4c, 0x55, 0x44, 0x08, 0x47, 0xa1, 0x41, 0xbc, 0xbb, 0x20, 0x4e, + 0x4f, 0x54, 0xfa, 0xc6, 0x40, 0xd5, 0x51, 0x49, 0x54, 0xd6, 0x40, 0xab, 0x4a, 0x2c, 0x85, 0x47, + 0xc6, 0x48, 0x20, 0x57, 0x50, 0x20, 0x4d, 0x7c, 0x11, 0x43, 0x48, 0x80, 0x38, 0x41, 0x42, 0x49, + 0x1b, 0x53, 0x54, 0x59, 0x71, 0x08, 0x46, 0x4a, 0x4e, 0x91, 0x48, 0x46, 0x71, 0x42, 0x2b, 0xf8, + 0x7a, 0x41, 0x20, 0x50, 0x41, 0x52, 0x54, 0x49, 0x43, 0x55, 0x4c, 0x00, 0x5a, 0x46, 0x55, 0x52, + 0x50, 0x4f, 0x53, 0x45, 0x20, 0x20, 0x48, 0x44, 0x5c, 0x28, 0x43, 0x50, 0x49, 0x4d, 0x21, 0x49, + 0x2e, 0x7c, 0x41, 0x88, 0x40, 0x57, 0x50, 0x56, 0x45, 0xb5, 0x50, 0x20, 0x53, 0xaf, 0x57, 0x4c, + 0x4c, 0x11, 0x44, 0x43, 0x6f, 0x50, 0x4f, 0x57, 0xaa, 0x49, 0x52, 0x3c, 0x47, 0x11, 0x60, 0xe7, + 0x49, 0x45, 0x56, 0x40, 0x82, 0x52, 0x4c, 0x45, 0x91, 0x43, 0x12, 0x50, 0x44, 0x49, 0x13, 0x52, + 0x43, 0x54, 0x29, 0x27, 0xb1, 0x69, 0x43, 0xbb, 0x41, 0x5b, 0x72, 0x4c, 0x2c, 0x9a, 0x30, 0x53, + 0x50, 0x0a, 0x29, 0x49, 0x61, 0xe8, 0x68, 0x45, 0xf1, 0x41, 0x6a, 0x55, 0x59, 0x2c, 0xa9, 0x40, + 0x67, 0x51, 0x51, 0x55, 0x7e, 0x01, 0x13, 0x59, 0x20, 0x44, 0x41, 0x4d, 0x41, 0x47, 0x1c, 0x6f, + 0x28, 0xe2, 0xf2, 0x09, 0x62, 0x5b, 0x50, 0x43, 0x55, 0x8c, 0x49, 0x4d, 0x44, 0x62, 0xed, 0x18, + 0x53, 0x55, 0x42, 0x53, 0x54, 0x10, 0x08, 0x55, 0x7b, 0x26, 0x20, 0x47, 0x4f, 0x4f, 0x44, 0x89, + 0x68, 0x53, 0x55, 0x68, 0x56, 0xfe, 0x60, 0x93, 0x48, 0x3b, 0x53, 0x73, 0x4f, 0x53, 0xc7, 0x08, + 0x55, 0x43, 0x73, 0x70, 0x44, 0x41, 0xc4, 0x42, 0x81, 0x62, 0x15, 0x61, 0xc7, 0x32, 0x53, 0x3b, + 0xa1, 0x28, 0x42, 0x6b, 0x49, 0xbd, 0x20, 0xd4, 0x70, 0x54, 0x45, 0x57, 0xf0, 0x55, 0x50, 0x40, + 0x63, 0x69, 0x29, 0x0c, 0x69, 0x57, 0xde, 0x61, 0xff, 0x49, 0x41, 0xc2, 0x6b, 0x44, 0x05, 0x00, + 0x62, 0x1e, 0x84, 0xf4, 0xc4, 0x50, 0x45, 0x4f, 0x36, 0x62, 0x6c, 0x75, 0x4c, 0x49, 0x72, 0x60, + 0x47, 0xe8, 0x57, 0x20, 0x61, 0xca, 0xf4, 0x49, 0x4e, 0x6a, 0x41, 0xe7, 0x28, 0x53, 0xc0, 0xe8, + 0x49, 0x47, 0xd9, 0x44, 0x02, 0x61, 0xb3, 0x62, 0x09, 0x47, 0x10, 0x20, 0x68, 0x20, 0x3b, 0x08, + 0x47, 0x30, 0x47, 0x45, 0x8c, 0x4a, 0x45, 0x3d, 0x4a, 0x4f, 0xb7, 0x70, 0x57, 0x49, 0x44, 0x69, + 0x29, 0x43, 0x00, 0x42, 0xdf, 0x4b, 0x49, 0x83, 0x81, 0xff, 0xb4, 0x41, 0x89, 0x4a, 0x55, 0x04, + 0x62, 0x4b, 0x42, 0x26, 0x63, 0x51, 0x8f, 0x46, 0x31, 0x5e, 0x6b, 0x2c, 0x22, 0x40, 0xcc, 0xe8, + 0x46, 0x51, 0x44, 0x56, 0xb9, 0x4e, 0x44, 0xd0, 0x69, 0x50, 0xee, 0x4c, 0x49, 0x4f, 0x64, 0xc1, + 0x75, 0x43, 0x48, 0x82, 0xa4, 0x9d, 0x9a, 0x4e, 0x59, 0x6f, 0x75, 0x20, 0x63, 0x61, 0x6e, 0x61, + 0x80, 0xed, 0xa5, 0xf4, 0x63, 0x74, 0x28, 0x75, 0xa1, 0xfe, 0x99, 0x81, 0x3d, 0x4a, 0x3a, 0x94, + 0xaa, 0x2d, 0xee, 0x18, 0xa6, 0xdc, 0xf9, 0x5e, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, + 0xb2, 0x3a, 0x20, 0x76, 0xa9, 0x73, 0xee, 0x75, 0xa9, 0x67, 0xe1, 0x99, 0x0d, 0x75, 0x62, 0x2e, + 0xff, 0x5f, 0xa1, 0x2f, 0x43, 0x79, 0x61, 0x6e, 0x34, 0x39, 0x37, 0x33, 0x2f, 0x6c, 0x7a, 0x34, + 0xc3, 0x28, 0x70, 0x1e, 0xa1, 0x64, 0xa2, 0xe3, 0xaa, 0x57, 0x75, 0x6d, 0xc8, 0x48, 0x72, 0xab, + 0x00, 0xb4, 0x5b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0xc1, 0x43, 0xde, 0x3b, 0x0c, 0x2f, + 0x23, 0x21, 0x42, 0xbc, 0xb8, 0xae, 0x63, 0x0a, 0x2a, 0x2f, 0x0a, 0x23, 0x70, 0x72, 0x61, 0x67, + 0x6d, 0x61, 0x20, 0x8e, 0xf9, 0xa5, 0x63, 0x65, 0x0a, 0x0a, 0x23, 0x69, 0x66, 0x20, 0x64, 0x65, + 0x66, 0x69, 0x6e, 0x3a, 0x28, 0x5f, 0x5f, 0x63, 0x70, 0x6c, 0x75, 0x73, 0xe1, 0x99, 0x29, 0x0a, + 0x65, 0x78, 0xe8, 0xed, 0xb9, 0x6e, 0x20, 0x22, 0x43, 0x22, 0x20, 0x7b, 0x0a, 0x23, 0x65, 0x6e, + 0xed, 0x56, 0x92, 0x0a, 0x0a, 0x55, 0x51, 0x2a, 0x20, 0xb5, 0xb6, 0x2e, 0x68, 0xe4, 0x5f, 0x9f, + 0x73, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0xd4, 0x4e, 0x50, 0x66, 0x75, 0xa3, 0xa3, 0xed, 0x61, + 0x8b, 0x2c, 0xf8, 0x40, 0x2d, 0x08, 0x76, 0x35, 0x01, 0x7b, 0x60, 0x6c, 0x6c, 0x20, 0x62, 0x75, + 0x66, 0x66, 0x65, 0x72, 0xde, 0xf8, 0x72, 0x6f, 0x6c, 0x4a, 0x6f, 0xb9, 0x48, 0x67, 0x6e, 0xac, + 0x6d, 0xe1, 0xc9, 0x68, 0x2a, 0x8a, 0x40, 0x70, 0x69, 0x79, 0xb9, 0x40, 0x70, 0x32, 0x65, 0x64, + 0x30, 0x67, 0x65, 0xb1, 0x20, 0x8a, 0x74, 0xd0, 0xa6, 0x41, 0x71, 0x39, 0x2d, 0x6f, 0x70, 0x90, + 0x40, 0x01, 0x4f, 0x65, 0x92, 0x41, 0x49, 0x08, 0x64, 0x09, 0x48, 0x61, 0x44, 0x01, 0x20, 0x26, + 0x41, 0x8b, 0x73, 0x6e, 0x67, 0x9e, 0x49, 0x66, 0xad, 0x12, 0x65, 0x20, 0x87, 0xd0, 0x9f, 0x51, + 0x29, 0x2c, 0xa0, 0x42, 0x70, 0x63, 0x5c, 0x74, 0x6c, 0x65, 0x60, 0x60, 0xb5, 0x92, 0x62, 0x72, + 0xd3, 0x5b, 0x09, 0x68, 0x41, 0xa8, 0x91, 0x69, 0x74, 0xdd, 0xd3, 0x91, 0x77, 0x6e, 0xb0, 0x69, + 0x6d, 0x69, 0x48, 0x2c, 0x62, 0x20, 0x6d, 0x48, 0x61, 0x9b, 0x82, 0x24, 0x42, 0x0a, 0x43, 0xaa, + 0x51, 0x2e, 0x68, 0x73, 0xb1, 0x73, 0x74, 0xdf, 0x78, 0x69, 0x2e, 0xb0, 0x62, 0xec, 0x07, 0xff, + 0x0d, 0x70, 0x0a, 0x2a, 0x01, 0x48, 0x56, 0x42, 0x62, 0xe0, 0x4f, 0x0a, 0xce, 0x0d, 0x62, 0x54, + 0x64, 0x65, 0x42, 0x2e, 0xb1, 0x5f, 0x56, 0xef, 0xbc, 0xa1, 0xa4, 0x99, 0x1f, 0x5f, 0x4d, 0x41, + 0x4a, 0x1c, 0x01, 0xfd, 0x0a, 0x31, 0xb2, 0x2f, 0x2a, 0xdd, 0xa1, 0x50, 0x20, 0x62, 0x01, 0x51, + 0x61, 0x6b, 0x04, 0x64, 0xd9, 0x92, 0x66, 0x61, 0x17, 0x41, 0x2e, 0x69, 0x67, 0x62, 0x4f, 0x20, + 0xb8, 0xf2, 0x00, 0xf4, 0x49, 0x4e, 0xef, 0x37, 0x80, 0xf3, 0xf9, 0xe8, 0x77, 0x68, 0x6e, 0xd4, + 0x4e, 0x2d, 0xaf, 0x4f, 0x29, 0xae, 0x70, 0x61, 0x70, 0x84, 0xb1, 0x69, 0x6c, 0xde, 0x87, 0x61, + 0x0b, 0x47, 0x62, 0xff, 0x45, 0x52, 0x45, 0x4c, 0x45, 0x41, 0x53, 0x45, 0xf1, 0x74, 0x77, 0x71, + 0x73, 0x2c, 0x03, 0x50, 0x67, 0x2d, 0xce, 0x11, 0x78, 0x65, 0xa5, 0x21, 0x9a, 0x4d, 0x64, 0x65, + 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x6e, 0x47, 0xb2, 0xf1, 0x00, 0x99, 0x4e, 0x55, 0x4d, 0x42, 0xe9, + 0xba, 0x4f, 0x28, 0x00, 0x3a, 0x1e, 0x2a, 0x31, 0x30, 0x30, 0x57, 0x20, 0x2b, 0x2b, 0xa3, 0x04, + 0x47, 0x68, 0xb3, 0x51, 0x29, 0x0a, 0x31, 0x03, 0x6c, 0x76, 0x75, 0x7f, 0xbf, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x28, 0x76, 0x6f, 0x69, 0x64, 0x29, 0x3b, 0x33, 0x15, 0x7a, 0x0f, 0x54, + 0x75, 0x6e, 0x8e, 0x92, 0x70, 0x61, 0xeb, 0x61, 0x8a, 0x67, 0x2a, 0xff, 0x10, 0xa4, 0xbb, 0x63, + 0x2c, 0xb8, 0x0e, 0x4d, 0x45, 0x4d, 0xbc, 0xf0, 0x59, 0x5f, 0xa1, 0xe5, 0x3f, 0x32, 0x20, 0x3a, + 0x8b, 0x4d, 0xfc, 0x88, 0xa1, 0xb4, 0x68, 0x61, 0x44, 0xa3, 0xcd, 0xc7, 0x79, 0x75, 0x6c, 0x61, + 0x20, 0x3a, 0x20, 0x4e, 0x2d, 0x3e, 0x32, 0x5e, 0x4e, 0x20, 0x42, 0x79, 0x74, 0x2e, 0x99, 0x2f, + 0x28, 0x65, 0x78, 0x61, 0x6d, 0x67, 0x09, 0x73, 0x32, 0x68, 0x31, 0xfe, 0x00, 0x20, 0xd0, 0x18, + 0x4b, 0x42, 0x3b, 0xaa, 0xea, 0x32, 0xe8, 0x34, 0x29, 0x20, 0xea, 0x36, 0x32, 0x36, 0x34, 0x42, + 0x4c, 0x32, 0xdd, 0xe9, 0x4d, 0xbb, 0x65, 0x74, 0x63, 0x2e, 0x29, 0xff, 0x9a, 0x91, 0x6e, 0x63, + 0xce, 0xea, 0x73, 0x4f, 0x6d, 0x8e, 0x3c, 0xb2, 0x69, 0x6d, 0x89, 0x97, 0x65, 0x73, 0xb4, 0x80, + 0xaa, 0x72, 0xcc, 0x60, 0xab, 0x0a, 0xaa, 0x82, 0xc4, 0x5a, 0x4f, 0x64, 0xcd, 0xa2, 0xff, 0xb3, + 0x45, 0xc9, 0xa3, 0x90, 0x00, 0x0c, 0x60, 0x18, 0x91, 0x64, 0x75, 0x35, 0x29, 0x6f, 0x3c, 0x89, + 0x63, 0x8a, 0xa9, 0x65, 0xfa, 0x0f, 0x52, 0x63, 0x74, 0x24, 0x08, 0x44, 0x59, 0x5c, 0x61, 0x75, + 0x6c, 0x74, 0x20, 0x76, 0x61, 0x6c, 0xdf, 0xa1, 0xa9, 0x5a, 0x0b, 0x31, 0x34, 0x2c, 0x1c, 0x41, + 0x52, 0x91, 0x4b, 0x42, 0xe0, 0x50, 0x68, 0x69, 0xd0, 0x91, 0x20, 0x6e, 0xbb, 0x66, 0x89, 0x6c, + 0xcc, 0xa2, 0xf7, 0x77, 0x61, 0x54, 0x49, 0x6f, 0x55, 0x08, 0x74, 0x5c, 0x4f, 0x20, 0x78, 0x38, + 0x36, 0x20, 0x4c, 0x31, 0xad, 0x8f, 0x0a, 0x2d, 0x28, 0x67, 0xb9, 0x41, 0xab, 0x6f, 0x0a, 0x39, + 0xfe, 0x15, 0x72, 0x53, 0x69, 0xb4, 0x96, 0x20, 0x46, 0x4d, 0x67, 0x39, 0xff, 0x11, 0x87, 0xb5, + 0x0f, 0x66, 0xd4, 0x54, 0x5f, 0x64, 0x1f, 0x51, 0x28, 0x63, 0xb9, 0xaa, 0x74, 0x7f, 0xb5, 0x72, + 0x2a, 0xb9, 0xf1, 0x2d, 0x2c, 0xa1, 0xe4, 0xd1, 0x52, 0x74, 0x2c, 0x28, 0x25, 0x40, 0x83, 0x34, + 0x7a, 0x65, 0x81, 0x19, 0x6d, 0x61, 0x78, 0x44, 0x17, 0x02, 0x56, 0x29, 0x3b, 0xa5, 0x41, 0xae, + 0x47, 0xa3, 0x0f, 0x60, 0x93, 0xe8, 0x66, 0x47, 0xa5, 0x0c, 0xa7, 0xe2, 0xe4, 0x47, 0xa1, 0x63, + 0x07, 0x5f, 0x84, 0x11, 0x4f, 0x0a, 0x3e, 0xcd, 0x8c, 0x29, 0x52, 0x56, 0x20, 0x43, 0xce, 0x60, + 0x53, 0x4f, 0x27, 0x4e, 0x10, 0x9b, 0x27, 0x20, 0x62, 0xf0, 0x77, 0x10, 0x66, 0x72, 0xa5, 0xe0, + 0x2e, 0x06, 0x4a, 0x27, 0xc9, 0x64, 0x47, 0x91, 0x61, 0x6c, 0xec, 0x6b, 0x31, 0x64, 0x79, 0x81, + 0xdb, 0xe0, 0xaa, 0x61, 0x2d, 0x4a, 0x27, 0x01, 0x4d, 0x27, 0xce, 0xa3, 0xb5, 0x6c, 0x41, 0x01, + 0x20, 0x47, 0x05, 0x2a, 0x56, 0x27, 0x2e, 0x89, 0x86, 0x02, 0x82, 0xff, 0xd8, 0xb1, 0x67, 0x75, + 0x9c, 0x95, 0x6e, 0x74, 0xd1, 0xed, 0x1a, 0x73, 0x75, 0x63, 0x63, 0xa5, 0x57, 0x69, 0x66, 0xc5, + 0x7f, 0x04, 0x20, 0x3e, 0x3d, 0x71, 0x70, 0x42, 0x6f, 0x2d, 0x77, 0x64, 0x28, 0x98, 0x15, 0x4c, + 0x29, 0xa4, 0x51, 0x49, 0x74, 0x6e, 0x20, 0x30, 0x20, 0x72, 0x1f, 0x41, 0x3e, 0xb1, 0x61, 0x73, + 0x46, 0x69, 0x2c, 0xb5, 0xa1, 0xea, 0x06, 0x89, 0x27, 0xb2, 0x00, 0x4b, 0x62, 0x8e, 0xa1, 0xda, + 0x82, 0xad, 0x86, 0x60, 0xd7, 0x8a, 0x74, 0xaf, 0x45, 0xc8, 0x8b, 0x66, 0xad, 0x7b, 0x86, 0x25, + 0xa2, 0xd1, 0x17, 0x77, 0x6e, 0x6f, 0x93, 0x67, 0xff, 0x0d, 0x45, 0x03, 0x89, 0x20, 0xc0, 0x82, + 0xd4, 0xa2, 0x57, 0x6d, 0x69, 0x06, 0x50, 0x64, 0x67, 0xac, 0xa3, 0xcf, 0xb2, 0xa7, 0x9e, 0x42, + 0x20, 0xb1, 0x6f, 0x70, 0xe0, 0xad, 0x49, 0x69, 0x87, 0x71, 0x64, 0x69, 0xd5, 0xbb, 0x6c, 0x79, + 0x2a, 0xd5, 0xc6, 0x47, 0x8e, 0x41, 0xd2, 0x61, 0x64, 0x62, 0xef, 0x70, 0x7a, 0x65, 0x86, 0x44, + 0x6a, 0x4a, 0x41, 0x4c, 0x82, 0xf2, 0x90, 0x99, 0x65, 0x71, 0x75, 0x65, 0x6e, 0xfc, 0x97, 0x65, + 0x9b, 0x83, 0x7c, 0x00, 0x7f, 0x43, 0xd2, 0xb3, 0x6e, 0x6f, 0x8c, 0x74, 0x69, 0x64, 0xa3, 0x89, + 0x54, 0xa1, 0x2e, 0x47, 0xab, 0xa9, 0x6e, 0xea, 0x7a, 0xa1, 0x6c, 0x72, 0x72, 0x69, 0x2f, 0xa1, + 0xaa, 0x69, 0xa9, 0x73, 0x8c, 0x67, 0x57, 0x5f, 0xa0, 0x5c, 0xe9, 0x6e, 0x62, 0x34, 0x26, 0x0a, + 0x46, 0x14, 0x44, 0xde, 0x87, 0x10, 0x2f, 0x87, 0x2a, 0x2e, 0x89, 0x20, 0x4a, 0x68, 0x4d, 0x62, + 0x61, 0x52, 0x70, 0x70, 0x70, 0xf6, 0x62, 0x02, 0xa6, 0xfe, 0x09, 0x84, 0x06, 0x5e, 0xbf, 0x41, + 0x58, 0x5f, 0x49, 0x4e, 0x50, 0x55, 0x54, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0xbf, 0xa7, 0xf9, + 0x3c, 0x94, 0x20, 0x3a, 0xcd, 0xb2, 0x6f, 0x72, 0xea, 0x9c, 0x89, 0x74, 0x62, 0x84, 0xfe, 0xd0, + 0x55, 0x6f, 0x66, 0x67, 0x46, 0x15, 0x8b, 0x28, 0xc6, 0xa4, 0xaf, 0x2b, 0x97, 0x62, 0x65, 0x88, + 0x9a, 0x4e, 0x29, 0xa2, 0xa2, 0x0d, 0xf0, 0x75, 0x72, 0x6b, 0x3a, 0xa8, 0xac, 0x6e, 0xef, 0x05, + 0x94, 0x6f, 0x66, 0x32, 0x63, 0xfc, 0x61, 0xcd, 0x63, 0x40, 0x47, 0x9e, 0x7e, 0x60, 0xda, 0x48, + 0x63, 0xde, 0xf0, 0x73, 0x61, 0x81, 0x65, 0x52, 0x3c, 0x3d, 0x5a, 0x68, 0x4f, 0xd5, 0x53, 0x70, + 0x75, 0x58, 0x46, 0xa1, 0x06, 0xff, 0x61, 0xd3, 0x89, 0x30, 0x63, 0xa7, 0xc5, 0xef, 0xbf, 0x3f, + 0x61, 0x69, 0x6c, 0x73, 0x0a, 0x0a, 0x2d, 0xaf, 0xa6, 0x95, 0xa7, 0xf6, 0x4a, 0x00, 0x55, 0x61, + 0x18, 0x43, 0x59, 0x01, 0x30, 0x63, 0x69, 0x53, 0x63, 0xf4, 0x66, 0xff, 0x02, 0x47, 0xcf, 0x2c, + 0xa4, 0x7e, 0x61, 0x22, 0x66, 0xbf, 0x47, 0xb4, 0xee, 0x46, 0xc1, 0x83, 0x79, 0x94, 0x69, 0x6e, + 0x9f, 0xf8, 0x66, 0x1b, 0x67, 0xbb, 0x07, 0x77, 0x2e, 0x0a, 0xbf, 0xf2, 0x09, 0x4f, 0x64, 0x88, + 0x63, 0xba, 0x47, 0x98, 0xa7, 0x67, 0xb5, 0x47, 0x50, 0x7a, 0x67, 0xaf, 0x4f, 0x49, 0x50, 0xbf, + 0x86, 0x28, 0x68, 0x6c, 0x6c, 0x89, 0x67, 0xda, 0x9c, 0x00, 0x5b, 0x1d, 0x75, 0x67, 0x68, 0x2c, + 0x7e, 0xaa, 0x64, 0x6b, 0x70, 0x77, 0x69, 0xd3, 0xa3, 0xf8, 0xaa, 0x83, 0x78, 0x6b, 0x6f, 0x54, + 0x01, 0xa8, 0x48, 0x20, 0x7f, 0x68, 0x72, 0x61, 0x84, 0xfc, 0x5f, 0x27, 0x28, 0x3c, 0x30, 0x29, + 0x2e, 0x96, 0x62, 0xda, 0xa6, 0xbd, 0x62, 0x71, 0x73, 0x74, 0xfd, 0x6a, 0x6d, 0xc5, 0xa9, 0x64, + 0x21, 0x8a, 0x63, 0xf8, 0x3d, 0xe8, 0x6d, 0x82, 0x33, 0x81, 0xdf, 0x1c, 0xa7, 0x66, 0x42, 0x47, + 0x91, 0x46, 0x7e, 0x42, 0x88, 0x66, 0xd2, 0xa9, 0x61, 0xff, 0x9b, 0x49, 0x67, 0x43, 0xb5, 0x76, + 0x65, 0x3d, 0x47, 0x89, 0x2f, 0xa7, 0x6f, 0x99, 0xab, 0x69, 0x7c, 0x45, 0x8f, 0x48, 0x61, 0xc8, + 0x82, 0xbe, 0x94, 0xa7, 0xcd, 0x0c, 0xa9, 0x76, 0x23, 0xa1, 0x8c, 0xfc, 0x40, 0x38, 0x10, 0x78, + 0x70, 0x81, 0xbd, 0x54, 0x82, 0xb4, 0x5a, 0x0b, 0x63, 0x6c, 0x75, 0x0c, 0x42, 0x63, 0x50, 0x69, + 0x63, 0xbe, 0xb4, 0x75, 0x73, 0xee, 0x5f, 0x47, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x1d, + 0xaf, 0x74, 0xfc, 0x0e, 0x65, 0xdd, 0xa7, 0xf8, 0x0e, 0x47, 0xdf, 0x10, 0x37, 0x69, 0x6e, 0x1b, + 0x82, 0x08, 0xa7, 0xdf, 0x9b, 0x16, 0x99, 0x2c, 0x41, 0x64, 0x76, 0x61, 0x6e, 0xc5, 0xa7, 0xdf, + 0x99, 0x1a, 0xa6, 0xde, 0x17, 0x87, 0xca, 0x61, 0x5e, 0x53, 0x49, 0x5a, 0x45, 0x2c, 0x1b, 0x2f, + 0x30, 0x78, 0x37, 0x45, 0x30, 0xa4, 0xbc, 0xef, 0xa0, 0xf8, 0xf8, 0x6d, 0x31, 0x31, 0x33, 0x20, + 0x39, 0x32, 0x39, 0x20, 0x32, 0x85, 0x55, 0x47, 0xb7, 0x60, 0x9b, 0x43, 0x4f, 0x4d, 0x85, 0x97, + 0xba, 0x42, 0x4f, 0x55, 0x4e, 0x44, 0x28, 0x69, 0x73, 0xf9, 0x39, 0x81, 0xae, 0x89, 0x28, 0xda, + 0xec, 0xb1, 0x69, 0x67, 0xf4, 0x2e, 0x29, 0x61, 0xf7, 0x3e, 0x20, 0x47, 0x7e, 0xaf, 0xa9, 0x3f, + 0x15, 0x56, 0x3a, 0x20, 0xd3, 0xe8, 0x2b, 0x05, 0xa1, 0x3a, 0x2f, 0x32, 0x35, 0x35, 0x8d, 0x40, + 0x80, 0xab, 0x29, 0x9b, 0x87, 0xd9, 0x68, 0xa6, 0xda, 0x9e, 0xac, 0x50, 0xba, 0xa3, 0xfc, 0x14, + 0x82, 0xfb, 0xb1, 0x69, 0x6d, 0xa7, 0x2a, 0x42, 0xbc, 0x83, 0x08, 0x42, 0x53, 0x87, 0x63, 0xf4, + 0x41, 0xde, 0x6e, 0x79, 0x54, 0x8a, 0x69, 0xfc, 0xa6, 0x70, 0x22, 0x77, 0x56, 0x82, 0x94, 0xf8, + 0x17, 0x61, 0x73, 0x65, 0x22, 0xa1, 0x2b, 0x81, 0xef, 0x5c, 0x48, 0x6f, 0x6f, 0x63, 0x52, 0x84, + 0xf8, 0x87, 0xd3, 0x5b, 0xa9, 0x69, 0xaf, 0xc5, 0x97, 0x29, 0x0a, 0x8c, 0xee, 0x93, 0x69, 0x6d, + 0x20, 0xa2, 0x7a, 0x38, 0xa1, 0x55, 0x82, 0xab, 0xf1, 0x84, 0xe4, 0xa6, 0xd9, 0x3e, 0x43, 0xd6, + 0x40, 0xa9, 0x89, 0x72, 0x4c, 0x82, 0xbf, 0x7b, 0xa7, 0x6c, 0xad, 0xaf, 0x73, 0x9a, 0x12, 0x7f, + 0x4d, 0x61, 0x63, 0x72, 0x6f, 0x95, 0xad, 0x49, 0x29, 0x94, 0xa4, 0x80, 0xa6, 0x7d, 0x20, 0x42, + 0x97, 0x43, 0x5f, 0x53, 0x69, 0x6c, 0xb3, 0x08, 0x2d, 0xa9, 0x6d, 0xfb, 0x2e, 0x82, 0xdb, 0x44, + 0xa3, 0xb1, 0x28, 0x73, 0x99, 0xb3, 0x4f, 0x6b, 0x74, 0x43, 0xc7, 0xa4, 0xbc, 0xf5, 0x46, 0x8a, + 0x48, 0x4e, 0x14, 0x65, 0xc8, 0x87, 0x2a, 0xe6, 0x05, 0xa6, 0xdb, 0x07, 0x81, 0x8c, 0xb3, 0x65, + 0x6e, 0xc3, 0x6b, 0x47, 0x3d, 0x61, 0xf1, 0x87, 0xce, 0xb4, 0xb7, 0x72, 0x63, 0xe5, 0x0f, 0x63, + 0x99, 0x86, 0xdc, 0x12, 0xef, 0x6d, 0x87, 0xfa, 0x48, 0x87, 0xd8, 0x71, 0x66, 0x08, 0x65, 0x26, + 0x43, 0x7b, 0x67, 0x21, 0xfd, 0x03, 0x87, 0x90, 0xac, 0xaa, 0x2c, 0xf2, 0x64, 0x0b, 0x46, 0x3e, + 0xbd, 0x0e, 0x74, 0x6f, 0x6f, 0xe2, 0x48, 0x28, 0x32, 0x47, 0x7a, 0xa8, 0x89, 0x29, 0xf3, 0x82, + 0xba, 0x3d, 0x47, 0x18, 0x21, 0x5b, 0x45, 0x25, 0x87, 0xd9, 0xeb, 0x61, 0xc2, 0x87, 0xdc, 0x19, + 0xaa, 0x53, 0x96, 0x00, 0x7e, 0x67, 0x8d, 0xa2, 0xac, 0x0a, 0x6b, 0x74, 0x4a, 0xb3, 0x77, 0x73, + 0x42, 0x68, 0x65, 0x52, 0xab, 0x63, 0xe9, 0x74, 0x68, 0x22, 0x2a, 0x09, 0x63, 0x6b, 0x72, 0x33, + 0x69, 0x22, 0x6e, 0xa9, 0x63, 0x8c, 0xf6, 0x86, 0x5d, 0x4c, 0x65, 0x44, 0xab, 0x72, 0x83, 0xbc, + 0x47, 0xd7, 0x64, 0xa7, 0xa3, 0xea, 0x80, 0x65, 0x3b, 0x02, 0xa7, 0x51, 0xdc, 0x46, 0x90, 0xb4, + 0x73, 0x6f, 0x95, 0x21, 0x41, 0x51, 0x44, 0xba, 0xa7, 0xad, 0x3b, 0x85, 0xf6, 0xa4, 0xc5, 0x0e, + 0xb1, 0x74, 0x72, 0xae, 0x70, 0x2d, 0x6f, 0x01, 0x29, 0x2e, 0x78, 0xa2, 0x40, 0x82, 0xc9, 0xbb, + 0xa3, 0x89, 0x91, 0x74, 0x75, 0xe5, 0xf5, 0x85, 0x47, 0x89, 0x65, 0xab, 0x33, 0x83, 0x85, 0x42, + 0xbe, 0x74, 0x76, 0x65, 0x20, 0x84, 0x5d, 0x5b, 0x83, 0x8e, 0x8a, 0x72, 0xdc, 0x7e, 0x81, 0xe2, + 0x79, 0x1a, 0x2b, 0x7e, 0x33, 0x25, 0x84, 0xa4, 0xf5, 0xa5, 0xc9, 0x5c, 0x4f, 0x6e, 0x3e, 0x83, + 0xc0, 0x39, 0xbf, 0x22, 0x31, 0x22, 0xd0, 0x66, 0x65, 0xbb, 0x40, 0x5f, 0x51, 0x67, 0x75, 0x06, + 0x67, 0xb3, 0xec, 0x63, 0xe3, 0x6a, 0x56, 0xff, 0x8a, 0x73, 0x79, 0x8c, 0x30, 0xd7, 0x18, 0x8b, + 0x62, 0xb6, 0xb2, 0x6c, 0x61, 0xe9, 0xa0, 0x50, 0x62, 0x79, 0x91, 0xb1, 0x43, 0x43, 0x7b, 0xb2, + 0x52, 0x41, 0x75, 0x76, 0xb9, 0x5f, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, 0xf8, 0xbb, 0xb3, + 0x65, 0x65, 0x48, 0xb5, 0x63, 0x29, 0xaa, 0x96, 0xa3, 0x7f, 0x8e, 0x2e, 0xf8, 0xfb, 0x67, 0x21, + 0x8f, 0x20, 0xaf, 0x3a, 0x25, 0x06, 0x74, 0x67, 0x45, 0xa1, 0x9f, 0xa0, 0x87, 0xb5, 0xd7, 0x89, + 0x5f, 0x94, 0x91, 0x53, 0x74, 0xaf, 0xdd, 0x87, 0xac, 0x47, 0x87, 0xae, 0xc5, 0x40, 0xaa, 0xaa, + 0x6a, 0x44, 0x20, 0xed, 0xa4, 0x9c, 0x8c, 0x20, 0x7a, 0x5a, 0x81, 0x9d, 0x87, 0xa2, 0x98, 0x86, + 0x9f, 0x2d, 0x71, 0x73, 0x70, 0xed, 0x63, 0x74, 0x81, 0xa7, 0x47, 0xb1, 0x5d, 0x4a, 0x73, 0x92, + 0x64, 0x62, 0x94, 0x55, 0x73, 0xed, 0x82, 0xad, 0x74, 0x55, 0x6f, 0x66, 0x79, 0x42, 0xca, 0xb1, + 0x6b, 0x6e, 0x97, 0x29, 0x68, 0xeb, 0x70, 0x6d, 0x75, 0xfb, 0x45, 0xac, 0x86, 0x9b, 0xa7, 0xc1, + 0xe8, 0xea, 0x2c, 0x82, 0x46, 0x00, 0x06, 0x82, 0x7d, 0xbc, 0x49, 0x20, 0x9d, 0x94, 0x38, 0x2d, + 0x86, 0x8a, 0x62, 0xab, 0x79, 0x81, 0xc6, 0xa2, 0x9f, 0x47, 0x44, 0x49, 0x4b, 0x6d, 0xd6, 0x42, + 0x9b, 0x70, 0x79, 0x70, 0x77, 0x42, 0x44, 0x8f, 0x29, 0x09, 0x0e, 0xb5, 0x6e, 0x2c, 0xe7, 0x43, + 0xb9, 0xa9, 0x61, 0xa8, 0x89, 0x82, 0x66, 0x4c, 0x2a, 0x4f, 0x49, 0x27, 0x69, 0x67, 0xea, 0xc7, + 0x66, 0x39, 0x47, 0x37, 0x85, 0x82, 0x29, 0x06, 0x67, 0x8a, 0xe2, 0x57, 0x20, 0x28, 0x9c, 0x77, + 0x2c, 0x20, 0x08, 0xfe, 0x09, 0x86, 0xe2, 0x67, 0x09, 0xf1, 0x24, 0x4c, 0x64, 0xd1, 0x67, 0x0e, + 0xb2, 0x52, 0x65, 0x87, 0x6e, 0xac, 0x65, 0x6c, 0x70, 0x6f, 0x67, 0xe8, 0x89, 0x2c, 0xf7, 0x34, + 0x46, 0x13, 0x64, 0x12, 0x6b, 0x73, 0x76, 0xa3, 0x10, 0x02, 0x9d, 0x94, 0x70, 0x6f, 0x2f, 0x83, + 0x9a, 0x79, 0x87, 0x6d, 0x79, 0x87, 0x79, 0xfa, 0x03, 0x87, 0xc2, 0x59, 0x87, 0x79, 0x1e, 0x8a, + 0x74, 0x8f, 0x8f, 0x74, 0x90, 0x76, 0xa7, 0xab, 0xd3, 0xb3, 0x65, 0x69, 0x4d, 0xd2, 0x46, 0x3a, + 0xa5, 0x4a, 0xa1, 0x48, 0xad, 0x08, 0x69, 0x46, 0x7e, 0xa7, 0xa0, 0x85, 0x43, 0x81, 0x46, 0x9a, + 0x93, 0x69, 0x66, 0x9b, 0x9f, 0x87, 0x50, 0x5a, 0x8d, 0x0a, 0xd1, 0x89, 0x66, 0xb9, 0x52, 0xa7, + 0xe3, 0x39, 0x45, 0x9d, 0x92, 0x6c, 0x65, 0xf6, 0xa3, 0x3f, 0xc8, 0x47, 0x03, 0x0f, 0x87, 0xb1, + 0x30, 0x8f, 0x2a, 0x81, 0xa0, 0x50, 0x50, 0x74, 0x14, 0x8e, 0x3a, 0xe3, 0xd6, 0xa5, 0x8d, 0xa4, + 0x66, 0xa3, 0xa9, 0x69, 0x2b, 0x62, 0xed, 0x84, 0xf0, 0x1a, 0xbe, 0x61, 0x6e, 0x79, 0xaa, 0xf6, + 0x41, 0x1b, 0xab, 0x65, 0x0e, 0x67, 0xa4, 0x62, 0x57, 0x74, 0x6f, 0x54, 0x43, 0x92, 0x27, 0xfe, + 0xbf, 0x08, 0x4e, 0x65, 0x77, 0x19, 0x1a, 0xa7, 0xc3, 0x69, 0x95, 0x6f, 0x6c, 0xf4, 0xaf, 0x2e, + 0xd9, 0xf7, 0xb7, 0x4e, 0x62, 0xab, 0x73, 0xa7, 0xae, 0x7a, 0x67, 0x4f, 0x0a, 0xa7, 0x79, 0xfe, + 0x16, 0x86, 0x0d, 0x87, 0xfb, 0x70, 0xa7, 0x8f, 0x9e, 0x0e, 0x05, 0x36, 0x66, 0xa2, 0x23, 0x47, + 0x72, 0x6e, 0x87, 0x14, 0x3d, 0xb7, 0x64, 0x65, 0xc7, 0xd2, 0xa9, 0x6f, 0x47, 0x89, 0x69, 0xea, + 0x44, 0xa7, 0x5c, 0x55, 0x26, 0x84, 0x28, 0x9e, 0x62, 0x76, 0x8a, 0x66, 0xb6, 0xb7, 0x75, 0x6e, + 0xa1, 0xa3, 0xa3, 0x8a, 0xc8, 0xa7, 0x70, 0xf1, 0x09, 0x67, 0x3f, 0x87, 0xa3, 0x2a, 0xa6, 0xa3, + 0x79, 0xb5, 0x69, 0x6e, 0x05, 0x81, 0xba, 0xbf, 0x94, 0x64, 0x73, 0x30, 0x47, 0x9e, 0x6a, 0xaf, + 0x29, 0xe2, 0xfa, 0x6d, 0xaf, 0x44, 0x04, 0x89, 0x87, 0x5b, 0xfd, 0x02, 0xa2, 0x3e, 0x6b, 0x73, + 0xe2, 0x47, 0xdc, 0x1c, 0xa0, 0xa3, 0xf4, 0x69, 0x6e, 0x81, 0x77, 0xd0, 0x66, 0x8d, 0x87, 0x3a, + 0x2b, 0x84, 0xc6, 0xea, 0x6e, 0xaf, 0x3a, 0xa5, 0x75, 0x01, 0xbd, 0x82, 0xa8, 0x85, 0x4d, 0xa6, + 0x85, 0xfe, 0xa7, 0xe3, 0x30, 0x8a, 0x66, 0x84, 0x65, 0x8a, 0x72, 0x6c, 0x41, 0xd9, 0x44, 0x05, + 0x87, 0x47, 0x67, 0x47, 0x33, 0x4b, 0x93, 0x49, 0x74, 0x02, 0xa1, 0x1c, 0xe8, 0x8f, 0x74, 0x44, + 0x1c, 0x81, 0x90, 0x87, 0x8c, 0xe9, 0x47, 0xc6, 0x40, 0xba, 0x48, 0x6f, 0x77, 0xed, 0xe0, 0x8a, + 0x2c, 0xeb, 0x9c, 0x09, 0x64, 0x6f, 0x65, 0x04, 0x86, 0xdf, 0xd7, 0xa1, 0x47, 0x84, 0x99, 0xcd, + 0x44, 0x4a, 0x86, 0xcc, 0x00, 0xd7, 0x20, 0xe9, 0x6e, 0xa3, 0xdf, 0xe2, 0xa5, 0x08, 0x45, 0x6a, + 0x66, 0x42, 0x8f, 0x28, 0x90, 0xcc, 0xa4, 0xa5, 0x20, 0x47, 0x8b, 0xaa, 0x55, 0xe3, 0x71, 0x67, + 0xef, 0x83, 0x1e, 0xb7, 0x51, 0x72, 0x75, 0x47, 0x89, 0x64, 0x0b, 0xe8, 0x76, 0x00, 0x65, 0xa3, + 0x42, 0x00, 0xc4, 0x41, 0x9f, 0x4b, 0x28, 0xa7, 0x74, 0x74, 0x6f, 0x1b, 0xa3, 0x5e, 0x86, 0x66, + 0xdd, 0x4e, 0x61, 0xca, 0xa5, 0xf2, 0x8e, 0x29, 0xcc, 0x89, 0x45, 0x06, 0x87, 0x87, 0xf6, 0x1b, + 0x66, 0x37, 0x87, 0x37, 0x2a, 0x67, 0xba, 0x8d, 0x5f, 0x7b, 0xc7, 0x86, 0x54, 0x67, 0x20, 0x61, + 0x47, 0xd2, 0xb7, 0x20, 0x61, 0x88, 0xb1, 0x87, 0x61, 0x60, 0xa7, 0x65, 0xc9, 0xa8, 0x27, 0xe0, + 0x81, 0xea, 0x74, 0x83, 0x80, 0x87, 0x64, 0x09, 0x87, 0x89, 0x0c, 0x87, 0xde, 0x96, 0xa7, 0x6a, + 0x73, 0x86, 0xd7, 0x91, 0xa7, 0x10, 0x3c, 0x8b, 0x74, 0xcb, 0x96, 0x74, 0x6f, 0x8d, 0xa6, 0xa7, + 0xf3, 0x33, 0xa3, 0xf7, 0x64, 0x11, 0x69, 0x73, 0xdb, 0x23, 0xcd, 0x86, 0x3d, 0x84, 0x70, 0x65, + 0x44, 0x54, 0x09, 0x68, 0x91, 0x62, 0x65, 0x7b, 0x2a, 0x8a, 0x72, 0x3f, 0x86, 0xc5, 0x51, 0xaa, + 0x72, 0x37, 0x83, 0x06, 0x4c, 0x8f, 0x65, 0x79, 0x3a, 0xa2, 0x86, 0xa7, 0x8f, 0x18, 0x0f, 0xa1, + 0x60, 0xe1, 0x85, 0xa9, 0xa7, 0x8f, 0x1b, 0x28, 0xac, 0x4e, 0xfb, 0x86, 0xe9, 0x74, 0x45, 0x96, + 0xa6, 0x7c, 0x4f, 0x3c, 0x2f, 0xb7, 0xc9, 0x73, 0xdd, 0xc4, 0xb7, 0x6c, 0x64, 0xff, 0xcf, 0x87, + 0x83, 0x1c, 0x42, 0xc2, 0xaa, 0x73, 0x99, 0x83, 0x6f, 0x64, 0x07, 0x33, 0x9e, 0x41, 0x6c, 0x77, + 0x61, 0x79, 0x73, 0x2d, 0x80, 0x87, 0x07, 0x8d, 0x81, 0x08, 0x46, 0x21, 0x87, 0x7f, 0xe4, 0x7b, + 0xa7, 0x8e, 0x45, 0xaf, 0x66, 0x86, 0x42, 0x42, 0xa0, 0x45, 0xd5, 0xa6, 0x88, 0x3c, 0x46, 0xd6, + 0xa7, 0x39, 0x5e, 0x84, 0x6f, 0x87, 0xd1, 0x9b, 0x87, 0x79, 0x87, 0x87, 0x7d, 0xab, 0xa7, 0xd4, + 0xbd, 0xa7, 0xfe, 0x8d, 0x87, 0x4f, 0x55, 0x22, 0x67, 0x0c, 0x34, 0x87, 0x3f, 0xf4, 0x07, 0xa7, + 0x16, 0x44, 0xa7, 0x0d, 0xf4, 0x13, 0x63, 0x42, 0x61, 0x76, 0x87, 0x97, 0x33, 0x87, 0xfe, 0xb7, + 0x87, 0x5c, 0xf0, 0x1c, 0x81, 0x4c, 0xba, 0x09, 0x45, 0x41, 0x4d, 0x9e, 0x18, 0x8c, 0x5f, 0x55, + 0x36, 0x34, 0x20, 0x28, 0x28, 0x31, 0x20, 0x3c, 0x3c, 0xa7, 0x37, 0x11, 0x9a, 0x07, 0x2d, 0x33, + 0x29, 0xcf, 0x57, 0x34, 0x29, 0xc3, 0xea, 0x63, 0x01, 0x4f, 0x28, 0xaf, 0x94, 0x2a, 0x20, 0xa0, + 0x56, 0x59, 0x28, 0x6c, 0x6f, 0x3f, 0x02, 0xd2, 0x97, 0x29, 0x29, 0xad, 0x26, 0x84, 0x4a, 0xab, + 0x5f, 0x3f, 0x8f, 0x92, 0x69, 0x6e, 0x6e, 0xa4, 0x84, 0x47, 0x21, 0x91, 0x75, 0x63, 0x5a, 0x02, + 0xa3, 0xef, 0x20, 0xa8, 0xa2, 0xae, 0x84, 0xd6, 0x86, 0x85, 0x18, 0x4b, 0x2e, 0xcf, 0xaa, 0x6d, + 0x5f, 0x54, 0x69, 0x61, 0x26, 0x69, 0x3a, 0x8b, 0xb3, 0x69, 0x74, 0x6a, 0x47, 0xc5, 0x24, 0x86, + 0xab, 0x8c, 0x62, 0xc7, 0x6c, 0x91, 0x66, 0x69, 0x84, 0xa3, 0x1d, 0xe4, 0x49, 0x21, 0x81, 0xa6, + 0xbc, 0xb7, 0x6f, 0x6e, 0xa4, 0x73, 0xb1, 0x64, 0x69, 0x46, 0xad, 0x08, 0x74, 0x82, 0x52, 0x7f, + 0x47, 0xb5, 0xac, 0x69, 0x1a, 0x18, 0x08, 0x61, 0xa3, 0xaa, 0x73, 0xa4, 0xf8, 0xa1, 0x41, 0xd0, + 0xb5, 0x6e, 0x6b, 0x3d, 0x42, 0xae, 0xa6, 0x60, 0x68, 0x47, 0xd4, 0xa4, 0xa1, 0x07, 0xa2, 0x4b, + 0xa1, 0x07, 0xed, 0x00, 0xa2, 0x40, 0x4f, 0xbf, 0x44, 0x4c, 0x4c, 0x14, 0x59, 0xb1, 0x62, 0x65, + 0x67, 0xdf, 0x42, 0x56, 0x44, 0x0e, 0xa3, 0xcb, 0xa9, 0x65, 0x01, 0x7c, 0xb7, 0x64, 0x73, 0x49, + 0x02, 0x83, 0xbf, 0xa1, 0xad, 0x83, 0x69, 0x65, 0x49, 0x65, 0xe7, 0x73, 0x20, 0x7b, 0xb5, 0x04, + 0x8a, 0x74, 0x09, 0x9d, 0x6f, 0x5b, 0x33, 0x7f, 0x14, 0x5d, 0x3b, 0x20, 0x7d, 0x9b, 0x77, 0x3b, + 0x0a, 0x86, 0x26, 0x00, 0x81, 0x3f, 0xd0, 0x84, 0xa5, 0x01, 0x6d, 0xa7, 0xc2, 0x9b, 0xa4, 0x8e, + 0x8a, 0x69, 0x51, 0x78, 0x67, 0xe1, 0x47, 0xb1, 0x41, 0x67, 0x5b, 0x43, 0x5e, 0x82, 0x17, 0x6c, + 0x47, 0xa6, 0x57, 0x20, 0x28, 0x80, 0x3b, 0x6d, 0x2a, 0x43, 0x81, 0x7b, 0x4f, 0x29, 0x74, 0x42, + 0xa2, 0x22, 0x54, 0x74, 0x65, 0xcd, 0x84, 0x80, 0xdb, 0x66, 0x6f, 0xa2, 0x6f, 0x63, 0x24, 0x89, + 0x69, 0x58, 0xd1, 0x0a, 0x7a, 0x47, 0x7d, 0xed, 0x46, 0xb5, 0xe8, 0x66, 0x46, 0xb7, 0x00, 0x63, + 0x99, 0xaa, 0x73, 0x00, 0xda, 0xa5, 0xde, 0xa4, 0x0d, 0x4c, 0x82, 0xf7, 0x85, 0xf3, 0xe2, 0xca, + 0x78, 0xd8, 0xd7, 0x64, 0x69, 0x74, 0x20, 0x28, 0x58, 0x6f, 0x29, 0x60, 0x42, 0xd6, 0x20, 0xb1, + 0x66, 0x6d, 0x82, 0xa4, 0xae, 0x68, 0xc7, 0xf9, 0x20, 0x86, 0xf9, 0xf4, 0x45, 0x7a, 0x62, 0x57, + 0xa2, 0xeb, 0x6b, 0x79, 0x05, 0x41, 0x91, 0xa2, 0x3e, 0x81, 0x94, 0x74, 0x75, 0x57, 0x92, 0x6f, + 0x66, 0x56, 0x03, 0x83, 0x06, 0x43, 0x8e, 0x84, 0x0a, 0x0f, 0x22, 0x67, 0xac, 0x64, 0x41, 0x1a, + 0x64, 0x0e, 0x07, 0x39, 0x67, 0xd9, 0xa7, 0x93, 0xd4, 0x07, 0xf1, 0x66, 0xfe, 0x67, 0x82, 0xf3, + 0x15, 0x9a, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x69, 0x1f, 0x0b, 0x87, 0xf9, 0xe3, 0x42, 0xdf, 0x56, + 0x20, 0x61, 0x13, 0x12, 0x64, 0x69, 0xc2, 0xd6, 0xd5, 0x83, 0x1f, 0x0e, 0x46, 0x41, 0xa6, 0x6b, + 0xab, 0x41, 0xc5, 0x21, 0xb7, 0x65, 0x76, 0x25, 0x0a, 0xa5, 0x34, 0x83, 0x03, 0xe0, 0x92, 0x67, + 0x6f, 0x4c, 0xac, 0x2c, 0xc1, 0x7d, 0x4f, 0x27, 0xb6, 0x4b, 0x27, 0xdb, 0xc1, 0xd7, 0x1c, 0xea, + 0x6d, 0x00, 0xe3, 0x67, 0x51, 0x48, 0x4c, 0x61, 0x84, 0x43, 0x5d, 0xa6, 0xb0, 0x82, 0x37, 0x50, + 0xac, 0x73, 0x5c, 0xa1, 0x41, 0x17, 0xa3, 0x16, 0xa5, 0xa3, 0x6f, 0x47, 0x64, 0x8d, 0x73, 0x15, + 0x54, 0xa4, 0xae, 0xa7, 0x38, 0xec, 0x81, 0xe0, 0x14, 0x91, 0x4b, 0x42, 0xa3, 0x84, 0x64, 0xaa, + 0x67, 0xf8, 0x67, 0xc9, 0xf8, 0x01, 0x87, 0x93, 0x42, 0x67, 0xf8, 0x83, 0xd8, 0xe3, 0x22, 0x84, + 0x68, 0x7e, 0x66, 0xa3, 0x87, 0x3c, 0xac, 0x41, 0xc0, 0x81, 0x83, 0x8b, 0x75, 0xf1, 0x52, 0x86, + 0x53, 0x86, 0xa2, 0x1c, 0xa6, 0xfd, 0xa9, 0x27, 0x67, 0x48, 0x94, 0x27, 0x2c, 0xcc, 0x63, 0xbf, + 0xa4, 0xa3, 0xeb, 0x66, 0xac, 0xb7, 0x6c, 0x79, 0xb5, 0x83, 0x61, 0xf3, 0x6f, 0x73, 0x69, 0x96, + 0x74, 0x6f, 0x00, 0x1d, 0xa7, 0xe7, 0x9e, 0xa3, 0xc7, 0xef, 0x49, 0x24, 0x6f, 0x50, 0x54, 0x46, + 0xb0, 0xaa, 0x72, 0x60, 0xdc, 0x9d, 0x73, 0x75, 0x6d, 0x19, 0x3c, 0x6d, 0x74, 0x3d, 0x42, 0xb4, + 0x41, 0x5c, 0xc4, 0xd4, 0xbf, 0xae, 0x6e, 0x63, 0xa4, 0xe8, 0xb0, 0x91, 0x27, 0x64, 0xef, 0x87, + 0xaf, 0x0c, 0x09, 0xc5, 0xda, 0xca, 0x83, 0x02, 0xbf, 0xa4, 0xc7, 0x87, 0x5f, 0x43, 0x06, 0x61, + 0x8c, 0xa7, 0x1f, 0xa2, 0x0b, 0x83, 0xc1, 0xbb, 0xa7, 0xdc, 0x31, 0x45, 0x99, 0x82, 0xb3, 0x24, + 0x2a, 0x97, 0x69, 0x66, 0x14, 0x71, 0xa6, 0xed, 0x94, 0x66, 0x69, 0x84, 0x04, 0x47, 0x3f, 0x84, + 0xf1, 0xc1, 0x87, 0x0a, 0x91, 0x44, 0x97, 0x86, 0x1c, 0xa5, 0x21, 0x5e, 0x61, 0x80, 0x84, 0x1c, + 0x87, 0xf3, 0xb1, 0x67, 0x06, 0xef, 0x87, 0xa3, 0xf0, 0x0f, 0x41, 0x01, 0xa7, 0x7b, 0x00, 0xa5, + 0x7c, 0x22, 0x60, 0xa7, 0x7f, 0x56, 0x87, 0x46, 0xff, 0x00, 0xa7, 0x21, 0x51, 0xfe, 0x73, 0x61, + 0x76, 0x65, 0x97, 0x49, 0x66, 0xfd, 0xb8, 0x67, 0x03, 0x21, 0xa5, 0x7d, 0x67, 0x98, 0x5f, 0xa6, + 0x66, 0x91, 0x61, 0x76, 0x1e, 0xe6, 0xc3, 0xd9, 0x2e, 0xb7, 0x61, 0x74, 0xa9, 0x24, 0xae, 0x20, + 0x8f, 0x42, 0x9c, 0x42, 0x90, 0x6e, 0x20, 0xac, 0x09, 0x61, 0x86, 0x62, 0xb1, 0xa3, 0x10, 0x53, + 0x20, 0x28, 0x23, 0x03, 0x6f, 0x6b, 0x42, 0x99, 0xa2, 0x7f, 0xa5, 0xbd, 0xad, 0xa3, 0xa0, 0x68, + 0x64, 0xfd, 0xe8, 0x27, 0xc6, 0xd8, 0xb2, 0x82, 0x6f, 0x93, 0xa7, 0x66, 0x30, 0xa2, 0x17, 0x71, + 0x61, 0x66, 0x22, 0x92, 0x77, 0x61, 0x8d, 0xfb, 0xa7, 0x8d, 0x1e, 0x87, 0x6c, 0x40, 0x97, 0x73, + 0x20, 0x67, 0x03, 0x83, 0xe1, 0x42, 0x51, 0x4a, 0x2c, 0xa2, 0x62, 0x0f, 0x87, 0x82, 0x5d, 0x46, + 0xa2, 0x67, 0x57, 0xee, 0x97, 0x28, 0x29, 0xa6, 0x3e, 0x43, 0x2a, 0x8f, 0x64, 0xa0, 0x7e, 0x87, + 0xa1, 0xfe, 0x01, 0x87, 0xf3, 0x11, 0xae, 0x2c, 0x9f, 0xa4, 0x2e, 0x33, 0x86, 0x8f, 0x67, 0x66, + 0x0e, 0x87, 0x8f, 0xf7, 0x07, 0x67, 0xcf, 0x87, 0xe8, 0x95, 0x62, 0x16, 0x87, 0xbf, 0xac, 0x25, + 0x81, 0xab, 0x16, 0x87, 0xaa, 0xfb, 0x2c, 0x41, 0x29, 0x87, 0xa8, 0xa1, 0x38, 0x44, 0x45, 0x43, + 0x4f, 0xeb, 0x87, 0xa2, 0x0f, 0x57, 0x20, 0x34, 0xdc, 0x03, 0x86, 0xb3, 0xbb, 0x27, 0x7b, 0x87, + 0xb5, 0x92, 0x86, 0x09, 0x8f, 0x20, 0xb2, 0xac, 0xa7, 0xc9, 0xdf, 0x46, 0xda, 0xa7, 0xc8, 0xd6, + 0x47, 0x61, 0x7c, 0xa7, 0xd0, 0xe8, 0x8b, 0x44, 0xe7, 0xa1, 0xcb, 0xca, 0x84, 0x51, 0x27, 0x38, + 0x87, 0xbf, 0x4b, 0x1e, 0x87, 0xbf, 0x57, 0x03, 0x85, 0x4c, 0xd8, 0x63, 0xe5, 0xa5, 0xbe, 0x46, + 0x7a, 0x8c, 0x20, 0x25, 0x22, 0x21, 0x97, 0x28, 0x29, 0xbd, 0x31, 0x87, 0xcf, 0x27, 0x0c, 0x86, + 0xb2, 0x88, 0x61, 0x12, 0x81, 0x00, 0xc5, 0xd8, 0x4a, 0x97, 0x6f, 0x66, 0xbc, 0x82, 0x84, 0xbc, + 0x67, 0x87, 0x2d, 0xf2, 0x2a, 0x66, 0xba, 0x86, 0xda, 0x41, 0x05, 0x46, 0xbc, 0xaf, 0x2e, 0xc9, + 0x01, 0x46, 0x10, 0x87, 0xbf, 0xfb, 0x11, 0x46, 0x9f, 0x87, 0xbe, 0xf5, 0x47, 0xab, 0x5b, 0x87, + 0xef, 0xe9, 0x77, 0x2f, 0x0a, 0x0b, 0x47, 0x67, 0xe4, 0x87, 0x5d, 0x4f, 0x07, 0x6d, 0x47, 0x8c, + 0x4f, 0x28, 0xa4, 0xd6, 0x26, 0xa7, 0xe0, 0x55, 0x67, 0x0a, 0xbb, 0xa7, 0x68, 0xf5, 0x03, 0x44, + 0x13, 0x84, 0x05, 0x84, 0x56, 0x18, 0xa4, 0x81, 0xa7, 0xc2, 0x62, 0x63, 0xa1, 0xcc, 0x53, 0xd9, + 0xec, 0xa7, 0xce, 0xc3, 0xb1, 0x20, 0x28, 0x33, 0x37, 0xc6, 0xd7, 0x0c, 0xa4, 0x30, 0x41, 0x7d, + 0xaf, 0x29, 0xc5, 0xac, 0xaa, 0x31, 0xd0, 0xc4, 0x9f, 0x4f, 0x4b, 0x2c, 0xea, 0x3a, 0x47, 0x4b, + 0xae, 0x47, 0x0e, 0x27, 0x67, 0xa7, 0xcf, 0xb5, 0x15, 0xaf, 0x2a, 0xe2, 0x6b, 0xa6, 0x7b, 0xe6, + 0xa3, 0x69, 0xa6, 0x60, 0x5f, 0x67, 0xe3, 0x45, 0x26, 0x87, 0x75, 0xd7, 0x42, 0x0a, 0xa9, 0x6d, + 0x6f, 0x56, 0x89, 0x69, 0x01, 0xa6, 0xc2, 0xcf, 0xa9, 0x69, 0x2f, 0xae, 0x73, 0x96, 0xa8, 0x8a, + 0x22, 0x91, 0xa5, 0x3c, 0xa0, 0xaf, 0x50, 0x99, 0x07, 0x86, 0xc7, 0x46, 0xcd, 0x8a, 0x2a, 0xcd, + 0x2c, 0xaf, 0x2a, 0xf6, 0xc0, 0xfe, 0x74, 0x68, 0x65, 0xa6, 0x7a, 0x95, 0x66, 0x65, 0x81, 0xf1, + 0xa7, 0x84, 0x58, 0xa1, 0x3b, 0xaa, 0x6a, 0x70, 0x3d, 0x86, 0x80, 0x00, 0xfa, 0x85, 0x70, 0x87, + 0xa2, 0xe5, 0x69, 0x72, 0x4e, 0x85, 0xc1, 0x78, 0xcf, 0x73, 0xdb, 0xda, 0x87, 0x56, 0xb1, 0xa5, + 0x42, 0x22, 0x65, 0xf0, 0x9b, 0x2d, 0x20, 0x45, 0x78, 0x61, 0x94, 0x48, 0x62, 0x2e, 0x63, 0x13, + 0x62, 0x30, 0x57, 0x65, 0x6e, 0xc4, 0x84, 0x1f, 0xe3, 0x44, 0xdd, 0x40, 0x79, 0xaa, 0x64, 0xa5, + 0x51, 0x72, 0x75, 0x3d, 0x6b, 0x28, 0xea, 0x87, 0x53, 0xd4, 0x00, 0x22, 0x44, 0xb7, 0x46, 0x31, + 0x4a, 0x73, 0x55, 0x44, 0x53, 0xa4, 0x70, 0x42, 0x51, 0x83, 0x12, 0x28, 0x67, 0x7a, 0x4f, 0x26, + 0x90, 0x01, 0x47, 0x3d, 0xa5, 0x7c, 0xe0, 0x8a, 0x68, 0xeb, 0x20, 0xcb, 0xa4, 0x69, 0xc7, 0xdb, + 0xf9, 0x33, 0xa1, 0xb9, 0x8c, 0x79, 0x76, 0x03, 0xa1, 0x68, 0xa2, 0xd1, 0xb7, 0x75, 0x20, 0x3c, + 0xe4, 0x4d, 0x2e, 0x27, 0xae, 0x4c, 0xa6, 0x57, 0x61, 0x6e, 0x30, 0x95, 0xb7, 0x62, 0x79, 0xcd, + 0x3b, 0x83, 0xa9, 0x6a, 0x42, 0x51, 0x81, 0xba, 0xa7, 0xa4, 0x7d, 0xa7, 0x53, 0xca, 0x0f, 0x20, + 0x04, 0x84, 0xce, 0xd6, 0xa1, 0xed, 0xc3, 0xcb, 0x9b, 0xa5, 0x6a, 0x9e, 0x28, 0x70, 0x09, 0x64, + 0x81, 0xaa, 0x2e, 0x92, 0xc7, 0xdd, 0x1b, 0x9c, 0x82, 0x5c, 0x84, 0x52, 0x57, 0x8f, 0x64, 0x24, + 0x3c, 0x86, 0x15, 0xa2, 0xef, 0x42, 0x86, 0x9d, 0x6f, 0x2e, 0xd0, 0xc4, 0x63, 0x6f, 0x86, 0xad, + 0x67, 0x26, 0x7c, 0x89, 0x73, 0x01, 0x82, 0xbc, 0x4f, 0x86, 0x00, 0x83, 0x65, 0xe9, 0x50, 0x79, + 0x6e, 0xc4, 0x81, 0x47, 0xb4, 0x69, 0x7a, 0x22, 0x44, 0xa5, 0x42, 0x67, 0x97, 0xff, 0x1a, 0x67, + 0x9c, 0x06, 0x99, 0x00, 0x5f, 0x41, 0x74, 0x84, 0x82, 0xa3, 0x5e, 0x04, 0xa1, 0x84, 0x15, 0xad, + 0x38, 0x69, 0x6f, 0x2b, 0xac, 0x4f, 0x47, 0x29, 0x79, 0x8f, 0x6c, 0xf1, 0xe2, 0x67, 0xb0, 0x60, + 0xa5, 0x63, 0xe8, 0x57, 0x83, 0x69, 0x78, 0xa4, 0x36, 0xc7, 0xc8, 0x74, 0x62, 0x43, 0x68, 0xa6, + 0x66, 0x8b, 0x2c, 0xb0, 0x45, 0xa3, 0x55, 0xe9, 0x6c, 0xc3, 0xd1, 0x70, 0x81, 0xeb, 0xc4, 0x44, + 0xa9, 0xa5, 0xdc, 0x87, 0xb3, 0x2a, 0x65, 0x49, 0xa7, 0x11, 0xad, 0x86, 0x22, 0x5f, 0x85, 0x6e, + 0x8a, 0x69, 0x6b, 0x51, 0x84, 0xc7, 0xa7, 0xdf, 0x26, 0x02, 0x97, 0x28, 0x29, 0x6f, 0x62, 0x03, + 0x86, 0xae, 0xca, 0xa7, 0xab, 0xff, 0x11, 0xc7, 0xd2, 0x90, 0x36, 0x87, 0x4e, 0x0d, 0x47, 0x6a, + 0xf4, 0x3d, 0xa6, 0xde, 0x87, 0x23, 0x72, 0xc6, 0xd8, 0x79, 0xa7, 0xeb, 0x18, 0x89, 0x3a, 0xda, + 0xea, 0x63, 0xab, 0x82, 0xe8, 0x87, 0xdf, 0xe9, 0x09, 0x82, 0x23, 0xc9, 0xcf, 0x6b, 0xdd, 0x46, + 0x64, 0x4c, 0x62, 0xf4, 0x8e, 0x62, 0x4d, 0xf3, 0x77, 0x6f, 0x66, 0x60, 0xc5, 0xc6, 0x37, 0xc3, + 0xdd, 0x52, 0x67, 0xf1, 0x7a, 0x8f, 0x78, 0xd1, 0x26, 0x46, 0x7f, 0x8e, 0x79, 0xda, 0xf8, 0x0e, + 0x6e, 0x64, 0x2d, 0x81, 0x2b, 0x2b, 0x2e, 0x5a, 0x87, 0x24, 0x2e, 0xc2, 0xd3, 0x5e, 0xa4, 0x80, + 0x87, 0xcf, 0x34, 0x09, 0x8f, 0x2e, 0xff, 0xe2, 0x03, 0x47, 0x00, 0x1f, 0xc7, 0xd0, 0x97, 0x34, + 0xa7, 0xda, 0x65, 0xb0, 0x53, 0x74, 0xd8, 0x66, 0xef, 0x74, 0x87, 0xfe, 0xe2, 0x47, 0x6a, 0xff, + 0x18, 0x66, 0x07, 0x47, 0x85, 0x14, 0xc7, 0xce, 0xcd, 0xf1, 0x16, 0xf8, 0x4f, 0x62, 0x73, 0x6f, + 0xcf, 0x74, 0xce, 0xcb, 0xf6, 0x1c, 0xca, 0x2f, 0xcd, 0xf9, 0x41, 0x24, 0x83, 0x75, 0x48, 0x57, + 0x6b, 0xc2, 0xcc, 0xbd, 0x14, 0x73, 0x20, 0x34, 0xab, 0x53, 0x25, 0x85, 0x62, 0xdf, 0x2e, 0x77, + 0x81, 0x2b, 0xba, 0xa2, 0xa9, 0xab, 0x73, 0x2b, 0x33, 0xa2, 0xda, 0x89, 0x62, 0xde, 0x9f, 0x82, + 0xdd, 0x84, 0xe2, 0xf1, 0xc4, 0xc9, 0xde, 0x83, 0x1d, 0xa6, 0x02, 0xec, 0x83, 0x7b, 0x20, 0x3a, + 0x0b, 0x61, 0x4c, 0x68, 0xd3, 0xa4, 0x03, 0xba, 0x5e, 0x2d, 0x57, 0x6e, 0x6f, 0x2d, 0x64, 0x80, + 0x09, 0x64, 0xa9, 0xc1, 0xc4, 0x4e, 0xa4, 0x1d, 0xa4, 0x21, 0x32, 0xbc, 0x67, 0x63, 0x63, 0x0a, + 0x04, 0x6c, 0xda, 0x5f, 0x43, 0x52, 0x54, 0x5f, 0x53, 0x45, 0xc6, 0xd1, 0x9a, 0x97, 0x5f, 0x4e, + 0x4f, 0x5f, 0x57, 0x41, 0x52, 0x4e, 0x49, 0x4e, 0x47, 0x53, 0x00, 0xa8, 0x56, 0xc3, 0x10, 0xe8, + 0x75, 0xc7, 0xd7, 0x81, 0xcf, 0x2e, 0xc8, 0x02, 0x2a, 0xc4, 0xd7, 0x22, 0xa7, 0x6b, 0x26, 0x5e, + 0x44, 0x45, 0x50, 0x52, 0x45, 0x43, 0x41, 0x54, 0x45, 0xbb, 0x21, 0x74, 0x59, 0x46, 0x42, 0x4c, + 0x4f, 0x43, 0x4b, 0x2e, 0x07, 0xc2, 0xc8, 0x7e, 0xe9, 0x6e, 0x47, 0xd5, 0xff, 0x07, 0x40, 0xd9, + 0x4d, 0x20, 0xac, 0x47, 0xd7, 0x16, 0xde, 0x00, 0x47, 0x43, 0x43, 0xc9, 0xc6, 0xc2, 0xc8, 0x20, + 0x38, 0x47, 0x4e, 0x55, 0x87, 0xa9, 0x5f, 0xd4, 0xc4, 0xca, 0xc5, 0x04, 0x71, 0xc4, 0xc9, 0xf5, + 0x00, 0x49, 0x29, 0x9b, 0x82, 0xb6, 0x65, 0x4f, 0x28, 0xc7, 0x82, 0x7d, 0xb0, 0xd1, 0x34, 0x30, + 0xd5, 0x30, 0xd6, 0x7c, 0x7c, 0xc7, 0xd4, 0x41, 0xb5, 0x61, 0xc6, 0x55, 0x6e, 0x67, 0xcb, 0x47, + 0x64, 0x75, 0x44, 0x28, 0x44, 0x49, 0x29, 0x97, 0xd4, 0x61, 0x74, 0xc1, 0xd2, 0x08, 0x65, 0xa1, + 0x77, 0x28, 0x28, 0x7d, 0x47, 0xdd, 0x0e, 0x4b, 0x29, 0x82, 0x57, 0x65, 0x6c, 0x80, 0x5f, 0x0f, + 0x33, 0x30, 0x31, 0x96, 0x27, 0x47, 0x9f, 0x11, 0x47, 0x3b, 0x73, 0x4d, 0x53, 0xe2, 0x47, 0x3c, + 0xff, 0x10, 0x82, 0xd1, 0x82, 0x0a, 0xf4, 0x47, 0x40, 0x46, 0x41, 0x74, 0x73, 0x65, 0xf0, 0xc5, + 0xc6, 0x9b, 0x25, 0x1f, 0x75, 0x28, 0x22, 0x59, 0x8a, 0x3a, 0xda, 0xa6, 0xdc, 0x48, 0xa7, 0xd3, + 0x16, 0x67, 0xc8, 0xa2, 0x61, 0x27, 0xa3, 0x86, 0xc5, 0xd4, 0xe8, 0x7f, 0x0f, 0x65, 0x72, 0x22, + 0x99, 0x0c, 0x63, 0xbe, 0xc4, 0xc6, 0x57, 0x0b, 0x23, 0xcf, 0xc1, 0xd2, 0xf3, 0x87, 0x7e, 0xff, + 0x07, 0xcc, 0x20, 0xc7, 0x3f, 0xa6, 0x2e, 0xc7, 0xd8, 0x8c, 0xdf, 0xa5, 0x60, 0x85, 0xa5, 0xdd, + 0x26, 0x84, 0x62, 0x2c, 0xfd, 0x70, 0x6c, 0x61, 0x6e, 0x6e, 0x82, 0xef, 0x2b, 0xc6, 0xc6, 0x4f, + 0xa7, 0x3f, 0x20, 0xa9, 0x62, 0xbd, 0xb8, 0x0f, 0x31, 0x33, 0x31, 0x43, 0xe9, 0x70, 0xa1, 0xc7, + 0x05, 0x83, 0xb9, 0xa7, 0x7b, 0x28, 0xa7, 0xa5, 0x02, 0xc7, 0xd7, 0x7f, 0xfb, 0x18, 0xc7, 0xd9, + 0x19, 0xc5, 0xcc, 0x81, 0x83, 0x1f, 0xc0, 0xc7, 0xd7, 0x2e, 0x22, 0xa5, 0x1e, 0xb0, 0x47, 0x9c, + 0x82, 0xef, 0xa7, 0xc4, 0xd8, 0xb9, 0x07, 0x4f, 0xc7, 0xd8, 0xab, 0x20, 0x47, 0x35, 0xf1, 0x0d, + 0x47, 0x8b, 0x47, 0x99, 0xff, 0x20, 0x47, 0x1f, 0x12, 0xa7, 0x61, 0x97, 0x67, 0x60, 0x74, 0xa7, + 0xb0, 0x96, 0xa7, 0x84, 0x0f, 0x47, 0x0f, 0x39, 0x46, 0x7b, 0x47, 0x89, 0xfe, 0x33, 0x67, 0x1e, + 0xa7, 0xf5, 0xf0, 0xb7, 0x64, 0x65, 0xff, 0xee, 0x12, 0xb1, 0x20, 0x6e, 0xc5, 0xf5, 0xa3, 0x15, + 0xc7, 0xd8, 0x41, 0x3e, 0x87, 0x14, 0x1b, 0x82, 0x2d, 0x84, 0x92, 0x93, 0xb2, 0x6e, 0x6f, 0x47, + 0xa2, 0xb2, 0x99, 0x8a, 0x62, 0x4b, 0x85, 0x0c, 0x93, 0x86, 0x15, 0xa3, 0x21, 0xbe, 0xc7, 0xd0, + 0xe0, 0x83, 0xbd, 0x05, 0xc6, 0xd0, 0xdb, 0x81, 0x54, 0xc3, 0xc4, 0x7d, 0xc4, 0xd7, 0xe9, 0xc2, + 0xd8, 0xb4, 0x20, 0x1a, 0xc6, 0xc2, 0xbd, 0xad, 0x73, 0x1f, 0x63, 0xec, 0xc7, 0xd9, 0xd0, 0x16, + 0xc7, 0xd3, 0x9d, 0x87, 0xcb, 0x9d, 0x47, 0xc8, 0xca, 0x01, 0xc2, 0xd4, 0xfd, 0x6f, 0x6e, 0xe3, + 0x16, 0x47, 0xb6, 0xa7, 0xcb, 0xbd, 0x41, 0x38, 0x67, 0xea, 0x60, 0x83, 0xab, 0xaa, 0x6f, 0x2a, + 0x92, 0x86, 0xdf, 0xae, 0x77, 0xd9, 0x62, 0xd4, 0x64, 0x3b, 0xd9, 0x29, 0x82, 0xd0, 0xa3, 0xd1, + 0x56, 0x43, 0x06, 0x86, 0xe5, 0xb2, 0x72, 0x65, 0xd5, 0x2a, 0x83, 0x44, 0x03, 0x10, 0x62, 0xdc, + 0x85, 0x4e, 0xd2, 0x68, 0x69, 0xd2, 0x94, 0xc7, 0xc8, 0x54, 0x31, 0xc6, 0xdc, 0xd9, 0x84, 0xdf, + 0x84, 0xc2, 0xbc, 0x47, 0x86, 0x64, 0x85, 0x69, 0x69, 0xda, 0xab, 0x74, 0x83, 0x22, 0xa2, 0xea, + 0x92, 0x74, 0x61, 0xd9, 0x36, 0xa2, 0xdb, 0x66, 0x31, 0x21, 0x66, 0x67, 0xc4, 0xa7, 0xcf, 0x8e, + 0x0f, 0x87, 0xe2, 0xdf, 0x47, 0xb5, 0xbe, 0x67, 0xb1, 0x47, 0xa3, 0xfe, 0x0e, 0x97, 0x69, 0x73, + 0x74, 0xfe, 0x00, 0xa7, 0x43, 0x71, 0x85, 0xf3, 0xa7, 0x84, 0x41, 0xaa, 0x3b, 0x21, 0x8c, 0xc2, + 0xc2, 0x29, 0x05, 0xc7, 0xc1, 0xdc, 0x5a, 0xae, 0x77, 0x35, 0xa6, 0xad, 0x4e, 0x42, 0xad, 0xa7, + 0x3c, 0x62, 0x49, 0x22, 0xbf, 0xa7, 0xd3, 0x91, 0xae, 0x29, 0xb3, 0x28, 0x22, 0xbe, 0x83, 0x7e, + 0x47, 0xdd, 0x14, 0x86, 0x6a, 0xa4, 0xf4, 0x98, 0x85, 0x69, 0x4f, 0x3b, 0xa9, 0xf2, 0x1a, 0xa3, + 0x77, 0xc7, 0xd2, 0x65, 0x32, 0x43, 0x22, 0xc7, 0xd3, 0x28, 0x47, 0xac, 0xe1, 0xa6, 0xcf, 0x47, + 0xad, 0xa2, 0x46, 0xac, 0x46, 0xdd, 0x47, 0xad, 0xa7, 0xe5, 0x51, 0x47, 0x3f, 0xf3, 0x14, 0x86, + 0xf1, 0x47, 0x96, 0x4f, 0x01, 0x44, 0xbb, 0x44, 0x3f, 0xa9, 0x6c, 0xf1, 0x36, 0x6f, 0x49, 0xf1, + 0x87, 0xd4, 0xe3, 0x77, 0x29, 0x3b, 0x3a, 0xe7, 0xa7, 0x72, 0xae, 0x67, 0x60, 0x87, 0xaf, 0x33, + 0x06, 0x67, 0xaa, 0x7b, 0x47, 0xd2, 0x83, 0xd2, 0x39, 0x81, 0x46, 0x79, 0x33, 0x66, 0x69, 0x78, + 0x36, 0x34, 0x6b, 0x3e, 0xa7, 0xc5, 0xea, 0x87, 0x05, 0x93, 0xa7, 0xbe, 0xbd, 0x67, 0x65, 0x87, + 0xae, 0x23, 0x47, 0x5a, 0xeb, 0x47, 0xd2, 0x47, 0x5a, 0xf9, 0x10, 0xa7, 0xfc, 0xef, 0xc7, 0xbd, + 0x11, 0x04, 0xce, 0x7d, 0xbd, 0x1c, 0xe7, 0xf0, 0xe8, +}; + +static unsigned char buf[18830]; + +int main() { + + unsigned long cksum = adler32(0, NULL, 0); + + decompress_lzsa2(compressed, buf); + cksum = adler32(cksum, buf, 18830); + + return cksum == 0xf748269d ? 0 : 1; +} diff --git a/test/val/zx02.c b/test/val/zx02.c new file mode 100644 index 000000000..0c123f968 --- /dev/null +++ b/test/val/zx02.c @@ -0,0 +1,416 @@ +/* + !!DESCRIPTION!! zx02 decompression + !!ORIGIN!! cc65 regression tests + !!LICENCE!! BSD 2-clause + !!AUTHOR!! Colin Leroy-Mira +*/ + +#include +#include +#include + +/* The sample data is the original lz4.h, compressed with: + * zx02 lz4.h lz4.zx02 + * + * We reused lz4.h from the LZ4 test to have a matching adler32 sum. + */ +static const unsigned char compressed[] = { + 0xa2, 0x2f, 0x2a, 0x0a, 0x20, 0x2e, 0x42, 0x4c, 0x5a, 0x34, 0x20, 0x2d, 0x20, 0x46, 0x61, 0x73, + 0x74, 0x15, 0xf9, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, + 0x61, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x4e, 0x4d, 0x4d, 0x48, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x4e, 0x69, 0x6c, 0x65, 0x4a, 0x1d, 0x41, 0x43, 0x6f, 0x70, 0x79, 0x36, 0x67, 0x2b, + 0x68, 0x43, 0x28, 0x43, 0x29, 0x20, 0x32, 0x30, 0x31, 0x31, 0x2d, 0x09, 0xd0, 0x35, 0x2c, 0x20, + 0x59, 0x61, 0x6e, 0x6e, 0x3b, 0x4d, 0x6c, 0x4c, 0x74, 0x2e, 0x0a, 0x4d, 0x53, 0x42, 0x53, 0x44, + 0x3a, 0x3e, 0x15, 0x2d, 0x43, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x20, 0x4c, 0x69, 0x63, 0x65, 0x0e, + 0x68, 0x39, 0x70, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x14, 0x00, 0x2e, 0x92, 0x25, 0x35, 0x6f, + 0x75, 0x72, 0x32, 0x29, 0x14, 0x72, 0x67, 0x2f, 0x6c, 0x33, 0x45, 0x96, 0x73, 0x2f, 0x62, 0x73, + 0x64, 0x2d, 0x19, 0x2d, 0x2e, 0x70, 0x68, 0x70, 0x29, 0x22, 0x9b, 0x99, 0x52, 0x65, 0x64, 0x69, + 0x52, 0x21, 0xf2, 0x62, 0x75, 0x94, 0x45, 0xd8, 0x14, 0x64, 0xaf, 0x53, 0x69, 0x14, 0x85, 0x48, + 0x23, 0xe0, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x0a, 0x66, 0x06, 0x72, 0x6d, 0x73, 0x2c, 0x77, + 0x05, 0x85, 0x20, 0x14, 0x24, 0x0f, 0x46, 0x52, 0x74, 0x8b, 0x21, 0x6d, 0x6f, 0x66, 0x15, 0xb4, + 0x61, 0x87, 0x56, 0x40, 0x56, 0x6c, 0x51, 0x06, 0x56, 0x3e, 0x74, 0x4c, 0xba, 0x12, 0x72, 0x6f, + 0x76, 0x11, 0x64, 0x11, 0x51, 0x5a, 0x3e, 0x09, 0x58, 0x36, 0x8e, 0x9a, 0x48, 0x6f, 0x8a, 0x6e, + 0x67, 0x15, 0x63, 0x5c, 0x70, 0x42, 0x69, 0x73, 0x92, 0x93, 0x60, 0xcc, 0x3a, 0xd3, 0x01, 0x19, + 0x2a, 0x3d, 0xe4, 0x4a, 0x99, 0x6f, 0x66, 0x2f, 0xd5, 0x74, 0xa6, 0x64, 0x5a, 0x56, 0xa4, 0x45, + 0x72, 0x64, 0x61, 0x98, 0x51, 0xb3, 0x88, 0x62, 0x47, 0xd6, 0x35, 0x76, 0x97, 0x41, 0x35, 0x6e, + 0x44, 0x72, 0x5c, 0x2c, 0x3d, 0x48, 0x90, 0x20, 0x6c, 0x51, 0x5e, 0x87, 0x69, 0xef, 0x67, 0x12, + 0x29, 0x84, 0x64, 0x50, 0x16, 0x63, 0xa2, 0x26, 0x12, 0x72, 0x2e, 0x6b, 0x11, 0x5c, 0x50, 0x2b, + 0xf6, 0x76, 0x11, 0x61, 0xd6, 0x2a, 0x75, 0x62, 0xda, 0x17, 0xd1, 0x81, 0x8b, 0x1d, 0x67, 0x17, + 0xe9, 0x58, 0x93, 0xcb, 0xd3, 0x28, 0x46, 0x6f, 0x63, 0x75, 0x22, 0x6e, 0x69, 0xea, 0x65, 0xc6, + 0x2f, 0x51, 0x04, 0x92, 0x33, 0x14, 0x0a, 0x6d, 0x26, 0x0a, 0x6d, 0x69, 0xd0, 0x77, 0x96, 0xed, + 0x68, 0x5d, 0xd1, 0x39, 0x58, 0x81, 0x87, 0xf6, 0xcc, 0x9b, 0xf9, 0x54, 0x48, 0x49, 0x53, 0x20, + 0x53, 0x4f, 0x46, 0x54, 0x57, 0x41, 0x52, 0x45, 0x20, 0x0a, 0x17, 0x82, 0x50, 0x52, 0x4f, 0x56, + 0x49, 0x44, 0x45, 0x44, 0x44, 0x42, 0x59, 0x39, 0x24, 0xa0, 0x43, 0x4f, 0x50, 0x59, 0xa9, 0x49, + 0x47, 0x48, 0x54, 0x20, 0x48, 0x4f, 0x4c, 0x13, 0x2e, 0x52, 0x42, 0x42, 0x41, 0x4e, 0x44, 0x2b, + 0x22, 0x4e, 0x54, 0x05, 0x42, 0x55, 0x4f, 0x20, 0x4d, 0x8d, 0x22, 0x41, 0x53, 0x05, 0x79, 0x22, + 0x37, 0x44, 0x07, 0x72, 0xd1, 0x45, 0x58, 0x50, 0x9c, 0x53, 0x52, 0x26, 0x3c, 0x2c, 0xc9, 0x4d, + 0x50, 0x4c, 0x49, 0x45, 0x04, 0xc1, 0x52, 0x34, 0x49, 0x54, 0x14, 0x53, 0x2c, 0x20, 0x26, 0x4e, + 0x43, 0x91, 0x55, 0x44, 0x0a, 0x47, 0x50, 0x14, 0x86, 0xb2, 0x4e, 0x1f, 0x54, 0x24, 0x73, 0x54, + 0x91, 0x49, 0x54, 0x53, 0x15, 0xa8, 0x2c, 0xf5, 0x2e, 0x73, 0x40, 0x9e, 0x46, 0x62, 0x4d, 0x06, + 0x43, 0x43, 0x48, 0x1d, 0x45, 0x41, 0x42, 0x49, 0x3a, 0x54, 0xd4, 0x44, 0xe5, 0x46, 0x10, 0x45, + 0x4e, 0xdd, 0x0e, 0x45, 0xde, 0x91, 0x24, 0x94, 0x8a, 0x64, 0x5e, 0xd4, 0x43, 0x55, 0x4c, 0x0c, + 0x14, 0x0d, 0x55, 0x50, 0x4f, 0x53, 0x65, 0x9a, 0xbf, 0x25, 0xe4, 0x53, 0x43, 0x26, 0x46, 0xae, + 0xa8, 0x2e, 0x11, 0x07, 0xef, 0x89, 0x50, 0x56, 0x45, 0x74, 0x94, 0x00, 0xa0, 0x99, 0x4c, 0x4c, + 0xdd, 0xb5, 0x8f, 0x25, 0x4f, 0x57, 0xaa, 0x59, 0x80, 0xa6, 0xdd, 0xa6, 0x54, 0x62, 0x4a, 0xf0, + 0xfa, 0x95, 0x4c, 0x45, 0xdd, 0x94, 0xdb, 0xad, 0x49, 0xb6, 0x43, 0x54, 0x94, 0xad, 0x13, 0xb0, + 0x43, 0x05, 0x44, 0x68, 0x14, 0xac, 0x2c, 0x91, 0xd4, 0x53, 0x50, 0x45, 0x1e, 0x17, 0x41, 0xdc, + 0x58, 0x86, 0xa9, 0x25, 0x14, 0x59, 0x2c, 0xad, 0x98, 0x30, 0x91, 0x51, 0x55, 0x4f, 0x12, 0x39, + 0x8a, 0x9c, 0x41, 0x4d, 0x41, 0x47, 0x3a, 0x8a, 0x20, 0x28, 0xad, 0xa4, 0x49, 0x65, 0x43, 0xac, + 0x94, 0x1c, 0x73, 0x25, 0x46, 0xbc, 0x55, 0xb6, 0x28, 0x04, 0xdc, 0x54, 0x3c, 0xc1, 0x20, 0x47, + 0x4f, 0x44, 0xc9, 0xed, 0x27, 0xb0, 0x52, 0x56, 0x45, 0x02, 0x9c, 0x3b, 0x70, 0x9c, 0xfa, 0x71, + 0x85, 0x55, 0x24, 0x94, 0x19, 0xcf, 0x05, 0x54, 0xfd, 0x57, 0x8b, 0x15, 0x71, 0x42, 0x17, 0x15, + 0x42, 0x3a, 0xe0, 0xd5, 0x85, 0x0a, 0x72, 0x8a, 0xdc, 0x26, 0x55, 0x50, 0x1a, 0x38, 0x29, 0x77, + 0xe6, 0x04, 0x18, 0x43, 0x53, 0x15, 0x41, 0x3e, 0xf6, 0xc9, 0xd7, 0x65, 0x2c, 0xe7, 0x1d, 0x91, + 0x5f, 0x45, 0x72, 0x59, 0xb5, 0x66, 0x36, 0x99, 0x1b, 0xa0, 0x70, 0x57, 0x95, 0x2e, 0x62, 0x1c, + 0x8f, 0x6b, 0xc7, 0x41, 0x44, 0x1d, 0x53, 0x0e, 0x24, 0x49, 0x4d, 0xe5, 0xe5, 0x71, 0x99, 0x96, + 0xb1, 0x38, 0xdf, 0x61, 0x20, 0x02, 0x47, 0x75, 0x3c, 0x06, 0x1e, 0x95, 0x90, 0x38, 0x04, 0x41, + 0x91, 0x57, 0x08, 0xf0, 0x29, 0x55, 0x52, 0x0c, 0x41, 0x56, 0x06, 0xf9, 0xc4, 0x23, 0xed, 0x65, + 0xdc, 0xf5, 0x46, 0x47, 0x55, 0xb3, 0x91, 0x79, 0x1a, 0x9d, 0xb5, 0xca, 0xa5, 0xbb, 0x08, 0x66, + 0x46, 0x76, 0x44, 0x16, 0x17, 0x7f, 0x5f, 0x6c, 0x1f, 0x58, 0x9a, 0x13, 0xdc, 0x7d, 0xdb, 0x76, + 0xa0, 0xfb, 0x7c, 0x29, 0xc6, 0x59, 0xb0, 0xc4, 0x20, 0x7d, 0xae, 0xa9, 0x35, 0x6b, 0x23, 0xb4, + 0x63, 0x74, 0x9b, 0xc0, 0x40, 0x68, 0x24, 0x72, 0x1a, 0x51, 0x3a, 0x45, 0x2d, 0xe9, 0xcf, 0x6e, + 0x66, 0x17, 0xa4, 0xf1, 0x9f, 0x6f, 0x73, 0x44, 0xcc, 0x3c, 0x79, 0x38, 0x7a, 0x20, 0x47, 0x13, + 0x73, 0xa0, 0x15, 0x7c, 0x67, 0xef, 0x37, 0x75, 0x62, 0x2e, 0xb0, 0x01, 0xd2, 0x2f, 0x43, 0x79, + 0x98, 0xa4, 0x34, 0x39, 0x37, 0x33, 0x2f, 0x6c, 0x7a, 0x34, 0x79, 0xb1, 0x70, 0x7a, 0x3a, 0x1a, + 0x1d, 0xd6, 0x7f, 0xa4, 0x9a, 0x6f, 0xf1, 0x72, 0x4f, 0xa8, 0x10, 0x49, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x7d, 0x52, 0x43, 0x0a, 0x49, 0x23, 0x21, 0x0f, 0x4e, 0x87, 0xd9, 0x63, 0x0a, + 0x2a, 0x2f, 0x0a, 0x23, 0x70, 0x72, 0x61, 0x67, 0x6d, 0x61, 0x20, 0x46, 0x85, 0x02, 0x0a, 0x1a, + 0xbc, 0xfe, 0xa0, 0x20, 0x64, 0x65, 0x66, 0xc2, 0x6e, 0x65, 0x64, 0x81, 0x28, 0x5f, 0x5f, 0x63, + 0x6c, 0xb9, 0x22, 0x5e, 0x07, 0x89, 0xca, 0x65, 0x78, 0xac, 0x25, 0x6b, 0x30, 0x70, 0x22, 0x43, + 0x22, 0x5a, 0x7b, 0x4c, 0xde, 0x6c, 0x85, 0x53, 0x5c, 0xf9, 0x55, 0x04, 0x2a, 0x95, 0x26, 0x2e, + 0x68, 0xb7, 0x53, 0x06, 0x73, 0x01, 0x1c, 0x6f, 0x6b, 0xf9, 0x63, 0xa2, 0x5b, 0x66, 0x75, 0xb8, + 0x88, 0x35, 0x6e, 0x2c, 0x26, 0x37, 0x14, 0xa4, 0x76, 0x30, 0x29, 0x6e, 0x4d, 0x3a, 0x56, 0x75, + 0x66, 0x66, 0x72, 0xac, 0x43, 0x56, 0x7c, 0x1c, 0x51, 0xf6, 0x8d, 0x67, 0x86, 0x22, 0x6d, 0xf5, + 0x6d, 0x46, 0xb7, 0x49, 0x1c, 0x1e, 0x79, 0x8d, 0x66, 0x1e, 0x51, 0x20, 0x3b, 0x67, 0x5d, 0xf0, + 0x30, 0x78, 0xed, 0xb3, 0x60, 0x1d, 0x6f, 0x2d, 0x45, 0x24, 0x1b, 0xde, 0x5d, 0x1c, 0xdb, 0x04, + 0x4b, 0x64, 0x3c, 0x04, 0x61, 0x28, 0x19, 0x56, 0x36, 0xe8, 0xe1, 0xf9, 0xd5, 0x49, 0xd8, 0x15, + 0xa5, 0x4a, 0x25, 0x7b, 0x28, 0xc1, 0x95, 0x29, 0x2c, 0xbf, 0x96, 0x1f, 0x95, 0x47, 0x86, 0xa3, + 0x3f, 0x71, 0x94, 0x62, 0x69, 0x54, 0x00, 0xd1, 0x8c, 0x31, 0x1d, 0xaf, 0xf8, 0x9b, 0x50, 0xd5, + 0x84, 0x3c, 0x78, 0xf9, 0x36, 0x67, 0x2a, 0x7c, 0x7f, 0x16, 0x5f, 0xde, 0xc8, 0x96, 0xb7, 0x52, + 0xeb, 0xab, 0x61, 0xf5, 0x6f, 0xca, 0x49, 0x1e, 0x2e, 0x64, 0x2e, 0xc7, 0x9f, 0x52, 0x27, 0x01, + 0xe9, 0x68, 0x56, 0x80, 0x67, 0x56, 0x7a, 0x54, 0x3f, 0x14, 0x01, 0xaf, 0x69, 0x57, 0x68, 0x35, + 0xd9, 0xa3, 0x1f, 0x5f, 0x07, 0x9d, 0x53, 0xc1, 0xb7, 0x5f, 0xb1, 0xdc, 0x4a, 0xe1, 0xc7, 0x05, + 0x01, 0x31, 0x09, 0x5b, 0xf8, 0x46, 0x11, 0x20, 0x61, 0x86, 0x1c, 0x6b, 0x87, 0xf7, 0x31, 0x4d, + 0x66, 0xb7, 0xf8, 0x19, 0x43, 0xa2, 0x75, 0x1e, 0x28, 0x44, 0x3f, 0x8f, 0x23, 0x49, 0x4e, 0x82, + 0x37, 0xf6, 0xc2, 0x0c, 0x77, 0x18, 0x6e, 0x42, 0x5c, 0x2d, 0xa1, 0x4f, 0x29, 0xa3, 0x27, 0x61, + 0x70, 0x1d, 0xf6, 0x69, 0x60, 0xd4, 0x98, 0xac, 0xab, 0xfd, 0xac, 0xb8, 0x07, 0x4c, 0x41, 0xd9, + 0x64, 0x3b, 0xb2, 0x36, 0x74, 0x77, 0xda, 0x16, 0x09, 0xf9, 0x67, 0x2d, 0x04, 0x62, 0x78, 0x15, + 0x45, 0x2b, 0x7a, 0xb1, 0x2a, 0x6c, 0xa7, 0xa0, 0xe5, 0x23, 0x3f, 0x9b, 0x29, 0x4e, 0x55, 0x4d, + 0x42, 0x66, 0x14, 0x22, 0x2a, 0xff, 0x4d, 0x60, 0x31, 0x30, 0x30, 0x49, 0x07, 0x20, 0x2b, 0x8b, + 0xa9, 0x93, 0x31, 0x62, 0x2f, 0xf7, 0x90, 0xac, 0xc4, 0x74, 0xb1, 0x76, 0xa3, 0x15, 0x1f, 0x4e, + 0x16, 0x32, 0x62, 0x12, 0x07, 0xe6, 0x76, 0x89, 0x94, 0x29, 0x3b, 0xa3, 0x99, 0xe8, 0x79, 0x54, + 0xc8, 0xd7, 0xe3, 0x6d, 0x26, 0x29, 0x71, 0x47, 0xa2, 0xab, 0xfd, 0xf6, 0x89, 0x64, 0x3b, 0x06, + 0x4d, 0x4d, 0xf2, 0x86, 0x26, 0x59, 0x5f, 0xb1, 0x85, 0xa9, 0x94, 0x46, 0x2b, 0x4d, 0xc9, 0xef, + 0xb0, 0xdf, 0x69, 0x61, 0x76, 0xab, 0x27, 0x45, 0xc4, 0x68, 0x61, 0x32, 0xac, 0x20, 0x4e, 0x2d, + 0x3e, 0x32, 0x5e, 0x4e, 0x20, 0x42, 0x46, 0xce, 0x73, 0x6a, 0x58, 0x5e, 0x34, 0xe2, 0x50, 0x30, + 0x12, 0x31, 0x65, 0x31, 0xd0, 0x34, 0x34, 0x0a, 0x4b, 0x42, 0x3b, 0x14, 0x28, 0x32, 0x21, 0x34, + 0x20, 0x02, 0x17, 0x36, 0x84, 0x36, 0x19, 0x44, 0x16, 0x32, 0x45, 0xc3, 0x4d, 0x63, 0x4c, 0x7c, + 0x63, 0x2e, 0x29, 0xcb, 0x9a, 0x9b, 0x3e, 0x02, 0x63, 0x73, 0x84, 0x6d, 0xe3, 0xf6, 0xad, 0x62, + 0xa9, 0xab, 0x5a, 0xb2, 0x9a, 0x9b, 0x1f, 0x72, 0x59, 0x7d, 0x39, 0x06, 0x52, 0xb8, 0x4b, 0x56, + 0x06, 0x65, 0x9f, 0x57, 0x99, 0x6d, 0x7d, 0xdf, 0x5a, 0x3c, 0x58, 0xb8, 0x4a, 0x76, 0x11, 0x74, + 0x33, 0xe5, 0x06, 0x10, 0xa1, 0xaa, 0x66, 0xa8, 0x2f, 0x50, 0x7d, 0x44, 0x6d, 0x8c, 0x80, 0x9c, + 0x74, 0xd5, 0x76, 0x61, 0x6c, 0x40, 0x66, 0x36, 0xc8, 0x31, 0x34, 0x2c, 0x58, 0xc7, 0x5b, 0x66, + 0x4e, 0xb8, 0xba, 0x25, 0x77, 0x5e, 0xe5, 0x02, 0x08, 0xb1, 0x2a, 0x79, 0x6a, 0x2c, 0x59, 0x11, + 0x3c, 0x61, 0x8a, 0x55, 0x80, 0xe6, 0x6c, 0xdc, 0x78, 0x38, 0x36, 0x62, 0x4c, 0x31, 0xa5, 0x6d, + 0x0a, 0x5d, 0xa7, 0x7d, 0x8d, 0x1a, 0xa8, 0x0a, 0x3e, 0x8d, 0x86, 0x53, 0x1a, 0x79, 0x81, 0xf1, + 0x46, 0xb9, 0x65, 0xda, 0x3a, 0x8d, 0x9b, 0x29, 0x95, 0xb9, 0x17, 0xc1, 0x5f, 0x8c, 0xc1, 0x55, + 0x28, 0x20, 0x8c, 0x34, 0x9b, 0x52, 0x1e, 0x32, 0x2a, 0x98, 0xd5, 0x59, 0x2c, 0x1b, 0x54, 0x42, + 0x30, 0x16, 0x71, 0x59, 0x2f, 0x24, 0xf8, 0x7a, 0x65, 0x1f, 0xde, 0x89, 0x22, 0x78, 0x44, 0x15, + 0x39, 0x21, 0xe4, 0x0e, 0xb5, 0xa5, 0x5e, 0x29, 0xb9, 0xc2, 0xd8, 0x66, 0x4a, 0xb5, 0xf6, 0xf3, + 0x37, 0x97, 0xbd, 0x96, 0x31, 0x95, 0xcd, 0xe5, 0x15, 0x8e, 0x83, 0x87, 0x29, 0x97, 0x1b, 0xad, + 0xbd, 0x5d, 0x63, 0xa1, 0x18, 0x27, 0x8b, 0x63, 0x02, 0x27, 0x1e, 0x62, 0x79, 0x93, 0xa3, 0x3d, + 0x72, 0x6f, 0x6d, 0x65, 0x3d, 0x34, 0x5a, 0x6d, 0x36, 0x71, 0x9b, 0xca, 0x09, 0xc5, 0x64, 0x79, + 0x1e, 0x0f, 0xc6, 0x3f, 0xd5, 0x84, 0xe8, 0x46, 0x91, 0x47, 0x27, 0x77, 0x63, 0xa9, 0x27, 0x45, + 0x99, 0x2a, 0x8b, 0xf5, 0x45, 0x7c, 0x2e, 0xed, 0xa6, 0x86, 0x1f, 0xd2, 0x4f, 0x7c, 0x67, 0x75, + 0xc7, 0x5e, 0xa4, 0xcd, 0x25, 0x78, 0x68, 0x06, 0x57, 0x63, 0x15, 0xa5, 0xb0, 0x75, 0xb3, 0x18, + 0x20, 0x3e, 0x3d, 0x99, 0xf1, 0x42, 0x9e, 0x20, 0x86, 0xa4, 0x28, 0x74, 0x6b, 0xb6, 0x38, 0x29, + 0x98, 0x49, 0x74, 0x23, 0x41, 0x2a, 0x20, 0x59, 0x3a, 0xb2, 0xda, 0x67, 0x78, 0x14, 0x46, 0x44, + 0x1f, 0xd9, 0xe0, 0x84, 0x5d, 0x32, 0x2c, 0x4b, 0x79, 0xc0, 0x46, 0x72, 0xc3, 0x1e, 0xec, 0x74, + 0xd5, 0xa1, 0x6f, 0x97, 0xdc, 0xb5, 0x5f, 0xf9, 0xb5, 0xde, 0x5b, 0xef, 0xdc, 0x50, 0xd9, 0xb7, + 0x29, 0x01, 0x99, 0xf9, 0xde, 0xe2, 0x7b, 0xb0, 0x5e, 0xbb, 0xe6, 0x9a, 0x68, 0xf3, 0x86, 0x64, + 0x67, 0x95, 0x4a, 0x9f, 0xf6, 0xc3, 0x96, 0x36, 0xf6, 0x0e, 0xf1, 0xa5, 0x5f, 0x58, 0xf0, 0xdd, + 0xcc, 0x54, 0xf0, 0x01, 0x7f, 0x2a, 0x25, 0x73, 0xe3, 0xb4, 0x5b, 0x68, 0x37, 0x75, 0x21, 0x9d, + 0x98, 0xf2, 0x8c, 0x2b, 0x65, 0x41, 0x67, 0xb4, 0x29, 0xd9, 0x65, 0x71, 0x75, 0x68, 0xb1, 0x1b, + 0x77, 0xd5, 0xf5, 0xc3, 0x49, 0x20, 0x5b, 0x9f, 0x4c, 0x26, 0xe7, 0xe4, 0xc0, 0x65, 0xc9, 0x54, + 0x68, 0x4b, 0x26, 0xa9, 0x06, 0x6e, 0xf1, 0x13, 0xf0, 0xf6, 0x72, 0x69, 0xa1, 0x7e, 0x86, 0x2d, + 0x5a, 0x1e, 0x7e, 0x6d, 0x51, 0x56, 0xa4, 0x80, 0x42, 0x95, 0x97, 0x3f, 0xd9, 0xd7, 0xd7, 0x43, + 0x45, 0xaf, 0x01, 0x9c, 0xdb, 0xb4, 0x1a, 0x06, 0x3a, 0x4d, 0x98, 0x3a, 0xb4, 0x85, 0x75, 0x70, + 0x7c, 0xd6, 0x07, 0xa7, 0xed, 0x6a, 0x33, 0x65, 0x83, 0x41, 0x58, 0x5f, 0x49, 0x4e, 0x50, 0xd7, + 0x54, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x81, 0x7c, 0x0d, 0xf5, 0x80, 0xab, 0x35, 0x65, 0x7a, + 0xbd, 0xc7, 0x65, 0x58, 0x7c, 0xb3, 0x5f, 0x6d, 0x6e, 0x66, 0xed, 0x71, 0x4d, 0x28, 0xac, 0x73, + 0x9e, 0xf3, 0x97, 0x06, 0x62, 0xca, 0xef, 0xc5, 0x29, 0xbb, 0xdf, 0xa5, 0xe5, 0x85, 0x3e, 0x6e, + 0xb0, 0xd6, 0xaf, 0x7a, 0xaa, 0x35, 0xf5, 0x9c, 0xe6, 0x9b, 0x75, 0x07, 0xc6, 0x65, 0x89, 0x7f, + 0x7d, 0xc3, 0xc4, 0x4a, 0x63, 0x42, 0x89, 0x73, 0x61, 0xb8, 0x35, 0x26, 0x3c, 0x3d, 0x47, 0x4b, + 0x4f, 0x6e, 0x14, 0x98, 0x10, 0x4f, 0x91, 0xbd, 0x3d, 0x01, 0x91, 0x5f, 0x30, 0xe1, 0x39, 0xa6, + 0xc1, 0x9b, 0x47, 0xce, 0x72, 0x73, 0xda, 0xdc, 0x8b, 0xa5, 0x9f, 0x76, 0xd5, 0xa7, 0x6b, 0x97, + 0x28, 0x59, 0x53, 0x4d, 0x55, 0x28, 0x60, 0x14, 0x75, 0x0e, 0x17, 0xdd, 0x01, 0x53, 0x31, 0x61, + 0x9b, 0xa3, 0x03, 0x69, 0x0a, 0xca, 0x81, 0x4f, 0x97, 0xd7, 0x7d, 0x65, 0xab, 0x9f, 0xcc, 0xb3, + 0x0f, 0x69, 0xc9, 0xdd, 0x89, 0xf9, 0x77, 0xba, 0x81, 0xf5, 0xaa, 0x39, 0xef, 0xc9, 0x8b, 0x2e, + 0xcf, 0x77, 0x95, 0xd9, 0x5f, 0xf7, 0x2e, 0xa1, 0x18, 0x49, 0x5f, 0xbd, 0xe7, 0xaf, 0x17, 0x6c, + 0x90, 0xe1, 0x07, 0xa6, 0x6a, 0xcd, 0xee, 0x67, 0x68, 0x2c, 0x88, 0x03, 0x7f, 0x64, 0x90, 0xff, + 0x77, 0x67, 0x6e, 0xc9, 0xab, 0xf2, 0x8b, 0x5a, 0x38, 0x55, 0x57, 0x14, 0x78, 0x81, 0x5c, 0x72, + 0x44, 0x76, 0x49, 0x66, 0xda, 0x28, 0x3c, 0x30, 0xd7, 0x22, 0xd3, 0xd9, 0xaf, 0x79, 0x89, 0x91, + 0x7d, 0xc1, 0x05, 0x6d, 0x51, 0xd1, 0x5a, 0x74, 0x79, 0xb0, 0x85, 0x09, 0x6d, 0xaa, 0x5f, 0x27, + 0x86, 0xc7, 0xa6, 0x33, 0x93, 0xdd, 0x99, 0x03, 0xd5, 0xef, 0xdc, 0x5b, 0x18, 0x61, 0xe6, 0x61, + 0x67, 0x79, 0xf6, 0xd0, 0xa6, 0x85, 0x5a, 0xed, 0x6a, 0x7d, 0x21, 0x1f, 0x17, 0xc4, 0x99, 0xe1, + 0xd5, 0x74, 0x6e, 0x5b, 0x98, 0xb0, 0xca, 0x65, 0x5b, 0x84, 0xa3, 0x14, 0x08, 0x6c, 0x6f, 0x77, + 0x65, 0x78, 0x5f, 0x0c, 0xc7, 0x45, 0xa1, 0xb9, 0x7d, 0x6c, 0xac, 0x59, 0xe3, 0x39, 0x69, 0x82, + 0x69, 0x82, 0x80, 0xbf, 0x37, 0x23, 0xdb, 0x66, 0x16, 0x24, 0x65, 0x42, 0x7c, 0xc5, 0x6a, 0x74, + 0x3a, 0xe3, 0x77, 0x45, 0x6a, 0x7d, 0xe3, 0x2d, 0x41, 0x4b, 0xc2, 0x3f, 0x6f, 0x97, 0xef, 0xf3, + 0xc9, 0xec, 0x9a, 0x41, 0x64, 0x99, 0xfa, 0x50, 0x9f, 0xa0, 0xda, 0xcd, 0xb6, 0xa9, 0xd1, 0xda, + 0xde, 0x6b, 0x7e, 0xc1, 0xea, 0x5a, 0xf7, 0xe3, 0x28, 0x30, 0x78, 0x37, 0x45, 0x49, 0x01, 0xbb, + 0x36, 0xe5, 0xbc, 0x0e, 0xac, 0x31, 0x31, 0x33, 0x20, 0x39, 0x32, 0x39, 0x20, 0x32, 0x9e, 0x65, + 0x37, 0x91, 0xe3, 0x6a, 0x43, 0x4f, 0x4d, 0xb2, 0xd1, 0x01, 0x42, 0x55, 0xfe, 0x1d, 0x34, 0x28, + 0xe4, 0xb5, 0xeb, 0x26, 0x76, 0x28, 0x28, 0x6a, 0x3a, 0x06, 0x5c, 0x67, 0xb1, 0x65, 0x72, 0x27, + 0x2e, 0x3e, 0x20, 0x62, 0x03, 0xe0, 0x3f, 0x41, 0xe6, 0x3a, 0x70, 0x59, 0x2b, 0x96, 0x15, 0x29, + 0x2f, 0x32, 0x35, 0x35, 0x51, 0x1f, 0xfe, 0x29, 0xfd, 0xc9, 0x9f, 0x9f, 0x2f, 0x6a, 0x71, 0xed, + 0x50, 0xef, 0x66, 0x8b, 0xd7, 0xa1, 0xd7, 0x19, 0xb7, 0x06, 0xe8, 0xab, 0x56, 0x87, 0xbe, 0x34, + 0xef, 0x71, 0x6b, 0x69, 0x91, 0x1a, 0x42, 0x79, 0x71, 0x57, 0x69, 0xb4, 0xb3, 0x9a, 0x22, 0x77, + 0x6a, 0x52, 0xd7, 0x21, 0xb8, 0x49, 0x17, 0x22, 0x6c, 0x7c, 0xc2, 0x48, 0x26, 0x72, 0x68, 0x0c, + 0x5b, 0xdb, 0x5f, 0x0f, 0x52, 0x4b, 0x83, 0xde, 0xf1, 0x75, 0x9b, 0x20, 0x3e, 0xe7, 0x5a, 0xf2, + 0x8c, 0x29, 0x5a, 0x75, 0x94, 0xc5, 0xd7, 0x38, 0x6e, 0xb0, 0x99, 0xd1, 0xad, 0x09, 0xd5, 0x53, + 0x1f, 0xac, 0x72, 0xe1, 0x67, 0x5a, 0x94, 0xc4, 0x8b, 0x27, 0x99, 0x6d, 0x7d, 0xa7, 0x86, 0x4d, + 0xd9, 0xfa, 0xb0, 0xcb, 0xd5, 0x85, 0x29, 0xd7, 0x7f, 0x5a, 0xff, 0xec, 0xd1, 0xb5, 0xd1, 0x65, + 0x41, 0x48, 0xf6, 0x99, 0x57, 0x2d, 0x08, 0xec, 0x9e, 0xc0, 0xd4, 0x5b, 0xb9, 0xc5, 0x28, 0xce, + 0xe1, 0x95, 0x8b, 0x17, 0x95, 0x71, 0xbf, 0x35, 0x15, 0xeb, 0xc6, 0x4e, 0x76, 0xd6, 0x6f, 0x6b, + 0x8f, 0xab, 0x96, 0x25, 0x6a, 0x9d, 0xf1, 0xf7, 0x0a, 0x59, 0xe8, 0x8e, 0x93, 0x63, 0x85, 0xd8, + 0x45, 0x6a, 0xcf, 0x97, 0x9a, 0xdb, 0x2c, 0x9b, 0x3f, 0x72, 0xcd, 0x7e, 0x70, 0xdb, 0x6d, 0xae, + 0x9b, 0x5f, 0x6b, 0x8a, 0x1d, 0x9a, 0x76, 0xef, 0x9d, 0xb3, 0x96, 0x09, 0x9b, 0xbd, 0x9e, 0xcb, + 0xdf, 0x87, 0x2c, 0xb5, 0xe1, 0x5d, 0x62, 0x79, 0xbd, 0x3b, 0x00, 0x74, 0x6f, 0xf1, 0x28, 0x98, + 0x9a, 0x0b, 0xb9, 0x9f, 0x8a, 0x1e, 0x27, 0x86, 0x4b, 0x2e, 0xcf, 0x44, 0x2b, 0x99, 0xdb, 0xb3, + 0x4d, 0xf7, 0x5e, 0x7b, 0x28, 0x83, 0x7f, 0x53, 0xd5, 0xd3, 0x20, 0xcf, 0xe5, 0x9f, 0xa5, 0xeb, + 0x69, 0x9a, 0x6b, 0x19, 0x77, 0x27, 0x62, 0x3c, 0x07, 0x65, 0x6c, 0x63, 0xa5, 0x17, 0x9a, 0xb6, + 0x10, 0xaa, 0x63, 0x19, 0x68, 0x72, 0x99, 0x99, 0xba, 0x59, 0x5e, 0x2c, 0x94, 0xae, 0x75, 0x45, + 0xa2, 0x95, 0x77, 0x38, 0xf2, 0x2d, 0x4f, 0x51, 0x73, 0xb1, 0x6f, 0x36, 0xff, 0x57, 0x0d, 0x45, + 0x6f, 0xf7, 0x47, 0x5c, 0xdf, 0x15, 0x73, 0x2e, 0x8b, 0x61, 0x19, 0x37, 0x45, 0xcf, 0x8d, 0x6e, + 0xdd, 0x13, 0xba, 0x55, 0xe3, 0x36, 0xb0, 0xbc, 0x00, 0x1a, 0x2d, 0x17, 0xfc, 0x2e, 0x22, 0x5e, + 0xd5, 0x16, 0x9d, 0x58, 0xb2, 0x53, 0x69, 0x3a, 0xa8, 0xed, 0x6f, 0xe6, 0x71, 0x1e, 0x65, 0xb1, + 0xf3, 0xbb, 0x25, 0xf5, 0x83, 0x6f, 0x63, 0x80, 0x0d, 0x79, 0x89, 0x9b, 0xd1, 0xfb, 0x72, 0xf9, + 0x03, 0x7c, 0x7b, 0x29, 0x2b, 0x7e, 0x33, 0x25, 0x87, 0xcf, 0xbc, 0x15, 0xdb, 0xa6, 0x47, 0x18, + 0x6e, 0x83, 0xb9, 0xfd, 0x6d, 0x36, 0x22, 0x31, 0x22, 0xa8, 0x33, 0xa7, 0x66, 0x89, 0xc1, 0x24, + 0x67, 0x87, 0xf3, 0x3e, 0x99, 0x48, 0x9d, 0x57, 0x56, 0x7d, 0x82, 0x42, 0x3c, 0x1e, 0x30, 0xc9, + 0xf1, 0x95, 0x5d, 0x4c, 0xf5, 0x08, 0xc6, 0x6e, 0xe0, 0x12, 0xdb, 0xdc, 0x7f, 0x43, 0x43, 0x83, + 0xd9, 0x7f, 0x52, 0x41, 0x54, 0x90, 0xef, 0x44, 0x2d, 0x46, 0x41, 0x55, 0x4c, 0x54, 0xf1, 0x89, + 0x9a, 0x1c, 0xe8, 0x6f, 0x89, 0x63, 0x29, 0xaa, 0x77, 0xd5, 0xe9, 0x01, 0x1b, 0x2e, 0x76, 0x09, + 0x9f, 0xbd, 0x5e, 0x22, 0xe7, 0x8b, 0xe9, 0x76, 0x21, 0x69, 0xf1, 0xb1, 0x93, 0xb3, 0x95, 0xb1, + 0x5f, 0xa9, 0x8a, 0x11, 0x64, 0x74, 0x46, 0x65, 0xb6, 0xa7, 0x9a, 0xec, 0xa3, 0xe9, 0xa0, 0xbc, + 0x6a, 0x61, 0x2b, 0x7f, 0x06, 0x25, 0xc7, 0x2e, 0xaf, 0x8d, 0x4b, 0xb1, 0xbd, 0xae, 0x39, 0x55, + 0xad, 0x55, 0xda, 0x71, 0x04, 0x25, 0xa2, 0x17, 0x6c, 0xb1, 0x5b, 0x9d, 0x51, 0x22, 0x51, 0xbf, + 0x30, 0x83, 0x55, 0x7b, 0x37, 0x25, 0xd6, 0x6f, 0x99, 0x26, 0x0d, 0x94, 0x6b, 0x6f, 0x6b, 0x01, + 0x72, 0x77, 0x68, 0x1a, 0x07, 0x99, 0x32, 0xec, 0x66, 0xa7, 0xbd, 0x3f, 0xd2, 0xd9, 0xde, 0xa3, + 0x99, 0x6a, 0x95, 0xdb, 0x25, 0xd9, 0xee, 0x42, 0x42, 0xc5, 0x7b, 0x38, 0x2d, 0x25, 0xf3, 0x58, + 0xf5, 0xa5, 0xa8, 0x6d, 0x6f, 0x58, 0x67, 0x6d, 0x94, 0x86, 0x53, 0x94, 0xc9, 0x9a, 0x79, 0x70, + 0x64, 0x10, 0x77, 0x78, 0x29, 0xed, 0xa6, 0x6d, 0xc0, 0xa7, 0x95, 0x8d, 0xb4, 0x21, 0x6a, 0x27, + 0xe4, 0x33, 0x63, 0x2a, 0x61, 0x18, 0x27, 0x2d, 0x73, 0x2b, 0xa6, 0x9d, 0x8d, 0x9f, 0x91, 0x6a, + 0xe7, 0xad, 0x57, 0x35, 0x6b, 0xeb, 0x64, 0x2e, 0xc7, 0xe0, 0x2c, 0x69, 0xef, 0xfd, 0xac, 0x3b, + 0xa6, 0x9e, 0xed, 0xf1, 0x64, 0x36, 0x5d, 0x8b, 0xe3, 0x1a, 0x52, 0xe5, 0x2b, 0xa7, 0x14, 0xc9, + 0x19, 0xc7, 0x3a, 0x67, 0x5d, 0x2e, 0x90, 0x7e, 0x9d, 0xd9, 0xd7, 0x6d, 0x5a, 0x19, 0x5f, 0x13, + 0x89, 0xab, 0x5b, 0x19, 0xdf, 0xd0, 0x8d, 0xa1, 0xfe, 0x27, 0x0d, 0xb9, 0x25, 0xf7, 0xf9, 0x0d, + 0xb9, 0xea, 0x6d, 0xb7, 0xfe, 0x2c, 0x0d, 0x6b, 0x74, 0x47, 0xe1, 0x74, 0xf9, 0x13, 0xa7, 0xf7, + 0x4f, 0xc6, 0x65, 0xb1, 0x13, 0x62, 0x72, 0x2b, 0x9a, 0xa6, 0x6b, 0x69, 0x68, 0x59, 0x38, 0x1c, + 0x03, 0xde, 0xf2, 0xf5, 0xd5, 0xfd, 0x70, 0xcb, 0x69, 0x95, 0x76, 0x42, 0xbe, 0x6d, 0x5f, 0x26, + 0xc3, 0xd6, 0xaa, 0xbe, 0xa1, 0x8b, 0xff, 0x79, 0x39, 0x41, 0xc5, 0x6c, 0xfb, 0x5a, 0x13, 0xc9, + 0xfd, 0x8b, 0xf9, 0xb6, 0x5f, 0x67, 0xa6, 0x13, 0x0b, 0x2a, 0x86, 0x50, 0xe7, 0xc0, 0x6b, 0xc6, + 0x77, 0x53, 0xbf, 0x67, 0xe5, 0xfc, 0x93, 0xd9, 0x40, 0x75, 0x16, 0x25, 0xe3, 0xcb, 0x78, 0x86, + 0x7b, 0x79, 0xdd, 0x13, 0x85, 0xc9, 0x28, 0xd5, 0x6d, 0xbd, 0xb4, 0x67, 0x63, 0x57, 0x95, 0xdb, + 0x3f, 0x01, 0x37, 0x4e, 0x65, 0x77, 0xf2, 0x03, 0xde, 0xa7, 0xe3, 0x89, 0x6f, 0x6c, 0xfd, 0x3b, + 0x97, 0x7e, 0xf7, 0x11, 0xd1, 0x6e, 0x62, 0xfa, 0x2e, 0x19, 0x7e, 0x8f, 0x0b, 0xda, 0x29, 0x61, + 0xfa, 0x3e, 0x0d, 0xdf, 0x77, 0x57, 0x8e, 0x1f, 0x9b, 0x8b, 0xed, 0xa5, 0x14, 0xda, 0xbb, 0x49, + 0x27, 0x9e, 0x1b, 0x78, 0xe9, 0xf5, 0x6e, 0xfc, 0x71, 0xed, 0xf8, 0x61, 0x17, 0x67, 0x72, 0x7e, + 0x12, 0x9b, 0x47, 0x5d, 0x2b, 0xaa, 0x9d, 0xff, 0x1b, 0x6e, 0x66, 0x97, 0x7b, 0x9e, 0x04, 0xf3, + 0xb9, 0x9e, 0x5f, 0x61, 0xa2, 0x1f, 0xa9, 0xa2, 0x81, 0xde, 0xe3, 0xab, 0xdf, 0xa7, 0x0d, 0x55, + 0xc4, 0x50, 0xbb, 0x77, 0xd2, 0xfa, 0x0d, 0x3a, 0x64, 0x57, 0x45, 0xc3, 0x87, 0x29, 0xbc, 0x3b, + 0xab, 0xa1, 0x44, 0xbb, 0x2a, 0xcf, 0x7f, 0x9a, 0x49, 0xda, 0xa4, 0x83, 0x62, 0x73, 0x77, 0x4b, + 0x47, 0x56, 0x12, 0x7a, 0xbc, 0xb9, 0xd8, 0x7e, 0x77, 0x27, 0xb9, 0x6b, 0xe3, 0x8b, 0x9b, 0xb3, + 0x73, 0x0d, 0x6e, 0xda, 0x8c, 0x9e, 0xdd, 0x5e, 0x10, 0xd7, 0xaf, 0xab, 0x67, 0xb3, 0xb6, 0x03, + 0x7a, 0x3d, 0x9f, 0x87, 0xdb, 0xa5, 0x5b, 0x11, 0x3a, 0x72, 0x4d, 0x8d, 0xf5, 0xeb, 0x9f, 0x31, + 0x66, 0x99, 0x99, 0x38, 0xbe, 0x24, 0xfb, 0xee, 0x1a, 0x69, 0xe2, 0x77, 0xdf, 0x86, 0x89, 0xab, + 0x3a, 0x2d, 0x5a, 0x73, 0x1a, 0x48, 0x9b, 0x40, 0xd7, 0x3f, 0x51, 0xb0, 0x72, 0xac, 0x6f, 0x65, + 0x48, 0x5f, 0xec, 0x51, 0xa6, 0xa1, 0x71, 0xfb, 0x76, 0x65, 0x5f, 0x6b, 0xb7, 0x67, 0x50, 0x08, + 0x22, 0x6e, 0xa7, 0xb5, 0xc3, 0xa9, 0xef, 0x99, 0x2b, 0x9a, 0x71, 0x7b, 0x28, 0xfb, 0x29, 0x67, + 0xe8, 0xa3, 0xd6, 0xe9, 0xc7, 0x55, 0xa5, 0x1d, 0xeb, 0x6d, 0x4f, 0x5c, 0x04, 0x70, 0xb1, 0x45, + 0x8d, 0xb4, 0x1b, 0xf6, 0x72, 0x82, 0xd0, 0x6d, 0x95, 0x0c, 0xc0, 0x49, 0x96, 0xb1, 0xa6, 0xca, + 0x8d, 0xc9, 0xb2, 0x99, 0x6e, 0xb7, 0x45, 0x17, 0x61, 0x6b, 0x6d, 0x79, 0x96, 0xcc, 0xa3, 0x07, + 0xd6, 0x56, 0xad, 0xf1, 0xae, 0x69, 0x91, 0xdb, 0xe6, 0x43, 0xdd, 0x8b, 0xf1, 0x5f, 0xae, 0xd9, + 0x71, 0xf7, 0xe5, 0x69, 0xbf, 0xe4, 0x5b, 0xb6, 0x6a, 0x44, 0xf2, 0x9d, 0xa7, 0xb2, 0x31, 0xd2, + 0x33, 0xdb, 0x26, 0x6d, 0xf0, 0xfc, 0x74, 0xd5, 0x34, 0x85, 0x6e, 0xe2, 0xed, 0xe7, 0xbc, 0x2f, + 0xe7, 0xb3, 0xd3, 0xf6, 0xae, 0x79, 0xe7, 0xec, 0xdd, 0xf7, 0xcf, 0x6f, 0x1b, 0x74, 0x25, 0xc9, + 0xa4, 0xf7, 0x77, 0x7f, 0x3d, 0x19, 0xb5, 0xe9, 0x37, 0xc7, 0x71, 0x64, 0x49, 0x27, 0x0f, 0xe7, + 0x85, 0x6b, 0xe2, 0x35, 0xd1, 0xe6, 0x68, 0x7c, 0x2c, 0x53, 0x33, 0x65, 0x6e, 0x20, 0x76, 0x86, + 0xb9, 0x5d, 0x97, 0x18, 0xaa, 0x51, 0x91, 0x8d, 0x3d, 0xa9, 0x1e, 0x85, 0xf5, 0xf3, 0xae, 0x8b, + 0xcf, 0xe7, 0xe9, 0x71, 0x55, 0x80, 0x3d, 0xae, 0x9f, 0xc9, 0xf1, 0x4e, 0xf3, 0xf3, 0x0d, 0x74, + 0x67, 0xd3, 0xa9, 0x07, 0x96, 0x70, 0x2e, 0xa1, 0x70, 0x16, 0x68, 0x21, 0x75, 0x6c, 0xaf, 0xce, + 0x01, 0x9b, 0x39, 0xf9, 0x5a, 0x7a, 0x50, 0xf5, 0xcd, 0x6b, 0x98, 0x78, 0x9b, 0xe7, 0x41, 0x6c, + 0x77, 0x61, 0x79, 0x73, 0xeb, 0x77, 0xff, 0xe2, 0xf1, 0xa6, 0xf1, 0xdb, 0x9d, 0xbd, 0xae, 0xcb, + 0x37, 0xae, 0x6b, 0xa3, 0x75, 0xe1, 0x66, 0xae, 0x9e, 0x7b, 0x55, 0xbf, 0x55, 0x9b, 0xd4, 0x3f, + 0x53, 0xf6, 0xba, 0x6d, 0x8d, 0xb8, 0x21, 0xde, 0xcb, 0xc9, 0x6b, 0xb2, 0xf1, 0xb6, 0xbb, 0x3e, + 0xa9, 0x6a, 0x77, 0x7d, 0xdb, 0xe5, 0x9e, 0xb9, 0x55, 0xeb, 0x68, 0xe7, 0xf7, 0xae, 0x7e, 0x81, + 0x6b, 0xe6, 0x09, 0x9e, 0xe8, 0xe5, 0xee, 0x68, 0x7b, 0x9a, 0x1e, 0x13, 0xac, 0xd1, 0xf6, 0xbe, + 0x2f, 0x35, 0x7f, 0xa6, 0x4f, 0xbc, 0x83, 0x53, 0x54, 0x7f, 0x45, 0x41, 0x4d, 0xd7, 0xc3, 0xbe, + 0x2c, 0x20, 0x36, 0x34, 0x20, 0x28, 0x28, 0x78, 0x90, 0x5e, 0x3c, 0x0c, 0xf9, 0x4f, 0xf3, 0x6b, + 0x2d, 0x33, 0x29, 0xb4, 0x41, 0x93, 0x34, 0x29, 0x79, 0xe6, 0x95, 0xf9, 0x6a, 0x2e, 0xa1, 0x67, + 0x7e, 0xa8, 0xc1, 0xc7, 0x28, 0x98, 0xe4, 0x81, 0x55, 0x09, 0x90, 0xfa, 0xce, 0xa5, 0x78, 0x33, + 0xc9, 0x5f, 0x74, 0x57, 0x1f, 0xaa, 0x96, 0x23, 0xa3, 0x33, 0x46, 0x2f, 0xa6, 0xe4, 0xc7, 0xe5, + 0xbc, 0x21, 0x96, 0x16, 0x86, 0x8f, 0xc5, 0x4d, 0x63, 0x0e, 0x20, 0x12, 0x2e, 0x61, 0x74, 0x1a, + 0x60, 0x1c, 0x74, 0xdd, 0x11, 0x3a, 0x79, 0xb6, 0xca, 0xa2, 0x2b, 0x4e, 0x75, 0x6f, 0x9c, 0xb3, + 0x6c, 0x62, 0x5d, 0xd8, 0x6c, 0x7e, 0x72, 0x89, 0x17, 0x11, 0x12, 0x21, 0x7b, 0xfd, 0x87, 0xd7, + 0x46, 0xe9, 0x19, 0xa7, 0x95, 0xe2, 0x52, 0x7a, 0x6d, 0x24, 0xcd, 0x4e, 0x95, 0x1a, 0x69, 0xaa, + 0x36, 0xcf, 0x95, 0xd6, 0x29, 0x7b, 0x50, 0xcd, 0x0f, 0x97, 0x9c, 0xea, 0xfb, 0x59, 0xeb, 0x2f, + 0x57, 0xa3, 0xdd, 0xf7, 0x2d, 0x57, 0x54, 0xd8, 0x3d, 0x4c, 0x7f, 0x62, 0x85, 0x97, 0x20, 0xe9, + 0x6f, 0x36, 0x44, 0x4c, 0x4c, 0xaa, 0x9a, 0x4d, 0x64, 0x36, 0xf2, 0x65, 0x77, 0x53, 0x5f, 0xd7, + 0x30, 0x6d, 0x6d, 0x48, 0xf6, 0x6f, 0x64, 0x6a, 0xa8, 0x6d, 0xb6, 0xeb, 0x5e, 0x1d, 0xf1, 0xf9, + 0x99, 0x3a, 0x8e, 0x8d, 0x25, 0x81, 0xe0, 0x7b, 0xca, 0x9f, 0x78, 0x03, 0x11, 0x62, 0x9e, 0x5b, + 0xca, 0xf7, 0xc8, 0x5d, 0x3b, 0x1d, 0x7d, 0xc9, 0xa7, 0x9c, 0x00, 0xf3, 0xe6, 0xc5, 0x8f, 0xce, + 0xb3, 0xb5, 0x47, 0x25, 0xf2, 0x7b, 0xe7, 0x73, 0xf0, 0xa9, 0x77, 0xbe, 0x2d, 0x3d, 0x69, 0x9d, + 0xcb, 0x3d, 0x62, 0x43, 0x7e, 0x95, 0x2b, 0xb3, 0xf6, 0xd3, 0x24, 0x61, 0xd4, 0xca, 0x13, 0xc4, + 0x50, 0x0a, 0x66, 0x29, 0x17, 0x85, 0x63, 0x2a, 0x16, 0xbb, 0x65, 0x6e, 0x52, 0x03, 0xe3, 0x9a, + 0xd6, 0x39, 0x5a, 0x0d, 0x96, 0x47, 0xd5, 0x8e, 0x1d, 0x8f, 0x05, 0x97, 0x95, 0x09, 0x66, 0x75, + 0x91, 0x08, 0xc9, 0xcd, 0xc0, 0x91, 0x74, 0x6b, 0xd9, 0x1d, 0xd6, 0x97, 0xf0, 0x36, 0x6e, 0xdb, + 0x60, 0x3b, 0x78, 0x9e, 0x68, 0x36, 0x2d, 0xd9, 0x56, 0xa3, 0x4f, 0x1a, 0x29, 0x3d, 0x3f, 0x56, + 0x53, 0x0a, 0x8a, 0x25, 0x79, 0x10, 0x6b, 0x0e, 0xdd, 0x0d, 0x6d, 0x08, 0x17, 0xd9, 0x0b, 0x95, + 0xb9, 0xfd, 0x25, 0x1a, 0x79, 0x24, 0xf5, 0xdd, 0x6f, 0x59, 0xad, 0x36, 0xb8, 0x51, 0xd6, 0xca, + 0xb5, 0x31, 0x55, 0xe8, 0xaf, 0xe3, 0x6a, 0xb8, 0xe1, 0xd5, 0x17, 0x9e, 0xa1, 0x61, 0xcb, 0xa3, + 0xe3, 0x4f, 0x2d, 0x72, 0x4d, 0xb7, 0xfc, 0x57, 0xf4, 0x01, 0xb7, 0x77, 0x03, 0x3e, 0xfb, 0x9d, + 0xd2, 0xb2, 0xc8, 0x66, 0x44, 0x69, 0x7e, 0xda, 0x0d, 0x95, 0x41, 0x99, 0x62, 0xd9, 0xdf, 0x49, + 0x42, 0x31, 0x86, 0xc6, 0x79, 0xac, 0x83, 0xd2, 0xc7, 0xdc, 0xbb, 0x81, 0x41, 0x82, 0xfe, 0x70, + 0x1e, 0x76, 0x8b, 0x0b, 0x7e, 0x9d, 0x97, 0xa8, 0xbb, 0x21, 0x67, 0x6f, 0xf2, 0xe8, 0x38, 0x6e, + 0x2c, 0x4b, 0x27, 0x93, 0x13, 0x27, 0x49, 0x6e, 0xb8, 0xc6, 0x29, 0x6d, 0x68, 0x04, 0x5d, 0xe5, + 0xbe, 0x7e, 0xfa, 0x37, 0x0d, 0xbb, 0x28, 0x1f, 0x6f, 0x30, 0xa3, 0x2b, 0x7c, 0x71, 0x79, 0x22, + 0x21, 0x45, 0x52, 0xaa, 0x74, 0xff, 0xa3, 0xb4, 0x59, 0x9d, 0xe5, 0x7f, 0x66, 0x57, 0xa9, 0xc7, + 0xf6, 0xe0, 0x35, 0xdd, 0x4b, 0x42, 0x29, 0xd1, 0x75, 0x85, 0xda, 0x0f, 0x76, 0x6d, 0xa6, 0xab, + 0x69, 0xd9, 0x39, 0xd7, 0xe8, 0xe5, 0xd5, 0x1f, 0xba, 0x39, 0xbf, 0x6a, 0xb2, 0xe2, 0x87, 0xe6, + 0xd4, 0xe7, 0x56, 0x79, 0x75, 0x5b, 0x7a, 0x29, 0x99, 0xf9, 0xbd, 0x9f, 0xbc, 0x05, 0xa0, 0x27, + 0x7b, 0x06, 0xf6, 0x27, 0xb6, 0x75, 0x75, 0x81, 0xbe, 0x37, 0x2b, 0x76, 0xa7, 0x6a, 0x7c, 0xca, + 0x93, 0x95, 0x84, 0xb6, 0x8f, 0xf5, 0x69, 0x28, 0xaa, 0xe7, 0xc5, 0x6a, 0xbc, 0x31, 0xad, 0xbc, + 0x71, 0x82, 0x49, 0xf1, 0x50, 0xa6, 0x57, 0x97, 0x9f, 0x55, 0x28, 0x06, 0x6a, 0xae, 0x5b, 0xbe, + 0xc4, 0xa3, 0xa3, 0x69, 0x85, 0x95, 0x97, 0x96, 0x47, 0xa4, 0x2b, 0x1e, 0x75, 0xa7, 0x49, 0x6f, + 0x36, 0x9f, 0x9b, 0x9c, 0xb5, 0x6b, 0xee, 0x7f, 0xe7, 0x6b, 0xbd, 0x6b, 0xdf, 0xd7, 0x41, 0xec, + 0xf7, 0xdb, 0xf9, 0x79, 0xed, 0xc7, 0xe7, 0xff, 0x2b, 0xbb, 0x9a, 0xb2, 0x89, 0x7f, 0xf3, 0x47, + 0xd6, 0xcd, 0x7a, 0x53, 0xc9, 0x37, 0x67, 0x50, 0xb9, 0xd7, 0xf7, 0xff, 0x76, 0x25, 0x6a, 0x82, + 0xe3, 0xf7, 0x66, 0x81, 0x9b, 0x37, 0x7d, 0xfe, 0x2b, 0xeb, 0x4d, 0x99, 0xf7, 0x39, 0x6b, 0xd9, + 0x2d, 0xc7, 0x5f, 0xfe, 0x36, 0xc7, 0xdd, 0x9d, 0xa6, 0xf3, 0xe6, 0xcb, 0xb9, 0xe6, 0x1a, 0xfd, + 0xb2, 0xfd, 0x9a, 0xb6, 0xfb, 0x56, 0x27, 0xad, 0xc1, 0xb6, 0xbe, 0x6e, 0x85, 0x7f, 0x3c, 0xc5, + 0x87, 0x61, 0x76, 0x97, 0xad, 0x36, 0x23, 0xce, 0x8f, 0xda, 0x39, 0xf9, 0xfb, 0x99, 0x55, 0xdb, + 0xcf, 0x6a, 0x75, 0x33, 0x94, 0x1a, 0x0a, 0x6c, 0xfe, 0x25, 0xa3, 0x5e, 0xbc, 0xad, 0xb5, 0x92, + 0xeb, 0x9d, 0xc9, 0x51, 0xc7, 0xdf, 0x77, 0x3c, 0xa7, 0x57, 0xa8, 0x1c, 0x5b, 0x9d, 0xe9, 0xdf, + 0x61, 0xf7, 0x8d, 0xa3, 0x47, 0x25, 0x42, 0x26, 0xcd, 0xa5, 0x01, 0xbf, 0x77, 0xa5, 0xf4, 0x67, + 0x70, 0x64, 0x04, 0x27, 0x56, 0xfc, 0xe9, 0x7f, 0x5a, 0xc9, 0x9a, 0x33, 0x7b, 0xc5, 0x31, 0x74, + 0xa1, 0xbb, 0xbf, 0x6a, 0x28, 0xb5, 0x09, 0xfc, 0xe5, 0xb6, 0xe6, 0x27, 0x99, 0x28, 0xaa, 0xe3, + 0x31, 0x9f, 0x19, 0x8d, 0x5d, 0x15, 0x2c, 0xbb, 0xa5, 0xe1, 0xbb, 0x39, 0x7b, 0x5a, 0xbb, 0x6e, + 0x51, 0x5a, 0xd6, 0xcf, 0xb3, 0x65, 0xab, 0x6b, 0xa6, 0x7d, 0xbf, 0xad, 0xbd, 0xad, 0x5e, 0x51, + 0x66, 0x7f, 0xba, 0x75, 0xb3, 0xee, 0xb0, 0x42, 0x72, 0xed, 0x5a, 0xa7, 0xdf, 0xe1, 0x9d, 0x61, + 0xf6, 0xb2, 0xd5, 0xa6, 0x96, 0xd3, 0xed, 0xa7, 0xfa, 0x6f, 0x86, 0x4d, 0xec, 0xab, 0xab, 0xd8, + 0xad, 0x6e, 0xcb, 0x35, 0x8a, 0x5a, 0x44, 0x45, 0x43, 0x4f, 0x06, 0xe7, 0x21, 0x45, 0xec, 0x34, + 0x47, 0xe9, 0xbb, 0x75, 0x89, 0x33, 0xf6, 0xed, 0x95, 0xf7, 0xee, 0x71, 0xc5, 0x20, 0xbb, 0x39, + 0xa7, 0xaf, 0x2b, 0x41, 0x5d, 0x4b, 0xaf, 0x6a, 0x53, 0x5d, 0xc1, 0xaf, 0x3e, 0x5f, 0x75, 0x31, + 0x6b, 0xa0, 0xc7, 0x6b, 0xd9, 0x97, 0x7d, 0x33, 0xbe, 0x6e, 0x69, 0xdb, 0xe6, 0x51, 0xf7, 0xa6, + 0xe7, 0x56, 0xd1, 0xbd, 0x83, 0x4e, 0xd7, 0x6c, 0x89, 0x7d, 0xd5, 0x47, 0x2b, 0x9b, 0x2c, 0xe3, + 0x9d, 0xb6, 0xb8, 0xb1, 0xaf, 0x6b, 0x9d, 0xaf, 0xa1, 0xdb, 0xb1, 0x95, 0xaf, 0xf6, 0x21, 0x5b, + 0x4a, 0xb3, 0xfb, 0xa6, 0xf8, 0x31, 0xda, 0xe7, 0xa5, 0xad, 0xdf, 0x57, 0x7c, 0x5f, 0xa5, 0xba, + 0x71, 0x87, 0x2e, 0xba, 0x79, 0xfd, 0x39, 0x5f, 0xbb, 0x3a, 0x09, 0x97, 0x61, 0x6e, 0xdb, 0x15, + 0xd7, 0x47, 0x6e, 0xcf, 0x21, 0xde, 0x4a, 0x72, 0x9b, 0xd8, 0x31, 0xfd, 0xaf, 0x3d, 0xed, 0x79, + 0x01, 0x3b, 0xe7, 0x13, 0x28, 0xb7, 0xb5, 0x27, 0xde, 0x9a, 0x55, 0x69, 0xeb, 0xf7, 0xa9, 0x2f, + 0xb9, 0x8d, 0xd9, 0xbf, 0x8d, 0xf5, 0xbf, 0x8d, 0xcf, 0xbb, 0xcd, 0xfd, 0xb8, 0x43, 0xa6, 0xbd, + 0x79, 0x8a, 0x3b, 0x53, 0x65, 0x74, 0x74, 0x98, 0x3a, 0x5b, 0x73, 0xd6, 0xae, 0x77, 0xe7, 0xea, + 0x36, 0x9f, 0x06, 0x05, 0x29, 0xbd, 0xa7, 0xb1, 0x31, 0xb9, 0x79, 0x36, 0x4f, 0x4b, 0x2c, 0xe6, + 0x8b, 0xa5, 0x50, 0x8e, 0xe3, 0xb5, 0x27, 0xda, 0xf3, 0x95, 0xe8, 0x7a, 0x2a, 0x29, 0x29, 0xaf, + 0xce, 0x33, 0x61, 0x53, 0xab, 0x8b, 0x45, 0x77, 0x39, 0x66, 0xb3, 0x6b, 0xb6, 0x51, 0xd9, 0xeb, + 0x6e, 0xf8, 0x31, 0x5e, 0x3e, 0x1a, 0xfd, 0xe6, 0xc1, 0x79, 0x11, 0x18, 0x22, 0x1f, 0xd0, 0x12, + 0x67, 0x56, 0x3c, 0x8c, 0xbb, 0x61, 0x95, 0x50, 0xfc, 0x3d, 0xa6, 0xaf, 0x75, 0xb3, 0x65, 0xc5, + 0x2a, 0x86, 0x1f, 0x62, 0x2a, 0xcb, 0x13, 0xdd, 0xf1, 0x6d, 0x9f, 0x9a, 0xfc, 0xd5, 0xa6, 0x9d, + 0x35, 0xf1, 0x77, 0xae, 0x9a, 0x4f, 0x72, 0x3c, 0x69, 0x75, 0x70, 0x61, 0x6e, 0xdd, 0xff, 0x6a, + 0x00, 0x67, 0x6d, 0xcb, 0x8f, 0x58, 0xc4, 0x27, 0x6b, 0x99, 0x0f, 0xf9, 0xca, 0x8a, 0xc9, 0x6b, + 0xde, 0xb5, 0x7b, 0xa6, 0xbb, 0x76, 0x1f, 0x2d, 0x2d, 0x20, 0x45, 0x78, 0x61, 0xfe, 0x26, 0x6f, + 0x96, 0xa3, 0x8d, 0xd9, 0x45, 0x9e, 0x46, 0x6e, 0x77, 0xa7, 0xfb, 0x34, 0x39, 0x45, 0xd9, 0x0c, + 0xaa, 0x1f, 0xe7, 0x02, 0x27, 0x75, 0x66, 0x26, 0x26, 0xc5, 0xfb, 0x3d, 0x57, 0x4d, 0x34, 0x4b, + 0x9c, 0x9d, 0x65, 0x73, 0x55, 0x8d, 0x59, 0xfe, 0x99, 0x1f, 0x95, 0x5d, 0x9e, 0x68, 0x9a, 0x0b, + 0xe1, 0x26, 0x29, 0xdf, 0x8f, 0x85, 0x7f, 0x21, 0xed, 0x68, 0xdb, 0x5e, 0xe8, 0xf3, 0xd9, 0x33, + 0x6b, 0xac, 0x0d, 0xf5, 0x2c, 0xda, 0x68, 0xf8, 0xf9, 0xc5, 0x20, 0xca, 0xfd, 0x91, 0x7f, 0x76, + 0x7a, 0x37, 0x19, 0x2e, 0xb1, 0x87, 0x4c, 0xff, 0x75, 0xb3, 0x7c, 0x8a, 0x9f, 0x9b, 0xfc, 0x64, + 0x3e, 0x79, 0x49, 0x90, 0x78, 0x42, 0x96, 0x97, 0xc6, 0x7b, 0xe6, 0x5f, 0x6f, 0xf7, 0x6b, 0x55, + 0x01, 0x3d, 0xa6, 0xac, 0x53, 0xdb, 0x1e, 0x27, 0xeb, 0x2d, 0xc9, 0x9e, 0x92, 0xdd, 0x86, 0x02, + 0x1a, 0x1d, 0xed, 0xd7, 0x1a, 0x27, 0xbe, 0x2b, 0xc9, 0x6a, 0xd7, 0x8b, 0x94, 0x41, 0x49, 0x7e, + 0xe3, 0xb7, 0xda, 0xe2, 0xd5, 0x98, 0x33, 0x6d, 0xc5, 0xc7, 0x2e, 0x3b, 0x5f, 0x67, 0x81, 0x6e, + 0x5a, 0xa5, 0x7c, 0xb3, 0x50, 0x73, 0x20, 0xa6, 0x6e, 0x6b, 0x8b, 0xff, 0x69, 0xc8, 0x04, 0xa4, + 0x79, 0x76, 0x65, 0x72, 0x34, 0xf8, 0xbb, 0xd9, 0x19, 0x57, 0x00, 0x75, 0x6a, 0xd1, 0xdd, 0xc7, + 0xec, 0x90, 0x5f, 0x41, 0xea, 0x6c, 0x6b, 0x94, 0xfd, 0x31, 0xda, 0xe8, 0xd5, 0x1c, 0x38, 0x73, + 0xd7, 0x12, 0x69, 0x69, 0x8b, 0xad, 0xaa, 0x1b, 0x6c, 0x2d, 0x3b, 0x7d, 0xf1, 0xff, 0x8c, 0x4b, + 0x36, 0x57, 0xa5, 0xa4, 0x45, 0x6b, 0x5f, 0x65, 0xaa, 0x79, 0x17, 0x97, 0x2f, 0xee, 0x75, 0x39, + 0xac, 0x45, 0xb8, 0xcb, 0x4f, 0x5c, 0xaa, 0x15, 0x71, 0x13, 0xdb, 0x10, 0x13, 0xa7, 0xad, 0x6f, + 0xd9, 0x47, 0xbe, 0x3d, 0xab, 0x67, 0xcd, 0xff, 0x2d, 0xa5, 0xfb, 0x9d, 0x41, 0xa9, 0xf7, 0x96, + 0xcc, 0xc5, 0xc5, 0xa7, 0x5a, 0x76, 0xa6, 0xb3, 0xb6, 0xe6, 0xa2, 0xee, 0x6e, 0x3b, 0x6e, 0x76, + 0xef, 0xf3, 0xa9, 0xa9, 0xbe, 0xf2, 0xdf, 0xfa, 0x7a, 0xe3, 0xe5, 0xf6, 0x3b, 0x2b, 0xa7, 0xaf, + 0x7d, 0x43, 0xe9, 0xef, 0x6e, 0xa9, 0x0d, 0xde, 0x8b, 0xcf, 0xc7, 0x3a, 0xb1, 0x2b, 0xc9, 0xa9, + 0xbf, 0x5e, 0x81, 0xca, 0x2d, 0xb1, 0x77, 0x1a, 0xbe, 0x6b, 0xbe, 0x3d, 0x73, 0xa3, 0x67, 0x74, + 0x17, 0x7a, 0x62, 0xb7, 0x19, 0x69, 0xd2, 0xa3, 0x3f, 0xb7, 0xeb, 0x99, 0x4f, 0xab, 0xe2, 0x5b, + 0x77, 0x1d, 0xc7, 0x78, 0xe3, 0x33, 0x99, 0x01, 0xc6, 0x79, 0xeb, 0x73, 0x4b, 0x25, 0x6e, 0x64, + 0x2d, 0x3c, 0xf4, 0x66, 0x2b, 0x9e, 0xe3, 0xb7, 0x96, 0x08, 0x6f, 0x1a, 0x36, 0xff, 0xb9, 0x97, + 0xfd, 0x6d, 0x76, 0x3b, 0xb9, 0x8b, 0xff, 0x6f, 0xfc, 0xd1, 0xbb, 0xda, 0xa2, 0x35, 0xe7, 0x56, + 0x1e, 0x12, 0x87, 0x56, 0x1d, 0xde, 0x3b, 0xd8, 0x2b, 0xff, 0x69, 0xf1, 0xd3, 0xf5, 0xbd, 0xbb, + 0xa3, 0x9b, 0xec, 0xa8, 0x4f, 0x62, 0x73, 0x6f, 0x6c, 0x65, 0x74, 0x65, 0xeb, 0xd7, 0xca, 0xbc, + 0x3f, 0x61, 0xb7, 0xa8, 0xab, 0x86, 0x57, 0x18, 0x14, 0x6e, 0xb5, 0x6d, 0x98, 0x31, 0x31, 0x53, + 0xee, 0x9d, 0xb5, 0x90, 0x94, 0x36, 0x77, 0xa8, 0x5b, 0x6d, 0x1a, 0xf5, 0xad, 0x6a, 0x10, 0xe5, + 0xf9, 0xbf, 0x5a, 0x4b, 0xc1, 0xb1, 0x6d, 0xad, 0x45, 0x6b, 0x37, 0x1d, 0xbe, 0xd9, 0x43, 0xbe, + 0xd6, 0x79, 0xb7, 0xed, 0x6f, 0x59, 0x25, 0xb6, 0x55, 0x68, 0x15, 0x98, 0x36, 0x59, 0xa8, 0x4f, + 0xc9, 0x2d, 0x57, 0xb2, 0x50, 0x5d, 0x2d, 0x64, 0xff, 0xb7, 0x9a, 0x1b, 0xd3, 0x97, 0x30, 0x78, + 0x8c, 0xa3, 0x24, 0x66, 0x98, 0x95, 0x63, 0x63, 0x59, 0x0f, 0x13, 0x7e, 0x5f, 0x43, 0x52, 0x54, + 0x5f, 0x53, 0x45, 0xbd, 0x5d, 0x2f, 0x1a, 0x5f, 0x4e, 0x4f, 0x5f, 0x57, 0x41, 0x52, 0x4e, 0x49, + 0x4e, 0x47, 0xe4, 0xcf, 0x45, 0x56, 0xb6, 0x75, 0xe0, 0xba, 0xb3, 0xfd, 0xc7, 0x2e, 0xea, 0x8e, + 0xfb, 0x6b, 0xec, 0xf7, 0xde, 0xbe, 0x38, 0x3b, 0x09, 0x44, 0x50, 0x52, 0x21, 0x8e, 0x41, 0x54, + 0x74, 0x89, 0x23, 0x3d, 0x46, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x2e, 0x87, 0xf1, 0xea, 0x90, 0x03, + 0x6e, 0xd7, 0x55, 0xe4, 0x4c, 0x59, 0x20, 0xa7, 0x3e, 0x51, 0xcd, 0x47, 0x43, 0x43, 0xee, 0xf7, + 0x07, 0x7e, 0xa9, 0xbf, 0x35, 0x47, 0x4e, 0x55, 0x1e, 0xf9, 0x24, 0xde, 0xd6, 0xef, 0x34, 0x43, + 0x21, 0xde, 0xef, 0x34, 0x6b, 0x16, 0x56, 0x29, 0x77, 0x57, 0x1a, 0x4e, 0x71, 0x9a, 0xed, 0x9f, + 0x3d, 0x34, 0x30, 0x35, 0x29, 0x20, 0x7c, 0x7c, 0x61, 0xb5, 0x64, 0x1c, 0x95, 0x73, 0x69, 0x3c, + 0x66, 0x69, 0x3b, 0x37, 0x26, 0x44, 0x28, 0x99, 0x77, 0x5d, 0x72, 0x4e, 0xc8, 0xfe, 0xb3, 0x83, + 0x12, 0x65, 0x14, 0x68, 0x28, 0x28, 0x05, 0xb4, 0x45, 0xa5, 0x00, 0x5e, 0x91, 0xb4, 0x9e, 0xff, + 0xf8, 0x05, 0x33, 0x31, 0xd3, 0xfe, 0x4b, 0xc1, 0x62, 0x89, 0xc9, 0x4d, 0x53, 0x24, 0xc9, 0xb3, + 0xbf, 0x6d, 0x5d, 0x6a, 0xad, 0x17, 0x62, 0x7f, 0xe5, 0xbb, 0xde, 0x4d, 0x72, 0x97, 0xfa, 0xf6, + 0xc9, 0x58, 0x3b, 0x9a, 0x28, 0x22, 0x61, 0x4d, 0x3a, 0xb5, 0x4b, 0xaa, 0x76, 0x6f, 0xbc, 0x59, + 0xb5, 0xe7, 0xe6, 0xd7, 0xb5, 0xb8, 0x47, 0x9b, 0xbf, 0x67, 0x2f, 0x86, 0xbe, 0x22, 0x2e, 0x45, + 0x95, 0x47, 0xfb, 0xa2, 0x51, 0x52, 0x10, 0x0d, 0x1f, 0x20, 0x6d, 0xa8, 0x5b, 0xf9, 0xe5, 0x01, + 0xf5, 0xf5, 0xa9, 0xa3, 0xda, 0xfb, 0x3a, 0xbb, 0x6a, 0x67, 0x3f, 0xb6, 0x17, 0x5d, 0x2b, 0xbb, + 0x8c, 0xa7, 0xb3, 0x70, 0x6c, 0x61, 0x6e, 0x6e, 0xda, 0xd7, 0xb3, 0xee, 0x9d, 0x61, 0xa8, 0x81, + 0xb7, 0xa4, 0xc9, 0xa6, 0x72, 0x31, 0x33, 0x31, 0xa0, 0x78, 0x70, 0xdb, 0xa1, 0xf5, 0xae, 0xc9, + 0x8d, 0xba, 0x8b, 0xaf, 0xdf, 0xa6, 0xf9, 0xdb, 0xae, 0x3f, 0x01, 0xda, 0xfe, 0x2f, 0xcd, 0x7a, + 0xfd, 0xfd, 0x9f, 0xac, 0x97, 0x9b, 0xae, 0x7a, 0xa3, 0xd3, 0x7d, 0x4f, 0xc7, 0xda, 0xd6, 0xb1, + 0xbf, 0xcd, 0x8d, 0x69, 0x01, 0xaf, 0xf6, 0xa9, 0xfd, 0x8b, 0x95, 0xa4, 0xe9, 0xb5, 0xcd, 0xbf, + 0x63, 0xc1, 0xad, 0xae, 0x2d, 0x39, 0x9f, 0xc1, 0x7a, 0xf2, 0x9f, 0xb6, 0xbf, 0x29, 0xcf, 0x8e, + 0xe1, 0xa9, 0x9d, 0x09, 0x7b, 0xed, 0x72, 0x01, 0xaf, 0x7d, 0x1f, 0xb5, 0x6a, 0xf3, 0x23, 0xac, + 0x80, 0x20, 0x6e, 0x6d, 0x7c, 0x2d, 0x9b, 0xaa, 0x3d, 0x7d, 0xac, 0x57, 0xb6, 0xf9, 0xa5, 0x7e, + 0xcd, 0xd9, 0xf9, 0x0a, 0xaf, 0xd7, 0x7d, 0xe0, 0xa8, 0x72, 0xa5, 0x20, 0xea, 0x96, 0x89, 0xb8, + 0xd5, 0xf5, 0x34, 0x6f, 0x6e, 0xfc, 0x3f, 0xb5, 0x2a, 0x6f, 0x24, 0xfc, 0x49, 0xa7, 0xe1, 0x57, + 0xfe, 0xa2, 0x05, 0x6e, 0xad, 0x2d, 0x9f, 0xef, 0x32, 0x84, 0x64, 0x65, 0x72, 0xa1, 0x73, 0xeb, + 0x77, 0xf9, 0x59, 0x27, 0x26, 0x9d, 0x71, 0xbe, 0xb7, 0xc5, 0x9a, 0xb2, 0xc5, 0xf4, 0x6f, 0xe9, + 0x1b, 0x15, 0xbf, 0x47, 0x05, 0x6e, 0x2d, 0x39, 0x7e, 0x93, 0x6b, 0xd4, 0x85, 0x93, 0x77, 0x2b, + 0x99, 0x3b, 0x6b, 0x61, 0x3a, 0x60, 0x70, 0xd9, 0x35, 0x1a, 0xa5, 0xa7, 0x3b, 0x34, 0x64, 0x3b, + 0x20, 0xdd, 0x9b, 0xd5, 0x05, 0xb1, 0x18, 0x6d, 0xf3, 0x9f, 0xed, 0x35, 0xd6, 0x56, 0xa9, 0xab, + 0x6f, 0x35, 0x59, 0x39, 0x65, 0xbb, 0xaa, 0xe6, 0x63, 0x7b, 0xc1, 0x50, 0x67, 0x7e, 0x34, 0xa9, + 0x57, 0xa6, 0xaf, 0xdd, 0x4d, 0xaf, 0x26, 0x59, 0xac, 0x87, 0xd6, 0xf3, 0x9d, 0xf5, 0x5b, 0x6a, + 0x95, 0x33, 0x55, 0x69, 0xe6, 0xa1, 0xf3, 0x15, 0x07, 0x70, 0xe4, 0x69, 0x08, 0x9d, 0xd1, 0x27, + 0xde, 0x07, 0x6b, 0xcb, 0xe3, 0xe6, 0xce, 0x7d, 0x4e, 0x95, 0x77, 0x9d, 0xf4, 0xb9, 0xbb, 0x67, + 0xdc, 0x8f, 0x53, 0xde, 0x8a, 0x79, 0x9f, 0x37, 0x0f, 0xa9, 0x4f, 0xa5, 0x48, 0xdc, 0x20, 0xe7, + 0x05, 0x65, 0x39, 0x9f, 0xfb, 0x6c, 0x47, 0x7e, 0x77, 0x9d, 0x95, 0xaf, 0x75, 0x75, 0xa5, 0x7b, + 0x78, 0xb9, 0x47, 0x22, 0x81, 0xef, 0x2b, 0x59, 0x1f, 0x29, 0xfd, 0x99, 0xc5, 0x22, 0x12, 0xb8, + 0x03, 0x92, 0x45, 0xde, 0xb9, 0x2b, 0xdf, 0x37, 0xcf, 0xae, 0x61, 0x2d, 0x3b, 0x6a, 0xad, 0xd9, + 0xe3, 0x1b, 0x20, 0xee, 0x69, 0xa3, 0x5b, 0x45, 0xee, 0x2d, 0xaf, 0x6e, 0xa7, 0x7f, 0xf7, 0x61, + 0x5f, 0xa5, 0x5d, 0xa7, 0x74, 0x45, 0xa5, 0xe6, 0xf6, 0x8f, 0xd8, 0x81, 0xef, 0x7a, 0xb7, 0xe9, + 0x5b, 0xd3, 0x53, 0x00, 0x89, 0x4c, 0x45, 0x6a, 0x6c, 0x04, 0x93, 0x49, 0x9b, 0xb7, 0xa6, 0x6b, + 0x96, 0xb4, 0x8f, 0x8b, 0x9e, 0xf2, 0xed, 0xe6, 0x8f, 0x3f, 0x9e, 0xe7, 0x99, 0xb7, 0x7d, 0xab, + 0x3a, 0x5b, 0x6b, 0x47, 0x9d, 0x50, 0x8b, 0x4e, 0x19, 0x66, 0x69, 0x78, 0x36, 0x34, 0x3e, 0xef, + 0xcf, 0x75, 0xde, 0xe7, 0xf5, 0xf5, 0x3e, 0x5d, 0x1f, 0x5b, 0xad, 0xad, 0xf3, 0xf6, 0x3a, 0x4b, + 0xd5, 0x5b, 0x8f, 0x4b, 0xe7, 0xfd, 0x07, 0xf6, 0xab, 0xe6, 0xdd, 0xf1, 0x7d, 0xaa, 0xf9, 0xc7, + 0xda, 0xaa, 0xa0, +}; + +static unsigned char buf[18830]; + +int main() { + + unsigned long cksum = adler32(0, NULL, 0); + + decompress_zx02(compressed, buf); + cksum = adler32(cksum, buf, 18830); + + return cksum == 0xf748269d ? 0 : 1; +} From 13ddd6392cb24b90d585424bfe2fa7f7ca8f5afe Mon Sep 17 00:00:00 2001 From: Piotr Fusik Date: Wed, 14 May 2025 15:15:32 +0200 Subject: [PATCH 15/28] zlib: Make crc32 8 bytes shorter and 3 cycles/byte faster --- libsrc/zlib/crc32.s | 31 ++++++++++++------------------- 1 file changed, 12 insertions(+), 19 deletions(-) diff --git a/libsrc/zlib/crc32.s b/libsrc/zlib/crc32.s index 41b5fe9db..f80b1f437 100644 --- a/libsrc/zlib/crc32.s +++ b/libsrc/zlib/crc32.s @@ -1,6 +1,7 @@ ; ; 2001-11-14, Piotr Fusik ; 2018-05-20, Christian Kruger +; 2025-05-14, Piotr Fusik ; ; unsigned long __fastcall__ crc32 (unsigned long crc, ; const unsigned char* buf, @@ -9,7 +10,7 @@ .export _crc32 - .import compleax, incsp2, incsp4, popptr1, popeax + .import compleax, incsp4, popptr1, popeax .importzp sreg, ptr1, ptr2, tmp1, tmp2 POLYNOMIAL = $EDB88320 @@ -58,15 +59,12 @@ make_table: inx bne @L1 inc table_initialised -RET: rts _crc32: -; ptr2 = (len & 0xff) == 0 ? len : len + 0x100; - tay - beq @L1 +; ptr2 = len + 0x100 inx -@L1: sta ptr2 + sta ptr2 stx ptr2+1 ; ptr1 = buf jsr popptr1 @@ -78,20 +76,15 @@ _crc32: bne @dont_make jsr make_table @dont_make: -; eax = crc - jsr popeax -; if (len == 0) return crc; - ldy ptr2 - bne @L2 - ldy ptr2+1 - beq RET -@L2: ; eax = ~crc + jsr popeax jsr compleax stx tmp2 ldy #0 +@L1: cpy ptr2 + beq @low_end ; crc = (crc >> 8) ^ table[(crc & 0xff) ^ *p++]; -@L3: eor (ptr1),y +@L2: eor (ptr1),y tax lda table_0,x eor tmp2 @@ -106,12 +99,12 @@ _crc32: sta sreg+1 lda tmp1 iny - bne @L4 + bne @L1 inc ptr1+1 -@L4: dec ptr2 - bne @L3 + jmp @L1 +@low_end: dec ptr2+1 - bne @L3 + bne @L2 ldx tmp2 jmp compleax From 500887ec23e57cd2c4d2db88f3996530eb97ed4f Mon Sep 17 00:00:00 2001 From: Kugel Fuhr <98353208+kugelfuhr@users.noreply.github.com> Date: Sat, 17 May 2025 17:18:05 +0200 Subject: [PATCH 16/28] Fix #2599. The compiler handled all functions returning an int but without a "return" statement by silently adding "return 0" instead of emitting a warning. This is the desired behavior for the "main" function in C99 and above, but the compiler applied it to all functions. --- src/cc65/function.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/cc65/function.c b/src/cc65/function.c index fed0349dd..3123079d3 100644 --- a/src/cc65/function.c +++ b/src/cc65/function.c @@ -636,7 +636,9 @@ void NewFunc (SymEntry* Func, FuncDesc* D) /* If this is the main function in a C99 environment returning an int, ** let it always return zero. Otherwise output a warning. */ - if (IS_Get (&Standard) >= STD_C99 && GetUnqualRawTypeCode (ReturnType) == T_INT) { + if (F_IsMainFunc (CurrentFunc) && + IS_Get (&Standard) >= STD_C99 && + GetUnqualRawTypeCode (ReturnType) == T_INT) { g_getimmed (CF_INT | CF_CONST, 0, 0); } else if (IS_Get (&WarnReturnType)) { Warning ("Control reaches end of non-void function [-Wreturn-type]"); From 81e1312416c4e290fefbc4079be8f67850109eb4 Mon Sep 17 00:00:00 2001 From: Kugel Fuhr <98353208+kugelfuhr@users.noreply.github.com> Date: Tue, 20 May 2025 13:50:33 +0200 Subject: [PATCH 17/28] Remove the unused function ClearDiagnosticStrBufs(). --- src/cc65/error.c | 13 +------------ src/cc65/error.h | 3 --- 2 files changed, 1 insertion(+), 15 deletions(-) diff --git a/src/cc65/error.c b/src/cc65/error.c index d6e7d7cbd..6575a1e54 100644 --- a/src/cc65/error.c +++ b/src/cc65/error.c @@ -506,23 +506,12 @@ void InitDiagnosticStrBufs (void) void DoneDiagnosticStrBufs (void) /* Done with tracked string buffers used for diagnostics */ -{ - ClearDiagnosticStrBufs (); - DoneCollection (&DiagnosticStrBufs); -} - - - -void ClearDiagnosticStrBufs (void) -/* Free all tracked string buffers */ { unsigned I; - for (I = 0; I < CollCount (&DiagnosticStrBufs); ++I) { SB_Done (CollAtUnchecked (&DiagnosticStrBufs, I)); } - - CollDeleteAll (&DiagnosticStrBufs); + DoneCollection (&DiagnosticStrBufs); } diff --git a/src/cc65/error.h b/src/cc65/error.h index 5af862f9f..3cb2f75a9 100644 --- a/src/cc65/error.h +++ b/src/cc65/error.h @@ -159,9 +159,6 @@ void InitDiagnosticStrBufs (void); void DoneDiagnosticStrBufs (void); /* Done with tracked string buffers used for diagnostics */ -void ClearDiagnosticStrBufs (void); -/* Free all tracked string buffers */ - struct StrBuf* NewDiagnosticStrBuf (void); /* Get a new tracked string buffer */ From c7c7377f7aaef38a51ad1bb37f2fda555b9a87d4 Mon Sep 17 00:00:00 2001 From: Kugel Fuhr <98353208+kugelfuhr@users.noreply.github.com> Date: Tue, 20 May 2025 13:50:33 +0200 Subject: [PATCH 18/28] Remove the unused function ClearDiagnosticStrBufs(). --- src/cc65/error.c | 13 +------------ src/cc65/error.h | 3 --- 2 files changed, 1 insertion(+), 15 deletions(-) diff --git a/src/cc65/error.c b/src/cc65/error.c index d6e7d7cbd..6575a1e54 100644 --- a/src/cc65/error.c +++ b/src/cc65/error.c @@ -506,23 +506,12 @@ void InitDiagnosticStrBufs (void) void DoneDiagnosticStrBufs (void) /* Done with tracked string buffers used for diagnostics */ -{ - ClearDiagnosticStrBufs (); - DoneCollection (&DiagnosticStrBufs); -} - - - -void ClearDiagnosticStrBufs (void) -/* Free all tracked string buffers */ { unsigned I; - for (I = 0; I < CollCount (&DiagnosticStrBufs); ++I) { SB_Done (CollAtUnchecked (&DiagnosticStrBufs, I)); } - - CollDeleteAll (&DiagnosticStrBufs); + DoneCollection (&DiagnosticStrBufs); } diff --git a/src/cc65/error.h b/src/cc65/error.h index 5af862f9f..3cb2f75a9 100644 --- a/src/cc65/error.h +++ b/src/cc65/error.h @@ -159,9 +159,6 @@ void InitDiagnosticStrBufs (void); void DoneDiagnosticStrBufs (void); /* Done with tracked string buffers used for diagnostics */ -void ClearDiagnosticStrBufs (void); -/* Free all tracked string buffers */ - struct StrBuf* NewDiagnosticStrBuf (void); /* Get a new tracked string buffer */ From b5b7ea422e8615399b8653ca10f5752338608ac0 Mon Sep 17 00:00:00 2001 From: Kugel Fuhr <98353208+kugelfuhr@users.noreply.github.com> Date: Wed, 21 May 2025 11:04:21 +0200 Subject: [PATCH 19/28] Make sure, the command line setting for the "Unreachable code" warning is checked in all cases before outputting such a warning. Fixes #2655. --- src/cc65/error.c | 12 ++++++++++++ src/cc65/error.h | 5 +++++ src/cc65/stmt.c | 4 ++-- src/cc65/testexpr.c | 2 +- test/misc/Makefile | 5 +++++ test/misc/bug2655.c | 18 ++++++++++++++++++ test/misc/bug2655.ref | 2 ++ 7 files changed, 45 insertions(+), 3 deletions(-) create mode 100644 test/misc/bug2655.c create mode 100644 test/misc/bug2655.ref diff --git a/src/cc65/error.c b/src/cc65/error.c index 6575a1e54..b67fa1afd 100644 --- a/src/cc65/error.c +++ b/src/cc65/error.c @@ -379,6 +379,18 @@ void PPWarning (const char* Format, ...) +void UnreachableCodeWarning (void) +/* Print a warning about unreachable code at the current location if these +** warnings are enabled. +*/ +{ + if (IS_Get (&WarnUnreachableCode)) { + Warning ("Unreachable code"); + } +} + + + IntStack* FindWarning (const char* Name) /* Search for a warning in the WarnMap table and return a pointer to the ** intstack that holds its state. Return NULL if there is no such warning. diff --git a/src/cc65/error.h b/src/cc65/error.h index 3cb2f75a9..b3cdc49ab 100644 --- a/src/cc65/error.h +++ b/src/cc65/error.h @@ -127,6 +127,11 @@ void LIWarning (errcat_t EC, LineInfo* LI, const char* Format, ...) attribute (( void PPWarning (const char* Format, ...) attribute ((format (printf, 1, 2))); /* Print a warning message. For use within the preprocessor */ +void UnreachableCodeWarning (void); +/* Print a warning about unreachable code at the current location if these +** warnings are enabled. +*/ + IntStack* FindWarning (const char* Name); /* Search for a warning in the WarnMap table and return a pointer to the ** intstack that holds its state. Return NULL if there is no such warning. diff --git a/src/cc65/stmt.c b/src/cc65/stmt.c index c86f25f8a..e28b844b5 100644 --- a/src/cc65/stmt.c +++ b/src/cc65/stmt.c @@ -188,8 +188,8 @@ static int IfStatement (void) /* If the if expression was always true, the code in the else branch ** is never executed. Output a warning if this is the case. */ - if (TestResult == TESTEXPR_TRUE && IS_Get (&WarnUnreachableCode)) { - Warning ("Unreachable code"); + if (TestResult == TESTEXPR_TRUE) { + UnreachableCodeWarning (); } /* Define the target for the first test */ diff --git a/src/cc65/testexpr.c b/src/cc65/testexpr.c index 14160f13f..ced563d01 100644 --- a/src/cc65/testexpr.c +++ b/src/cc65/testexpr.c @@ -76,7 +76,7 @@ unsigned Test (unsigned Label, int Invert) /* Constant rvalue */ if (!Invert && Expr.IVal == 0) { g_jump (Label); - Warning ("Unreachable code"); + UnreachableCodeWarning (); } else if (Invert && Expr.IVal != 0) { g_jump (Label); } diff --git a/test/misc/Makefile b/test/misc/Makefile index f5225b14b..48293e504 100644 --- a/test/misc/Makefile +++ b/test/misc/Makefile @@ -134,6 +134,11 @@ $(WORKDIR)/endless.$1.$2.prg: endless.c | $(WORKDIR) # these need reference data that can't be generated by a host-compiled program, # in a useful way +$(WORKDIR)/bug2655.$1.$2.prg: bug2655.c $(ISEQUAL) | $(WORKDIR) + $(if $(QUIET),echo misc/bug2655.$1.$2.prg) + $(CC65) -t sim$2 -$1 -o $$@ $$< 2>$(WORKDIR)/bug2655.$1.$2.out + $(ISEQUAL) $(WORKDIR)/bug2655.$1.$2.out bug2655.ref + $(WORKDIR)/limits.$1.$2.prg: limits.c $(ISEQUAL) | $(WORKDIR) $(if $(QUIET),echo misc/limits.$1.$2.prg) $(CC65) -t sim$2 -$1 -o $$(@:.prg=.s) $$< $(NULLERR) diff --git a/test/misc/bug2655.c b/test/misc/bug2655.c new file mode 100644 index 000000000..e0b1c939c --- /dev/null +++ b/test/misc/bug2655.c @@ -0,0 +1,18 @@ +void f1(void) +{ + if (1) { + f1(); + } else { + f1(); + } +} + +void f2(void) +{ + if (0) { + f2(); + } else { + f2(); + } +} + diff --git a/test/misc/bug2655.ref b/test/misc/bug2655.ref new file mode 100644 index 000000000..99e2d6698 --- /dev/null +++ b/test/misc/bug2655.ref @@ -0,0 +1,2 @@ +bug2655.c:5: Warning: Unreachable code +bug2655.c:12: Warning: Unreachable code From 7be7ce4e9ba6ec93ac009c6bee12fc27ef36690b Mon Sep 17 00:00:00 2001 From: Kugel Fuhr <98353208+kugelfuhr@users.noreply.github.com> Date: Wed, 21 May 2025 11:21:40 +0200 Subject: [PATCH 20/28] Remove tabs. --- src/cc65/error.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc65/error.c b/src/cc65/error.c index b67fa1afd..db0debf8c 100644 --- a/src/cc65/error.c +++ b/src/cc65/error.c @@ -385,7 +385,7 @@ void UnreachableCodeWarning (void) */ { if (IS_Get (&WarnUnreachableCode)) { - Warning ("Unreachable code"); + Warning ("Unreachable code"); } } From 6628c4ff4333d82c40fa13db9b6e4356ce405951 Mon Sep 17 00:00:00 2001 From: mrdudz Date: Sat, 24 May 2025 18:34:44 +0200 Subject: [PATCH 21/28] fix cpeekc/cpeekcolor/cpeekrevers for atari 800 --- libsrc/atari/cpeekc.s | 35 +++++++++++++++++++++++ libsrc/atari/cpeekchar.s | 35 ----------------------- libsrc/atari/cpeekcolor.s | 8 ++++++ libsrc/atari/cpeekrevers.s | 18 ++++++++++++ targettest/conio.c | 57 ++++++++++++++++++++++++++++++++------ 5 files changed, 109 insertions(+), 44 deletions(-) create mode 100644 libsrc/atari/cpeekc.s delete mode 100644 libsrc/atari/cpeekchar.s create mode 100644 libsrc/atari/cpeekcolor.s create mode 100644 libsrc/atari/cpeekrevers.s diff --git a/libsrc/atari/cpeekc.s b/libsrc/atari/cpeekc.s new file mode 100644 index 000000000..a51e477a6 --- /dev/null +++ b/libsrc/atari/cpeekc.s @@ -0,0 +1,35 @@ +; +; 2016-02-28, Groepaz +; 2017-06-21, Greg King +; +; char cpeekc (void); +; + + .export _cpeekc + + .include "atari.inc" + + +_cpeekc: + lda OLDCHR ; get char under cursor + and #<~$80 ; remove reverse bit + + ;; convert internal screen code to AtSCII + + tay + and #%01100000 + asl a + asl a + rol a + rol a + tax + tya + eor intats,x + ldx #>$0000 + rts + + .rodata +intats: .byte %00100000 ; -> %001xxxxx + .byte %01100000 ; -> %010xxxxx + .byte %01000000 ; -> %000xxxxx + .byte %00000000 ; -> %011xxxxx diff --git a/libsrc/atari/cpeekchar.s b/libsrc/atari/cpeekchar.s deleted file mode 100644 index ff502074d..000000000 --- a/libsrc/atari/cpeekchar.s +++ /dev/null @@ -1,35 +0,0 @@ - - .export _cpeekc - - .import mul40 - .importzp ptr4 - - .include "atari.inc" - - .segment "CODE" - -_cpeekc: - - lda ROWCRS - jsr mul40 ; destroys tmp4 - clc - adc SAVMSC ; add start of screen memory - sta ptr4 - txa - adc SAVMSC+1 - sta ptr4+1 - - ldy COLCRS - lda (ptr4),y ; get char - tax - - ;; convert to asc - - ;; FIXME: ugly hack here to make tetris fx work :=P - lda #' ' - cpx #0 - beq @l - lda #0 -@l: - ldx #0 - rts diff --git a/libsrc/atari/cpeekcolor.s b/libsrc/atari/cpeekcolor.s new file mode 100644 index 000000000..ed275ec95 --- /dev/null +++ b/libsrc/atari/cpeekcolor.s @@ -0,0 +1,8 @@ +; +; 2017-06-03, Greg King +; +; unsigned char cpeekcolor (void); +; + + .import return1 + .export _cpeekcolor := return1 ; always COLOR_WHITE diff --git a/libsrc/atari/cpeekrevers.s b/libsrc/atari/cpeekrevers.s new file mode 100644 index 000000000..15b26fcd4 --- /dev/null +++ b/libsrc/atari/cpeekrevers.s @@ -0,0 +1,18 @@ +; +; 2017-06-21, Greg King +; +; unsigned char cpeekrevers (void); +; + + .export _cpeekrevers + + .include "atari.inc" + + +_cpeekrevers: + lda OLDCHR ; get char under cursor + and #$80 ; get reverse bit + asl a + tax ; ldx #>$0000 + rol a ; return boolean value + rts diff --git a/targettest/conio.c b/targettest/conio.c index efe82d7c6..f65f886c5 100644 --- a/targettest/conio.c +++ b/targettest/conio.c @@ -32,6 +32,48 @@ static char grid[5][5] = { {CH_LLCORNER, CH_HLINE, CH_BTEE, CH_HLINE, CH_LRCORNER} }; +void colortest(void) +{ + unsigned int i, j; + cputsxy(0, 2, "Colors:" ); + for (i = 0; i < 3; ++i) { + gotoxy(i, 3 + i); + for (j = 0; j < NUMCOLS; ++j) { + (void)textcolor(j); + cputc('X'); + } + } +} + +#define LINE_PEEKTEST 11 + +void peektest(void) +{ + int j; + char buf[NUMCOLS]; + char cbuf[NUMCOLS]; + char rbuf[NUMCOLS]; + + gotoxy(0, LINE_PEEKTEST); + for (j = 0; j < NUMCOLS; ++j) { + (void)textcolor(j); + revers((j >> 1)&1); + cputc('a' + j); + } + for (j = 0; j < NUMCOLS; ++j) { + gotoxy(j, LINE_PEEKTEST); + buf[j] = cpeekc(); + cbuf[j] = cpeekcolor(); + rbuf[j] = cpeekrevers(); + } + gotoxy(0, (LINE_PEEKTEST+1)); + for (j = 0; j < NUMCOLS; ++j) { + (void)textcolor(cbuf[j]); + revers(rbuf[j]); + cputc(buf[j]); + } +} + void main(void) { unsigned int i, j, n; @@ -52,16 +94,13 @@ void main(void) (void)bordercolor(bcol); (void)bgcolor(bgcol); - cputsxy(0, 2, "Colors:" ); - for (i = 0; i < 3; ++i) { - gotoxy(i, 3 + i); - for (j = 0; j < NUMCOLS; ++j) { - (void)textcolor(j); - cputc('X'); - } - } - (void)textcolor(tcol); + colortest(); + peektest(); + (void)textcolor(tcol); + revers(0); + + gotoxy(4,5); cprintf("\n\n\r Screensize: %ux%u", xsize, ysize); chlinexy(0, 6, xsize); From 228316ff58cd9ac7fd70727713f8a486f09b3a4c Mon Sep 17 00:00:00 2001 From: mrdudz Date: Sat, 24 May 2025 19:19:49 +0200 Subject: [PATCH 22/28] NES complete now (tested and conio test updated), replaces what is in #532 --- libsrc/nes/color.s | 4 ++-- libsrc/nes/cpeekc.s | 37 +++++++++++++++++++++++++++++++++++++ libsrc/nes/cpeekchar.s | 34 ---------------------------------- libsrc/nes/cpeekcolor.s | 8 ++++++++ libsrc/nes/cpeekrevers.s | 37 +++++++++++++++++++++++++++++++++++++ targettest/conio.c | 1 + 6 files changed, 85 insertions(+), 36 deletions(-) create mode 100644 libsrc/nes/cpeekc.s delete mode 100644 libsrc/nes/cpeekchar.s create mode 100644 libsrc/nes/cpeekcolor.s create mode 100644 libsrc/nes/cpeekrevers.s diff --git a/libsrc/nes/color.s b/libsrc/nes/color.s index e3aef9a28..cd1a950ea 100644 --- a/libsrc/nes/color.s +++ b/libsrc/nes/color.s @@ -9,11 +9,11 @@ .export _textcolor, _bgcolor, _bordercolor - .import return0, ppubuf_put + .import return0, return1, ppubuf_put .include "nes.inc" -_textcolor = return0 +_textcolor = return1 _bordercolor = return0 .proc _bgcolor diff --git a/libsrc/nes/cpeekc.s b/libsrc/nes/cpeekc.s new file mode 100644 index 000000000..315a2df5c --- /dev/null +++ b/libsrc/nes/cpeekc.s @@ -0,0 +1,37 @@ +; +; 2016-02-28, Groepaz +; 2017-08-17, Greg King +; +; char cpeekc (void); +; + + .export _cpeekc + + .import ppubuf_waitempty + .forceimport initconio + + .include "nes.inc" + + +_cpeekc: + ; wait until all console data has been written + jsr ppubuf_waitempty + + ldy SCREEN_PTR+1 + lda SCREEN_PTR + +; waiting for vblank is incredibly slow :// +vwait: +; ldx PPU_STATUS +; bpl vwait + + ldx #>$0000 + sty PPU_VRAM_ADDR2 + sta PPU_VRAM_ADDR2 + lda PPU_VRAM_IO ; first read is invalid + lda PPU_VRAM_IO ; get data + stx PPU_VRAM_ADDR2 + stx PPU_VRAM_ADDR2 + + and #<~$80 ; remove reverse bit + rts diff --git a/libsrc/nes/cpeekchar.s b/libsrc/nes/cpeekchar.s deleted file mode 100644 index 55230edbc..000000000 --- a/libsrc/nes/cpeekchar.s +++ /dev/null @@ -1,34 +0,0 @@ - - .export _cpeekc - - .import ppubuf_waitempty - - .include "nes.inc" - - .segment "CODE" - -_cpeekc: - - ; wait until all console data has been written - jsr ppubuf_waitempty - - ldy SCREEN_PTR+1 - ldx SCREEN_PTR - -; waiting for vblank is incredibly slow :// -vwait: -; lda $2002 ;wait -; bpl vwait - - lda #0 - sty $2006 - stx $2006 - ldy $2007 ; first read is invalid - ldy $2007 ; get data - sta $2006 - sta $2006 - - tya - and #$7f ; ?!?! - rts - diff --git a/libsrc/nes/cpeekcolor.s b/libsrc/nes/cpeekcolor.s new file mode 100644 index 000000000..ed275ec95 --- /dev/null +++ b/libsrc/nes/cpeekcolor.s @@ -0,0 +1,8 @@ +; +; 2017-06-03, Greg King +; +; unsigned char cpeekcolor (void); +; + + .import return1 + .export _cpeekcolor := return1 ; always COLOR_WHITE diff --git a/libsrc/nes/cpeekrevers.s b/libsrc/nes/cpeekrevers.s new file mode 100644 index 000000000..8b1542bc0 --- /dev/null +++ b/libsrc/nes/cpeekrevers.s @@ -0,0 +1,37 @@ +; +; 2016-02-28, Groepaz +; 2017-08-17, Greg King +; +; char cpeekrevers (void); +; + + .export _cpeekrevers + + .import ppubuf_waitempty + .forceimport initconio + + .include "nes.inc" + + +_cpeekrevers: + ; wait until all console data has been written + jsr ppubuf_waitempty + + ldy SCREEN_PTR+1 + lda SCREEN_PTR + +; waiting for vblank is incredibly slow :// +vwait: +; ldx PPU_STATUS +; bpl vwait + + ldx #>$0000 + sty PPU_VRAM_ADDR2 + sta PPU_VRAM_ADDR2 + lda PPU_VRAM_IO ; first read is invalid + lda PPU_VRAM_IO ; get data + stx PPU_VRAM_ADDR2 + stx PPU_VRAM_ADDR2 + + and #<$80 ; get reverse bit + rts diff --git a/targettest/conio.c b/targettest/conio.c index f65f886c5..e054319e5 100644 --- a/targettest/conio.c +++ b/targettest/conio.c @@ -59,6 +59,7 @@ void peektest(void) (void)textcolor(j); revers((j >> 1)&1); cputc('a' + j); + rbuf[j] = (j >> 1)&1; } for (j = 0; j < NUMCOLS; ++j) { gotoxy(j, LINE_PEEKTEST); From 8d42c4a8c5ea357f9c037cb466c764963545b562 Mon Sep 17 00:00:00 2001 From: mrdudz Date: Sat, 24 May 2025 20:03:44 +0200 Subject: [PATCH 23/28] fix cpeekc/cpeekcolor/cpeekrevers/cpeeks for atmos, replaces what is in #532 --- include/atmos.h | 11 ++++++++ libsrc/atmos/cpeekc.s | 21 +++++++++++++++ libsrc/atmos/cpeekchar.s | 30 --------------------- libsrc/atmos/cpeekcolor.s | 10 +++++++ libsrc/atmos/cpeekrevers.s | 22 ++++++++++++++++ libsrc/atmos/cpeeks.s | 54 ++++++++++++++++++++++++++++++++++++++ targettest/Makefile | 3 ++- targettest/conio.c | 14 ++++++++++ 8 files changed, 134 insertions(+), 31 deletions(-) create mode 100644 libsrc/atmos/cpeekc.s delete mode 100644 libsrc/atmos/cpeekchar.s create mode 100644 libsrc/atmos/cpeekcolor.s create mode 100644 libsrc/atmos/cpeekrevers.s create mode 100644 libsrc/atmos/cpeeks.s diff --git a/include/atmos.h b/include/atmos.h index 460a0010f..9b1b021c1 100644 --- a/include/atmos.h +++ b/include/atmos.h @@ -169,6 +169,17 @@ void atmos_tock (void); void atmos_zap (void); /* Raygun sound effect */ + +/* The following #defines will cause the matching function prototypes +** in conio.h to be overlaid by macroes with the same names, +** thereby saving the function call overhead. +*/ +#define _textcolor(color) COLOR_WHITE +#define _bgcolor(color) COLOR_BLACK +#define _bordercolor(color) COLOR_BLACK +#define _cpeekcolor(color) COLOR_WHITE + + void waitvsync (void); /* Wait for start of next frame */ diff --git a/libsrc/atmos/cpeekc.s b/libsrc/atmos/cpeekc.s new file mode 100644 index 000000000..f0f5f99b1 --- /dev/null +++ b/libsrc/atmos/cpeekc.s @@ -0,0 +1,21 @@ +; +; 2016-02-28, Groepaz +; 2017-06-19, Greg King +; +; char cpeekc (void); +; +; Atmos version +; + + .export _cpeekc + + .import setscrptr + .importzp ptr2 + + +_cpeekc: + jsr setscrptr ; Set ptr2 and .Y to the cursor's address + lda (ptr2),y ; Get char + and #<~$80 ; Remove revers() bit + ldx #>$0000 + rts diff --git a/libsrc/atmos/cpeekchar.s b/libsrc/atmos/cpeekchar.s deleted file mode 100644 index fba51bf72..000000000 --- a/libsrc/atmos/cpeekchar.s +++ /dev/null @@ -1,30 +0,0 @@ - - .include "atmos.inc" - - .export _cpeekc - -_cpeekc: - - ldy CURS_Y - ldx ScrTabLo,y - stx @l+1 - ldx ScrTabHi,y - stx @l+2 - ldx CURS_X -@l: - lda $bb80,x -;; inc COORDX_TEXT - ldx #0 - rts - - ; FIXME: is that table available elsewhere? -.rodata -ScrTabLo: - .repeat 28, Line - .byte <(SCREEN + Line * 40) - .endrep - -ScrTabHi: - .repeat 28, Line - .byte >(SCREEN + Line * 40) - .endrep diff --git a/libsrc/atmos/cpeekcolor.s b/libsrc/atmos/cpeekcolor.s new file mode 100644 index 000000000..307c04e96 --- /dev/null +++ b/libsrc/atmos/cpeekcolor.s @@ -0,0 +1,10 @@ +; +; 2017-06-03, Greg King +; +; unsigned char cpeekcolor (void); +; +; Atmos version +; + + .import return1 + .export _cpeekcolor := return1 ; always COLOR_WHITE diff --git a/libsrc/atmos/cpeekrevers.s b/libsrc/atmos/cpeekrevers.s new file mode 100644 index 000000000..53f907511 --- /dev/null +++ b/libsrc/atmos/cpeekrevers.s @@ -0,0 +1,22 @@ +; +; 2017-06-08, Greg King +; +; unsigned char cpeekrevers (void); +; +; Atmos version +; + + .export _cpeekrevers + + .import setscrptr + .importzp ptr2 + + +_cpeekrevers: + jsr setscrptr ; Set ptr2 and .Y to the cursor's address + lda (ptr2),y ; Get char + and #$80 ; get reverse bit + asl a + tax ; ldx #>$0000 + rol a ; return boolean value + rts diff --git a/libsrc/atmos/cpeeks.s b/libsrc/atmos/cpeeks.s new file mode 100644 index 000000000..e54563e7d --- /dev/null +++ b/libsrc/atmos/cpeeks.s @@ -0,0 +1,54 @@ +; +; 2017-06-20, Greg King +; +; void cpeeks (char* s, unsigned length); +; + + .export _cpeeks + + .import setscrptr, popax + .importzp ptr1, ptr2, ptr3, tmp1, tmp2 + + .macpack generic + + +_cpeeks: + eor #<$FFFF ; counting a word upward is faster + sta ptr3 ; so, we use -(length + 1) + txa + eor #>$FFFF + sta ptr3+1 + + jsr setscrptr ; Set ptr2 and .Y to the cursor's address + sty tmp2 + + jsr popax + sta tmp1 ; (will be a .Y index) + stx ptr1+1 + ldx #<$0000 + stx ptr1 + bze L3 ; branch always + +L4: ldy tmp2 + lda (ptr2),y ; Get char + iny + bnz L2 + inc ptr2+1 +L2: sty tmp2 + and #<~$80 ; Remove reverse bit + ldy tmp1 + sta (ptr1),y + iny + bnz L1 + inc ptr1+1 +L1: sty tmp1 + +L3: inc ptr3 ; count length + bnz L4 + inc ptr3+1 + bnz L4 + + txa ; terminate the string + ldy tmp1 + sta (ptr1),y + rts diff --git a/targettest/Makefile b/targettest/Makefile index 4d989d0df..35b767727 100644 --- a/targettest/Makefile +++ b/targettest/Makefile @@ -540,12 +540,13 @@ EXELIST_sym1 = \ strnlen \ strqtok-test -# omitted: clock-test cpeek-test conio deb dir-test em-test exec-test1 exec-test2 +# omitted: clock-test cpeek-test deb dir-test em-test exec-test1 exec-test2 # fileio-test ft mouse-test posixio-test rename-test seek ser-test EXELIST_atmos = \ minimal \ arg-test \ clock \ + conio \ cprintf \ cursor \ div-test \ diff --git a/targettest/conio.c b/targettest/conio.c index e054319e5..56fc5dcda 100644 --- a/targettest/conio.c +++ b/targettest/conio.c @@ -24,6 +24,12 @@ #define NUMCOLS 16 #endif +#if defined(__ATMOS__) +// FIXME: those should be defined elsewhere? +#define CH_HLINE '-' +#define CH_VLINE '!' +#endif + static char grid[5][5] = { {CH_ULCORNER, CH_HLINE, CH_TTEE, CH_HLINE, CH_URCORNER}, {CH_VLINE, ' ', CH_VLINE, ' ', CH_VLINE }, @@ -73,6 +79,14 @@ void peektest(void) revers(rbuf[j]); cputc(buf[j]); } + gotoxy(0, LINE_PEEKTEST); + cpeeks(buf, NUMCOLS); + (void)textcolor(1); + revers(0); + gotoxy(20, LINE_PEEKTEST); + for (j = 0; j < NUMCOLS; ++j) { + cputc(buf[j]); + } } void main(void) From 5c72deb0b98ad6e71d64f446a93d3700117bb7d9 Mon Sep 17 00:00:00 2001 From: mrdudz Date: Sun, 25 May 2025 01:38:32 +0200 Subject: [PATCH 24/28] prepare osic1p cpeekc/cpeekcolor/cpeekrevers, replaces #532 --- libsrc/osic1p/cpeekc.s | 17 +++++++++++++++++ libsrc/osic1p/cpeekcolor.s | 8 ++++++++ libsrc/osic1p/cpeekrevers.s | 9 +++++++++ targettest/Makefile | 1 + targettest/conio.c | 15 ++++++++++++--- 5 files changed, 47 insertions(+), 3 deletions(-) create mode 100644 libsrc/osic1p/cpeekc.s create mode 100644 libsrc/osic1p/cpeekcolor.s create mode 100644 libsrc/osic1p/cpeekrevers.s diff --git a/libsrc/osic1p/cpeekc.s b/libsrc/osic1p/cpeekc.s new file mode 100644 index 000000000..55a170501 --- /dev/null +++ b/libsrc/osic1p/cpeekc.s @@ -0,0 +1,17 @@ +; +; 2017-06-21, Greg King +; +; char cpeekc (void); +; +; Get a character from OSI C1P screen RAM. +; + .export _cpeekc + + .include "extzp.inc" + + +_cpeekc: + ldy CURS_X + lda (SCREEN_PTR),y + ldx #>$0000 + rts diff --git a/libsrc/osic1p/cpeekcolor.s b/libsrc/osic1p/cpeekcolor.s new file mode 100644 index 000000000..ed275ec95 --- /dev/null +++ b/libsrc/osic1p/cpeekcolor.s @@ -0,0 +1,8 @@ +; +; 2017-06-03, Greg King +; +; unsigned char cpeekcolor (void); +; + + .import return1 + .export _cpeekcolor := return1 ; always COLOR_WHITE diff --git a/libsrc/osic1p/cpeekrevers.s b/libsrc/osic1p/cpeekrevers.s new file mode 100644 index 000000000..ab7c68b35 --- /dev/null +++ b/libsrc/osic1p/cpeekrevers.s @@ -0,0 +1,9 @@ +; +; 2017-06-15, Greg King +; +; unsigned char cpeekrevers (void); +; +; Get a reverse attribute from screen RAM +; + .import return0 + .export _cpeekrevers := return0 ; No attribute diff --git a/targettest/Makefile b/targettest/Makefile index 35b767727..f78e22461 100644 --- a/targettest/Makefile +++ b/targettest/Makefile @@ -624,6 +624,7 @@ EXELIST_pce = \ # stroserror-test strqtok-test uname-test EXELIST_osic1p = \ minimal \ + conio \ cursor \ mul-test diff --git a/targettest/conio.c b/targettest/conio.c index 56fc5dcda..8ebb15bd5 100644 --- a/targettest/conio.c +++ b/targettest/conio.c @@ -15,12 +15,16 @@ #include #include -#if defined(__GAMATE__) +#if defined(__GAMATE__) || defined(__OSIC1P__) /* there is not enough screen space to show all 256 characters at the bottom */ #define NUMCHARS 128 -#define NUMCOLS 4 #else #define NUMCHARS 256 +#endif + +#if defined(__GAMATE__) +#define NUMCOLS 4 +#else #define NUMCOLS 16 #endif @@ -79,6 +83,7 @@ void peektest(void) revers(rbuf[j]); cputc(buf[j]); } +#if !defined (__OSIC1P__) gotoxy(0, LINE_PEEKTEST); cpeeks(buf, NUMCOLS); (void)textcolor(1); @@ -87,6 +92,7 @@ void peektest(void) for (j = 0; j < NUMCOLS; ++j) { cputc(buf[j]); } +#endif } void main(void) @@ -134,7 +140,8 @@ void main(void) } } - gotoxy(0, ysize - 2 - ((NUMCHARS + xsize) / xsize)); + gotoxy(0, ysize - 3 - ((NUMCHARS + xsize) / xsize)); + // one line with 0123..pattern revers(1); for (i = 0; i < xsize; ++i) { cputc('0' + i % 10); @@ -147,9 +154,11 @@ void main(void) cputc(' '); } } + // fill last line of the block with '#' while(wherex() > 0) { cputc('#'); } + // one more line with 0123..pattern revers(1); for (i = 0; i < xsize; ++i) { cputc('0' + i % 10); From e9a15af29b406ec9e8ea64fd58997c03f6eb6463 Mon Sep 17 00:00:00 2001 From: mrdudz Date: Sun, 25 May 2025 02:52:03 +0200 Subject: [PATCH 25/28] cleanup/fix pce cpeekc/cpeekcolor/cpeekrevers/cpeeks, replaces #532 --- libsrc/pce/cpeekc.s | 6 +++--- libsrc/pce/cpeekcolor.s | 6 +++--- libsrc/pce/cpeekrevers.s | 15 ++++++++------- libsrc/pce/cpeeks.s | 28 +++++++++++----------------- 4 files changed, 25 insertions(+), 30 deletions(-) diff --git a/libsrc/pce/cpeekc.s b/libsrc/pce/cpeekc.s index e144f94ac..326fe5203 100644 --- a/libsrc/pce/cpeekc.s +++ b/libsrc/pce/cpeekc.s @@ -14,11 +14,11 @@ _cpeekc: st0 #VDC_MARR ; Memory-Address Read ldy SCREEN_PTR ldx SCREEN_PTR+1 - sty VDC_DATA_LO - stx VDC_DATA_HI + sty a:VDC_DATA_LO + stx a:VDC_DATA_HI st0 #VDC_VRR ; VRAM Read Register - lda VDC_DATA_LO ; character + lda a:VDC_DATA_LO ; character and #<~$80 ; remove reverse bit ldx #0 rts diff --git a/libsrc/pce/cpeekcolor.s b/libsrc/pce/cpeekcolor.s index 8b96d29d4..ecee91ed5 100644 --- a/libsrc/pce/cpeekcolor.s +++ b/libsrc/pce/cpeekcolor.s @@ -14,11 +14,11 @@ _cpeekcolor: st0 #VDC_MARR ; Memory-Address Read ldy SCREEN_PTR ldx SCREEN_PTR+1 - sty VDC_DATA_LO - stx VDC_DATA_HI + sty a:VDC_DATA_LO + stx a:VDC_DATA_HI st0 #VDC_VRR ; VRAM Read Register - lda VDC_DATA_HI + lda a:VDC_DATA_HI and #<~$02 lsr a lsr a diff --git a/libsrc/pce/cpeekrevers.s b/libsrc/pce/cpeekrevers.s index 3f208fd10..8fa173202 100644 --- a/libsrc/pce/cpeekrevers.s +++ b/libsrc/pce/cpeekrevers.s @@ -14,13 +14,14 @@ _cpeekrevers: st0 #VDC_MARR ; Memory-Address Read ldy SCREEN_PTR ldx SCREEN_PTR+1 - sty VDC_DATA_LO - stx VDC_DATA_HI + sty a:VDC_DATA_LO + stx a:VDC_DATA_HI st0 #VDC_VRR ; VRAM Read Register - lda VDC_DATA_LO ; character (bit 7 is revers bit) - rol a - rol a - and #1 - ldx #0 + + lda a:VDC_DATA_LO ; character (bit 7 is revers bit) + and #$80 ; get reverse bit + asl a ; reverse bit to carry, A=0 + tax ; ldx #>$0000 + rol a ; reverse bit from carry rts diff --git a/libsrc/pce/cpeeks.s b/libsrc/pce/cpeeks.s index fe5e28687..322b9ba30 100644 --- a/libsrc/pce/cpeeks.s +++ b/libsrc/pce/cpeeks.s @@ -1,5 +1,6 @@ ; ; 2020-07-14, Groepaz +; 2020-07-15, Greg King ; ; void cpeeks (char* s, unsigned length); ; @@ -8,9 +9,7 @@ .export _cpeeks .import popax - .importzp ptr1, ptr2, tmp1, tmp2 - - .macpack generic + .importzp ptr1, ptr2 .include "pce.inc" .include "extzp.inc" @@ -22,35 +21,31 @@ _cpeeks: eor #>$FFFF sta ptr2+1 + st0 #VDC_CR ; Control Register + st2 #>$0088 ; make VRAM address increment by one + st0 #VDC_MARR ; Memory-Address Read ldy SCREEN_PTR ldx SCREEN_PTR+1 - sty VDC_DATA_LO - stx VDC_DATA_HI + sty a:VDC_DATA_LO + stx a:VDC_DATA_HI st0 #VDC_VRR ; VRAM Read Register jsr popax - sta tmp1 ; (will be a .Y index) + tay ; low byte of address will be used as index stx ptr1+1 - ldx #<$0000 stx ptr1 beq L2 ; branch always -L3: ldy tmp2 - lda VDC_DATA_LO ; get character - bit VDC_DATA_HI ; we need to "read" the highbyte to advance the address - iny - sty tmp2 +L3: lda a:VDC_DATA_LO ; get character + bit a:VDC_DATA_HI ; need to read high byte to advance VDC address and #<~$80 ; remove reverse bit - - ldy tmp1 sta (ptr1),y iny - bne L1 + bne L2 inc ptr1+1 -L1: sty tmp1 L2: inc ptr2 ; count length bne L3 @@ -58,6 +53,5 @@ L2: inc ptr2 ; count length bne L3 txa ; terminate the string - ldy tmp1 sta (ptr1),y rts From c996157f0ebd5b8ccf99a66049d2bf21b1ad35cb Mon Sep 17 00:00:00 2001 From: mrdudz Date: Sun, 25 May 2025 02:53:34 +0200 Subject: [PATCH 26/28] update conio test to reflect the state of cpeek implementation(s) --- targettest/conio.c | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/targettest/conio.c b/targettest/conio.c index 8ebb15bd5..db7752857 100644 --- a/targettest/conio.c +++ b/targettest/conio.c @@ -42,12 +42,15 @@ static char grid[5][5] = { {CH_LLCORNER, CH_HLINE, CH_BTEE, CH_HLINE, CH_LRCORNER} }; +#define LINE_COLORTEST 3 +#define LINE_PEEKTEST 11 + void colortest(void) { unsigned int i, j; cputsxy(0, 2, "Colors:" ); for (i = 0; i < 3; ++i) { - gotoxy(i, 3 + i); + gotoxy(i, LINE_COLORTEST + i); for (j = 0; j < NUMCOLS; ++j) { (void)textcolor(j); cputc('X'); @@ -55,8 +58,6 @@ void colortest(void) } } -#define LINE_PEEKTEST 11 - void peektest(void) { int j; @@ -69,13 +70,24 @@ void peektest(void) (void)textcolor(j); revers((j >> 1)&1); cputc('a' + j); - rbuf[j] = (j >> 1)&1; + buf[j] ='#'; + cbuf[j] = 1; + rbuf[j] = 0; } for (j = 0; j < NUMCOLS; ++j) { gotoxy(j, LINE_PEEKTEST); +// TODO: cpeekc() implementation missing for those: +#if !defined(__TELESTRAT__) buf[j] = cpeekc(); +#endif +// TODO: cpeekcolor() implementation missing for those: +#if !defined(__TELESTRAT__) cbuf[j] = cpeekcolor(); +#endif +// TODO: cpeekrevers() implementation missing for those: +#if !defined(__TELESTRAT__) rbuf[j] = cpeekrevers(); +#endif } gotoxy(0, (LINE_PEEKTEST+1)); for (j = 0; j < NUMCOLS; ++j) { @@ -83,7 +95,14 @@ void peektest(void) revers(rbuf[j]); cputc(buf[j]); } -#if !defined (__OSIC1P__) +// TODO: cpeeks() implementation missing for those: +#if !defined(__APPLE2__) && \ + !defined(__APPLE2ENH__) && \ + !defined(__ATARI__) && \ + !defined(__CX16__) && \ + !defined(__NES__) && \ + !defined(__TELESTRAT__) && \ + !defined(__OSIC1P__) gotoxy(0, LINE_PEEKTEST); cpeeks(buf, NUMCOLS); (void)textcolor(1); From bd63c6aa4b424bee3113772eefb210a7e48535c2 Mon Sep 17 00:00:00 2001 From: mrdudz Date: Sun, 25 May 2025 03:23:54 +0200 Subject: [PATCH 27/28] move char block printing into function --- targettest/conio.c | 54 +++++++++++++++++++++++++--------------------- 1 file changed, 30 insertions(+), 24 deletions(-) diff --git a/targettest/conio.c b/targettest/conio.c index db7752857..e270d3dab 100644 --- a/targettest/conio.c +++ b/targettest/conio.c @@ -114,6 +114,35 @@ void peektest(void) #endif } +void allchars(int xsize, int ysize) +{ + int i; + gotoxy(0, ysize - 2 - ((NUMCHARS + (xsize-1)) / xsize)); + // one line with 0123..pattern + revers(1); + for (i = 0; i < xsize; ++i) { + cputc('0' + i % 10); + } + revers(0); + for (i = 0; i < NUMCHARS; ++i) { + if ((i != '\n') && (i != '\r')) { + cputc(i); + } else { + cputc(' '); + } + } + // fill last line of the block with '#' + while(wherex() > 0) { + cputc('#'); + } + // one more line with 0123..pattern + revers(1); + for (i = 0; i < xsize; ++i) { + cputc('0' + i % 10); + } + revers(0); +} + void main(void) { unsigned int i, j, n; @@ -159,30 +188,7 @@ void main(void) } } - gotoxy(0, ysize - 3 - ((NUMCHARS + xsize) / xsize)); - // one line with 0123..pattern - revers(1); - for (i = 0; i < xsize; ++i) { - cputc('0' + i % 10); - } - revers(0); - for (i = 0; i < NUMCHARS; ++i) { - if ((i != '\n') && (i != '\r')) { - cputc(i); - } else { - cputc(' '); - } - } - // fill last line of the block with '#' - while(wherex() > 0) { - cputc('#'); - } - // one more line with 0123..pattern - revers(1); - for (i = 0; i < xsize; ++i) { - cputc('0' + i % 10); - } - revers(0); + allchars(xsize, ysize); cursor(1); for (;;) { From 0d9ae7cb708d3948ec02a776d28766b542ed0a58 Mon Sep 17 00:00:00 2001 From: Bob Andrews Date: Sun, 25 May 2025 03:44:36 +0200 Subject: [PATCH 28/28] Update kgetin.s use symbol from cbm_kernal.inc --- libsrc/plus4/kgetin.s | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/libsrc/plus4/kgetin.s b/libsrc/plus4/kgetin.s index 14919f750..e77395b9a 100644 --- a/libsrc/plus4/kgetin.s +++ b/libsrc/plus4/kgetin.s @@ -1,14 +1,17 @@ -.export GETIN -.include "plus4.inc" + .export GETIN -KERNAL_GETIN := $FFE4 +.scope KERNAL + .include "cbm_kernal.inc" +.endscope + + .include "plus4.inc" .segment "LOWCODE" ; Stay out of ROM area. .proc GETIN sta ENABLE_ROM - jsr KERNAL_GETIN + jsr KERNAL::GETIN sta ENABLE_RAM rts .endproc