From 29d43518c5caf15ed3120fe69ad915acbe6d4dfe Mon Sep 17 00:00:00 2001 From: Matthew Butterick Date: Thu, 15 Nov 2018 16:25:15 -0800 Subject: [PATCH] no, THIS is the initial commit --- xenomorph/info.rkt | 17 + xenomorph/xenomorph/array.rkt | 5 + xenomorph/xenomorph/base.rkt | 5 + xenomorph/xenomorph/bitfield.rkt | 5 + xenomorph/xenomorph/buffer.rkt | 5 + xenomorph/xenomorph/enum.rkt | 5 + xenomorph/xenomorph/info.rkt | 3 + xenomorph/xenomorph/lazy-array.rkt | 5 + xenomorph/xenomorph/main.rkt | 17 + xenomorph/xenomorph/number.rkt | 5 + xenomorph/xenomorph/optional.rkt | 5 + xenomorph/xenomorph/pointer.rkt | 5 + xenomorph/xenomorph/private/array.rkt | 84 +++++ xenomorph/xenomorph/private/base.rkt | 116 ++++++ xenomorph/xenomorph/private/bitfield.rkt | 44 +++ xenomorph/xenomorph/private/buffer.rkt | 56 +++ .../private/compiled/drracket/base_rkt.dep | 1 + .../private/compiled/drracket/base_rkt.zo | Bin 0 -> 206134 bytes .../private/compiled/drracket/generic_rkt.dep | 1 + .../private/compiled/drracket/generic_rkt.zo | Bin 0 -> 327642 bytes .../private/compiled/drracket/helper_rkt.dep | 1 + .../private/compiled/drracket/helper_rkt.zo | Bin 0 -> 67377 bytes .../private/compiled/drracket/number_rkt.dep | 1 + .../private/compiled/drracket/number_rkt.zo | Bin 0 -> 380174 bytes .../private/compiled/drracket/racket_rkt.dep | 1 + .../private/compiled/drracket/racket_rkt.zo | Bin 0 -> 351457 bytes .../private/compiled/drracket/sizes_rkt.dep | 1 + .../private/compiled/drracket/sizes_rkt.zo | Bin 0 -> 107091 bytes .../private/compiled/drracket/utils_rkt.dep | 1 + .../private/compiled/drracket/utils_rkt.zo | Bin 0 -> 32947 bytes xenomorph/xenomorph/private/enum.rkt | 23 ++ xenomorph/xenomorph/private/generic.rkt | 110 ++++++ xenomorph/xenomorph/private/helper.rkt | 23 ++ xenomorph/xenomorph/private/lazy-array.rkt | 77 ++++ xenomorph/xenomorph/private/number.rkt | 189 ++++++++++ xenomorph/xenomorph/private/optional.rkt | 28 ++ xenomorph/xenomorph/private/pointer.rkt | 102 ++++++ xenomorph/xenomorph/private/racket.rkt | 33 ++ xenomorph/xenomorph/private/reserved.rkt | 22 ++ xenomorph/xenomorph/private/sizes.rkt | 36 ++ xenomorph/xenomorph/private/string.rkt | 106 ++++++ xenomorph/xenomorph/private/struct.rkt | 154 ++++++++ xenomorph/xenomorph/private/utils.rkt | 13 + .../xenomorph/private/versioned-struct.rkt | 147 ++++++++ xenomorph/xenomorph/private/~stream.rkt | 205 +++++++++++ xenomorph/xenomorph/reserved.rkt | 5 + .../xenomorph/scribblings/xenomorph.scrbl | 255 +++++++++++++ xenomorph/xenomorph/string.rkt | 5 + xenomorph/xenomorph/struct.rkt | 5 + xenomorph/xenomorph/test/array-test.rkt | 89 +++++ xenomorph/xenomorph/test/bitfield-test.rkt | 48 +++ xenomorph/xenomorph/test/buffer-test.rkt | 44 +++ xenomorph/xenomorph/test/enum-test.rkt | 35 ++ xenomorph/xenomorph/test/lazy-array-test.rkt | 59 +++ xenomorph/xenomorph/test/main.rkt | 15 + xenomorph/xenomorph/test/number-test.rkt | 336 +++++++++++++++++ xenomorph/xenomorph/test/optional-test.rkt | 114 ++++++ xenomorph/xenomorph/test/pointer-test.rkt | 234 ++++++++++++ xenomorph/xenomorph/test/racket.rkt | 6 + xenomorph/xenomorph/test/reserved-test.rkt | 33 ++ xenomorph/xenomorph/test/string-test.rkt | 129 +++++++ xenomorph/xenomorph/test/struct-test.rkt | 121 +++++++ xenomorph/xenomorph/test/test.rkt | 19 + .../xenomorph/test/versioned-struct-test.rkt | 340 ++++++++++++++++++ xenomorph/xenomorph/versioned-struct.rkt | 5 + 65 files changed, 3554 insertions(+) create mode 100644 xenomorph/info.rkt create mode 100644 xenomorph/xenomorph/array.rkt create mode 100644 xenomorph/xenomorph/base.rkt create mode 100644 xenomorph/xenomorph/bitfield.rkt create mode 100644 xenomorph/xenomorph/buffer.rkt create mode 100644 xenomorph/xenomorph/enum.rkt create mode 100644 xenomorph/xenomorph/info.rkt create mode 100644 xenomorph/xenomorph/lazy-array.rkt create mode 100644 xenomorph/xenomorph/main.rkt create mode 100644 xenomorph/xenomorph/number.rkt create mode 100644 xenomorph/xenomorph/optional.rkt create mode 100644 xenomorph/xenomorph/pointer.rkt create mode 100644 xenomorph/xenomorph/private/array.rkt create mode 100644 xenomorph/xenomorph/private/base.rkt create mode 100644 xenomorph/xenomorph/private/bitfield.rkt create mode 100644 xenomorph/xenomorph/private/buffer.rkt create mode 100644 xenomorph/xenomorph/private/compiled/drracket/base_rkt.dep create mode 100644 xenomorph/xenomorph/private/compiled/drracket/base_rkt.zo create mode 100644 xenomorph/xenomorph/private/compiled/drracket/generic_rkt.dep create mode 100644 xenomorph/xenomorph/private/compiled/drracket/generic_rkt.zo create mode 100644 xenomorph/xenomorph/private/compiled/drracket/helper_rkt.dep create mode 100644 xenomorph/xenomorph/private/compiled/drracket/helper_rkt.zo create mode 100644 xenomorph/xenomorph/private/compiled/drracket/number_rkt.dep create mode 100644 xenomorph/xenomorph/private/compiled/drracket/number_rkt.zo create mode 100644 xenomorph/xenomorph/private/compiled/drracket/racket_rkt.dep create mode 100644 xenomorph/xenomorph/private/compiled/drracket/racket_rkt.zo create mode 100644 xenomorph/xenomorph/private/compiled/drracket/sizes_rkt.dep create mode 100644 xenomorph/xenomorph/private/compiled/drracket/sizes_rkt.zo create mode 100644 xenomorph/xenomorph/private/compiled/drracket/utils_rkt.dep create mode 100644 xenomorph/xenomorph/private/compiled/drracket/utils_rkt.zo create mode 100644 xenomorph/xenomorph/private/enum.rkt create mode 100644 xenomorph/xenomorph/private/generic.rkt create mode 100644 xenomorph/xenomorph/private/helper.rkt create mode 100644 xenomorph/xenomorph/private/lazy-array.rkt create mode 100644 xenomorph/xenomorph/private/number.rkt create mode 100644 xenomorph/xenomorph/private/optional.rkt create mode 100644 xenomorph/xenomorph/private/pointer.rkt create mode 100644 xenomorph/xenomorph/private/racket.rkt create mode 100644 xenomorph/xenomorph/private/reserved.rkt create mode 100644 xenomorph/xenomorph/private/sizes.rkt create mode 100644 xenomorph/xenomorph/private/string.rkt create mode 100644 xenomorph/xenomorph/private/struct.rkt create mode 100644 xenomorph/xenomorph/private/utils.rkt create mode 100644 xenomorph/xenomorph/private/versioned-struct.rkt create mode 100644 xenomorph/xenomorph/private/~stream.rkt create mode 100644 xenomorph/xenomorph/reserved.rkt create mode 100644 xenomorph/xenomorph/scribblings/xenomorph.scrbl create mode 100644 xenomorph/xenomorph/string.rkt create mode 100644 xenomorph/xenomorph/struct.rkt create mode 100644 xenomorph/xenomorph/test/array-test.rkt create mode 100644 xenomorph/xenomorph/test/bitfield-test.rkt create mode 100644 xenomorph/xenomorph/test/buffer-test.rkt create mode 100644 xenomorph/xenomorph/test/enum-test.rkt create mode 100644 xenomorph/xenomorph/test/lazy-array-test.rkt create mode 100644 xenomorph/xenomorph/test/main.rkt create mode 100644 xenomorph/xenomorph/test/number-test.rkt create mode 100644 xenomorph/xenomorph/test/optional-test.rkt create mode 100644 xenomorph/xenomorph/test/pointer-test.rkt create mode 100644 xenomorph/xenomorph/test/racket.rkt create mode 100644 xenomorph/xenomorph/test/reserved-test.rkt create mode 100644 xenomorph/xenomorph/test/string-test.rkt create mode 100644 xenomorph/xenomorph/test/struct-test.rkt create mode 100644 xenomorph/xenomorph/test/test.rkt create mode 100644 xenomorph/xenomorph/test/versioned-struct-test.rkt create mode 100644 xenomorph/xenomorph/versioned-struct.rkt diff --git a/xenomorph/info.rkt b/xenomorph/info.rkt new file mode 100644 index 00000000..057ab656 --- /dev/null +++ b/xenomorph/info.rkt @@ -0,0 +1,17 @@ +#lang info +(define collection 'multi) +(define deps '("at-exp-lib" + "beautiful-racket-lib" + "brag" + "describe" + "png-image" + "srfi-lite-lib" + "sugar" + "debug" + "base" + "draw-lib" + "rackunit-lib")) +(define build-deps '("scribble-lib" "racket-doc")) +(define version "0.0") +(define pkg-authors '(mb)) +(define test-omit-paths 'all) diff --git a/xenomorph/xenomorph/array.rkt b/xenomorph/xenomorph/array.rkt new file mode 100644 index 00000000..25c57459 --- /dev/null +++ b/xenomorph/xenomorph/array.rkt @@ -0,0 +1,5 @@ +#lang racket/base +(require "private/racket.rkt") + + +(r+p "private/array.rkt") \ No newline at end of file diff --git a/xenomorph/xenomorph/base.rkt b/xenomorph/xenomorph/base.rkt new file mode 100644 index 00000000..0d371a01 --- /dev/null +++ b/xenomorph/xenomorph/base.rkt @@ -0,0 +1,5 @@ +#lang racket/base +(require "private/racket.rkt") + + +(r+p "private/base.rkt") \ No newline at end of file diff --git a/xenomorph/xenomorph/bitfield.rkt b/xenomorph/xenomorph/bitfield.rkt new file mode 100644 index 00000000..a49e45e5 --- /dev/null +++ b/xenomorph/xenomorph/bitfield.rkt @@ -0,0 +1,5 @@ +#lang racket/base +(require "private/racket.rkt") + + +(r+p "private/bitfield.rkt") \ No newline at end of file diff --git a/xenomorph/xenomorph/buffer.rkt b/xenomorph/xenomorph/buffer.rkt new file mode 100644 index 00000000..32ea13d0 --- /dev/null +++ b/xenomorph/xenomorph/buffer.rkt @@ -0,0 +1,5 @@ +#lang racket/base +(require "private/racket.rkt") + + +(r+p "private/buffer.rkt") \ No newline at end of file diff --git a/xenomorph/xenomorph/enum.rkt b/xenomorph/xenomorph/enum.rkt new file mode 100644 index 00000000..53412371 --- /dev/null +++ b/xenomorph/xenomorph/enum.rkt @@ -0,0 +1,5 @@ +#lang racket/base +(require "private/racket.rkt") + + +(r+p "private/enum.rkt") \ No newline at end of file diff --git a/xenomorph/xenomorph/info.rkt b/xenomorph/xenomorph/info.rkt new file mode 100644 index 00000000..b93ecb0b --- /dev/null +++ b/xenomorph/xenomorph/info.rkt @@ -0,0 +1,3 @@ +#lang info + +(define compile-omit-paths '("test/test.rkt" "test/~stream.test.rkt" "private/~stream.rkt")) \ No newline at end of file diff --git a/xenomorph/xenomorph/lazy-array.rkt b/xenomorph/xenomorph/lazy-array.rkt new file mode 100644 index 00000000..19bf6e5d --- /dev/null +++ b/xenomorph/xenomorph/lazy-array.rkt @@ -0,0 +1,5 @@ +#lang racket/base +(require "private/racket.rkt") + + +(r+p "private/lazy-array.rkt") \ No newline at end of file diff --git a/xenomorph/xenomorph/main.rkt b/xenomorph/xenomorph/main.rkt new file mode 100644 index 00000000..8d8f0700 --- /dev/null +++ b/xenomorph/xenomorph/main.rkt @@ -0,0 +1,17 @@ +#lang racket/base +(require "private/racket.rkt") + + +(r+p "array.rkt" + "base.rkt" + "bitfield.rkt" + "buffer.rkt" + "enum.rkt" + "lazy-array.rkt" + "number.rkt" + "optional.rkt" + "pointer.rkt" + "reserved.rkt" + "string.rkt" + "struct.rkt" + "versioned-struct.rkt") diff --git a/xenomorph/xenomorph/number.rkt b/xenomorph/xenomorph/number.rkt new file mode 100644 index 00000000..13b63b6f --- /dev/null +++ b/xenomorph/xenomorph/number.rkt @@ -0,0 +1,5 @@ +#lang racket/base +(require "private/racket.rkt") + + +(r+p "private/number.rkt") \ No newline at end of file diff --git a/xenomorph/xenomorph/optional.rkt b/xenomorph/xenomorph/optional.rkt new file mode 100644 index 00000000..f4e69df5 --- /dev/null +++ b/xenomorph/xenomorph/optional.rkt @@ -0,0 +1,5 @@ +#lang racket/base +(require "private/racket.rkt") + + +(r+p "private/optional.rkt") \ No newline at end of file diff --git a/xenomorph/xenomorph/pointer.rkt b/xenomorph/xenomorph/pointer.rkt new file mode 100644 index 00000000..03954b81 --- /dev/null +++ b/xenomorph/xenomorph/pointer.rkt @@ -0,0 +1,5 @@ +#lang racket/base +(require "private/racket.rkt") + + +(r+p "private/pointer.rkt") \ No newline at end of file diff --git a/xenomorph/xenomorph/private/array.rkt b/xenomorph/xenomorph/private/array.rkt new file mode 100644 index 00000000..8ca49704 --- /dev/null +++ b/xenomorph/xenomorph/private/array.rkt @@ -0,0 +1,84 @@ +#lang racket/base +(require "racket.rkt") +(require "number.rkt" "utils.rkt") +(provide (all-defined-out)) + +#| +approximates +https://github.com/mbutterick/restructure/blob/master/src/Array.coffee +|# + +(define-subclass xenomorph-base% (ArrayT type [len #f] [length-type 'count]) + + (define/augride (decode port [parent #f]) + (define ctx (if (NumberT? len) + (mhasheq 'parent parent + '_startOffset (pos port) + '_currentOffset 0 + '_length len) + parent)) + + (define decoded-len (resolve-length len port parent)) + (cond + [(or (not decoded-len) (eq? length-type 'bytes)) + (define end-pos (cond + ;; decoded-len is byte length + [decoded-len (+ (pos port) decoded-len)] + ;; no decoded-len, but parent has length + [(and parent (not (zero? (· parent _length)))) (+ (· parent _startOffset) (· parent _length))] + ;; no decoded-len or parent, so consume whole stream + [else +inf.0])) + (for/list ([i (in-naturals)] + #:break (or (eof-object? (peek-byte port)) (= (pos port) end-pos))) + (send type decode port ctx))] + ;; we have decoded-len, which is treated as count of items + [else (for/list ([i (in-range decoded-len)]) + (send type decode port ctx))])) + + + (define/augride (size [val #f] [ctx #f]) + (when val (unless (countable? val) + (raise-argument-error 'Array:size "countable" val))) + (cond + [val (let-values ([(ctx len-size) (if (NumberT? len) + (values (mhasheq 'parent ctx) (send len size)) + (values ctx 0))]) + (+ len-size (for/sum ([item (in-list (countable->list val))]) + (send type size item ctx))))] + [else (let ([item-count (resolve-length len #f ctx)] + [item-size (send type size #f ctx)]) + (* item-size item-count))])) + + + (define/augride (encode port array [parent #f]) + (when array (unless (countable? array) + (raise-argument-error 'Array:encode "list or countable" array))) + + (define (encode-items ctx) + (let* ([items (countable->list array)] + [item-count (length items)] + [max-items (if (number? len) len item-count)]) + (unless (= item-count max-items) + (raise-argument-error 'Array:encode (format "list or countable with ~a items" max-items) items)) + (for ([item (in-list items)]) + (send type encode port item ctx)))) + + (cond + [(NumberT? len) (define ctx (mhash 'pointers null + 'startOffset (pos port) + 'parent parent)) + (ref-set! ctx 'pointerOffset (+ (pos port) (size array ctx))) + (send len encode port (length array)) ; encode length at front + (encode-items ctx) + (for ([ptr (in-list (· ctx pointers))]) ; encode pointer data at end + (send (· ptr type) encode port (· ptr val)))] + [else (encode-items parent)]))) + +(define-procedures (Array Array? +Array) (ArrayT ArrayT? +ArrayT)) +(define-procedures (array% array? array) (ArrayT ArrayT? +ArrayT)) + +(test-module + (check-equal? (decode (+Array uint16be 3) #"ABCDEF") '(16706 17220 17734)) + (check-equal? (encode (+Array uint16be 3) '(16706 17220 17734) #f) #"ABCDEF") + (check-equal? (size (+Array uint16be) '(1 2 3)) 6) + (check-equal? (size (+Array doublebe) '(1 2 3 4 5)) 40)) diff --git a/xenomorph/xenomorph/private/base.rkt b/xenomorph/xenomorph/private/base.rkt new file mode 100644 index 00000000..3d2cc61d --- /dev/null +++ b/xenomorph/xenomorph/private/base.rkt @@ -0,0 +1,116 @@ +#lang racket/base +(require racket/class sugar/class racket/generic racket/private/generic-methods "generic.rkt" racket/port racket/dict racket/function) +(require sugar/debug) +(provide (all-defined-out)) +(define-generics posable + (pos posable [new-pos]) + #:defaults + ([port? (define (pos p [new-pos #f]) (when new-pos + (file-position p new-pos)) + (file-position p))])) + +(define posable<%> + (interface* () + ([(generic-property gen:posable) + (generic-method-table gen:posable + (define (pos o [new-pos #f]) (send o pos new-pos)))]))) + +(define-generics codable + (decode codable #:parent [parent] [stream]) + (encode codable [val] [stream] #:parent [parent])) + + +(define codable<%> + (interface* () + ([(generic-property gen:codable) + (generic-method-table gen:codable + (define (decode o [port (current-input-port)] #:parent [parent #f]) + (send o decode port parent)) + (define (encode o [val #f] [port (current-output-port)] #:parent [parent #f]) + (when (port? val) + (raise-argument-error 'encode "encodable value" val)) + (send o encode port val parent)))]))) + + +(define-generics sizable + (size sizable [val] [parent])) + +(define sizable<%> + (interface* () + ([(generic-property gen:sizable) + (generic-method-table gen:sizable + (define (size o [val #f] [parent #f]) (send o size val parent)))]))) + +(define (dump x) + (define (dump-dict x) + (for/list ([(k v) (in-dict x)]) + (cons (dump k) (dump v)))) + (let loop ([x x]) + (cond + [(input-port? x) (port->bytes x)] + [(output-port? x) (get-output-bytes x)] + [(and (object? x) + (memq 'dump (interface->method-names (object-interface x)))) (send x dump)] + [(dict? x) (dump-dict x)] + [(list? x) (map loop x)] + [else x]))) + +#;(define dumpable<%> + (interface* () + ([(generic-property gen:dumpable) + (generic-method-table gen:dumpable + (define (dump o) (send o dump)))]))) + +(define (symbol-append . syms) + (string->symbol (apply string-append (map symbol->string syms)))) + +(define xenomorph-base% + (class* object% (codable<%> sizable<%>) + (super-new) + (field [_hash (make-hash)] + [_list null]) + + (define/pubment (decode port [parent #f] . args) + (when parent (unless (indexable? parent) + (raise-argument-error (symbol-append (get-class-name) ':decode) "indexable" parent))) + (define ip (cond + [(bytes? port) (open-input-bytes port)] + [(input-port? port) port] + [else (raise-argument-error (symbol-append (get-class-name) ':decode) "bytes or input port" port)])) + (post-decode (inner (void) decode ip parent) port parent . args)) + + (define/pubment (encode port val-in [parent #f] . args) + #;(report* port val-in parent) + (define val (pre-encode val-in port)) + (when parent (unless (indexable? parent) + (raise-argument-error (symbol-append (get-class-name) ':encode) "indexable" parent))) + (define op (cond + [(output-port? port) port] + [(not port) (open-output-bytes)] + [else (raise-argument-error 'Xenomorph "output port or #f" port)])) + (define encode-result (inner (void) encode op val parent . args)) + (when (bytes? encode-result) + (write-bytes encode-result op)) + (when (not port) (get-output-bytes op))) + + (define/pubment (size [val #f] [parent #f] . args) + (when parent (unless (indexable? parent) + (raise-argument-error (symbol-append (get-class-name) ':size) "indexable" parent))) + (define result (inner (void) size val parent . args)) + (cond + [(void? result) 0] + [(and (integer? result) (not (negative? result))) result] + [else (raise-argument-error (symbol-append (get-class-name) ':size) "nonnegative integer" result)])) + + (define/public (get-class-name) (define-values (name _) (object-info this)) + (or name 'Xenomorph)) + + (define/public (post-decode val . _) val) + (define/public (pre-encode val . _) val) + (define/public (dump) (void)))) + +(define-class-predicates xenomorph-base%) + +(define-subclass xenomorph-base% (RestructureBase)) +(define-subclass RestructureBase (Streamcoder)) + diff --git a/xenomorph/xenomorph/private/bitfield.rkt b/xenomorph/xenomorph/private/bitfield.rkt new file mode 100644 index 00000000..c476c778 --- /dev/null +++ b/xenomorph/xenomorph/private/bitfield.rkt @@ -0,0 +1,44 @@ +#lang racket/base +(require "racket.rkt") +(provide (all-defined-out)) + +#| +approximates +https://github.com/mbutterick/restructure/blob/master/src/Bitfield.coffee +|# + +(define-subclass Streamcoder (Bitfield type [flags empty]) + (unless (andmap (λ (f) (or (key? f) (not f))) flags) + (raise-argument-error 'Bitfield "list of keys" flags)) + + (define/augment (decode stream . _) + (define flag-hash (mhasheq)) + (for* ([val (in-value (send type decode stream))] + [(flag i) (in-indexed flags)] + #:when flag) + (hash-set! flag-hash flag (bitwise-bit-set? val i))) + flag-hash) + + (define/augment (size . _) (send type size)) + + (define/augment (encode port flag-hash [ctx #f]) + (define bit-int (for/sum ([(flag i) (in-indexed flags)] + #:when (and flag (ref flag-hash flag))) + (arithmetic-shift 1 i))) + (send type encode port bit-int)) + + (define/override (get-class-name) 'Bitfield)) + + +(test-module + (require "number.rkt") + (define bfer (+Bitfield uint16be '(bold italic underline #f shadow condensed extended))) + (define bf (send bfer decode #"\0\25")) + (check-equal? (length (ref-keys bf)) 6) ; omits #f flag + (check-true (ref bf 'bold)) + (check-true (ref bf 'underline)) + (check-true (ref bf 'shadow)) + (check-false (ref bf 'italic)) + (check-false (ref bf 'condensed)) + (check-false (ref bf 'extended)) + (check-equal? (encode bfer bf #f) #"\0\25")) \ No newline at end of file diff --git a/xenomorph/xenomorph/private/buffer.rkt b/xenomorph/xenomorph/private/buffer.rkt new file mode 100644 index 00000000..99877914 --- /dev/null +++ b/xenomorph/xenomorph/private/buffer.rkt @@ -0,0 +1,56 @@ +#lang racket/base +(require "racket.rkt") +(require "number.rkt" "utils.rkt") +(provide (all-defined-out)) + +#| +approximates +https://github.com/mbutterick/restructure/blob/master/src/Buffer.coffee +|# + +#| +A Buffer is a container object for any data object that supports random access +A Node Buffer object is basically a byte string. +First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object. +A Restructure RBuffer object is separate. +|# + +(define (+Buffer xs [type #f]) + ((if (string? xs) + string->bytes/utf-8 + list->bytes) xs)) + +(define-subclass xenomorph-base% (RBuffer [len #xffff]) + + (define/augment (decode port [parent #f]) + (define decoded-len (resolve-length len port parent)) + (read-bytes decoded-len port)) + + (define/augment (size [val #f] [parent #f]) + (when val (unless (bytes? val) + (raise-argument-error 'Buffer:size "bytes" val))) + (if val + (bytes-length val) + (resolve-length len val parent))) + + (define/augment (encode port buf [parent #f]) + (unless (bytes? buf) + (raise-argument-error 'Buffer:encode "bytes" buf)) + (define op (or port (open-output-bytes))) + (when (NumberT? len) + (send len encode op (length buf))) + (write-bytes buf op) + (unless port (get-output-bytes op)))) + +(define-subclass RBuffer (BufferT)) + + +#;(test-module + (require "stream.rkt") + (define stream (+DecodeStream #"\2BCDEF")) + (define S (+String uint8 'utf8)) + (check-equal? (send S decode stream) "BC") + (define os (+EncodeStream)) + (send S encode os "Mike") + (check-equal? (send os dump) #"\4Mike") + (check-equal? (send (+String) size "foobar") 6)) \ No newline at end of file diff --git a/xenomorph/xenomorph/private/compiled/drracket/base_rkt.dep b/xenomorph/xenomorph/private/compiled/drracket/base_rkt.dep new file mode 100644 index 00000000..bec1bb7f --- /dev/null +++ b/xenomorph/xenomorph/private/compiled/drracket/base_rkt.dep @@ -0,0 +1 @@ +("7.1.0.2" chez-scheme ("a50f81f2081d14c7713d132155430594a3c63ed8" . "95ba59ab2463177adfad76c52cfa8ec2f14e67fe") #"/Users/MB/git/xenomorph/xenomorph/private/generic.rkt" (collects #"racket" #"base.rkt") (collects #"racket" #"class.rkt") (collects #"racket" #"dict.rkt") (collects #"racket" #"function.rkt") (collects #"racket" #"generic.rkt") (collects #"racket" #"port.rkt") (collects #"racket" #"private" #"generic-methods.rkt") (collects #"racket" #"runtime-config.rkt") (collects #"sugar" #"class.rkt") (collects #"sugar" #"debug.rkt")) diff --git a/xenomorph/xenomorph/private/compiled/drracket/base_rkt.zo b/xenomorph/xenomorph/private/compiled/drracket/base_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..a970829d003c371be945c1553718e8aa2c44f92d GIT binary patch literal 206134 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 Xhk@#nl3cmW+Ng}E=4Nv|D5k*=R32zv%3ji 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 z z2p=ZuZ)V%)oJAiGcK!yf@chSd)*t>|W1X)9>ljcc&x24yRhRoo)U#!-V{S}E8{y6` z;NtLUZIffxru-eM)U-->WRH*bK!8%1#(iy&ekUUBNwRDrlN0p4hir!6yv z#HD-1seg*(GB6O5xtS)dI1&G+OmscZK;zBm{Q9?F*F^>1VW2<6{*_Cq88cwqUa29!h4mi^raR51)CKXfj zB(x{RSK(msWUjHL~NyIN3p4TGG%H^=~en5-S5p`F7_^ z6{o!eG6j9fRzxg!AJJE>O+7i}l_LYM_rNn{L zv4MT%;1H6x*2{r@!^lT344Z-3_@b%Out`>ypGk5 zU^8q}JNz*-bq=m3o^ZwCfF1rAt5JoSYjNhwl2NnyvdY+sjQf8ksCkH_a&bfN_YsMP zL(eYM8GatKozQGz^VAXy34XyTDO!Pa0K>P6CuVk6bNpf&?_P`XV$K@#$L(i~_l)s=vi>+3<88MX?>UFL@phas-ZRGguW!5^7UMnl zC^z2DGsb(yc>nc{x6@+0V~=y=?K)$;XN>n>-*~&Y@j4xZd;SVoG2S3#aD?}kX>WWE>NaOq$tEE zJ*{`CIlJKIKIgDNzD2`?3BhV`{6d1SpmV?{?GdV z7>D((M}D4`C6LPG0P}dyF$l%k63DZ?MmNG}xqt0BMR>F=fjksrVFT?Anx>wJ$#+0M zf2h%I4Y!->^$;dH>x->Bpr4Dt!LkGTDYPp@wEZk@mF{90X%MIik$`2(tAA_`QpB^n;exe=F`5w8n54X~?48ot0ACfG{ zIqFF@{b@rwx?=fBxgYpnXs;Oi&fKq|4&Xa;zl1xBo|D*_J1ckXHApqQl)e>fuaeuD zdxb;Wo9(`KM;@7Y?%F~m9o~mOG@m9J-9$~&`I`eNN;JitxhIKJ(}lpAAW3iDB&&#jnJxsUO^_@H=dvyY9`CAwoeY6f)&Pyq&?Pm( zpD5sZuOK`yxvqrcPHB`|dk$K|7h3^mx)Nx8y*38(y=7NIFS-(1M4XMTgx;jO5@PSB zbpAM_SM5sB(s~il%iWajiLsO)OOH>wiog4~*iR|vliyEi-09m-Nw#oo+bJzbVmqY; zF}G8SuR+RH+EB?j;F?jdAEMm@7U_qxBkic@a~>|ki9(lsgazv@u@K}Thd}zfmX3>ezCcoK(TR#&`mt<&kb_eBfYA(eE(jr%O}A1MVu=Hp{tMCSkUAIQF6#f}IiYO2m7);T$w`-o z{Wbrbo}Ad^kUAIQyTCw~p=T;cV>?U_HV}OXlJgBjY4iSIA2twOF60<0x}=Isx!4_q zD?%q%aZD%Dz_tP@vX}AL8;D9us~jjw6^cggxK4nJ*KZqd+}ujEt0Gy6AI@sV`(sti4KQ9yx8?5-Xao6>Q40qGQoS zDZ+VY?9^QH>yBB%X<*Ty)RFG6C|wK)(qT#VEl*S%ZN^c=*+)d2oxcT-=8zpG!nL}lx{ZU{j2J??d9Zy!q~jag@*to%d%AH{4YskX zSiOD>M@*gd4EE(&Ql;+8GX-|7G~iNy>idRie^w4 zZQr9}d3dqpK@(U10!pdVZ;A*dPU`lZCQ?M{!Dm zHXrR2MVE*DHUE%?!Y=C|W@|WP--7bA>@=Yj>Bq4b#F8p&Rbp-hG59&-7;Odd5!&*Z zwBjO*?JRN|k*_#)y~;lyvkZTzhuz5*9a=dw7@pFk4U(VDk}t_n<@u{$V^8s?>I zEZaa-pv8>&B5V>sBqmln3;MD%gFN)t6U~ALM+&hi@)2SQC8XkM8ISrd$&4$GgyBNS zl;q9~2b_|kof*Dh?LcS^UkShn?96aPyU3WwcU8dVBD5F7N$kVG_hL8_wFkrT=sg&+ zjE^kq(Q;peEnS5D$~E+_W$u*56yK0&{|jMAb8)K}QkD{VU$(n$sriVlj-hYovjIsZ zOy5~d%bK=R{N{;Y`2&lhGR`b28?6K!QJc`3*mfDoHBn^t(mB|4$!GpVvcsU!4z;!% z6G<1bCMg}AQAJlA>B47oYod~v=v+EF=R0mvq@Ou&$Ze!)i5G^Q<$-BoVOW|ArZs4BQY*vOQEbLnX^hA1nU!H`eWi3|N~=t2 zWtiFRpt{(;u6G(ht#Di(_SgJFRU}0yr*FN}mjxv$tfWOnP_B1+7^a-UdZ#xXlH|-| zz0-Q?MKI%rR<@|hgY`~F9M?PXqGKM)I1xq1zM^T+^G2G>vZU#(4&#`mt#%Y8CVh~W zF=)EdkW?oo-47Y86O(QSM3kBlbQ{&UajwisCzh)2M?%xF6fat6sMJ&4IaQ{Xcx}^Z z*_8d0o|v=&N)$OU$n14WGACrU;Iy_Wg_-kmLw1UKRF7gBc~Iug_sJS?$!GpV_JwiS zr|l)fR#bwc`!pS!ZHSJ|gwb^|=x!q|T`dpV<9b?#D-T^Yp`OOh9<5kU%gP^d0H@N? z3_*5Q_Eg%iyuGb+Z+oC;Zm2y}X?a^&#kTi82NkM%Tnio#p7Uom#`wZ^BS%|cq-CHc zOv_@}xzX6W1@=#X?V3UL=7>a}JSaZ-X%h%kCBhyeuzyDEB*H!+vA4dK1onp#`@dd^ z!p@8m^#h6h^A~|#si(PJ*psd^g#ED5%VjDl`pbRvT*YtQ$7N8`rfs~fnL9vY?^qj!ZAU&4LH^|`j;vV1J+_oTj3B?gJSycY zY{(x(kasPKO8Fcc^1cZ2uNFli54R!jh#>!ZK|lE z-HN=!ME=9LXykh=Dc@@%|8aCQ@)Z{30VeXF3ZjwEQIXG9kpFB%Bj>8fg$nY%oM_}s z6B??G+Kk9TCKTf?J!v*3(SHdpTm3tN27GmtS?hCf8=&9~em)8>U*N%;5`Ua-?hm5y(gYqHsfnj=;dqK10u3(IM9Y6X z3atwj(5aK>>{HRsdN>~14vuyUQ_AoMJ0mvAN17X~vsBJ2 zi;Z$jbLR?_PhArm<&fqcBv8)x#zqO^&~t%u;pEsT+cmeq`1GZ*F;;6?0^{EoZU7;1~l)W1ro_(@?ywEA!O73P$Pfs5F29gC{-)Xh`F_#u#ak%K^qf zhEe`{3=DEMz`$Rmal@;2jI2y@GZBOvUy4FV+ovLY?zt$09qRj8&+zxAJIlJ4y&s6b z;NYgG@O}<8EQX@3#(GjFWZ+1svZil+27IhH=_W5 z6bM_*gaG)o{Ij%PYlbzBny1XjgAr%1UZomEIq`D_eJ@t zN#W3PMTO>I?AT4Hq$NqE$2JY~jHh)^%fPgT9D@&%L0WC0gJ z6~s9^lEF_tn?4RqW&k2{`@yXx1*Z~|M_HU@D=hD$?8GZ9bZS^ttdHJhAEiAp)5yud z{sYpy-K3>5H^Nup7OL#=qax3nwL|3utx#IIwb*{N}z86go!5tl*K?# zX@wq{H^4yN?9VSyPTsD*CQcryIFwfg^pGXfhDjo^r?tX#2}x&=En1;Vp|(ZSgZTw* zoy~zmRJs<d73dsN$6=!@5&#>SPFIrn&(zecjB6(P$AMUPz{Vkh~#Fm zEjQ^zqjGEZNg~q;c<&MS=N&MSH6PO?$ekTbr8p zR4%AqykL=%fzN1qr}E{ZBrE|qEDI;_ETqhfC`x#RM&wv1)YY9>Pn)Hl^~fSF99mLg_+D9c>#FJ{bF1U6?TR31Mv?M$j;1%~8?dLIRr9Oje;q+!UvvIAH^Z#l4Au0e z{9#=?_u%B>Rr9Ok7exid%F!rI-1(`|!*QD4 zDAHe$Abq^I@-{)!w~KF4M>+CFbr@-y>k7Gutb!p#d?e4^iFO~k2}Z2=NIdFq=I3+= zS{Bc(o*YLP{H>MKiJJa;{t&#GRy((PO8gJ$wZbRQ(@U*9T&n4>1nQ1Fx`I9yMB_?Av?94$%dab0zWt?J_ zaf+tDn4bsg)2bb;PQJHFH&xT0=hB4&J=3aTHBQn=9EBrpxz{U}i%13ba*bjyTm#dr z8t`iRbBbPJb54|*?yYvoburzli|LyFEY~ZlWGB7iwN(?>X!;L?7U7@cl@F#x^516p z;L=?iRT_L&&U~8wjG}3j2`71(rh#MS@mfuPTG1Ko-zg2IGg(F=mUq3TZ($mm@2nwu z9VO+AC@CwfQdVgCQ(TMl6KIj%Tcw+!=}(#(nxBM*2*;YnOih2>)X@ASG(5`WHD;!l}FAf<229}(HcZXp!qi{k|? zNQxAk!yZfCJldn_52~T&{CK|5j7Gs9+G`h(r20iRo}2=t#b!1AXs@Q4=m7LpiydN*2!fI~%$^>Ls_P#cZ>j4a8>8u~^M@TkEYj7z zYOzB!qM%sH!ebX``l|e4p`Pxx&fTjPqiTqk-wKMtC$pi)c)cHy8+G%F{GmG!_XI+# z7NfS97AFf#3@cBl_wE)k+hVx$co83q*$6@52hkdGW}ZFDd`zu-IM3HuH91Ywmq+5d z#ju-rdJu6Pp;)zQjha3?nrk?sWVx0;OV#YdR?R-F=`$m8BrJ`Kq$i7L_7P2=5zS-r zWp9!6T`G@{TlMg`rdLQFYZKZmVOVVz{gKy4@mQO@%@V3o_6n%%J@KZ}>%!uQCtg%a zBl96oJZF&uk9wIUE?tmBT)IF;PfBkMNa@!iC9(DB68MI=DJeLL44l80EVl5(OPcOe zqtXTOYG*Sl1$U9CwAjj#Q&3uKdZZ^_*7R$XFOho*WuY84L(*ayFy^t0=~BWHR;-@b z%`!%s>=TWeJ`G{(68Px2VJp3qijRb?TxokP)$|j4HGQfGKbOEu#0#TX_(=#B(|n>! z)2BoNq9yPW@l-AXB0^EJkvWnl4n`SX$jT#{F_U?9y(B@HL+`B|9@O*_@hu9!Q&qo2 zItRtIKXFuXa$J9ht%c&SrcdJ8PaEYfK~Zzceu-n{@u;R>s-yw;pD+!374gJzO`oWw z0k@Pe4Xf*7oh|S1ypXnrN4+w?puMf7C(t~vW+Aj2FI5%Cp2P2`T4c`V9j-;iX})vF zQke0mzZ{`Fe}RKu1!aa~(JP4PuPA9a6wOE)()p^K9kFtDMAKh2Q>}K$Etx9eSUE$E z2O?=yFG|cA!?C7uOw(JGG#s3$;G;Scgt7d^KxVpr$9aQMJ?(X6pgT%BjL2waIt_LX z$-nxJ^LcF{KVu;Hy*;ih>cvvNvtaDh^vw)oro@0Nk{BB@zx`q_cAe|6nGC(*LLH!^U*7-KI6;sp&T$YePXZJSmX^<%Q0RwZQ%S|&Qu+Bh0@ zl1VfSG+5An4=3j}_rjKFkv{AU($d-0g`fX3jq{!x8RnJHcVE-=M_dNDnaR42Wde#{ z7N~!r1Ta6$WPp<0S2|47A7%;A_cJ4mD%vExzn;j@^yw~TM-(w48POwEm>GvxmkaS4mcpf>a41ey3rxrgyl8Mg}BfA%5@g%ZBf|^7dym zeXVPBBuU=5G1Jw1T{#_H&ApgoK+_8J1FoXEy8}Iyp~GO|5LO!X1iBmBr_p2s{h({i zTqvNjr@OH;)Y8@65$L8DS+4Qjjcp;UPwEW@ySjTS1Kr(S-N>-6Q00oQ?q=7p=0Hnh zZ+lNAHji-?G_?kr_EvTTdRn`hY1V-&ueqzTrR`8}&{Yvx%!JGebO$<{0+lN`ca@>8 z-tMLV1`2lq;2I;KooJ}@kBLJU8-QXq#~!E1O>byuzNf9Tx3Q}3eTw7h`5OB!%jK>-z8K3q`^qTQlg9PK_t)xP(`%OA0%w`&b$$*h zDgMYAf6I0>$b8wDXk2PcGD?ie#uQ_!;Wefi(~WBkpK+~GW?XMn7&DBS#%yDbQEALI z<{4E+wK3mVVAL23jYY;{qt;krEH#!H%ZjO-8d3 zFj|b=Myt_g>@oHl?M8>uX>=JuV?Rduxp%^lA&nYt%)>z}XQ!ntzyu%d)|%VyEZk|?tqx;RN2jQ98K-L&4EgeX1EH+(DZ{WEq|0X?c$cs-a`lW_8th; z9;!ODvuROn>w?yfMU~aW5kAQ&8=Fy&Rs5rJatd9T_f+PSn{i^{@NJq)ThCs5Bd^z- z(CUU*k(3qH!F27RjCwr-DSq`RzBw0Ukmi~bgL2p1HX3V9{VTD)xX#CS7oA3sHH&Ko zH;0F9@u1BH+KH%F2CBlHA|Jx%{I@ye69a8gNfbrNMnoAGj9; zrqKQ%xMC9U-%(@bzBWnjPw_+_6N%UUf9$;tv|DF+CVF&ioFhY%qmwi}3b|l~L$E@o zwID;S(tWJ(^+Ib=m|C5-NTD!MZDyiQV4_(}Cz{pXMqSWGz1&r+ zmuVy4{8(--*UI9utV||jvC`BEv^Sz$8kG**=lS;Yp0l^Md~$53ovxN0=RB{T_x--_ z`QE*?_3giJdmq>SBKL=(eg_DsKYS7D)xh6u)IjZnhlA>mY*xLuJ-$oRJsnxo?HN#i z1nPHs>W^HEdanVSF6?Z)PeQ5FMK5W2yS1!wba_Mo`>jSHn%a*I z;J>f$ev^0(V124LuG%fo;&!bshT-Bi^$W_mw0MtGV%&HiBt-IiTe&rnD zoNo=^zfl91dbILAoPQI`tTh1j_rT>g{|nzoz1-D1_j4OHaH&Ttf2zt4dTp)!<@Xrs z?*#$%2RHt9&CLB9y}EAH;pjo{z@;9o)KvMQwQ4;BmGfxjK74}uOE_A2W}^l! z^=RdmMNjSFuzDV?-0!JBd=a_V(aL=rHE^j%D=+eXeCCdX)$?eD`yJ%|5(anpjWTRCV7$>n_8^vyNoa7zK{h@?$ zT;^XOj1)xf%U4Lh5BFUand){)c$Z&Q{$vR zUHAt#PWs=z*Hb+!PcQH|>19`YP0h^HrHqq)af6Dn19}e4VvoE3B7QIQD|cq21}=4+ z^v`kbg3GKm0QGYiL_qz4i%_p|(x*3S;8Mp)f2GO~x<0J`al;s#llIhK!Z_(2%U-23 z8@SYQQd^ZDS{LptjguBV^_MVCTEYX*TxK?KspF)dSLKJjHrD<^J;zDQp887|C!OA) z0sUMpdLxbhh7+AUiFO%>6<53^cpW;j)-TUM?>LUy;q~qk#!}*0=5pHc z3%s)S9o0W;2amDL!um1yMW36nuKet^ULR&Pg>~mUH^CcU{w~i=xarw9cU}s={%&~{ zE@5(6^kD5Tw(Lc$bzh#ma}x_2@B3$+!?8MlLrq!J#-k~mVS9+Lb#rfE_yT6{a0f@3 z?|f{QO@{GY|d6H1h|T1SHt{b?3lfYdp`i z#dhlLS854Madykib6<~bz4E$K&*DBF+}6VTT-;OC{pZeo^fn%L zymt%2>>{cxGt0A68%movBqj_!L7Z&G|cHgT53xnaCrb+Y=g;bp5I zo4m-q1%B4o+*&!jQ7gz1-j4SQ)VT|uy`Cre9o;~ug<7#+u4*Tj!dG!WTc-T07 zPSJ+1-`YS54(#}P9&~BjNA@7SYWvd9d~u+XfQ(z#$OG*RBiSHmrf`*)1$H z8(7;m@CM0!&tAl~@vK+*+_4Q?`5<1_aEW>Pi;Wt1y*u~(|$MLn6@vSFVlYGr(TVq$vZ++}!?CSZ2Q_r4# z>Lq*in#%9Pl(qA3xg&P@i|4jpb`|d7bMGL-Eqr)A_=mB+`OD3>Vd2+%+57e02Ufq{ z-$shDUYGIf?Rz!Gj?H~j#s{&a+)w^Pk+H`OzO^lV&)>_{8*&i&A33-S5*LhNPp3+He{ zc6__))hvye#qZ$!>Ps-E$Xu;a?)#yMA{FtX&6xPX191fzNo` z#&?In&ocx*d&znFA3X#<=k?&bL*VZYf#<$+dUR1kVBg?&VQKLq2fIs4e+L8HrK^^% z_77{9Ijp_rAL_7{2ln3`)*iuR&@0=0XEM(>ti2{M@OD&A%RiYjvAeu&gI-_*98WX7cvap5h&>&hWZ9;8qNLUJC?R>=^-8)nJFK~)i!5jih&$#kSU*lvOOMmI6+_=t7)PYgysi!dK2d6l2lW**J>vZQe{h^Os|OmS-Mx6Lf5wU(w_%-h?gQ+$+~T`qZgYw>@?e zuP}ZLvyMFVOTRjQ%}LDg@%U}O>|H!@lTA>!&9j6VaNJ}>Q`7l4?gS=c!0RgT&I!zT z^5hebKK4btSOj;9pz_BtiOBlgG>pFD21Gx7?pd1$;#EJ#A)0R*h*#}hT>Pgx3&eIj zY4&2y91)AyG!U^XKK|>t{*Eai7I~#{A1(;)JNoWD`;NYIHGA~kcv$a)xQ+XrhrR1c zZ)c=8J;X`wmGBTG0MFU+x*n?7iAzws_SI0lhT=68$8E2;U*Iqfqc{01`kDWX8nHa# z{?2|D!ClGSK&y9O+ClG*$?rjZduzk>OTK$+nJswiZ3pnhtF=6?A?03*&x`o{ioLb` zt6?v|e(h?l`1-xI@{g|8N^f1Qm495W`scXZJJhWD4@H*|SyiOaq z<7~)#(4J?_o#*PAt*U>e`!|mGwZewnBO7f~qc2Rq;{M(sfmhsbImr2gFv*ZNH??<4 zVgA?dh;4oG+*MaR5uG_(l>gSIGspxkkYeM0`;TKo#$7BQh(&SjblZow@`gNbyZ%oI z(sun;nn&OM*42-dquZ|d_#^1YzN5GND7Nthnl*PD(emalpDv>Wmp}Dj&OYlS6NGj7 zD+_4g^=ma>@HJGcHKnb_K2NuTUSZq5h4*kR!si3?QgdUE7DP%GYEd~E%Ka3VV;-F6?&n`w`0Bm>N*A{O z!KX2k6?*XA`PD6}OAFiicEi1MH^g4T83CVo+IvaY+)C{7E3a9bCl9m7z3C0SZQ;yg zPki~zsdMhe-GG<(FI;vOgVWdGO?_A4-iMn|t-Zw)=azBP!i(Rqw0+xc>-p0A2Q?I4 zxGeaZzY~l@N_uHGd)^3J=&wBAoehb$g zH_O?zbMtRIzsC1Gf!Dg-=FN15x4Uigy+)1mo7wBtuJhTiL9+Rp!7W=iQXi;zx-0%( z+PlTpQn1IE^{sD@y`GKK`U?Ty@4b0#9=b7`=!wT4Jb8kf$kNy1@9<`|o971{5Mk!C z_4WRP|F*IJvVC8@1uuX6+WLf)^DhfdJ&9ys3yghp{tYKjJ&mKM6K5X##;Myh{o~ma z=T2iKlQwUrH(H8qS)9M#@0S~8@uj}q z%>;S&#KWiNUvj&XGQS=3Yo2)&uE(Bu`mB3j$o!4BKlsdG1Lo%x?EZ>KuWxp#ooMd12D3l1U{HXL+v zOqTf$?f}(Zf6nC)AMEGAc#K={(~ckPUvH^Iga!%sC&^@uXm&S#)IWG z-S*S}4vjADv(?XW-fHa`-q(&JvF~K7-MirOj`2R`J;aTE?OloT0kRk$kBjd{0F4Ce z$kyJmlH{kznw6++^%uw4)U|+f4-*^StdQy@34VC?#9_Ft!`4;}{6H$+!nH;lfbrgaLtq8}2ct*w zj)7d*?u3XE5v=$M>|hDbF`cb_b_M5~Tsv`xcdzhaL6%Aa!=-p6OK%#;h3#a-WmSUy z9Bk`f9(K5Y1(rhlMTf^$N)GQ{DHBmc6<9$FLDe;R>p(7Szag%v5-i<B%+2Cu!0tX?Wg6<0J*UJthk&?uyh`_wO@c8ZokMhJ2Sc`Zy#v&55x^;mKf2C`o|8jwJSP;y-fvG1ocP3 zvUeD(xrO>UJ3YC?%o0g@v3^nxkFBH~VrwU&R2CR+Cns+n$c60`#1&P7rAx4F{gh#c z*H4wD(7&3)yI1N&lxzSis5#ibro1g67q;6L*O^(OOE2p0ImC9a=)uhBp}ZrY)jt+D znOP#T)vG`1@a~lu5&H4YsJRNN262G6>!1&yYw>u4v~K%>K_2Z z(L;GhKrXC*EN%j?>Ct}+5@$a# z_h58^N5ga1;-Tu7dGBAm?U(U(fxpD75B5wwQ8MLTd$wdHy1)td=dQII+vcu~Zo{$W z+{zlU<-^g-`S$EnU-_Dky)pU{j|^}(JdG0xXV#9Ab?oR1xgolU!~Cz|0^!NI8`qk+ zKejFWrihzyx8Gho)OEG*PQbZ?OAB*%0yejazi`$p3LSt92y}RW0rK|CI+4q)^+n1KXTr=;x zbc~v=K~2~CU(s><(zOVCnfLyc+m~L34?FZ$mD}+)_xHuF(;HN7U%C#TR{ZY~xqWE` z)b+j>o!pMst-mj})Avr3+wpec_r-4Tzdhvkr5omd^N!dq-0!gO_Nf`+moY;XPuY4$ zqZ7>6rK8c`rRhDT7+pPD;}H)ITyTldJy{lAb3O9Ns^_|hsU#oN=6}HdHDGNvmDD3| zcCPhrDUNy$;!*2EED&H12R`8{)H@gO=<=1>+NUb45U1z8YnJv%_VdnK6h*P=GxRne z!Y^x>wjVM61-f|w6xUGCmn0st9oXe*ppDlxkm8Q{d3xey{%5xMcE4w>p`Y8RAwFG;i!2w_6I;vw_eKq@_awG@ zu|2VdcH?J#gLQHs+>?Ww++N@4Rm_nLmxJ!_`X78b4%%J=sfv3&Ik@rGHEW$br-tVB zqd&7D%wHAm$)Qd5rE|KTHqM!SY*Q5WSmRQoiXx>ZTipqE$b4_gc zJ2SguUUM(uj}VsgHRnwbAMV&)D6`owk~h=Wzfemo>0i(>SK0a+%X%Gi>_v3UYwpjU zr@7ka)N0_z=fY-mf4S?&+c%!k-M7YaUdQf1v5Wb3dCmRt^E6lcoU4E8SGD@ky=--p zo8lW0i|K)IRfWsF?(g~^tT9r)j^(|MIrbvfnAhCDd!FWMpHr(-YwSL1*<{B)irBfi zhz=uJ(!Zc%uCnz_vEX&gu@})Xuerk;H-{tZ39isQ043g;_5;{aBe}S05u9fC=spa? zrd}Mf52JwKTSJcS!_Vnnyg39f64^uRji?L1OM6#tA%#))-j%n5!VZ4#%DYIpDt^-U z5|W=G>x%q5*gGMNvA>x8natY(bzul;zOBpYo`;Mph-HRR`4)?@2 zUaVH(_BwMBL&p2mR&Rs0++JnvT||F{kr}oKxBm#d4aM7k1YU*W?LS_{eZVe$@53)5 zI>=YjVY(%p5m@_{Y_#F>u*O}lz4PT>R_=&-IP05%8Ac z^{@KspGy6CZ)pA&?idc9i2XEXjl!N`^*pCtpS#R!I;FYTSJ#wy2K20smM~eS@3{Z; z=$l^)5NA)!ZP^w3{!6*raPFqqjo5~6T)GiwU2oj}*|j?g=ia;Y{d#ixCO9qN57q;2 zwE+L@RDW;e{%?eF`d6_z4+f;X{WY#O`R~;8Sk|d4Uc3Fl<+<3F`T0fOLv|al9^l-w|0YZq^e4D6EHhoQ_83ZT0^x#Y1{D1uX8N@8i-{9R=ckW4dQ>t#& za|M>Zfg9E?+rIS8rRSFZX6bL2zRer!mbT!PtGtzMVF}ZCZP~iCW!uu01!lzrxVzMD zMctTC4o@+iu-nuMZja%+P3RSW zP82)d7x*?cchAnpx;wnXh~L6k7r*(s(F>RI+^?d$rndtcFrN0`6UF=Pr+!Fg-*dGr z{Yh@+SnRX+iG9U`8ocRjO-PhNaMzA^*AV0VBK&tWabCPliP){yeorEHSnEQF*bx-* zA>J*xCW7&P5&k>3IIq~IL>y6LujSAg%T5p0{z8Oz8`WAS{tNF@TobVik$w?71KY+0 z-qUqlB3P+^frwqfOxzq0!A$x^>u{$7Q&n88v@e{&5*18ZP_5?*-9T36MmS4o4fQZ#iiqMeh7M;qUHDn5k_$W?P zoj((+0TCOIBe@dXIM^<>Jt`41$B}`r=sAo$*F_wf%EbPFh>b78t&7lDpSK}!IpD$C zU#yM;!A#@=BKYm{uZ{x&5gQ*VuZwu2*WQ;U;^12Io&gaDgChP2D{ws%jQ5K;7!a}X zMUiz8AN3mh37vpvdi@JT914nfML@*#hIuF;V&m%>>mt76HF;Jd4*M0rh6o&q;-$!e z?cz@FRFpdx6ujv(vIB+qDhQvLO`OR0>G8g%hxLW2pgRA8b8!`X4$Ap+tj6_~!!63U za(-BLn^4|ckpFj&&~bt`_;I{{c7%Ez$Vpr-{fm_Mx7=73)GMbs<{kmaMuu?3&tht zOpGl9BRfKYk76^}Tl)%bA3nTV`w)WP6noYMzsUvr)@My;6!C;~^`UzavswAxK42jE zEa_h$|6Y8y6PA2_JMa~VJAqHH)_xA+-V)=>gMg78C=(2P62HKB${7dfcqIB31mB|I zTh@cC-GeCajn6)V`1S7XtKGa3MOn;DjFDQ9j|V>{5Vp*)B#a$2Qo(>UcsyQ?8}?z~ z8FSoj9Sq2U-%UObV-Jl2j8z)NU}OpWe)45M@7>Z5*MWUC@0Nbp2Wi)t7CdrIy8$~` zs_A+03K`rG?Cg(M2>96cKJr_`kGxlH-_eh|%^V-Q_{ej|J)nO&aPMyHATtQX3`5K) z#Ee7CB*gH*F4$Hy#Kb~O91QQSOE~jpXi8&I@3UlM`odojTbwD`xG?&nI5F!zzCePwja%uid)%FJ8IG zQ$-kF%!#L;#xsk^z!N9VgyOE&v??tSflkS{m5d6-W{`g-U0UoC&A;PSasxaSn>e#-O3SH8}= zK1Tk&w~ z{PwRr^W-@^$N839AI7GElUFN|D=$}ncYo>hH%@%{8y`6JzEdCg^1)LNf9c8ho__e@ zFWvV3_rCvU56`Xmns<#k=IW=P`QnME-gENQgU@^sb@9er?@9GjC--=dsRmj&_2?6a zzIO1;*S~i9+*9xUz>}xGc=Fk=oH}&d&wc>^ArQCl>d(5U^A$P#K8dn~TG~!L_1L+u zyKLQL*|JpQYlVA^Pn>)5DJT9a?;+dwa26nT?;6E>w4-dDKKSG_Pn^Wm`;N4=z!iOF z{ylfNhxViI#Yr%nBE*?e%o=jp6(4^ohdAEb7Id2|&lKovSS#?mwfAVmyB@aj$rn`U z9pfI*4)1q`JB0?=5%S5no!*TWH-qNGgZ_6QT(+9}i|N}`t=2hc<1(|>&}G|AN?!Hq zoO}1il`r6SvKOzvfoQ!GEI-`|yr;sw5@@<3d(>8MgSNaYZ96u1CF%SxEU}#3#C3yZ zR?bFO2Hyj5di2**)7R{n|I+p=Z+!Tfr=G$@SlIcW#GF|6VD;Oketc#}-F9$pXKeeW zTxZ(;K6jntMZ0jz{F|1x>&nuNTW`h7B(}!4#~0&E@vGy@@oVEd;@8Dj;@8J_#=k$l zEB>1JP4R7beZ@8L*Tr|oe<=RL@i)Zx#NQOZIsTUTYW&vt-uO%6Z;S7b|5*GTY66!b zR_1Q-T^_mW0xyp6H5r%=B6`o#g8%A;n@VH?*>REx-EmSH5+;cMcaEczt7O%XZ9Y7Q7n4%MjiLiNJ*uUVunW&5Y)_n^6nq zp0GWA@RG%=|8fqm!g=y(OeZ&wcZQted~NFyysEPA%58JFTyyT(+x(X`qW|>?Zt}kC z8qxoHd~wTH?8-*$@@ud=oQr!?Utj`=Yo9uWJ@DDb@Wcmamcuoct=nUmh3(NZC-Ef3 z<7c0I3h(th^_6$LLVV%r@!7mU~VXg-zy z%)W5p(ZKxNC$`-Y+j15W(eHg~Ee3P0T=DVSUlh^RjSMX9&%eGECJ*%8^1@!-;KS_e zRoC9h_tPzI?)ZN}g1#kO6dK@%Vv)~0gq{&+8y9#@-ereoj(*U)1XJzq#|b>|bVFtfRu3M(j{5fZcrH6;&veJ>Oaz@t za;YHaJ;NR3vW&|Gxx7_eptBfs;wkQTtd#xS=L64k2R%Hg;MJz*xp6ez1Q(3r2?ZW! z^Grg}!;=a0bVDAVPoSqC^6)GIJ;RWP=MLy`XAIWgvQ+!L_k1@z?mR)j!}A0zapwsFWq6)|wYjqc0Z&#QcTOPSapwe3rhtfGJ4KZ#g*;{F`K){Lo9)#? z5p@@F%sufPthGrGZr^JGxv+dYRKDZNW6gv-J$d>e&p@7G$TN~>9P&)$iC~Np)ERX{ zRIHhhCoWGS-Jh_l3FHa%lDaum{dCKxsL!O#E^^m6_Pc!6c$B3~`f(Sjuzo@wK6mcEKOqmFIj1KT z^6<%Xdibn)upR$X=RpsjKW7;}aUS&W*>ieIArGHGr>7e7)a0qtv-Su&V;jzMY^53U zwCKTaQ5)#}79CsZgrd5N>iMGjp{RkPhCrNN#(c2HRz{(yv7#oxXB8E}P%Nl8%B!o; z6$4sbd>LslDxs(((CSJtio+VWP(xZ#8KA3+&+b=n)64YyN*6Qc{6RgzutN5#*f)yyn!;n)7cmXe_vm4OUDh2TdbP`Y zB_0RuoTe3Lk?@}C^EG>cH_7~(n%y04c6Yd0|E(}eta`g=bH_i=Vb{&Y9(~y3KCS;j zZ}&_$JG-ZR88B`Z-ej}7lKvrGsNl&f|AJ;$-OIJH1}(`)(Ln7Z{##!BJ@%Tvz*}I( zYJR`JZP;jj|E%WE-}Bl>p8qj@j52ixj(5p??yw#=I1p|g^Tn=h(QXrC?~kI9+OPO; zb(zk9C*$BISAuuxd+x6#<6v0E!K}W&{*~Zl_`X_9JsQSL4pJln6D+j+fvEH&9d*Kk8zLJZEZ*5||9nOtuaZrjs zCUxL4tHdSdhPWnh5pm?)VKRRV!R;jHF8tdSciseGm)kYv8Djg0y`OdAAlDrjgB#*= zg&b@i5?@anKSX136Cic)r#XTz2IHbYZV}WG6BqY!32{lF^&urL4WwSylY!0lyyRl) zC&nBH;THBF2ZpWW=|PDCa2LE(QxsPMIyEl&zZRJ2j1{qbO|f<09%Zm0t_fuJp~Bq< z(GuSVs$Q4P4tZp*D}N72vE=&V20$*hHiqQkAIU!kJ^(+tiMR+hY_A?nD#QaQ^fLxz z=Gf1;xCGF$o)nh??m!&-m=>1-?i805mjkY<-+6Hb;C`-&K*oz;_o3C2!!HD;FFVL+ zsH?$upX@s9!|F)`_C25SVw$j5T@Q|}v|zJb8)&`ii0cBaS3PlkA2$#;1nyR^M&iam z+mdd(M#$=*ffOx+%*!qUL@5V?mW1uv;HYVgzZ-fUhC>I5~I>5!m#esKGzqBOC!=IEt1vD*b zaTy@%K^fP6R(uZVZ$D2Sbrs|<0xt_F`7I$g5H|!qz+45kiV;|T=f)1durg6}1cx1`8O@Bsz7K;j+A-L> z^_`2uKK@fUCk#FT+f#<=4q>z96p+3&(CW&-wz{&g_iJtE81r7Qt~_nm%g=a|jNvz- z2#$4?fNY0bZCP9uxS*`m#MOZZ#5Ke+yr=7 zTtsb0fwn)6!M>h-LVI!f6F_S(DJ})H_R``qz#XbPD=r5-A}%kk09?g7qSm6g5^z7) z8`>?4s{*avnz%a9+HHty0cyC<#> zyjR>n+z@EFAHlZv#_~^q)?Os490IMqm^e<=zC(2<#3h0EiA#w~16M7F;<7;7#&Y8F zKx?-kt_ZYtOXA8v>t|J54S2uWt&3{_t)ETU;ccwNNNiDUmFNJiwXV1xaF1&4iyHus zgX0!86gL7=J-4W_xCyYLEh@rCY_J7Hf%hpJF>!IAZBYqvNuXsTB`yub%5iOE#ASgG zh|7t~1J7xTD!{fiT$H~AG_7TERUpeye@$Fn9CbHfd-dRwqx>zP<*O~O1LVSby5f4k zGmgUrM%eTX6xRY;8*OnNAhob;S6ojVwe-aefL3-WZsdy_i<>Y``Z)Cq`x^xwQ5!LF zaiHl-h)V*`DhDZXY2Y4}&4|kat!z$Q9(d03C$0#zvL$h4pp~tPs{x-=*}Av}aEID$ ziff5uUfSY1K+8*4T+bKR7dK!W>SNiVxDjxt+8B$Q08L+n&vG(!I=g4_0R z>Uq~StoWzTch*#AlyL55v!}9t1gfx{xX#0a9<2Sv3B7~oId_9IYUewPdf_s3MlJh_ z3zu=+#LhaK1(D}Dx3&w#+_^R1ix2Gl+G)u+WK|214V+)|PRviA*gJ}bo>vM^^*#TI zHSDK?C)R#)#cTg?SPmW`n|Znqb6Fh3$u<8oZ8OgGF*}rm^L@|%eng)vnsamClq`PX z{R^^mWOZX%IOlhGbJ=pzYVST`bIon?*(!Wru-x-XPgli*wZC{ciBz_BZq}(%%bgQ> z^xa4H)jsZ`H??+sdhcWto79VuCYDwHCSqYp{{p?PvQ6uC(HE-sE;PAWz22Gc=cJb< z{R{NE$~LXnMPI1id(h-&^}gK6yYE$=N|y95(CaGOv|bl|+^RU=j%V$w0hAtUVPsC_UocARPTLkVw2nNM-hvksiXrpMDZ-|FZ8;~Hl1G=eW7~q zM`N4S`yD6jxb(85e}P_C*{1a}+C8>d?e6;Zxw$Lu*!EvQq~CVniaY-Haj3#2hUhlN z=z@gza-c;p?urJlEc41mlAlucW1prZ(%!3G&L}#^in8uH2A=fyUg)wwYAs*95>nd7 zTLC$ysKV#`828m&9p}HA!8SPdXeo|YGpLeWM_d=U?6}Y9~AWDmCWzVEXKuwCy1H4MSBS0f<%J_cH^CgLI(6I-vMu&FUdM0^}rq3%Gf z33-!1E-aA}m$nipoiTr)bXJi$^CB`2+j>>-*+tmwmG|Aj*-m_>t}<|$EyJ$D=1m-2 zQ#JYPz&ST=#_=X>?@NaB^76OH$!-I=xb0kA7s&BG&mi_3es-lV-vBuMox^qx)@52z zV~axeC*mSdMAd95Ds?g78F6uO37~!RlHyXp-7fAkdQHpcL$7HGuBDtx=7C(emI~sE zzzR9!uVnt?jN-zpePu;f&5OtyY+FlppWT4%wmrl&eSAx{t-Urrv&9aOd7#~eZELS5 zf1jLkHh^twZz%r=$fH1(AH(LtoKEDA;5*7AO!}j+O>@j=$IV8$1Z?ghl0=kA0mExJ z4VG&-qo}M!fy;@@1KBgGDTpfq&xk9DD+3RStBR`u4?FHN-iuhUz8dm1ffe|IYq%wE z8_0!gxFfC$tdK*0dgc$T;l3gV=0)TXwq}zr`_nWz=+DTP1v>o!%{h7VKrU{Z7FVXo6+0T0r)_4YXc$#C3tzs~$P@sxRLFSfTDftwVW7KrSpX7B{gHXe~ma z^ao0Fa6v6G^TLk9=11}gpPht#J$bCh6l|`?G!bzbV0f#~f@P06@?ccnqQDiz6@kmB zm0NvDTp4&qTvc2RXj^?i;4N{xY_7?0=Cy5#ppcobimL(dbsY91CpgAXR9>|3y3gU`Z0-8$Z50ow|vT9yL)?izY>pr^y+x0k5Lldmqj{w>C zHW2?@uR7woKqVfkyN5N7{%)GGUu&q}K zpPhtl>oEn}?MH|xlL1mdP+JzP+m9$JZ&BQjh${k@QPS;4#Fc?(#8t)BfcJ>2i)#Sy zcO3R3s{mgtG=TM6`MVE#b1hKd}S7m;JwmaU1;j^L_;%NAmy zuq`Gg+r~$6d}am{KsP!Kw3wt9TX>2X@T8sR*h+?o@>$@r>k;-S;_^U#yWGe`ToHIg zTuEFRcp76Tw?`3I1Mbw=st()w(tz#y5>V4*Dd=nw1D-Y+=<5J?slG1kJ^1bhBYTWQ z9erY;j)C*wY8erAjeyJQ>sZ_bXnl?7ibWK7M175kivv%puL*HUp!GEc+xnV@9qwy} zrJyrQ4Cu@`&#{#}5jqP%(^(W(0-DaUxGKXgY`DMnKa!7B>N!&WNsRM1jYpGbSz$G@S|9rZWjUtTV+@(3vI% zbY`3fui_&@XAWpO^Wq9X(^(W(0-DaUxGIqI_;4GqiK_!mX9KqBY{CxfY_Sw{wuu3q z9p}M)9YpBt0ZnIL+yH1ghvG&+(>WG50p2H_{;Nc$lUIpMC$AKRbtZTn2|AO+fXFkQ@0ZnIL+yH1ghvG)Sd!%zLZUQu&5!~5sI-{_|I%8llhgQYyNbvKBk3qQ! zGLV@B+Ab~y+f@ZVZFZoO8I}q#Su#jSF67CRK}`kV4(>Q%7h#9RmKcdT%EUnJRWc}7 z1KMTsI_z*A4MuXs5Ce6z$e@lk(0bZ|9j>FxNYv3I2I}ZL&#{#O5p@lL%i5Wb#EpTr zawp;8y&Y0q>N~y0`|=bT(m|&KB&j&NfRyXNMTj*>xVw=|+UkKG1Xy z#0`O_b0lu;<0j%F2&zbD6t>GT&~(OOo6ZF6u+Ah)L1&5>(3y4~3|NTJnFX58oVYv? z|GWWK^=LZ)lq;QuA|6E)KMY^>L`;z9aW&!QG*?>qs~aw(I5uuXgUvW@g<_JHgFla z9k3qR{ zGANz^T9=csT~**yW(PW%W~l(f7ht#*6Y}K9pr$-bcumFdSp;XA82(9VDmkY!N?&aQOAfF zsAKFr$5tjp)D^+2G?ul2L}8PQ0c`_`i%S5HXroDr<7+q$Y6D4&%K&Wy$-=%~8%Pdz zxUYGZg3balptI;ac=qs0ofC19tJZZ!VY?gyO=nzO0=Qo~lj2f9)0u{CIy11tIGTaF2Ax#U+5IGYQ*treKG4rdbL)GsJ+- ztn*+{Lxj#e&~z5W6@jL+B(4lRqVG{vTn)HeI_u&ZK-1ZTZ8}@9!#dk61)UvYKxfx^ zFsLCyXCG)f2jYf6(>W412Aa-^xX9Jm??`79w#zZlbjD$u&IIhR&Lm4gXNnlmnRXrw zYKYL81)9#BxIB>O#@tyLaYf)xX)1{;lhb~>3fnZ*V23r;SqhpO#DJ!z^Wevn2u*FE zY3hjU0!>p-TpzeYng-&AK+`mWZJNfg!=IRz+70x&h&cYDURt|`Nh{l~0;tD|1R1{ZYkTjLWRe`3d2HP~%VTUy} zSPGh&#N(bKevdF7aUPr@AVO0Ih<{E~S6mNh`-i@`0q_Xo_+1=|8v!|=Cb_Y=3D9&# z;_Eu2u){iIV5u`sJnq+-aGql;Ng{NnfT-H(OpD6^O=nhI4tSq*=EW6&&q`-eTnT78 z%djni|t>S6mOcQ#$+N2EcRDITSZyoc3*F z*rsy=JFGK;o1UpNN(|_XIS-y_B0^^ZXgZVPQb5z07MB4Ykr%t>1>PZ0ByZ@#r1$^q_Zz>05qLL*rsy? zJFIieQqVae26RU7sz2(B0uN~Y#9-ea8k@%%i8>O*Kpjaks3Qg3sgqM_*x@=dj6@w- zVxW#38Pt&n9#S0z*x@>gj6@wJVxW#P8Prh)T3>3g?+f*%&PdeJAO`Aal0h9Up!KB< zJ6uPHk*K3f4AjvhgF5;^>&pOkxQ-zsQOAfFsAEh9bxeSE%oMp6+i<8aQLwBdMhw&u zcb;P_2_ouB0++S#Nr_7XZ5zyp%K~j1%!$hbPiq@2h${kZ8!W-LZLkbGybV@a3OZ}V zfX=$}VDdX6bT)yevn8$#G@TuBU7+dgiR%MTO6Ne_5NJ9_uubO}c39_xrJytNKTYe5 zlHnMJ2%T}D=}d@A0!?R1TpDOPGvczq2c$D6E)O)F1=yyu2s^B^1lD(wqKuEhv{uPL zW({bYP#w0b3Vg%tz{+T{RDfxbK|H-hyOWT7T7Taee>KG6MwGYXljuG&% z>KMZg*D+xvSIo<%>xhy;9WkKwG!8plM}m>4BS{SCNRdGuX`t1SfqjHK#Xw}1k*Fg_ z40!TnP)7l1brfM&LUoiFi8{)}Kpj=*!89a9)Kv#A>r2}Z*96)|))LnS?$i%lM_d

&$`jh5Oz3UBbI{BF)^TX;ylMzBDm3><)c8;850)=n$Co{B+zuG z#HE4vOJ_!0mT}UVgKawVu){hFECroKVnAofc`(Q)LT43dI&0$UK-1X}*94l*mbfoQI{d$3JsA9h&hfTf^wNDSy4IS;0NAwuT_XgVW1JT3|}oiTB7py^DAO9Jne z&Xl+`&~#>Co6aoku+AJ<>dX_5&uQVnyFdo|ia@uG2fQVE15B9=YO01jH8QBF4h+}S z2*o$apr%&H(zi8}hkfX;#Q;J}NBx< zL=s+H6u47dOk5mzPsEE$h)V)3|0&p(|1|7y{xd8EompZ)XU=(WivbZj3qaFZ6juV8 z&a${F&~(`3O`z#)!8V<3*kPR=mV(YMF`%>OJh;Vx2%Q6<=^Tn10Zr#v z+yrPkBiDIlqrf{Op3a!KIM8$^V4Kb)?6A%hOF?Iv7|@w<9vs{fp)&_Goq2Hupy@1% zD*;VsSzHxZkHLk9Y~K-wS&FW?T$teT|Dt0FS7zNpUI0ZSl&aVOw7_u)}@Lf~C$J zF`zT=JUHn~MEgac=`4vW18tpD#nphOvo5XyJS?3}aV^Ge@#=2FHk}>VVVzyD)Y&5j zboQMGCw+;~IRu){k+?C?bWX%YR@QY!VY?gy4@qZST!L|1Jbx0l=}f^6>rAs0bY_SF zomuC>Nnav#=7FZOAg%~Boh5N)pyjhFt_D0Popo^y#z|)rw&`ra4(n{Q6m)io0i9hk z(ANX*VtoN`KNLS8gPMjR&&YZ3Yf40o6QK1t@=A}308y#X15IZ`TobroI$Pq}jFZj| zY}46=9oE@nDd_AI13CxJgI`A?bdG?gb1ZHGG@TJN#JDKXbjHNRfveJ)5SL_}bf#eA zpDUk+v5j^>O$ID=W{Ck$&Ux_bNJRSupy@1%D*;VsSzHxpI&0$Uz&+C05Z7d!bhcpQ zpKGTLV_QgP2P}1Vi2WA30-DaTxCzj7MqcHWjRJQ|XG~liXgU+H zQOvcIguN}KGsRNSnI;BwW}FAVjzs9p0ZnIKTmfi0i{eT^(^(c*1@4m0nz%aSl+Oli z)7gX_*4bhy=xh@MIy=sT8}NwG*#nx+zPJICB4D0ZnIKTmg6l>y0DNqPP-phjf<3Re`3n2HSMj zVTW}#SPD9u#DLD0^WgM45js0S)7cf*1DejhxB<{~4#kat%hEX(HvyW?NOE0g6n0o= z3@mlVi2A2ZUi))W7wv10z0fTa)YNcN(|_X zIS)>+6QMH!G@VItDWK_0i^~8_XI5MeI47NXaRs31EW$ROCD>t|WtKudtHglLn)BfF zIuSY>K-1Y2*8-Z(wzv+^baut{fY0f>)fYDan$96?(>a12);VS==$sG(IwP;92h)lY zp)&?FopEsqpy^DCO9AhbrnI;W@L6$LaXFyr%)>UF1=wMoMV5lj5;35&>^#R-szm6l z0ZnIJTmxu2o8nqP)7ci+0iKi2uDBl1boODJ&H?PO&LK-d=ZF~4Id&f021JC;$c^hd zqp)3$fu=JqE&)6uO-XSn;8}5LaT%cL%)&OEIoM&Hd6t6C0x_Vo=sdU$hzOl!pyjhF zt_C!nb#V=#>1>K?0Z&V3TU-ZdI=iqQmy+k7HUDuhj{0zZPmwkABC-zKWd(M_XE$Lpb2yEDCxO?MLE+fNhQGLgyw5iG2U8bVR|r%^JvsCF0@|GfO1F zQcg-yX`so;h|2<}{P|ofKzhnbfNNw zLYlw|8w|*4$=e2UVTq2o?#vQBu$0qR)BtF5hT=xRDLG@hQ29h5k<=_XQLt{m12j2t zafz8Fl3*z(rKmK}IF_@jAyd@wPmMDv>&MZ*_OF4B#HGn3k zDXs;alGCP(saHrBSYd;KmDQ8C59GoU198KdB}QN=XRN3R(Bwp3gBrNs0Zz$@(S^$6 z3P}JfY%m}vDQ^nMg(cGBGBZnL!BS36QF)-rDTpfqr{t9ALgi(JRDl&X7?4www+`gO z5)E<9nI&3aDW|Qd4$$Ou#r1$wa{6?k@_|BzzzQ1-$Qj8y26ADEiMYsXXO)P8rJNYh z?RS7CCm}8goRX8G3zer8k^xrOU_ee*-W-q%OXS5BW|k;|rJRzY%0QD-6;}gJ$*I$Y z${Px40xN7VAg3j78_0zvI^w!BOZ31}PG3<2pvf7E8v&=}jOjw<6NN->nk6R+*6nwI zCMPZ~F|$MxEajvWl?IxejJPatN=}Y0rd}ZhU>|5 z(Bw45wSZG{+H^7X3h4qXY%s90dh+&xTv%ctZm1G?vfO)DfcPA6oKF}dPE4xSmF5SIj=<7qpzo)VV^vMj61z~(|bD;urf4~nhlK>5Vv z`4P1jfGkl2PKhbWRR)@vs<;}^#MH$#fcHv36E+uC-IDDS(+1@e)8R*m=>l1z2b>bq zmumntF+*`9potlan*i^TfXM5d7FTstwogn9lut~YADMR`#Uz1KVp4LYfhHy+E(K*7y+jwjpdpEEkBVT^unV+6B82`2i_$C3D{g%byBuZObV1w zOqw4dCIe)NEO1IpPOd!A#1zC8fhMLTt_-xyRAHN#nrxq#Iw-c@0J8NaaM^uDF}WW( z9L2Wf>i`$nufVG6g5`dzr>MR~fg6Y$0+&&eEseyDfoH@`#6@n*i1b2lzes>_Vum> zY~Qe%tr`(=bznGK4Y15sQ&BC80@oJT0WPCfW~(c%2RtLLFKz(5Pux)42zbtMxciD6 z`aY2_lAe{VC|H+gAQzU1i%VDu^e1Wl<6fMXt&}3u=0#)%wq+~pvvaU5TY1>bR)L5z zMPN8vC9up^Sy5Gs0#_4P2QEXB+ls|CfoH_E#I=Ezt&X@Z@L3m!>-6N%_r81sU!qF`OF&5Ou5Y|B={XD4A>wot>oIrP0MUkzA+JD9DyybT~1mS~D=Sqb!~ zZT>*EI*RO?7m+>KmaV?e9>BJ3YY3a!8WEXcU^rV7u*_EEhrOsM&_#iZiHid*TM2PV zpk*s1E)BG7WyEEH-qk7G*+UL}&&yW;R+x`Ke~a>#fLvIjEUs!L(4U(51EuSVY?v33 zP1u&Lmd|d(wrq7^Gh1CEGYkx8s}Gjh8YpULQQ$`6#=vFh=C(Bv7x|I(Y(-(Sg&5GX z6&IHPdeWdoy&!8{N;85HMctqS-+yv-dNyc5^ zZ}9paB{I9f3iA=@Z(QC4kPEYw6qm9RD4jNcpmau&S@R+?2ivlh_t^#5maQUeW~)R* znKCe(ttwb%tEQ;BMS*LGYXX;{o0(~eYXi@S>xkjS;}18^@OIrM!f-w0Si zd@x&Mc_%OW5t)Q-*-H8BG;GUO1~#*mB{IXnaJKSb znXQ7NiWUW~B(4m!Y*oe8fR?SgxCU@1^fRkXaV>K0YBlaJA&0(q?Yikz4ik&!*?*^2t?7;MW{95%C+ATqz3jU4)(kuM9ZFdu>b=H$%-xv)e*T+vEELCO4q(q%N zXE$J5wwkb+trihw+Q4wOI$)WtuA+Jt1+Fh{09=M{_xmSq1hj08#Z7>gt;mmhtww>X z%2tdV`W}}r0jw||f&M1tO#!*EL|Rk)1tt&#I=Ezt&X@Z(6ZGN*9Tg*2I7Xm{mRye9Qr<%Zvw0^AA$Zx zZuay>fm~Q3CN2)FkVAhG<`0xkDl%nWM5bX|wlY3D3)`}lgUxK^iOeuCoUI~QW~-#A zvPFTbimL%FTXk^_pk=Emt_8GgwZ(OS2b8TYIrP0JUmxiD9_a5t-XV|+ON_*gffaJ- z&&2$J(vdfN-YAd@BV({FTXCPAfNj}I!e+KoL}nNm&Q=C2vz1j;&Z5BO#T9^-t)jRR z(6Ut)R|Q(OYU1j^gUVKe9QxjruLZ2IM}hvfSQq3>n+s=x~K5$JDC-a3#AOEknatpxhhGJl|STag{}BC-p68*75y^Vxma*Si+J zurh$nYz>Ks8v(=F8iQrFCW?yOq9|}t*e=gN%T`=m0%+Mvic0}4TWN6_;9+GeOAdX{ z$(ILKs5a2wg1ki_7nUfAD_aTlr)vH{>6#+z=0#)!_BPf8yXmuAu&;M5d|{;xo7w6R z5!VHVv(*F3Z1oj2uqbdtaU-B*Yb2&IiH<}ZP_ZoX10n%W*E4@)&sSd!7^J_Mb#_{TwPoP zXxVCtYXL1=ZE+poPPD+RcE$C8cPd+ba_IX&z9Fy@QZ$lx4CKNR6LFDSRRaBq!gl^Z ze_~+S+qijQCtzE)l0G{H+p?90&1_|eD3b+-vy}tOY~>YIuqbdvaV4N-t1PYxv~1PH z)q$3+hPWp1E@i7l4t;OS*8x`0;o$n~%G(2SVTr!Dft5gihUO1sYoy4rc@a5*ZP|*v zb={7_wrs^O;cV5wGFx>;H7p8TQ(OyZ*=mdH04-ZxaXp}At1oTKXJ=qrwz9C9 ztsD_$^1yJm3SgP7qM}L`1+FZv3bbt1#MOb8t%kTJ@ILf~BZ!u`Ht+#ut3wXi>dMyx zy1obc+n09$6TUy%dzB60}ZvNiJAW7w9h32bI7k^?fsz;L!=V41DBq7oJbE-5Yrv}~ot zWq_8gthgM|vXvKC0G?L1isaDul6+-gh4~2dw<>Q9$b}{9;u=;0{b`y%P`ahaws{fR zfo<99`s^NT%T^yYvo#F9)nJAA$bn9RNtb&4a5zBmaUPvG0?I#5f}OK_3MdI*laZhJgaQQ$)WEF`I5j2 z^AYH8O5QY(3rl3gWvv8i&Y3?@I@sZ2Ruwk0RU@KI9T?7511z)E zR8-5Nz_rD7fR?SUxE|25)fYDa?nM9G`Fn9A;5lV$Ob&gY$QOCXtZYTWx;z89utZ#3 z!b+e&N%IG?l~QEdyok)ewrpj6b`G{>D-WC5DiE1rU^rVPu*_CjQB{iqR})tUTDBVE znn24|OI#axANt2^b;Nan&njCza_DCr76q;#t_ZYjmBf{SmaVF|8t@3Z zz--mUHGt14TTOE4drQ7Hu)=%<`rDDW3*^EQJ#l?2f&L84A1FOk5 zWnhJU5A>}nZw<(WCF^$ znHh;2GftVAkV8Ks2fWs!zzX{w=vz$QIFJiVB*Z0w6>`v?GXHT#ap9dGX+>tti^wc& z%S_H^=V4oB3b2`(A`xXuz;I^DV40b!qG}cet}d8s{(f@Gc|JPXI;JqutN2LzBT1- z0lBb5TU^IVKzrBxfzmxi_RWjP0c^|6&}WZeTV}?vnVAU@Wg@rD%1jh2GZO76R1%GuDBl1veg$i0G>f#n8BgA5%7q(vA79vx3U$v z-Rpal$m{|u%txTVad{I!F3eU^T*^wIblUuZ(iuf&&5Ot!Y|B>OXBS{wwu-Qstr8Js z%D`~8s$iL|nxg)H_TC2|uIkDke>@NvLK9|)2@|7*NK>$>g*0Cq)Mg<@JEOz~jW%GK z0%8_YOo2ultfr6{HzVpVxc&MKu0J=pZ8uok6}R86Shayo3CyxtV6*uG<;z0KQii74 zkh-q8t@(b=edo@+KQqIS7&mS666TzH?m6e4d)|Hb-@Es|M#%+Q6VsXjQ(!lFriE#( zfCEfxV_G}lPNsD;tq(Aly){TQ+l@l(p!1J$y;uMgLF4@_Q_aq4g!~D zYfOjxfJ<*p11E3I5F`(OC78Etppv)jfW+mLT%e^fEfX*WcGHuX&9ofA0jA|K%?-Gd zX$4Fx1l+{lDj^#3UcqtIfOX(EdaIUW>jCK^2@lg6r35T(lJN#_H8W?6j0I;aaOtf! z9o`OHdaD~ad8>~gWCj7PWoryn@|KUerX?3>Gfayr4tUE3oV3{irMH|+O9PbN%4AwL zU@?0uhiJ%q9>=)>>lDxo`7PksLO{AmqNG?$wF0n?Xt1CfI9*2R+F~uX9*{2L^b`lY z)u_XpfJ<*R11E2_5QI!Cpw(M#ppv)RnX6lJf!4>gLBJG6D_dhs^8re4O*3rZGhz}(eMcfq9N~2j!Ofq1HUo9nH-x9NEb=uFfC6?AU|#yZ}c^D7Rp#~mH?M! zt3roY1DD>a1y0_oCrBO!w0f%%RPt66b2UpY&{~+*3MjqR#8)<2^#LA0{^*Gv zWZD>D6?@A^G~|7n<7NQs$RCFMMwM#z+5qVy2|LrAfOSMee$r&TK{}H;vt=webAU^4 z<>_!YaOtfA;N-1Bg5+U9tG6mZC2v(TSFPj%t)6Kfz!ca>UT9=m6W{>Tnwi!DSkAOo zrnLd?R7ni0qfOL^WHPdRP1oBfa;|<>OFlVET1!og*>8)lR-U3{D zs}(qTtBoLe7|`miZcxcveatl|xj-9Znh#KVYno{@fYMu0TeTEyfIE>t@~WL_PQU}~ ztu&$`@0lEz4OmD1FyuFfWAgy%A_+Is3Zw+`Qz+vN(k0AUA!ET=4Lp`K0k75J^}v^l z6y8kt04HxX5(Hlppw(N=ppv&*n5$KCf!4;fcEA*9B`y#VOmry)v;(|}8FW$N&3 z;L=+;z{y*A1R>)FjHlEM+6zD>Zxu3EiR1#Uf@#%&DUhVHRm-$`zyYRtnAQlmlW9#% zYX*Fkz12cALdHp+N|bQ5zn%UE!>0GHls)!}WxrMKFF zlefAFLZ%PU>a9UgscelgmrrtmHqEpdz!ca`Wh?5dnl>BY0MqPDa{}&US{lLV4cOHG>**#q>Ci7nU=#6B%R0c#{9UMvw&lXvkGPgz^Kd zyp5uexprph1|*jnmG^P%ARt{NF~&4sP>E?!$($MHih3|$jtw|v#13dO$4OC8p2jSh zfUhG#qdD0en*&G}N#rrj9aN$KR5GWKxk><~cPf}x4QMi_mZG4%o>@GAR&yFTwh2(0 z)6BG%pc1X1iUQAE?SRspZl?7Cn#>ubC~`fs_yDcuOmplEpfo3HJ0#(98=zIf4l0@B zWUe$oX-+27vH?xz|<0R^u4DPdYgP>E_#$(&l|st1(jc$n4*XfmgX zqF_!lv$OzO&1vP>Hb7}kJJY&@O7wwB<_t2|7@#!A$FylclQ}aK1#_al#;ymnnq%i! zC!jPZjcJ)dC9**!b8?s~4^W!pW?BKD$(%xpf;lD3QUPc+r&d=Cn~1%xPzqZa}L!eH=RoD9ssTnlGrtG^k|G40A2|MH1~y>kcZ>2P&B}$XsK9(i|VtrU6an%up1RM|~X- z-mw8%&9QT=6HuCy#Y3&VD$xiknbX8v&4ALJ7N)fVn#^gVC~`fsbQ6okoIZ{n1eE5CG0hiLVj5I3XNI|= zb_C3^0T;y{&}5F2qF_!Mvt$yB#hh%8%>k6=GN+KaN&uyIDwtLcXfmgk zqF_!vvv`QbVooE+HUUa=nwi!TRH7ABGN+BX+5x3G-AwBPG?_CfLy~DA!fYO|Lrg?%&G=fUzG%;5*pfsn2X{~@JbJ{2h=Cm_QH?dgE>EqZzKxxhx z(|kcCra>ihW|%AL8v%1{z(u_SXfnr1Q7|WsSu%;mVoo;4<^W1_@|flhDp3F`nN!GI zC4ka96-=uJG?`ONQ81^TSvub zD3~+GEIwkfm^00>Gl0^ZsGXY2ZGct@JE&xiley9Wr8${Q%LX)=lS5H3Cy!a }e0 zfMW{*r8y-`s|YGl4Jw&a%Utz<(i{)d8Uan_G*J}HX=audVzHRh%CT*L(wugtbqAH` z1C`7fWUetlX^xL+(|{&(W+)2gMAfqE0j=iPIo1g%%}HZgW>AT2P|2Je=E?(<=D3+w z0BAC&kfLBt3A0oX3sN-II~-dJD9x#7nkT44BdBCf6LU2KN^@G6)(U7cr;VauPCK)7 z6N|;1K8_s(l;(^v%@U*0hHdUU|Kbx$(&k>f;sif;vp7`IgK3K1SrjEW?D;7iB?d_oHpia z2bAV?Gp!HMWX>Q(!JIK>@ezx~oN11o0hH!MeN%I}4bUoK2bIimGFKX)G$)g3*?=Z< zawrPs=A!u^39wQsyOt%4wiU*MG zIYgX@a&lA}pqv}YWLh?$oQ}w0S{~6zmgX0L(?xiJ!~@e2g(MP~8!17MjHw_pB&q>T z#?*3DJ)ktk!?Z>~X-pH-ngP$S0WHAkBGs)D4;a%%A^~IC5hP=}i42K8K$9_p95n_g zjqx#U8c-TD!?dVf+A;s6&IVi>W0!cq7$-h>1;rgF*zKS2PlnkGpztn z8dJ!$5c}B@qjV4BogpUJ%VJ6hscm<1T-1b#8J(F(wG*ewE{|G+L+c3 zxQ`9!22K~L?vr@Hm_d*z^)WzV@c|w*PGL<`RA35ghJu*Fiu#r&VFQdu0>Or61)sCvy98z32D2Q(Su5vH_(r zIZVp~lvRftxHP7K=(u#o6p~1w%##o?y&KR}b@WkGpz0W8i7}S&0SW^e9&=IKIIXcCL_!ptp&;sz zsNGruHozprQKELHIRVe88ZC`!nSi;Zqv5SXtSXzMasZ_p@|flZlx`?sS|OlxLkV!{ zh6;%Xp5tm3sRdll*3~o3188zdBSi&V(nLX855f{HfUBX!Sev$jO0{VlbF~AKN#u!c zru6}i8f()*ib8EV#wY6G-N*g+MQJ9DK0N^>%qmJMh! zCx@b_a%UDdpjCMR#})!gb4r+25mcfYR5GWQx#|I>IUc4p0-DTeq9~Zt%q%T{R&!c8 zwhd64)6TT+pb~wck~xFSH3lfn@iA>0&}7aGMUm?tXV(K-&9QT=6HuCy#QIf?o-U3`$2fP(HT}b^^0#MyXB7rui9YIm;5E&AEfF@%GIcf}08slTyG@vwQ zhG|hxU?p3Wrp^YOF5!3J!mxlbPLOoQq#;PgWD*(1WCNOv$>FFxz*s0Ib~n=s0Hra7 zOe+DDJ-7XV##NNWRRzPV?8`IhW zWe=_!I9;T=54g#gK@tfVGln2(_YoNq(|{&pW;iP9&jQBSfD^kNP#WW8S{h&~-=<99 z(wJ=ECS!6)Bw$P)g2L}ahV}wLlQD%HRRS0b&BR{8v}! zYidiFRsonwIs%=hYL2P}ly0bJng>w2p^<4#fcP)+)eIz_@fL{(+|UXVWxow@IoK$J z?M&+iG`XaYq5>`%M35xLSi%R$E)lC&rkOqin4;zBAOVO(c{EWQAQ@l>JQE|dA7U0K zN2LMEY-chp8&GCDhiQ3$LOs;Efya{`;03_xg5k0*EhLdZQ7l1_@=-x#NK^xwjHw05 z*cYs4ArA{R0!ovbnAQx4ybGl*z@Ajxa)r=GXJKgA1WIjO~1nR^vAM50JGvc`ZLsHO5VA$ z^pCywdCG&L{N{`R!fhI+{krRaEtEANtp=pkfV3KrRs+&%cr0c8(lrSApaz zG;);?SH&jgsxBu4x@z@YSes5sz@xY)N|oS6T?t%M`a*gW#ZwPPTy%m%Gcb~90n{u- zT?u@rNZ^I^Hi|b$w6jFFPNENZ9ZL*aB*s|6r<0flzKVdY16$BpQLsd^A}k znu+3hD!qju?n^5mRc`dWv@xw6@Blm^o?xc+0Ul!7Ak)SGUnh@2j}N#k1=AF7@ZJnd zM5)+c!4fv$1BBC_eBk&XyNgPU6FAY*2pY6x5(Q~x14=D9z(>h0md+y{NV^Fdqzi}w z=|aFWY(oifvRX=4AdJsN*9nK9CKW-=tXkltxSpUvv4<#7+z2QOQxkCE4$zx{FNa3q zcIIsbOcANT?M!P2^t+vDeSm(qGi?m;JTZ46i74y%Cwt-r;uL)H?svK+~-YH##&jV4UoDuq_~}EhD>!cS0A8M zJP2H7YRn?xV~J^<#Eg`n+X0hgrfk54iMVxk${gaIfb!O*0hcLdQoO;oY@*;f&LIfN zJiru@6YSk*S^*$6lT45<55=x z(y#$HO4vaWcK}f4BMta!l13Vt7Kv<@$k9pU0ncR#w?(3WB?@&CCBS7G6&8tVmZ;T9 z)B~4kcq|f)B!P0#L=g9-8IZ~am4OzfwF0_eCDGcL)(&_G{v=vA)A|5q{XPg>-k~wz zM(_DpVj6G*`+Ekstly&`>Tb9P)3ey=PdGek2Q+GNQVeWP1C&}afm8i1rKy)g(m8-e z={$;ov>R{}+d#b?{P#;25>LbbtRoUkDG@=go*CjnE~4Vh zxv+skme~PiE}X#i(rLs4=}bVQ53(r+(m8i2{}=)Jc>`323SSE^l%* z@Fae0YJnTmt_OwE_5jMX8-b^gMBrvN5nIDO7`lBsy_rQ?0A>B&3f!o;jk($ZrQ&Yj zGE;pPi9wba(@FTG1WcR;E;BU)oJ^!ADhkywWx)n0Z=D^uOvwq{Xj>XfWCF_Dm93M= zu}I{xgd4C}mVcc@p+%yEB`N^RS)!V7u2*X<67?+M0jy$)M&L3ZO%{n}mS_Q#`Dg{c zlcZ5_+AI?7EYYo#=+j9IS|r9u0(G8`Al(H(`S8s!Ey|`Sbx4!$h7CCJ*#YIl=VV$M zpse#Ufy3WKRv%0Qslu{v}ymckOWl9wkkEgbp`Dy`Iiz0X)Ss)w5LV>?%GC0h<_46xDqvb6ph&G@J$h45 zrI!$$@e0E6I;om@YXM&s9>tPSrg;GC*b|Mw$yygp!ibABHW4QZWiv~(0E&FT%2wb9 zxSnZ~bi8+NC*FqjNhIG*IC%R2QTYmd5I9{_`;KwE53ma~;++OA_09m7ev86{n9({L zC?sJAloC$hQX-AxGXeMGF(BS-9dC~01wBtkcl+s>Biz44!5rZjX61h8-qW5%Q*t$* z&iDLV;1;?(_eA5tiwB(N@;sIdJPY_$F3xZga7i?W<|?)a~c7=pfQPn|nw zq?}DRQx+wfDL?q_2j|>-eipBvfqY%2a&DB;qU)h6FxP^MT(7^}dww17^S=MVIaffa z*Y`ssVf14)$`RYbiO!Kx@4YAbhr5)e_L$^rCML)GhmRFKdcu45^vHNu?)ZtxqVcJr zBLm*e69W@Prs$$#b?5E{(do)E+x*^+iC*u?Q%brchKVa|i5gKyOSff=dq>B;6W-y; zj>-O0-XdXvvcfO5)gG@V4vln84S1Cs?XhaYP)FzZh?3!m#b3ODH!{8oFdu&e=lZu! z$i$zw{9Mz!H2Eq2!T;{HB}{lHy(e||?mAoSxVJ}lt5(_;4NVP9_VYbl<-dn(ZObQm z`+Fw6T}7c75>I(MCr8F{-(+#Q(H7r1GCZN&?5Esriya#6*Adp*;s^RCCY5!5mb+|; z6XTr&Bb_?hZhJy9m%QsuBT>0xd~sHceQC-;hhx5yn5a0j6z6WmnW)&4)cDbk$zCNcCMLn5*d1z2 zPjTW>hw5~Q@Ir)3MR-|azT#AsWWm1L+cR8#s(9e+sou%)(#jFGz2!xvHC4qm zl)%-`edeC8KTz}a&(xIM|J4U}e5UlFipsLjR8>mset*pUU#qNq;Qk%{a8*sk!zDW& z_{^U^u>FCWiu*=ZfvKTk!Ld?Ml14`+`X~EGG}>B0i=POHVsGd1k<#AI&f`U; zrQ5a%|88Udu3!6^KdspDnVk=8|Js9JtEnp2VZl7#B8MR&O?IH+DmvXi*;{mEYT$%S+NkZiiT3Nh#9oHzw?WyWQ^3{%GQyt@7$}9HUlT!lW(3{$RFHXx-Nu8Iu@u|rbNGDPuFFxQi)EtuhV6&GPFtl%z+2G(v>UH?aS3gog-5y zCFCffY-REi9c6Q=D}-SNCa7Dkyop@CV$V1Dr!17Gb^a;S{DaKBV!uo8l(N~KLbA)0 zH|-hvd~7GDtkUOWdnEY)6SQS0(J}VxaMP#Ie8DRa4s9K?n+oLO!7aln~>7CfMee34Z zwIPZ`fJ0ejkKU#xNrDo+)PB8sjlakgJt{gJs~p!W8|~5M$;(YK+iEtKZVZt~5LQZU ztGdh*L&-*$S+rM{My#D!Nqeb9dnJkmv=>{o!$A?+UI|vxzQwA2tI)pLs(oAJ+QCZN zi>%sFCBpViR_%BMBDI~K7HGfMsvVCXv~RR(kNmDyf|a!2Wz}9Iv~RFzuZrC7#7f%l zv}msqe$UcXCR;j{wT>*M(w?g(bc_$7=1zC4ME`m@TG~~B87RRws0;mNZx?7cP^r#O zc69Z3PVOoz-dvg+qAdFv$eP>L`5YEGbg}&Q@>%4Gf#h#v`R(OGeqD0>F~r;uB58^v zskLg%F-;&hIpNqgl$q6`Bq)+Z)~K;y6p7pnnHpp;qzpxp%#Dz#DJGfK>JkhAcK96z zf31eUZq&&BHVWh$LB3f{A#Pc(f_gJKcXhIZdP2KOQBFcR*Uv!d-=K=2Gz7?oHR>XN zLgEImQ7Rp|xU*}Kz%{tD>j2Y{&~3V=mhS9rpt;n<0q^iJj7?TKTx86u!pfH;nwICeif*;XHh{FJ5*ffSApgMk8Flt z1q#P3D!BM8_p8tfQMz9RIvKO5pl%4PSmsxO{s*i`^{bfGot5Aq71#JxR0$PJrHZOq zeL)|*7J~>MM&8%7Bc^S4&@zt^g>-qFlN@2*kFe) zrLtL5Dx;K={3(@{;{MH&lHj2{&G)AS(kv-~gHlQiq_lPRJe3g-rIZjzY3poxf)J$? zuS*Hl`fPdH%2j`?E~Txr)4JYX3;?`&~etUW4o~9j9*6$>WNu&5DRpi_Uovjs>E?SYUotd=J^co zWViuv8R&O0+^9kOy=oFQG(}#_+pcoli@N=k)?+40O_(rp(3snOBYP3$&Nu3(e`fUn~3q<3$i5tHnWcoU|Wi#LkWPS_A zt32kRwr>ka#j2RBT;(W6pj3^=%;j1{l_E5noJ65gJj!cA^dMwBTr{F4Y9VsZFpJ_Y zh85NB@(_!P)?z>tEt^G@;*l!m;waTJA$mM{J_XQ(+#JSUt%d1V69g|=TPCtiWu{EI zIWQNrS#dfP=T(QqG?jg;>VUw;BFyiQgSP59w+hayg+RK!TqVC1;nlzd7|Y?w-sBWX zDMbws>Ne|nkhf#%!T^Qr?9r(SQ|SCcTA}mm)QCdYrBefE%xaD1uuh#C(Iy`Ws40s; z4e=mT9RW3ELJbC$WH7sR8@zQ`Q%sc7FpsE|A|5DyTT`q_k+iN`_*W}pEq=B z#IWb}fSR%h)DRD>`Efu^nNahi9U=6c2-+)kL?8Ds4ZD!U^G0-L5(5 z85R|8dWuEy+=Ug@p35g$R6LXWSQI5Stfuyc7N(^}F zSQN!Ftf*FOcd@7_w~uO~HM6*h;*shjnrMx1(@qwh#Z5Jun;vFS;ietQi?kQLySAe& zhI*!TEJ(XXb@&NXBCC=YX>a&;ZAZRB>Cmx2$9C1>Cn(Vy9mq$zqY4vy+m%U7z`cRL zGR$zifxj|LUA%$6G7QPzz+V~0;BVls45RKh@K@$o1Gon8Ho)5eU4SmYdjanS+yuA@ za0}oTz+%8+z*4|cz%sxxz^#B=0m}i)0k;8e1FQtBROS`iqkGkuBRiD1dmSh!>5d(+ zw+6GR4^v<#0uLkb2n8NR;1L9NQJ@ZiT?p)^z~cz)M&Jnw>_gxQ1fHb8QwThXz%vxs zkH9ksJWGLZBk(K&&r#q20?#4vJOy4r;CTdIq`*N0UPRy}3Va8Fmk{_K1r8zbJp^8+ zz$*y6jKB{m@G1g7MBp_F{0M>95cn|#UPs`^2)sdoHxYOPfww7e7=gDD=%Bz61UeAt zq(Bz}od|d-(1U;%fnyZtMc^0${S-KkKtBQ}C@_G)2?T~HFpR(u0wWX{MPLMhlN1<7 z;3NVQ6qrO{0)Z(CoI+p5itr{1-%H^l5#CJUA_{L2;bIDJp>U}Pmr=Ns!dpeSoWffvyiJ5F zDZEXYv`24Oujv@?pFE3~W1Rz2U3dq8XEb`dQf7~?QZqVxy`3kD_@#c)kax0oq>JLK zD85Eb(c%O28lvw|7j=1iI zx^U7Hq-7^DJ)*7+$+V>lYY$Fg5*N&m5c8vIs`t$Bj-HPGfgKZ5qoX6^lN9$T#qCm; znd3y(cTr@Wn#!wrCXnliiH>7l60D=R-55uXOcXter9MR4O|-|=<>MXw6Ihv}rBdV_ zAICxsL_bc^PpH?UqMz!V++j|VSe{VgHrk{2saZz`(DD~`bYTUE@N^N@c1(KD2%Gnj zo+s7xPFi&_J`(VvaLtnx`;>ZvHCE^t@8}dto+7qq)YW0wgb$t}zWwSo#``5w+D}o> zs#&HeLo&}2&$rcdS#J7=Cnh_FJG~f>BD>$F*yq$$)>!@hdycpcsLNylFeGq*BA-`p zutfT~gssmL+Y9QAR<@r0@rlVI+(ECnNiPuNi|R@%qjn>Nwik)%pt{1!G>qFuIXg%k zF9kD;UJCbjc1#Mkmx%2X~Lf|yb|x~AIA(1aea@t4*4A& z;1YN75XHW%-tJFl00tBddyfT_;XN(Q24U$5se73OUQsjfZr?jTF)~c-Qkddjq4*!F zHwWTJ#{CR_rNsF|;(S$I6P{C8`6{u#rmh(3I1xzApzJl`_>sCy=G>norSv0;{IR;i z5?O@2iSqVi;&@$MY2nZpx7Ug34RswqrePisO7solepAh2Zs{X~)o&8d+v@Gi6W$Y~ z^ljy1FWI9Hs|i?MH6aShVI}#bJ-P$$u|zf8--QK${XPBO@wLR?K?xjD7xj#Ly+!?9 zC>T9NK0@S9HARxeU>fvJqIaoFBwZ{DAb~E5@Tw_X;bFbv8F6F0MDI~oab46iGCtHX zFtMd$baa4r-ArH#8sbX7Vv}mydTd)U~8;C3PLC8)*sKqx;qPUN2HO<%sTAo^nJ#r#xzpKCY^7 zE3css8~qeCqK!KaQT%+{9zCGOZr;2Zk&<@Y5q&}#4ovZsE6y0jdG%9@lV%QALvT6% zmfp$!vaiD*XQvKTFm0Pio9Ji+ z*LKA#>LOI^C%ltej&z{FM6U|uMWrQ6POP3;3by5^Vkt8g{cd+Hcw(3~F7Mf1 z9<|`{2gM%d!?YLQb@V8$H^!*}@i;vo1*Zn2;y{2btj=BS4tHDtZPpdX1x#vdbQQ_G zTE9{kI2P-!#yJ7;27|QK$Q!f+0{#(PhGPu!Jzt1+dA^9%$X`o#dA@O#yWtzazi}-f zg+B#|)yd!ZEa0_(H@Q4ty2b73avkl|mQFvI1oN}PnvdSEX8wLQ_nVxJEDlQm^RwIy z4<=!|ZHCM9@2n&(fcXi7H%rT*V>H^^c-3?tt&>+IVjl8k%*c zMavcjx$Hh6TG_pzS9OWC%&z1Vt>~iV9zDDEMw1eK9LdKWazqa)uH+j}VaOzwNmApw zMQfd>up*I0H(gsu3)cLe81PPt4FF-ei;5G9cP}VbUA6;I9=j5DWh5-aZ@zNS9zBx0 z#2~#UtZrfBa!2&Af)xm~E*!n?NoAoUdL(ugG;WY7xxf;;Hjq;6T@)L8jrdJB|0d*W z_AOrGh#rk4)1-lzI=~D?W&rgRSNLeq<0+Miz4(8I)qBcyN>r9?>m0$_#hD~F}EOe#>GGqvjwDH zYQ4JDS@?e&UQkrWP{)~~QLGH{(wcF9e4K69Rkc64daI(QOrQ@{s&Qx9=t}f+bfR(hvUD%rur^Y1MRW-I} zpbI-T#B$%nM0mZh=sh`kc9fQ*$B4D|DyGuWIlxlz7^hfk zACHCRn#c{KJ*SUN^>-cbJazKOsga)k{_)Y`n(fCsM|iP$q8fv}4(N2)V*?4xrSWRa zOq>v5S`v@&fVXE-glRcERE+l@>(vNiJv_`r z0%1%n6>dnPQWt&hgO8)Z{D5$={fGKVSad$02yuZps+2h@k)mS#Qm8sPB9Qv?E~g z{v`V~fs~{6i=-DS^u}M*K1y7Y=FHBKF0Z)7w7mj_K=kD`Z))zxT4gVK@S;~Q7`3~Q zf>8_ROeQ9ZI*#<~?na9DjG$xEsAojb?;^!mJQYu4VL>SsNhL`Qf>tAF^I2MuqIPp( zmqus(XzJwD+2Uh0M|!uN8uEH4M$dMPmLJo~+|_aSM%(yc zpRYZETJcvDbt#6*BiImwwd!Q6cns`{cmlCXOymv&r;{7;7^;@X5Z0p3;E6G2!?q6j zoS1ZH^$bs)Idx*{)I`;p;xk7&E3109_6}7RiIRv+qN0i2jUAFp(X|#;r0Xr&1k#>3 zRe2(IxBVqBeD247jy=Cq7VP~QHs5Joq?dtl7wJAiUzZAK=Udob099L}Z!INWU_|x` zBpt1ByiTv@!FcEn-^1|hmb%_!Wx;wFF3+#f_l?Kq!5M5GOx3#Uk784!+f$hy=YBdr z9bLQp^aXUh)?zw!>*LFzZN2A#B%{dZA`qd2!*r>frERLSq>^eB`9TCC8Ag%v2t=}s zBG*PBvf3yzLfe^V$xE(Lgf?W)CgL)RY>Yr;gHdEb1R|S^B3{}JKTBSUjUsy^5Ggl` z;{F%+dUW?R= z5l9VKr0$JCYSbb%KLV*qi&UpLry*?Z{oOMbsa+9BQA1+9UpGV`rJzAFN}a|a7(3Qo zo{Biv(*;Q`Pr(A0r*N_BXr9)(7#_yI5zHrDo^4>R0dozQi@>}#2y>NSo^W}#gLxO2 zcY%2em~RWhoGqAti8-ja{HMQ=ggGfNe+A562*P|8!{zm!QMac&ZvE3clh%87qD|a{ zCNVb%^WO^QU%H`r{nK9o^H;$96)*?WyhAYm!tMDgnC}Mj-C({C%(n#5{67TqNjJRV zetIq1=Cxoh0&_5LybI5B313I;_&Retp6~eu?#%D#Fi*NkI5}X!?!N&>rw7o(DK3}i zR?O9Xd0xKfp5%Pbm#@nAJa%oq=hjc*B!SPmJP%=R?w(t4lE5AAhNtOP1HBt4l@*}( z0j0tQ^nRdJT7iBQ=%|K%9Vk67pnel5J#a41(|Z6AqK6it1}$`03;nqkBKr{c7h335 zE%aAf=#Uorz7{&Dh5l9x9neBQ(L(#R(BEsJeOl-rv{0QE`ezYZzY~f5TtlmX{z5~` zf&NNEi-G<|LpK5aFAd!QG@9-Mj=canPeXHoCTr+wpjT;V7SL-o6f==ee@a7Bfqqs) zQ-I#2p(xu=-vZQfeuM8%FlS?&pL`FKHbzRDh4P4na+8Jf+uxe?yk(*6vQYlSLQyP~ z*Z<3`xynMxuuw+dH%lF`P&Qa7@fOPA8MB_97D|?dGWnia>Y#G=3TSY4=t1m3nkq``Pct2>v`TnxyM3DvQYlv9kZS%ER;M8<+r~vOZ}aNQbUy4 zj}jTd2#l_H4fua)1m!C^YnZm|_1$VDjF!_$A{YqcSdR&Mm3AQ~i7d4x;WP*Bm7M=5 z5jE}3-S)(J%7#V^^f74>gNXz2HYaVt-Yx0Ww%l6f_Pj;aCMI!Hv;pQSMDPIfU#|s9 zb)L9z+%wg+k&Q7?;?6}w?1wB&lKKnBJqu-?9}vK6kSeIB?*XiDcq<;VuFw zRDX1j3+LsC*39j3%>#NENdm>mIqOqg4IWVkdt7*JwLTSOytZ1u8t_vbP4zN@czcD{ zY#!H5P(b$;=q*6C%)8KDuFn7ojpbvxaJcy9foW#naC|pfer?Wx9J~O5T|~h}lKKk{ zCX#5`_q6kv{+nsDW|B%53_>Q))1U=(XK;l#h`m0LI;%m4p-VGJcwMxIp}j8J$cyjw zcOuFpdwuNVvu5&wy}lQHaJnM$`kL7dIt*PpuZzA(Xs?U@%EkBkHVlR6iYSv`xMo(b zQ-6^&iMNH~Nu~!|bkDR0Iu&Gkpy|P;Cz+x}mrXp-;=!h;nICLC&GNy<11%nGbbZhB zIrxw3y9%5m?_qTBNW?b|+k zQ{jGcvis=Xi~yPiGzru|KHZ+DSAz()TmWhmfw}_dh5$-SI+&q2fR+c)ssOq(fYt@j zeF1cT06h>u4+hXf0rb@X`Z}YA3>*g0Kc0FyTT_zmcbUUNrcvpa!W4*le96|qJ_rBBOfmx@eXQ% zcCe|A@#o3H;c!|U=3W=*8jiVH_mjC;w-Jfzo3@bFIX@)p3aNV#+IMJ4=+&UEC3yx5 zO@g%~)VZC9zA4R!0+lt}PqbjD0qoyv(bVm|NG*vde}7^}I=DiVKV!}IJeb4f@E{av zIh=E^`)y&(KSpE?KlktB28FZ6ab|`!BR$D1ZNz7Jc#jt>y6JsMP3+D2FwujOUQU z2IxhGL*?+#wdjkT!zeU=bVZcIU1(T?>U0g zq8#!%_b1Ug3YJ687IH}aO7~Z}q^5HAXo`Wl0u=Xk;M5(UdKY<<^9wfx<`*#QAm$hD zIFI=Stz7;cx@B~QziXVQ@63xRPxrxIx^2PobpJ9!P}{2Mm}OxaZq`~dU;Xy=)O_8(@l4|vE_m$uP@GA z*SEB?cngNWv*oeAy$&o|NAX|rekWKqi(xCWDJv5yiW@+pY{mo9+5rW8o!kw+QD0Kem`B|pGLmR z$1w90Ec}5y8ROBo_eO`dBO$lNJV)>k=1>ZZTdHZi?v8dsJa=q?3O%KX67SjwBu26RrX}BYp zB1B0y_~Q>_ig3N>yC3Dm;Cr9Z?)&$z7PlnSJ-Ij&gYPZS63@U33A#cR2yG~rs?~5u zqk}!-o^s>k{WQm90tKn~f$BqQ!7Jml2dLES5RJ9h-?SE_xfenstj9{Eg3QQo8JoEE(HqASD= z5czD_+XW8e4!{Ur%fcbrYuS`|GkJ%_g zT0{st0p!0;q@P|UzR78kr2gXN3AjyXKt@`MF)h<8`jDGKPgoW?ebPdiZ&_57YFQq% zz_Rpbk!2B2mSs84?UtoBWtN3CRagUKTo(4|w3)K+jF~d|?`Fz7r_Gd&7E1B2%{>2N z`L59O7D}>(GVm+2o?TOB%9B1bWopt)dH0uQ%Dom!>4cf*ugA=kS4Yj1k69>-{?*L$ z^$|1W(fhu#M zVKlm2IT@$Mso3%s+cPra+=$IE%ka$xY}dn)4|I_8D$~YGe}sS6=5zi{n+Y%ZQMCx4 zt(m7ROn$_;Vdk&#&WtvuYHOOr*VnXt#W{#T^&XE#;%@xekY(EL8;^a)w_t4$^?$JN zD<$l6?OzqcVDGD$5&kMpnbghM0V!+U!1sBAzvH1Ea_X1lSSs-&gK*asJ)s+3k74r7IH z50(?_>epW1pBf3HtCVPmJvRA5Hn-RK>qf=ph}8~cNO&?p%#Dk+FOkP~c~4Gt4D14B zsW|r+pVd)&<6`hhoP?88Ba>ciTg5JJQCq)lUzU8E*yfI}lhL_4V$Xe%w(-4VxT}b_ z+n1Z_@d!j@4IkXzm5%s?hXdx{>Ce+P5M!6nR(0N@%?Vk`~xz#z4Mi$OS zt*Y$sZttHuU4DA9rf0JJ)S0tGMPgepnV6xO7%NTC*NebZ99a{^dntIPL)q= z?LD#Wc*pkflLJK^w1eBWZOh9z8D(P2^N(*i)<3!BjCXisXk>h}SBK#gyi+)WYYQJQ zwHXDMwtdt8n2gjgJ{uc|pv1NEa>OZlLd&lR+aUT8}9jlKHp}Je&@GWeu zF`h}H4OomdxH#Tp_ImHfT-^q%ed$OM-#5^g)YW~X3CgQ@vhT%1oUms1f>PBL{eojr z!gY9_^OY@*6m{pv?$n;Ybn4#iHg@m6Z|L4VMSVK0d-r)lwQj&i)4g*aJ?!r@hV2Ai8+|KFlM5 zj!me}nqx^^tYfL;8XS9*%KfpZmoa>P+p&zlx*Ak+4&A2L9qFcS6IH+V6s`JQq3{0S zJUluDB}2gxcFrqr#vi_QaNBvbKwT&-mp}`IkJiN==@>UPLo4*nQ1XqMAF?j>W{B!s zF|xhf3|(%9w5hzKKhr9`vh}1+V0>l}-~pN2MDM3`6TMhRWSQvwEKl^_646AgWuo^I83o|5iwm6S4L1s) zO+n-)yz`hRitOxjyWvK!$HH{{X^jI9Y(z??H<`NEPC?qLPjW|Fwq1C_#6`32$OGO? zh&)`So2`!cIM^)K)xc?_a##Wy8e4|mG%Fq9akKL6%CExcC;KrgjW;+rWaFRa-cWSV z%iYGic438Ob-N_wv275hqjOBaWPpS7>T6r*<%Q_A@C z9!@70UqN$RL(K<9H7gyfXjFs0c!y|G#QC1#2Q~@M1cppE+HXkK(ph1e(G`jN=anfH zk%F?+af4;hRA!z>UYzJyZET4a(SXP~;z&%`=TBY#67sqP`%}rwI;Y0RaXdRFf+t3C zy6DKb`9xX^17=IF_xrZWuUe^zi%}Earq`l0;!~n`+xM%9!{YRHWf_hLyb9IGwCHsyjW}&7~Xy2oFzshMuu3r}17@l1URv(Dhpnm)3uDdvl?m#_2 zQ+?8W4<6px&PDXQNWLCA%E`zqvBz*1=q1(qc>Vs9nzgPs{PCWR>Cv=12`iiO)05G- z#iP$bJCWd24Tue`I9Qr0986e=Tl1b_g5y_zBkya7msrxV57Mv!mketmDl7E5^VWD@ zKVF6zYKwITc z%R9snHwp)oLo>B7FhU$ye)QH{Dk*p~?jndAi5BiZU7lk|7dC`DtUMO{=DD+C(CE6E zZK2%gFW8U;%^B9E6f3}nJfptBZg-4Li&^Xm)+F0bsSTR29PdFY@nlG#!{}P{fQyQit<*#-9#J_ImpIr^N+~jI-;b^%#ZbGiLcMJcftFSeb;V=HJ7OqU&9@Jb3K^b-EhF z=Qhq`_xe65jE3`Zm$&>dFNBy5u!jJTST=@O7Q3;fanO zZ;}7({9;q>JqtVP@FfZM+mchwde)lsnB&p+T4r}8FB|F@KcRgXrD$ptN6%ZnBVb|h zHyh8%?8a{0y&&#D!fhhcA4_-Ss!KZ-M6XhJBskW=JbXxTnZu>EFm%Lz+yUifDVh-I ze#YJ@7Bgty0=ROiBiC?1|85b9Bm428fO!dy8)NBJsXT`NPW487*=9?S*Tp-wR_!R; zrti1D=I>{!8+Y4pztpF-Q&CV+^3!Ai@M!%ssfb9%peyKy=}q3MKAFVQBp^FzL0 zb>bbXbED$ia31ehQ_*R<1m3S&R`}%etJO{9g3sKbxnRSk-UdEl`(2 zjnJIem|h|)d>q%C7WdqxZ-M^DBFzOGFZC8k%wb&~1zm1|0{isjyx!%-J=8hF8{rRU z8_^%};vTI9x=4$AHU?>dJ~yOQznd=g#XU4b`Uf!pxV*RrcT!FaQfopN)gB+=693DK zd&udR7x$Rws}1k!eV6Rw9$vO{uj9@SYZ;G!QO?{K>TEK$DoHf0bkh&iq%sqtS zCHqHqoB&<|=87uo@*5GjA@bQMn*7nd&%XRdgi0;eEL`+ABKkE<_h2D|I7~u!z<};Z z9Xg7G#<;W3QqhZRbM;AY@9FvtuNMf`%6~{>gnKD{Trx>5Bsvlw#!&+sBRgtfIE)qM zlLdNxcbHz+ub%t5&IEfgcBXrKHrh+onBFouUnL+$4FVR4tpO3dKw0J}QdT(P@ooBu zcL+>6HXEyZ@gn6`RQI$`e+x}x?V@_yylm^*lZx{b%M@qS<00m;T5tnJg}&oneI0?d zQ%7%2>O#$7+Clxcyy3xKv1n_`jjL_Mf-tNd4zVC3mG%7-LmB2Ebx>2Wi8{r%#k7ff zzH$g|T*Yp5;my9>OnuC;ML*H?1+V6$vP->jb0N=v5F@P%KQHHUYXb-k6^w4K4)v`_3toAxH!w0$Ak zwC{)xO&= z_1bq6ZuRBbS5zjKYu`(LRPjeq`%)M553%;G6t!iFR^zp=pIY?2I6?QHxiynT?*ljR}QwtNxp!%fnNp46gAJ0 z@xR8=5~ef4XWzE2_299vOcvYc!n|sr+60@kwBwu4Z)?cH$X<9X4R?^mCynnndVTYZ zgwY%3{=y^1QH8USpHQ`9>IeEKCh;m6XDP@tk;5Lrm+-uQqg}$IepGkJvE=~cE6W`< zLF)N0y{pyp56@E^SK|0w{SioKabp7Y{6ACWuGRC86ROqocbJYq!j|BRaLzqmOqa{Y z<@bH7-Yp;D5lG#0uII1P9f5=oiCK<7qK|ITS@)m)y*>g7hZA4yBap21{G5&_`um8h z^>7VGxN7|qTa;;jg zBlIJ#)~ha8>#`pddH0<ptJw zJCSSGV6``%;Sb}RCtu?vf>+=d{LPb}Sxy?sjI2tJ3soWX_g#LL8S>^upqIc2L!c_7f#>`87*c$$VXI?&%`uu!n zUetx6gMQ@fq<6x((WyjOnJc-;I>8%E=RgHi%5$6|?ZvNgJYuc&OHOOG{^Qufmi8TE zFaBn9SpvQIs}bT}Jbh7{d+{IH`P6lPD7F4axrHqmGr)7}#a}+3`oeqhx=Hv8m>ZXE zz(0m<18|D8HVuT7Qt?bq&hnANVAD0L@o3TYIj*ZyMJVt?tKE<%EaASDzRwxtM9eHO z(}|9Fk)S1jxp(TO(e*TI&Cr7WUuey6?fG5og2zkH?uk<(=d9Z|tL`f_-REKVtvm(@ zX1B1`^I!(Nk!3v}G?+Ku<9z=GYb7521#e`D!^R)XaN(yZ#sEg|HkI3Fz}jLlYWKx@1@j`R|MGe#?OMOITp4-LZ@i_k1TS`483|th{Q^ z*$lM%=%i!gPR*aw7qw?UhW#G2|8xbrBfiu4;7?X6Gt0%S5S6IBa}Qu%hYl~_ zi^q%mQ_F$6JYLtHlW2V2k6N%dmIw_63-Udku00bVegNXXLEPQ26Q|-H3lQ5u#JiF> zB<0#OMr{{34+>6Koc{ROnny7~MpVku{c z=RrPOZ^MUl$*>mUXAM)(s7{l7PvDWzCD-fQ2Es!1iWJ&u8(T_~CUoK{zR|jD_kx%N zpfL%Eizh6e4ot;qrg5)0>S9-dDMQ5$rs(w0{c-h)1jp`#9sXh{&OqHjYEm@O*wrE} zZJH)+$nm(L!yX+&^X?D)7(Mp8cH5twr!4(=hOx)K3w1!C$Nm-Srfc)=NrYuT=Ofkh>F_(W`(AzD@Ad1{ zn=bn6R8(odbMI;AbJBl;Ubpc+MDz2LOgCj-APzkPe0T!Rox`{5S94|bpWL@km6a1i z>T%;lj}*UF@d&L$ELGI{WruO%5PD;8Lu#kZ{dA>@-@uR5PJMbREY#Hk%wo8j+JHd* zkYX-k#hLqn8>kfn+{Cb$VL8JphC4O5w+`%#QiZ_i{s4L)fF2B>hXUxU0rd3%dYDnY zp-*>#xZd;KUI6#ey#oOAHFOjpmQd0lF70ljCwEkQctY2?3)dxH3R&~U?G)B{guC`K z%w*B&rmp?bTT?~uQ4M3``nA@CKNY4gPPZ~t!k?#{;R=?pvA6%(Fey-TX-+}5{(l)J zg%6{*e~$Ib^h9>>gOYlFy?tYUtP;VVHA^m+dm_o;)~<$L8l zQ{Q2~kuZAa`Sp2Y_&w0bk>hx^9~ZACbPjY(OsMlU!tHUY>X?`s^^O+}drwm@SWOV$ zCPDA`8GLq!dad|4(Gzk-fYv{bXvr5kA@+Uq6g92}-3rlz#lQhy-T5n&4U9?yJ&Sq} zxM#79;sPJ8@vNV{8l*~3d_E$BZU?Tv)_{`APy(u`@SI}E+NDck&L6Fz-ZWjo?jqOv zVpv#nyS_5XmmjRrx=k1K;hMh|eOC5Oh<@v8%}C`(Y;7usCD3YZbba9v-;?Hk>vkhy zbfNMteQqXtmt!9ejFF#*S-so-B(`KOSd04`RmY!I!ly49a7%)J_@x*ze5a=|vi+m^ z@QZnE6+R|$UT4o1^X+TlyDE#k?yib&!{|z$_*MyhA;;Yi@>?aePL;o>5sJ&b+)trGgwjJ|^uYB`3nJt#oiAU;&`Lp(?9 zSl>&8&;7F`-{wx8e4yEOYRvFaBhzO|zK^EKFaZ7kjD*pQpr0jqGT~YOC{j)Di1cF} zTObs>M2stu|9KGIvp@@WCqi7WokQPB>kYc^HjRyMxmaW4{q%UyeB$r>*!ZJ7 zCS)BRtUzrS$=LW>-PriELB__P((ZfpO~2P;lGFRPh`5;SMtGU!k`{=k*oVmuYY``}F@4Y(lV3wC^qBM^}4&%|^m`eT7v` z8l9TxE%FX`iHZJL?S!tlSZAy=-kG2cYeWoY+GpLasB3d@wxVB0!uCM>6L>wK+vF1X zyj6lWE4%n+$F~hF&pXucJXnK<=eFJU=lr85^C4b0;T-zUuf%~TClu!m!9Hzzd63oM z{=FS!J!c$b9iTzhDly2KTRFg3?D3FevBJPuZ0e6|EXIvbB!jSEjZZPxm@iQzu3*C( zGzjs!&c%P@Aj}nJkaH;v!Y0GmcgYOGo}SAf>^0+Lrlf;)?&8H0 ztSGGvgY`#n)+Am=pEjl0@GW$dXZS6-woii!iMgjLZ3{6?C)3a7x+GNkz69e-?q1(% z(-fUU=?U5q!ME9-Nswn@;{Ea!&pMtrd@XZ3^*Fxy8hRW!?)e4!_P{#hP&d&q)TOUF z^PPAxFx36X7H%GZkN+Tsx*z4j&0nDC>sq4-j(fhmaPvc2xT(FKOAa~`4fkp=SY;(g zo&($($uQSlcrIu?-iJ97U3-y7qA!KfPm?JZG7_B^+2*WIgd2%oW890?>r;({(epSr zI@YmNjTzC-i^e1;FFcE6)QO{wpPBm*^U6mYFBpcH+QOf2?Z$Tj*4STElV~m6WXJF% zz5snNdC94c@&1k@1Ky$u@8sGwv|V7JfB3|JcXIQ@z(kQDmKL+s7eUQx$BX!;^Fejz zo)w1B2l~+7UP@4M{@Ec8Ep!}=T}9Kx+KlY)<1eq=`tuY=Vr&Mo!r!5ejl1{vJ74E_ zFL-9-bEh0H8H$}fRh{2CGBnyh;8pC))TEw{i2*8TO5Bn-HE}7P12MfG7Ym&J$*@L^ z@zb;z`ZdyINWvu6qiGWwF|V^YE5?zapzKj+G*)pYD$WJyT794-D5^b*x|tjiuQ=mG zgwv)c#|Zup6epO$n;YwxuQ;PW{rLpNz9f0!K!4Aqw`)uJ=F+vt#;b--PfT@844-=E z$Ux2U<0F;cnj?6aB!^;8TAZZV(^C#Q912b0IFl47&aqV#b?J%Wk<-IP{s$9w6FFmp zk)FFbxA-oSWHT0bFFvc-Q<4{PBBiinU3fc)MR6p_Oe1%;$9{PflS=VYDTR9#`%+cy z6^vSri8`X#7vW36261@ts@lK%68vM6-eJ;&VqZw-gy;B4X8~u92di z{xegf>IQ#hHSX=f3A)3b-l9h}{Y4WaQ{$c9EfZ5mKv0)4b+}{5s|iyY$xAwWy`3kD z`iDjbHkVeqLU_`^B;@AzcfGc?YIEt$AtX2&yfNy^6W+6@N5;E~M#o1wyUA3Ez(wcEQLqJJ}+&> zhv1c~KLr2$W8PtKjH>bYDHEiHVp+5>N_XB5qLKphsA}SXclg+3uj+t*skzv=R-hY2 z)1iGEK~17Ks8La4K@*d#afuFxW1(Y_BgL`AfhRgp3=@=?82f{t_!tTjIy+kV zmb4BUsvc)I}&2 zBjb}rVkEG&7nG%(X$+{Bri4U&gvPS zI&0S(v#wgFm?zSgD<2;hFMqPOJ#u`WieQFh3n>tzBGQ{cg{XD_s$(gAUplZ(_Jw8oPB=wch0@{+;jH%*?LsY z34R$1p5y@i#A`1Dl{qRbisVrwk0N;#$)iXfMe^up4`2j$DD6%c-TlSBpV2?lBja;Y z+(V|=Leb|vq;|Tb!K#;HHs}Kou0?)T(aFTpy{c$s26y0qE)PfRu>8E{2Cn9YAGXQr zJ^(kC091Y`9Bsm~(H5MB)QoA$md`j>c>X@{U{PtpeoHv|n!NjB?7c?D6 zTXwBRK-mip>q3s|DzFYnnGHeN51^L}Yi*y{kI5RFn52_?P8^Tt>0GF=3tu=VXHu<_m+81QjJ%cGfz%@n_fNb+2V>1@06Q{ksud{C#K zK)Ij@GBf$2-C5#3?7w2|;7T=qqp}GCFompiTJK^?->8%pl7dp<*}mgLcwMP=QUVvV z-Y))XZc&A>tlyExvq1cYa5|C2;UgMpy9X=BAM;nW?cC(Uv%0wAX;IGQ$fh`cdCH96 zCKWFPHFhxw&5N{s8E^9)SRZ?W_~NCE!uk>#D7=j6x7@``dr1U5BXUcPK%potT1rz| z+IB+jZBOF;r=*kNwkI1GS7;82leLJZkk{}%#%284$A^_R8`YEZnZ(|mWse<s|R+Q{~S-;a~RHzHo2M1D)liNcnF6BX{G@_;)>5FPvC`iFys_O1Z1kqPLrkJaZu&Q{-tG$)*+z2(iBX%> z8~cD5&)rpR8_?;XibPzhWH7#q5As3Y5RYpUAQBsFtc1*cYG4`Cec@coyE#eb-u}LG=oLdZgpN4+#X)ayofd6#tIjS8 z`U4jXTXGSfK)BBaC@sc&HO2~6FKaCCrx(V!_uL@fGTmpNww7htK(eQ9z~5|hZ<0F9 z$V`Xck#TZS?4>lNx`J}vugmELZj8D5&K^72$3a@KI8>~MQC@n2*uBR`-i&@e@>?C% z%XYtU$5AU-Y+YC24X(FBe0ZFrX;cPYs=y}i_LGCtgHZjAj=VisFXQ2fzL_E1}Dp?&@A^k87CcePC% z3gZoI^RC_lch>kcbW>dihm*gt9ppr28DVQmA@&z$wI`qdbK27(+< z9#c|1Gqh=?6bwZ+4vcu^eY^Je(y2cfHi4v0N( z|KjpCd0mpsQhh4fsZ3;TjKCy~ww}9|eM4@ovmaoQFWKHBy=CLKLFWoZKZcc9K-Y^A z_NQxCKJ|XY=4R+f^zI@b*Qf?~cweZP0^lfQ>PYm#q7wSbs>N4MUuA>%BJ|bl7hfHH zjbZxWXj&%@&k!6O7h_8_?njC`+n_Q)q00V2-3wD+#kiNeQq>mSk8{u}WOK-sf9ANvY@asG)D>Y0h|u12-irhTPY zr|J>8bd#>nUa8hvQ@uh_%g`nvM{EEk%V9vU0o?sA?g2-fL+YS_w!5&4_B)3Wmjf+* zP`wO4fE7xof5cND=<&!o7i~aK?HX=fT1mN<)gtdI-z)nC+*D;j8@5m-QOmQ$N}3j7 z3se$L=J`YeK{zU4Kez{6+(Y&_x?*^sLfc&!jeh4DL{C*uP|Pj0o`&T9cFJ3n61o}> z?#9T!62nZTYFK>TjEVrS3<*;TkSA9OP{-n3rX>3DbZQlhpkGfXh*Rrmp|7YU=2bYA zPC%k00qjsz)s*(0q$-IK^kJD=Pg!MD!@5e+u*jGCV|?B$%UD5ZP`<pvLqsiJ8F0}sNcko5)^%i!jkUE{zaDLNu61PECEohO(K74RrcFTQm9L^ z{|ZVXf(FtFiatbPNhL|IDb}?HP4T67H03>8d zF{S-N!Bl36f<<(}6!!`Wrp2AVjJW9cL~2sOUI4bm7VIWfj;b789Hz8iD45DDQLq|a zFvY!sf@yI-xs15z_e5$^!CnHk#T9JkosX$<+={U$ub0$s;s*sI%l3}d>4GWlk_+~- zh{K*xbukzFCE_runRlGK{s1Qy>4IKLcz?%NXjB)EK} z!qIPki{!a)i|^a;A&hqgVLaFlVJ~Ul?!sdjsK#0s)4^4`G;-!C$-rNPWOHl<5yH>c!5FjCEdze z2YAd4uCONYUq}zf{$?&|lJ-xXjENVljP-%+cQg5dL-exH=i7kwS!;q>IY;9YEY`kY zcKocotayaP42-qQM99I8blFVtZ^x{TOaJYJ^gX`><~3Qt9I1%)ffcqToNEI9CC|uw z_y}fWHeemwnxNl%=p%RAedVjfw<_q@vo*53@1uS!cH};Ov)FMH+;X~|oN=djI4=K} zV9*}XOyy)^DkpJqDhJwYDqEALY_h3!ebPQ<)5?{14yCMb@Wz2pJqfL>r`5JtNO2#^ zw*uR}eyV=!sZ+79bwkD~&R-y9Wpcvkh!v>dqNVe*BU6LZ_GN22)$ngvfgM;4H8p-= z1X^lGgg@x{tA-ms@slr&T7jM3^;!=;Gp<(Bif&!S50+x?WLZvdQ*d+e_TZM_R%*h7 z+qCvMJGebq5!?~nX;j3nJeEq9E-z zFb-miNc#YXQMd}!Z{i0a3Y;K*8{e%&O)$Q_CJG!NmU!Is4+KPULcVeVM6nYD4;@Q@ zV0=4>Vh4!Q#nr?m5&B_0tg}kpAWEGe_B%kZChZ_f9U!(W5`;VpKNb+?_82Uvi7ieL z!_aahYN8?u#1;pLibaAD;U5!K5Hq!308!xtvDE=0jL7zysBnM?FA{`wkB$ilW@^6x zBJ2dggB%hykqjd20Fl0j7=JsAYC0mSq?A2GJ%uFg1Pw1GKr{fcy(X$1AkwR>6Ck7) ze_BA)+N*&A(2IB0#ACRD2@r>pK-4-wG%WIV=y9L*8POCqxIr{HL5!<0*d!KmLK9sX z;Qavg6oA?QM0Yo!kDOkGn5c;-kr>ygfY`6S@n6&gwR!|Hk6AsrB_9V6yNdp9oTU8R z-9>)R@~vbwVYScBB6VhXRdm`}h<}D`Oq+$H2T_O}ffpbO)KdVeBDVHkq*Kiv{wdOR)Swjeguv!bkx96 zK}Q`NVLBR}Nt(c~CcoLqZ?SuSRMd(BASTrKKPrmS9euW_9n`*s@!6sd7pGIjJyO)= z3gPx%XX+jor`N?9aB+rRoG}+?5*+o0z2;Ffs<LH^$6GpN-RR+X!R-o^Q?pCQiWXL9RB)0C~NHvWq@Fgy15|C}^v9dI%* zXgzjo0d`be=$jebJ2N;vvj>x`YF4)x{p{JZSOtU4C+Ex_lwCw^5ROJ zV}qw%{Pm`S)W(~)CI+WnQ8t?>YU_#ATHmNE-U{qANn$?i%iOcaHs>Ao=IZS^)=;L` zEL+-ZD!^I`rXTxc&di=0nXwMRx0=4enY}Ehbw3!`#G)90Yn8&kRs5+jsvPqrih^%d z*>Y7=^hF*lOUlaQh8e7t>fiGE(A#}y-hOcK-oXdYGz|8?KE7|LzyJ06`}f`dz=1%H zH=9oqhHslafo$(uy}WbqWQAS`Wfgg#;9!oy>>v&xvWh5ediHeR)ZUYW$7W9}h5>Z8 zZ>E1pM-hl8NBXe>6KU26LqK`=s`-DfZy&}?8D{<;=09%0R|f|W`V(saE}?~z!4prE zOtg?y>J)0cb?Ljy$WRX)Ob6f(<+Ur0zkb?*myk=X@fqP1^G-0iJjOm1pX%gkldA=6 zyi(?xG(EFu$YGtQ_4)Lf^Kj+mj@{c*2&PXi#6qV-R*0;DG_thTv%vNxOrzC9DHqV; znL69ddxI-goyGE;XGaXh{tvzs_65KN-q&;THuTRiQ+(Cjr<2;g)UoOt ztYWMVem6_7c~}us8{RZG;9yjy3J_OyiP5eLw{x#f@WlV?WS8lHHSsi+o+@peiG}2ok}MpTc-3*iPfW2 zG?nbMf?;T=yr#X2H)!!irqrM9hFvgd*k&%)+f`B-Wt;f?*>qAFWh?x58KqPp_doY$ zyFfM6Qg8gisg{auWzU=DSWd$wE$fqXzQVfT#h%RK#y2{?WxXhlY{L-Bj!p7<#08e_ zQE|Yw%Dx`aWcPn1JHI=7KSnOuSm$KdCF$jXOVlTQLE621w~Ty|VOJGt8B0_b{iVn# zaLXv53^O=FG(9-_=@wQ>6^2Cd{y4{97!rL}4a7nWEOZ8zkXPp9m6KQLP%B2A>7*L3@Mk8N>@lkLTX$g zbrRC(3Ta}9dJK*fHETD<#7By_9*~$@T`8g}>Pw>L{I=v;;m8wrm}*Xq+@`^l{FkW3{3nqScFPEh z44Z;dWGqohd5>sJtKBl726{t@dBucL1onzwetB`?MvEHq&qYkF$x0}yOD`rs#@xH^ z78U((wfG=6xbIA=FXkmtIC9Q|SA+UZ{6Jg-i=jl&{VNdgJ=5vm3o4e2(z$ z@XKR+yRo!?H$FchzPW{zfLKtkRmswRieb23+J8}pL+e%r^&3*uFa^W)^8QP<@Fs>g z`z5@Etwbw4FDr(8SHNqB{|ETj;1*J^?M5r8zA8w;uL`RaDFEczA{K_Z_kvQKE&y6B z;q!~ai+PNJs`d)hj~hy!`idYuzamnA3g$b{xNTUH4z~w!joYWvy{Nt*%qs-{0mR)M zeX*#J@xUtqJ;d~Im%+V`?&zyUAny=CvDT)ZM2DAYG#8fA|M&U7^Cb&&L%@W=M zYVv6nUKBJN|IDXdcpaembVDc1@^lKni+o~}a(2Vda`Z@eFX&-~^F{p?0FGhsYHex8 zB+aCxiGd!HG;_k62d%cH@$kWf93Lpl763JM7!qC~DDwd}b)QRwUj|yB@;_2kF1$)m z^JGPYR|7gK@#=)v2>JuzH3_d7bO<~nr$zX!pni!P6<#~2k<%f(PEg7*>AQsA4QkT& z2(K5^q#qF8Fz5`^^V|6nJ|6gX+P-h`_DMGyi=80&3Ub7?PZm7w*WUOq8jbx)jYiT( zNwtYfllfJh{h2f}p^0&beZ?TM7ZaMI3bc=lEvn3g?3Tq#mn$kZtmFO0s^@gF4=l26 zR*G@U8W7nBOmT#wnz0xTXLu%>XC;1N(b2~)e@Y2nCh2m>s^ze(oI2zdf5;`f4HCG( zI6a0%tT(p7&>e{XB`^*r!_e!EQzQ8vV_z1`GmMm^nM%Fk?b18?v%E(yab0N9?gC(x zoXgeB^Gg7uQN#ocQ`#?C*Bg$`ro@vTNc1}jNbB(zkmX`4NB3P?{2B#Q+Amp-n-WZ$ z7Plx&vc9(U_)ExrvCwosXH`H0VoLiZD_o&^NQbUXFYH|k$mnw~K@L{Gzf7{oXH2&_ zuL)MBv|qrgGKd}(KwonquDrGv_tpXj5`V;#@%jnci7yWHg}iJ-EDKT z*JkqRwYdju?qQpoJvS9!)x?WR8^E4J417M!bkBiu6w02D>b-&IK`S*Q;Xb%|F+2b_ z(}X}r!P7PD?7@|SAN~nb@QR?nQij;Or61=Esg(R8pj+_o46Si->cC-6jjoU;aEPoK z)SXj{D}F0D%qi*$X$ObB&JI%K*a@1?lC*suJ*pR#K7jmg@cB%!UV0>MFX)8u281^Z zYKeOcbRE1*KM6PQjkC-#aEWUU)EP1l4sm&;2jl~_;|d5r1Zr><3aV{j5gCwjM)Lja;jG@3WC$Z*14Gs?%OrZomP=g}?H*>`a8oJg& z-8f1lv<%eXpxGeiR+%zIgrUGuBeCj04UR_PHGvu&&2SS(i-fg;x^YA$v>nvo=n!6K z$`oA;1&(fs)dOm9^a^hP)ZiF~Th+3JO@g{{#3XbM)ZmyGo(BUgrodC*z(>jlKkF#~ znomCToFO#`J5p3AVI`m%!LvnW!Yc>mQ_Cl)Qg~b(SAZvo2y28_2O4I+kkJS?FS?t= zy*rAQo^c_!1(f-<(vLV%P$RcpcpacdZm00NK#kmP;q`#-7g@b<^J1O@;-=hT#)aH5 zP|BU8A8}%!M(&*O=0S~I4;+lgu8ENw5MBthL1Y!e&5LnM#7((na8n*TDh#Uxy~ucp zH=R8e+ndgQ3+|YD)7f=lsz%TkkjnX{vm3)FioF=dVkgEtQLVy@f`;WyZ-<-rt3$#% zK@Yid?UK-LP+m;YBfQ>}DFzq{9K#Z84AkJ56kZI};FyD(xz0USk?Gmd4 z)Zpk8UKgmr(G9n%WeMvAb>kS2&|y%6V@!CHDO1E43LJA1YaZ0#@W8>^^?@23TxL%k zI6PH_QAg^=Q6iybpaw^|@G4WLh%gj5s6nO7I#B#U){&w{;WdF89L;bOM~j5Dg1T`; zCA1yX;OG!uXUY^^31k~UtgPSgDPEa?FE(z@hH8^^N*PAlM07HReSYnNV8XS|ti-8&(b8r*Kyo7nM zF42v{$89TYKV;P+Q-p+9m@-8PLxH1AVwHm$9NZ4W+#;X`M-AM}wNAnsLESi-B(xdS z)JKc(T2rQoG88!4B~}Nh!OMG`8*bw0k+5D+H;w@b9R@Wx#)LPSGDVD`z%eJW z=0Ob(57uU|K761CM*wbB%Mw-y>c&wbp=F>3N4fASQ>KV86gX-mRvoCp(I~toP=lix zZsKT>uvSnvj;MsTgBlzi!s|?#qKl!x(JirhKn;#w;SGQq9K&!E$C!jog1T|UBya3Lm({5g=vz0cvm*3a`k#8Ur;rCWRLRH8|$r zCXRUt^FX8R#^D23wI8DIW{QyT3R9*iVJL8vNvv{EgQHS-5m1Ap25#nBCt;1C3WsA& zNRxy%gPQti5nijLz)Fe+uAYbrza4Z7BD2Ta0XM%aof6gssu5t-itu_s(HT?mdWAOt zYI?lG!W#p9hWX;Dn}nMe-7#^q$2-TkkUI}bxgMT^#g+op$PEZD1Zw0K3a4G0fbLE_~tgxkn15jW+Q!A*JPpv5fg{A^Xa zCA%sB~V%z3z3+jM&Z3AYdKb>z2w=P(H% z2Ec+>wIuL{;8jmB*+^Xi%6o(oH86Ua@XJB-RTf8!D&c0Dh=kRER;zLDvqg2nYXmj- zze#w_pyvL!2(K0NdFBh*QMlP=)7=g?FW&zS#>I2j2}-$L^dn9;sFB+Px3ivlCH8>C z9tJhi$AmWtYTmXO+(!Bw+(!C5<3hTJQznq^1Eur;sF5BLULmL{b&2rGK#kmT;Z=ef zxe>UH+#0xz+&Z`^uMw2;nn2Z4kBJt~P?6evm2N&$nPOP%-1gVB+>#BN?$;##n>>xL zCYNzKpv)!>aZsSP8xC-_>dbM+5jFx~;qAu)X~ zsD^-c5l+5YPKm?dP*cxYBxlGZIK&boMP75Db}aUJB!k80(QyNyj7uyb;T3`!EG2Ne zv6O*JEajk1ES2C8ON10yYC!E+>V)42YOpj3uNkyJu(SxT71Usf!tKV=4lc2DfI6{s zf1mB?7k_OAWZhQU~h9(g+T*G?AiSnnCSYT7=&UYOq9w z*ABWxuyhEo6Vzbog4>Oy8(d=P0d->O1&3G$NP%S-)Q)9L_>-UpOH6okpcR5;UU(kN zMi?wUxZPL+;1Wv+)QP1K9AYUU1(q^UJC<_cSArTW5#iN?o!0pB|3@)*ZfjY5Ff?o2yYm4 zzhD^?-Xy5O5`)`~We!|onFn=Z@o21ot|4of4bDC6*RYXGkkJ#1bV1mUd7(mJZ=} zf*LGc!s`ZoUa<5CuNTx{8Gw783(GLL#4-lz#4-sEvBXG$We(JiWnTCm+dPL)<~{9@Crc?IeZdF3>G1w^xh0h1Ua$%24rog*O07gzUi$3vUcGTlGaSk``W! z@xW6x3^$R`Jr6hYBnA(PM4k`S$O#B91Zw0I3a5rxDsw7Cjz&TQzLQf zgvW9>3a<&&$Y~Z{3#chitMH(L&ARY< zL2GSk2H;mCX9*tzJtS!+g%<UCESC7i*8jhLk~CWH2}(doX=bcT-JV} z#3}(*wT~2KaF@zmD>r?H(aE{*Z<9Hlf1S(;odDd{X$(+o5|b30+<{6oskixZwH+WEZ>w*$x;ZefJ36|<+7^$z)0fTkHqH*; z8Zi|lhIy==@z_#(#k0Vd4WjU}+W#L2=Ww$st7nWpcx61OubjZ0u<)`f`#ONO%ojrR_ zaW*NAAEtmucxH^^?a--U8cF-_!ruRoW#x&WLvrT;vKJG#7Bz9*PF)kLm6h$y!PWLC9@zRuoR9t?YvRFRzLk*+ zGssWCaS_kuQT*SFsymARdy)51{NIZVj^cmWB^U)?+dmGw%j!*gLYb zIv%jMAJNx>SwP!?68mf56@YiM_j(*#^Jtt8_RU}yX|^&wrfkF?g+;x4Vc;&Gu_tDy zhlINh++rAGrj0VPl(1qj*LzpRnH07jybZ=;HT)ak-ZJQ4_d zv)F#ToOt$OE)Qnj^PaUr+wegQTT_W3JSYtMIfFJkgTgB4eGl{XN($PggMMg*o=6VD zJBSRgn@y47T`DNFCq;&z(?LTif@)RJ4R~T*vOG_zuv>n^3f-NI!}CoQcI*07VMqXw zw;r=XTV3f;O9*>E{wrKzf1<+5{@e=Hy24&jVINv!p@2!%<@vD=`k4~Shn-KA zCjLc75LF&EA*f%?5qm=wcoKq)s`0<5Z{bs~9=`tpZ^r7U0#(bcY~LoFjp8%MPx)4UBZJCKPD1irLF{eT z2c?|ju;A&3_j^`;{UJ3%cyd{q!#CGVXkEh?C4-tAp-VE~MWp)v5 z(cbtky0zG!Piwt4K)T;vttV>!8gY4G|0^a zKug1*9|FAv^rPYEJs($gmXsY_?DX>ke)^MNp@P)#shHsPRVhZP_Qrn!A7{)zt0S;M#%Q=hThl8>26I(KRUUz>td_Pp_VsyQwWn|bY#rzT%}%qdQ)%*lRr2@8 zbJh;zk0(-Dp~gvQCpa26X4uSo2>ZoP6kUUJh~k;XZwHFJz{6+CVa_x&ek0zL3oVO3 zmX-X_%_f~~w%W?be^=*{Wmt*B{lj_rdhmop(k9;8u{CKlW)I_ekjq{U?y|ypTQBs% z(ki+u>Z89`ANV+nKFld}=1=ZrCg|3m86BM2Gd((8pEh=VLr#M^nQT`UPvMsn`K^}% zpI+h_X8^b^SY>UpACngRw4D1dQo_NiEE>2r=loZnwRc2{_Og9I--mFujC!thOL*d-qK&JQlX*?BY2kXa=y$)E$pmSbQ^3wjH^F#Y*_fMQ@ zI6HX%`1IMg-@bTY;=CTOVYC*=(N?KBrqtuLYzz@`mMMpH+S&-49@bz=n!_J zF*@|32McTD%9yh<;GB)op-yu9#Hlw=&yJjYz5l}bV;9Cxjf_l9G#q^R_5N`gA?A8B zp{77DA|S@G9fR4-uTSZLtk;{Pdi*w-xzOXB8o8)A$_leL`)uFz8Rh3V7N|xCPt7Pl z$FRs^YUK2gW~f0dU_w9|i2KygI*0ZoGHe#WuVHJ(j!zcN_aZRsCVU%zK^Gc4oOBmh zk*Gv;zR=BtN$boPP8l=O*|uV2!S<)E3^^D2MrU=^Ds$4r_`<0)81GdW(er}j=lxnG zU@4yGc_n(4ziM}aya;%D|YcyZ%VNcih z9UHOLY(7pZ9iN(+#+i?&#ufiA3Zf-rnpIYueM+?7o*4RxHm`qF*qeOMf(b ze)g?~(+7_YJ#gXdAZ#?h)i<&Kw0?eWymqziOd zu7vh6R~%+|;`ny>l^*=^3hSCQImO;g?gWfD852S8v7Eg1`}X1}U>tDTH(ig17K-F) zsL6Kn^E)!GzPu?T;8`urdp8H0enlT_x;>bgQ>8xL*Ng-+?cc|oe0)@^pm6i9=pTpG z8hj_9-|?U7n;unqk7ZffTu%IVjni}vTHUyQnsL3wdrm`7>-=Qyps^Y6&9I6-Q$I7+ zcW#=^#^97@2m8m*ofO zeuHL2^lST_#2Dq1bei$R(!t;(?%xG=eTe@#TPrfjY*j4kPFs2E;Q(dSmnY|rGDXdz$f3yf5L(zHRG!7oClx*2y?8il?2+REIyrK)D42F zQLD9!`+ORk%e_*owWfB3qLOPN=&GG_*2h&l=j!p|Va$9dmEo?1vi91%Z8NDKlpMOV<53W@2#(QA#a~t06g|dGyEPlS2 zKL2-Z@$=`Bf3+?~{1;8fyRrDWLw_AEXYunZXe4>D>9b#u9*zyb*o$p+G8FrslQ9wg z4`=c7!S~QSX5eKpfvL=6=Iyup-d8NXWb>HU6(yMoSkOFXU$S}3poK|RDzXyRG1*i9 z<(bF4-ew*%u=+Z`l~8y1jk;sanRDZBo`aI}-1JP}xfy84loq78+R3ljQ_*l2)fF;Y z$fOn}y^YN^b{m_k69x!WD%#jwYqzm!i(s>{S+Jmu&D9oWvRRp!JKhc}ov_-{H#+im ze8C5oE2ZOnKtrS+{s%6>1>w{~8Yl8(GVHwq=G4fetGxCW+Q{Hd#)wB(o z@(%d3|9@7F`1YdbXSZ;J1s~|SnV#RjaM+-ygZ>Ckr-r1Ao#x`jb?;28XtX26_9hZ; zw31g~-NxklbIC1bt{7IZcZy!A8rCcta)o4Chl2A;nfWU^3{~?N#-%DHt#(KES)AIP z3Q2wh%CY`3RTxJBb09qU4S++>iQ+lnQ_vW|~r(QD3g+(jabICbBJ3ce$^?!2L z85lJi97W@^Dl-dqb-ba>_u5|0k(8<}EW+YfZfWLgZnm)O2n&If`I>dX;^6w=hTuls zka~lht8g@-G+zS)%USUSi)pGQk@AY>h35b6+6LbjP9OZ;XFu?huRmUOJp0X~fAn|I z;q$W33%zi4UMSJIXfU0NtMfuv=Y_7$3+Xu?>*~CaZZ`EVx>i@`h2o1XuFeaYWek{s zUo$l*lVfV0S}kV?SZXB&76hN=3^tbCpT8T+DZH-b6qu>T!jF-2{iCy3`=O(mb?Ru0 zlkzS-b#C_Jg)_4krVm_fxOlAp!2?7051oCmUacrVw*%`%vYx_h?V9+kk7H`rYkd>b zxj{r&esx~x+ETpPP_H|T(Qzt=*VTC;*LE>%4O3gi+}p!mcWefGZqSeL)p;SAVsw5TuFeZ#W1v4iov|k1U-DAvtMfwaggfVduFebnd&~=clTDp{ zUg+Md^FmkWh3o^Zc!#1we-*8(^Fo&O&ackAP-fl=Y>dX_cK^bgGw*-kz||QcH6xUn Om=Q`fMYhkwP4}Y-)MQ}i+6tx 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 literal 0 HcmV?d00001 diff --git a/xenomorph/xenomorph/private/compiled/drracket/number_rkt.dep b/xenomorph/xenomorph/private/compiled/drracket/number_rkt.dep new file mode 100644 index 00000000..07767513 --- /dev/null +++ b/xenomorph/xenomorph/private/compiled/drracket/number_rkt.dep @@ -0,0 +1 @@ +("7.1.0.2" chez-scheme ("ce3116092a74ea3810b9196a07b46888af35e627" . "7cc4db05ffbf85da9b235668c63e86e169c45ab6") #"/Users/MB/git/xenomorph/xenomorph/private/racket.rkt" #"/Users/MB/git/xenomorph/xenomorph/private/sizes.rkt" (collects #"racket" #"base.rkt") (collects #"racket" #"match.rkt") (collects #"racket" #"runtime-config.rkt") (collects #"racket" #"serialize.rkt") (collects #"rackunit" #"main.rkt") (indirect collects #"racket" #"match" #"gen-match.rkt") (indirect collects #"racket" #"match" #"parse.rkt") (indirect collects #"racket" #"match" #"patterns.rkt")) diff --git a/xenomorph/xenomorph/private/compiled/drracket/number_rkt.zo b/xenomorph/xenomorph/private/compiled/drracket/number_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..437fd58cdb78fbe7e3bd4bed697944480561d758 GIT binary patch literal 380174 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 SVk$ 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 literal 0 HcmV?d00001 diff --git a/xenomorph/xenomorph/private/compiled/drracket/sizes_rkt.dep b/xenomorph/xenomorph/private/compiled/drracket/sizes_rkt.dep new file mode 100644 index 00000000..355afbc2 --- /dev/null +++ b/xenomorph/xenomorph/private/compiled/drracket/sizes_rkt.dep @@ -0,0 +1 @@ +("7.1.0.2" chez-scheme ("1c072b14e112a14b6948873cf516d8ef861699fd" . "e5786f4a46db571f65624f1910802a9914b63f3d") #"/Users/MB/git/xenomorph/xenomorph/private/racket.rkt" (collects #"racket" #"base.rkt") (collects #"racket" #"runtime-config.rkt") (collects #"racket" #"serialize.rkt") (collects #"rackunit" #"main.rkt")) diff --git a/xenomorph/xenomorph/private/compiled/drracket/sizes_rkt.zo b/xenomorph/xenomorph/private/compiled/drracket/sizes_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..d580ac23c24f836f0d71b02c9b1e7aeab5958ca0 GIT binary patch literal 107091 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 literal 0 HcmV?d00001 diff --git a/xenomorph/xenomorph/private/enum.rkt b/xenomorph/xenomorph/private/enum.rkt new file mode 100644 index 00000000..eea9f68d --- /dev/null +++ b/xenomorph/xenomorph/private/enum.rkt @@ -0,0 +1,23 @@ +#lang racket/base +(require "racket.rkt") +(provide (all-defined-out)) + +#| +approximates +https://github.com/mbutterick/restructure/blob/master/src/Enum.coffee +|# + +(define-subclass xenomorph-base% (Enum type [options empty]) + + (define/augment (decode stream . _) + (define index (send type decode stream)) + (or (list-ref options index) index)) + + (define/augment (size . _) (send type size)) + + (define/augment (encode stream val [ctx #f]) + (define index (index-of options val)) + (unless index + (raise-argument-error 'Enum:encode "valid option" val)) + (send type encode stream index))) + diff --git a/xenomorph/xenomorph/private/generic.rkt b/xenomorph/xenomorph/private/generic.rkt new file mode 100644 index 00000000..04387488 --- /dev/null +++ b/xenomorph/xenomorph/private/generic.rkt @@ -0,0 +1,110 @@ +#lang racket/base + +(require racket/generic + (prefix-in b: racket/base) + racket/dict + racket/class + racket/match) + +(provide (all-defined-out)) + +(define-generics indexable + (ref indexable i [thunk]) + (ref! indexable i [thunk]) + (ref-set! indexable i v) + (ref-keys indexable) + #:defaults + ([hash? (define (ref o i [thunk #f]) (hash-ref o i thunk)) + (define (ref! o i [thunk #f]) (hash-ref! o i thunk)) + (define ref-set! hash-set!) + (define ref-keys hash-keys)] + [dict? (define (ref o i [thunk #f]) (dict-ref o i thunk)) + (define (ref! o i [thunk #f]) (dict-ref o i thunk)) + (define ref-set! dict-set!) + (define ref-keys dict-keys)] + [object? (define (ref o i [thunk #f]) (with-handlers ([exn:fail:object? (λ (exn) (hash-ref (get-field _hash o) i thunk))]) (dynamic-get-field i o))) + (define (ref-set! o i v) (with-handlers ([exn:fail:object? (λ (exn) (hash-set! (get-field _hash o) i v))]) (dynamic-set-field! i o v))) + (define (ref-keys o) (append (remove '_hash (field-names o)) (hash-keys (get-field _hash o))))])) + +(module+ test + (require rackunit racket/set) + (define h (make-hash '((foo . 42)))) + (check-equal? (ref h 'foo) 42) + (ref-set! h 'foo 85) + (check-equal? (ref h 'foo) 85) + (ref-set! h 'bar 121) + (check-equal? (ref h 'bar) 121) + (check-equal? (apply set (ref-keys h)) (apply set '(foo bar))) + (define o (make-object (class object% (super-new) (field [_hash (make-hash)][foo 42])))) + (check-equal? (ref o 'foo) 42) + (ref-set! o 'foo 100) + (check-equal? (ref o 'foo) 100) + (ref-set! o 'bar 121) + (check-equal? (ref o 'bar) 121) + (check-equal? (apply set (ref-keys o)) (apply set '(foo bar)))) + +(define (ref* c . is) + (for/fold ([c c]) + ([i (in-list is)]) + (ref c i))) + +(define (ref*-set! c . is+val) + (match-define (list is ... i val) is+val) + (ref-set! (apply ref* c is) i val)) + +(require sugar/debug) +(define (ref-set*! c . kvs) + (for ([k (in-list kvs)] + [v (in-list (cdr kvs))] + [i (in-naturals)] + #:when (even? i)) + (ref-set! c k v))) + +(module+ test + (define h2 (make-hash (list (cons 'foo (make-hash (list (cons 'bar (make-hash '((zam . 42)))))))))) + (check-equal? (ref* h2 'foo 'bar 'zam) 42) + (ref*-set! h2 'foo 'bar 'zam 89) + (check-equal? (ref* h2 'foo 'bar 'zam) 89) + (ref-set*! h2 'hi 1 'there 2) + (check-equal? (ref h2 'hi) 1) + (check-equal? (ref h2 'there) 2)) + +(define-generics countable + (length countable) + (countable->list countable) + #:defaults + ([list? (define length b:length) + (define countable->list (λ (x) x))] + [vector? (define length vector-length) + (define countable->list vector->list)] + [string? (define length string-length) + (define countable->list string->list)] + [bytes? (define length bytes-length) + (define countable->list bytes->list)] + [dict? (define length dict-count) + (define countable->list (λ (x) x))] + [object? (define (length o) (b:length (get-field _list o))) + (define (countable->list o) (get-field _list o))])) + +(module+ test + (require racket/list) + (check-equal? (length (make-list 42 #f)) 42) + (check-equal? (length (make-vector 42 #f)) 42) + (check-equal? (length (make-string 42 #\x)) 42) + (check-equal? (length (make-bytes 42 0)) 42) + (check-equal? (length (map cons (range 42) (range 42))) 42) + (check-equal? (length (make-object (class object% (super-new) (field [_list (make-list 42 #f)])))) 42)) + +(define-generics pushable + (push-end pushable xs) + #:defaults + ([list? (define push-end b:append)] + [object? (define (push-end o xs) + (append (get-field _list o) xs))])) + +(module+ test + (check-equal? (push-end (range 3) '(3 4 5)) (range 6)) + (define o2 (make-object (class object% (super-new) (field [_list (range 3)])))) + (ref-set! o2 '_list (push-end o2 '(3 4 5))) + (check-equal? (ref o2 '_list) (range 6))) + diff --git a/xenomorph/xenomorph/private/helper.rkt b/xenomorph/xenomorph/private/helper.rkt new file mode 100644 index 00000000..a2e84375 --- /dev/null +++ b/xenomorph/xenomorph/private/helper.rkt @@ -0,0 +1,23 @@ +#lang racket/base +(require (for-syntax racket/base br/syntax) racket/class br/define "base.rkt") +(provide (all-defined-out) (all-from-out "base.rkt")) + + +(define-macro (test-module . EXPRS) + #`(module+ test + (require #,(datum->syntax caller-stx 'rackunit) #,(datum->syntax caller-stx 'racket/serialize)) + . EXPRS)) + +(define index? (λ (x) (and (number? x) (integer? x) (not (negative? x))))) + +(define key? symbol?) +(define (keys? x) (and (pair? x) (andmap key? x))) + +(define (unsigned->signed uint bits) + (define most-significant-bit-mask (arithmetic-shift 1 (sub1 bits))) + (- (bitwise-xor uint most-significant-bit-mask) most-significant-bit-mask)) + +(define (signed->unsigned sint bits) + (bitwise-and sint (arithmetic-shift 1 bits))) + +(struct LazyThunk (proc) #:transparent) \ No newline at end of file diff --git a/xenomorph/xenomorph/private/lazy-array.rkt b/xenomorph/xenomorph/private/lazy-array.rkt new file mode 100644 index 00000000..c60b22e1 --- /dev/null +++ b/xenomorph/xenomorph/private/lazy-array.rkt @@ -0,0 +1,77 @@ +#lang racket/base +(require "racket.rkt") +(require "utils.rkt" "array.rkt" "number.rkt") +(provide (all-defined-out)) + +#| +approximates +https://github.com/mbutterick/restructure/blob/master/src/LazyArray.coffee +|# + +(define (get o i) (send o get i)) +(define (LazyArray->list o) (send o to-list)) + +(define-subclass object% (InnerLazyArray type [len #f] [port-in #f] [ctx #f]) + (field ([port port] (cond + [(bytes? port-in) (open-input-bytes port-in)] + [(port? port-in) port-in] + [else (raise-argument-error 'LazyArray "port" port)]))) + (define starting-pos (pos port)) + (define item-cache (mhasheqv)) ; integer-keyed hash, rather than list + + + (define/public-final (get index) + (unless (<= 0 index (sub1 len)) + (raise-argument-error 'LazyArray:get (format "index in range 0 to ~a" (sub1 len)) index)) + (ref! item-cache index (λ () + (define orig-pos (pos port)) + (pos port (+ starting-pos (* (send type size #f ctx) index))) + (define new-item (send type decode port ctx)) + (pos port orig-pos) + new-item))) + + (define/public-final (to-list) + (for/list ([i (in-range len)]) + (get i)))) + + +(define-subclass ArrayT (LazyArray) + (inherit-field len type) + + (define/override (decode port [parent #f]) + (define starting-pos (pos port)) ; ! placement matters. `resolve-length` will change `pos` + (define decoded-len (resolve-length len port parent)) + (let ([parent (if (NumberT? len) + (mhasheq 'parent parent + '_startOffset starting-pos + '_currentOffset 0 + '_length len) + parent)]) + (define res (+InnerLazyArray type decoded-len port parent)) + (pos port (+ (pos port) (* decoded-len (send type size #f parent)))) + res)) + + (define/override (size [val #f] [ctx #f]) + (super size (if (InnerLazyArray? val) + (send val to-list) + val) ctx)) + + (define/override (encode port val [ctx #f]) + (super encode port (if (InnerLazyArray? val) + (send val to-list) + val) ctx))) + +(test-module + (define bstr #"ABCD1234") + (define ds (open-input-bytes bstr)) + (define la (+LazyArray uint8 4)) + (define ila (decode la ds)) + (check-equal? (pos ds) 4) + (check-equal? (get ila 1) 66) + (check-equal? (get ila 3) 68) + (check-equal? (pos ds) 4) + (check-equal? (LazyArray->list ila) '(65 66 67 68)) + (define la2 (+LazyArray int16be (λ (t) 4))) + (check-equal? (encode la2 '(1 2 3 4) #f) #"\0\1\0\2\0\3\0\4") + (check-equal? (send (decode la2 (open-input-bytes #"\0\1\0\2\0\3\0\4")) to-list) '(1 2 3 4))) + diff --git a/xenomorph/xenomorph/private/number.rkt b/xenomorph/xenomorph/private/number.rkt new file mode 100644 index 00000000..0516265f --- /dev/null +++ b/xenomorph/xenomorph/private/number.rkt @@ -0,0 +1,189 @@ +#lang racket/base +(require "racket.rkt") +(require "sizes.rkt" (for-syntax "sizes.rkt" racket/match)) +(provide (all-defined-out)) + +#| +approximates +https://github.com/mbutterick/restructure/blob/master/src/Number.coffee +|# + +(define (ends-with-8? type) + (define str (symbol->string type)) + (equal? (substring str (sub1 (string-length str))) "8")) + +(define (signed-type? type) + (not (equal? "u" (substring (symbol->string type) 0 1)))) + +(test-module + (check-false (signed-type? 'uint16)) + (check-true (signed-type? 'int16))) + +(define (exact-if-possible x) (if (integer? x) (inexact->exact x) x)) +(define system-endian (if (system-big-endian?) 'be 'le)) + +(define-subclass xenomorph-base% (Integer [type 'uint16] [endian system-endian]) + (getter-field [number-type (string->symbol (format "~a~a" type (if (ends-with-8? type) "" endian)))]) + (define _signed? (signed-type? type)) + + ;; `get-type-size` will raise error if number-type is invalid: use this as check of input + ;; size of a number doesn't change, so we can stash it as `_size` + (define _size (with-handlers ([exn:fail:contract? + (λ (exn) + (raise-argument-error 'Integer "valid type and endian" (format "~v ~v" type endian)))]) + (get-type-size number-type))) + + (define bits (* _size 8)) + + (define/augment (size . args) _size) + + (define-values (bound-min bound-max) + ;; if a signed integer has n bits, it can contain a number between - (expt 2 (sub1 n)) and (sub1 (expt 2 (sub1 n)). + (let* ([signed-max (sub1 (arithmetic-shift 1 (sub1 bits)))] + [signed-min (sub1 (- signed-max))] + [delta (if _signed? 0 signed-min)]) + (values (- signed-min delta) (- signed-max delta)))) + + (define/augment (decode port [parent #f]) + (define bstr (read-bytes _size port)) + (define bs ((if (eq? endian system-endian) identity reverse) (bytes->list bstr))) + (define unsigned-int (for/sum ([(b i) (in-indexed bs)]) + (arithmetic-shift b (* 8 i)))) + unsigned-int) + + (define/override (post-decode unsigned-val . _) + (if _signed? (unsigned->signed unsigned-val bits) unsigned-val)) + + (define/override (pre-encode val . _) + (exact-if-possible val)) + + (define/augment (encode port val [parent #f]) + (unless (<= bound-min val bound-max) + (raise-argument-error 'Integer:encode (format "value within range of ~a ~a-byte int (~a to ~a)" (if _signed? "signed" "unsigned") _size bound-min bound-max) val)) + (define-values (bs _) (for/fold ([bs empty] [n val]) + ([i (in-range _size)]) + (values (cons (bitwise-and n #xff) bs) (arithmetic-shift n -8)))) + (apply bytes ((if (eq? endian 'be) identity reverse) bs)))) + +(define-values (NumberT NumberT? +NumberT) (values Integer Integer? +Integer)) +(define-values (Number Number? +Number) (values Integer Integer? +Integer)) + + +(define-subclass xenomorph-base% (Float _size [endian system-endian]) + (define byte-size (/ _size 8)) + + (define/augment (decode port [parent #f]) ; convert int to float + (define bs (read-bytes byte-size port)) + (floating-point-bytes->real bs (eq? endian 'be))) + + (define/augment (encode port val [parent #f]) ; convert float to int + (define bs (real->floating-point-bytes val byte-size (eq? endian 'be))) + bs) + + (define/augment (size . args) byte-size)) + + +(define-instance float (make-object Float 32)) +(define-instance floatbe (make-object Float 32 'be)) +(define-instance floatle (make-object Float 32 'le)) + +(define-instance double (make-object Float 64)) +(define-instance doublebe (make-object Float 64 'be)) +(define-instance doublele (make-object Float 64 'le)) + + +(define-subclass* Integer (Fixed size [fixed-endian system-endian] [fracBits (floor (/ size 2))]) + (super-make-object (string->symbol (format "int~a" size)) fixed-endian) + (define _point (arithmetic-shift 1 fracBits)) + + (define/override (post-decode int . _) + (exact-if-possible (/ int _point 1.0))) + + (define/override (pre-encode fixed . _) + (exact-if-possible (floor (* fixed _point))))) + +(define-instance fixed16 (make-object Fixed 16)) +(define-instance fixed16be (make-object Fixed 16 'be)) +(define-instance fixed16le (make-object Fixed 16 'le)) +(define-instance fixed32 (make-object Fixed 32)) +(define-instance fixed32be (make-object Fixed 32 'be)) +(define-instance fixed32le (make-object Fixed 32 'le)) + + +(test-module + (check-exn exn:fail:contract? (λ () (+Integer 'not-a-valid-type))) + (check-exn exn:fail:contract? (λ () (encode uint8 256 #f))) + (check-not-exn (λ () (encode uint8 255 #f))) + (check-exn exn:fail:contract? (λ () (encode int8 256 #f))) + (check-exn exn:fail:contract? (λ () (encode int8 255 #f))) + (check-not-exn (λ () (encode int8 127 #f))) + (check-not-exn (λ () (encode int8 -128 #f ))) + (check-exn exn:fail:contract? (λ () (encode int8 -129 #f))) + (check-exn exn:fail:contract? (λ () (encode uint16 (add1 #xffff) #f))) + (check-not-exn (λ () (encode uint16 #xffff #f))) + + (let ([o (+Integer 'uint16 'le)] + [ip (open-input-bytes (bytes 1 2 3 4))] + [op (open-output-bytes)]) + (check-equal? (send o decode ip) 513) ;; 1000 0000 0100 0000 + (check-equal? (send o decode ip) 1027) ;; 1100 0000 0010 0000 + (encode o 513 op) + (check-equal? (get-output-bytes op) (bytes 1 2)) + (encode o 1027 op) + (check-equal? (get-output-bytes op) (bytes 1 2 3 4))) + + (let ([o (+Integer 'uint16 'be)] + [ip (open-input-bytes (bytes 1 2 3 4))] + [op (open-output-bytes)]) + (check-equal? (send o decode ip) 258) ;; 0100 0000 1000 0000 + (check-equal? (send o decode ip) 772) ;; 0010 0000 1100 0000 + (encode o 258 op) + (check-equal? (get-output-bytes op) (bytes 1 2)) + (encode o 772 op) + (check-equal? (get-output-bytes op) (bytes 1 2 3 4)))) + + +(test-module + (check-equal? (send (+Integer 'uint8) size) 1) + (check-equal? (send (+Integer) size) 2) + (check-equal? (send (+Integer 'uint32) size) 4) + (check-equal? (send (+Integer 'double) size) 8) + + (check-equal? (send (+Number 'uint8) size) 1) + (check-equal? (send (+Number) size) 2) + (check-equal? (send (+Number 'uint32) size) 4) + (check-equal? (send (+Number 'double) size) 8)) + +;; use keys of type-sizes hash to generate corresponding number definitions +(define-macro (make-int-types) + (with-pattern ([((ID BASE ENDIAN) ...) (for*/list ([k (in-hash-keys type-sizes)] + [kstr (in-value (format "~a" k))] + #:unless (regexp-match #rx"^(float|double)" kstr)) + (match-define (list* prefix suffix _) + (regexp-split #rx"(?=[bl]e|$)" kstr)) + (map string->symbol + (list (string-downcase kstr) + prefix + (if (positive? (string-length suffix)) + suffix + (if (system-big-endian?) "be" "le")))))] + [(ID ...) (suffix-id #'(ID ...) #:context caller-stx)]) + #'(begin (define-instance ID (make-object Integer 'BASE 'ENDIAN)) ...))) + +(make-int-types) + +(test-module + (check-equal? (size uint8) 1) + (check-equal? (size uint16) 2) + (check-equal? (size uint32) 4) + (check-equal? (size double) 8) + + (define bs (encode fixed16be 123.45 #f)) + (check-equal? bs #"{s") + (check-equal? (ceiling (* (decode fixed16be bs) 100)) 12345.0) + + (check-equal? (decode int8 (bytes 127)) 127) + (check-equal? (decode int8 (bytes 255)) -1) + + (check-equal? (encode int8 -1 #f) (bytes 255)) + (check-equal? (encode int8 127 #f) (bytes 127))) diff --git a/xenomorph/xenomorph/private/optional.rkt b/xenomorph/xenomorph/private/optional.rkt new file mode 100644 index 00000000..c319560b --- /dev/null +++ b/xenomorph/xenomorph/private/optional.rkt @@ -0,0 +1,28 @@ +#lang racket/base +(require "racket.rkt") +(provide (all-defined-out)) + +#| +approximates +https://github.com/mbutterick/restructure/blob/master/src/Optional.coffee +|# + +(define-subclass xenomorph-base% (Optional type [condition #t]) + + (define (resolve-condition parent) + (if (procedure? condition) + (condition parent) + condition)) + + (define/augment (decode stream parent) + (when (resolve-condition parent) + (send type decode stream parent))) + + (define/augment (size val parent) + (when (resolve-condition parent) + (send type size val parent))) + + (define/augment (encode stream val parent) + (when (resolve-condition parent) + (send type encode stream val parent)))) + diff --git a/xenomorph/xenomorph/private/pointer.rkt b/xenomorph/xenomorph/private/pointer.rkt new file mode 100644 index 00000000..59a365e5 --- /dev/null +++ b/xenomorph/xenomorph/private/pointer.rkt @@ -0,0 +1,102 @@ +#lang racket/base +(require "racket.rkt") +(require racket/undefined) +(provide (all-defined-out)) + +#| +approximates +https://github.com/mbutterick/restructure/blob/master/src/Pointer.coffee +|# + +(define (resolve-void-pointer type val) + (cond + [type (values type val)] + [(VoidPointer? val) (values (· val type) (· val value))] + [else (raise-argument-error 'Pointer:size "VoidPointer" val)])) + +(define (find-top-ctx ctx) + (cond + [(· ctx parent) => find-top-ctx] + [else ctx])) + +(define-subclass xenomorph-base% (Pointer offset-type type-in [options (mhasheq)]) + (field [type (and (not (eq? type-in 'void)) type-in)]) + (define pointer-style (or (· options type) 'local)) + (define allow-null (or (· options allowNull) #t)) + (define null-value (or (· options nullValue) 0)) + (define lazy (· options lazy)) + (define relative-getter-or-0 (or (· options relativeTo) (λ (ctx) 0))) ; changed this to a simple lambda + + (define/augment (decode port [ctx #f]) + (define offset (send offset-type decode port ctx)) + (cond + [(and allow-null (= offset null-value)) #f] ; handle null pointers + [else + (define relative (+ (caseq pointer-style + [(local) (· ctx _startOffset)] + [(immediate) (- (pos port) (send offset-type size))] + [(parent) (· ctx parent _startOffset)] + [(global) (or (· (find-top-ctx ctx) _startOffset) 0)] + [else (error 'unknown-pointer-style)]) + (relative-getter-or-0 ctx))) + (define ptr (+ offset relative)) + (cond + [type (define val (void)) + (define (decode-value) + (cond + [(not (void? val)) val] + [else + (define orig-pos (pos port)) + (pos port ptr) + (set! val (send type decode port ctx)) + (pos port orig-pos) + val])) + (if lazy + (LazyThunk decode-value) + (decode-value))] + [else ptr])])) + + + (define/augment (size [val #f] [ctx #f]) + (let*-values ([(parent) ctx] + [(ctx) (caseq pointer-style + [(local immediate) ctx] + [(parent) (· ctx parent)] + [(global) (find-top-ctx ctx)] + [else (error 'unknown-pointer-style)])] + [(type val) (resolve-void-pointer type val)]) + (when (and val ctx) + (ref-set! ctx 'pointerSize (and (· ctx pointerSize) + (+ (· ctx pointerSize) (send type size val parent))))) + (send offset-type size))) + + + (define/augment (encode port val [ctx #f]) + (unless ctx + ;; todo: furnish default pointer context? adapt from Struct? + (raise-argument-error 'Pointer:encode "valid pointer context" ctx)) + (if (not val) + (send offset-type encode port null-value) + (let* ([parent ctx] + [ctx (caseq pointer-style + [(local immediate) ctx] + [(parent) (· ctx parent)] + [(global) (find-top-ctx ctx)] + [else (error 'unknown-pointer-style)])] + [relative (+ (caseq pointer-style + [(local parent) (· ctx startOffset)] + [(immediate) (+ (pos port) (send offset-type size val parent))] + [(global) 0]) + (relative-getter-or-0 (· parent val)))]) + + (send offset-type encode port (- (· ctx pointerOffset) relative)) + + (let-values ([(type val) (resolve-void-pointer type val)]) + (ref-set! ctx 'pointers (append (· ctx pointers) (list (mhasheq 'type type + 'val val + 'parent parent)))) + (ref-set! ctx 'pointerOffset (+ (· ctx pointerOffset) (send type size val parent)))))))) + + +;; A pointer whose type is determined at decode time +(define-subclass object% (VoidPointer type value)) diff --git a/xenomorph/xenomorph/private/racket.rkt b/xenomorph/xenomorph/private/racket.rkt new file mode 100644 index 00000000..4c319ee3 --- /dev/null +++ b/xenomorph/xenomorph/private/racket.rkt @@ -0,0 +1,33 @@ +#lang racket/base +(require (for-syntax racket/base br/syntax) br/define) +(provide (for-syntax (all-from-out racket/base br/syntax))) +(provide (all-from-out racket/base) r+p) + +(define-macro (r+p ID ...) + #'(begin (require ID ...) (provide (all-from-out ID ...)))) + +(r+p "helper.rkt" + "generic.rkt" + sugar/debug + racket/class + racket/list + racket/string + racket/function + br/define + sugar/define + sugar/class + sugar/js + sugar/dict + sugar/stub + sugar/port + sugar/case) + +(provide define-procedures) +(define-macro (define-procedures (NEW ...) (OLD ...)) + #'(define-values (NEW ...) + (values (if (procedure? OLD) + (procedure-rename OLD 'NEW) + OLD) ...))) + +(module reader syntax/module-reader + #:language 'xenomorph/private/racket) \ No newline at end of file diff --git a/xenomorph/xenomorph/private/reserved.rkt b/xenomorph/xenomorph/private/reserved.rkt new file mode 100644 index 00000000..3cc478f1 --- /dev/null +++ b/xenomorph/xenomorph/private/reserved.rkt @@ -0,0 +1,22 @@ +#lang racket/base +(require "racket.rkt") +(require "utils.rkt") +(provide (all-defined-out)) + +#| +approximates +https://github.com/mbutterick/restructure/blob/master/src/Reserved.coffee +|# + +(define-subclass xenomorph-base% (Reserved type [count 1]) + + (define/augment (decode port parent) + (pos port (+ (pos port) (size #f parent))) + (void)) + + (define/augment (size [val #f] [parent #f]) + (* (send type size) (resolve-length count #f parent))) + + (define/augment (encode port val [parent #f]) + (make-bytes (size val parent) 0))) + diff --git a/xenomorph/xenomorph/private/sizes.rkt b/xenomorph/xenomorph/private/sizes.rkt new file mode 100644 index 00000000..ccdea446 --- /dev/null +++ b/xenomorph/xenomorph/private/sizes.rkt @@ -0,0 +1,36 @@ +#lang racket/base +(require "racket.rkt") +(provide type-sizes get-type-size) + +(define-values (int-keys byte-values) (for*/lists (int-keys byte-values) + ([signed (in-list '("u" ""))] + [bit-size (in-list '(8 16 24 32))]) + (values (format "~aint~a" signed bit-size) (/ bit-size 8)))) + +(define type-sizes (for/hash ([type-key (in-list (append '("float" "double") int-keys))] + [byte-value (in-list (append '(4 8) byte-values))] + #:when #t + [endian (in-list '("" "be" "le"))]) + (values (string->symbol (string-append type-key endian)) byte-value))) + +(define (get-type-size key) + (hash-ref type-sizes key (λ () (raise-argument-error 'DecodeStream:get-type-size "valid type" key)))) + +(test-module + (check-equal? (get-type-size 'int8) 1) + (check-equal? (get-type-size 'uint8) 1) + (check-equal? (get-type-size 'uint8be) 1) + (check-equal? (get-type-size 'int16) 2) + (check-equal? (get-type-size 'uint16) 2) + (check-equal? (get-type-size 'uint16be) 2) + (check-equal? (get-type-size 'uint16le) 2) + (check-equal? (get-type-size 'uint32) 4) + (check-equal? (get-type-size 'uint32le) 4) + (check-equal? (get-type-size 'int32be) 4) + (check-equal? (get-type-size 'float) 4) + (check-equal? (get-type-size 'floatle) 4) + (check-equal? (get-type-size 'floatbe) 4) + (check-equal? (get-type-size 'double) 8) + (check-equal? (get-type-size 'doublele) 8) + (check-equal? (get-type-size 'doublebe) 8) + (check-exn exn:fail:contract? (λ () (get-type-size 'not-a-type)))) \ No newline at end of file diff --git a/xenomorph/xenomorph/private/string.rkt b/xenomorph/xenomorph/private/string.rkt new file mode 100644 index 00000000..ca1e452f --- /dev/null +++ b/xenomorph/xenomorph/private/string.rkt @@ -0,0 +1,106 @@ +#lang racket/base +(require "racket.rkt") +(require "number.rkt" "utils.rkt") +(provide (all-defined-out)) + +#| +approximates +https://github.com/mbutterick/restructure/blob/master/src/String.coffee +|# + +(define (read-encoded-string port len [encoding 'ascii]) + (define proc (caseq encoding + [(utf16le) (error 'bah)] + [(ucs2) (error 'bleh)] + [(utf8) bytes->string/utf-8] + [(ascii) bytes->string/latin-1] + [else identity])) + (proc (read-bytes len port))) + +(define (write-encoded-string port string [encoding 'ascii]) + ;; todo: handle encodings correctly. + ;; right now just utf8 and ascii are correct + (define proc (caseq encoding + [(ucs2 utf8 ascii) string->bytes/utf-8] + [(utf16le) (error 'swap-bytes-unimplemented)] + [else (error 'unsupported-string-encoding)])) + (write-bytes (proc string) port)) + +(define (count-nonzero-chars port) + ;; helper function for String + ;; counts nonzero chars from current position + (length (car (regexp-match-peek "[^\u0]*" port)))) + +(define (byte-length val encoding) + (define encoder + (caseq encoding + [(ascii utf8) string->bytes/utf-8])) + (bytes-length (encoder (format "~a" val)))) + +(define (bytes-left-in-port? port) + (not (eof-object? (peek-byte port)))) + +(define-subclass xenomorph-base% (StringT [len #f] [encoding 'ascii]) + + (define/augment (decode port [parent #f]) + (let ([len (or (resolve-length len port parent) (count-nonzero-chars port))] + [encoding (if (procedure? encoding) + (or (encoding parent) 'ascii) + encoding)] + [adjustment (if (and (not len) (bytes-left-in-port? port)) 1 0)]) + (define string (read-encoded-string port len encoding)) + (pos port (+ (pos port) adjustment)) + string)) + + + (define/augment (encode port val [parent #f]) + (let* ([val (format "~a" val)] + [encoding (if (procedure? encoding) + (or (encoding (and parent (· parent val)) 'ascii)) + encoding)]) + (define encoded-length (byte-length val encoding)) + (when (and (exact-nonnegative-integer? len) (> encoded-length len)) + (raise-argument-error 'String:encode (format "string no longer than ~a" len) val)) + (when (NumberT? len) + (send len encode port encoded-length)) + (write-encoded-string port val encoding) + (when (not len) (write-byte #x00 port)))) ; null terminated when no len + + + (define/augment (size [val #f] [parent #f]) + (if (not val) + (resolve-length len #f parent) + (let* ([encoding (if (procedure? encoding) + (or (encoding (and parent (· parent val)) 'ascii)) + encoding)] + [encoding (if (eq? encoding 'utf16be) 'utf16le encoding)]) + (+ (byte-length val encoding) (cond + [(not len) 1] + [(NumberT? len) (send len size)] + [else 0])))))) + + +(define-values (String? +String) (values StringT? +StringT)) + +(define-subclass StringT (Symbol) + (define/override (post-decode string-val . _) + (string->symbol string-val)) + + (define/override (pre-encode sym-val . _) + (unless (or (string? sym-val) (symbol? sym-val)) + (raise-argument-error 'Symbol "symbol or string" sym-val)) + (if (symbol? sym-val) sym-val (string->symbol sym-val)))) + + +(test-module + (define S-fixed (+String 4 'utf8)) + (check-equal? (encode S-fixed "Mike" #f) #"Mike") + (check-exn exn:fail? (λ () (encode S-fixed "Mikes" #f))) ; too long for fixed string + (define S (+String uint8 'utf8)) + (check-equal? (decode S #"\2BCDEF") "BC") + (check-equal? (encode S "Mike" #f) #"\4Mike") + (check-equal? (size (+String) "foobar") 7) ; null terminated when no len + (check-equal? (decode (+Symbol 4) #"Mike") 'Mike) + (check-equal? (encode (+Symbol 4) 'Mike #f) #"Mike") + (check-equal? (encode (+Symbol 4) "Mike" #f) #"Mike") + (check-exn exn:fail:contract? (λ () (encode (+Symbol 4) 42 #f)))) \ No newline at end of file diff --git a/xenomorph/xenomorph/private/struct.rkt b/xenomorph/xenomorph/private/struct.rkt new file mode 100644 index 00000000..8d9e93af --- /dev/null +++ b/xenomorph/xenomorph/private/struct.rkt @@ -0,0 +1,154 @@ +#lang racket/base +(require "racket.rkt") +(require racket/dict racket/private/generic-methods racket/struct) +(provide (all-defined-out) ref* ref*-set! (all-from-out racket/dict)) +(require (prefix-in d: racket/dict)) + +#| +approximates +https://github.com/mbutterick/restructure/blob/master/src/Struct.coffee +|# + + +(define private-keys '(parent _startOffset _currentOffset _length)) + +(define (choose-dict d k) + (if (memq k private-keys) + (get-field _pvt d) + (get-field _kv d))) + +(define dictable<%> + (interface* () + ([(generic-property gen:dict) + (generic-method-table gen:dict + (define (dict-set! d k v) (d:dict-set! (choose-dict d k) k v)) + (define (dict-ref d k [thunk #f]) + (define res (d:dict-ref (choose-dict d k) k thunk)) + (if (LazyThunk? res) ((LazyThunk-proc res)) res)) + (define (dict-remove! d k) (d:dict-remove! (choose-dict d k) k)) + ;; public keys only + (define (dict-keys d) (d:dict-keys (get-field _kv d))) + (define (dict-iterate-first d) (and (pair? (dict-keys d)) 0)) + (define (dict-iterate-next d i) (and (< (add1 i) (length (dict-keys d))) (add1 i))) + (define (dict-iterate-key d i) (list-ref (dict-keys d) i)) + (define (dict-iterate-value d i) (dict-ref d (dict-iterate-key d i))))] + [(generic-property gen:custom-write) + (generic-method-table gen:custom-write + (define (write-proc o port mode) + (define proc (case mode + [(#t) write] + [(#f) display] + [else (λ (p port) (print p port mode))])) + (proc (dump o) port)))]))) + +(define-subclass*/interfaces xenomorph-base% (dictable<%>) + (StructDictRes) + (super-make-object) + (field [_kv (mhasheq)] + [_pvt (mhasheq)]) + + (define/override (dump) + ;; convert to immutable for display & debug + (for/hasheq ([(k v) (in-hash _kv)]) + (values k v))) + + (define/public (to-hash) _kv)) + + +(define-subclass xenomorph-base% (Struct [fields (dictify)]) + (field [[_post-decode post-decode] (λ (val port ctx) val)] + [[_pre-encode pre-encode] (λ (val port) val)]) ; store as field so it can be mutated from outside + + (define/overment (post-decode res . args) + (let* ([res (apply _post-decode res args)] + [res (inner res post-decode res . args)]) + (unless (dict? res) (raise-result-error 'Struct:post-decode "dict" res)) + res)) + + (define/overment (pre-encode res . args) + (let* ([res (apply _pre-encode res args)] + [res (inner res pre-encode res . args)]) + (unless (dict? res) (raise-result-error 'Struct:pre-encode "dict" res)) + res)) + + (unless ((disjoin assocs? Struct?) fields) ; should be Versioned Struct but whatever + (raise-argument-error 'Struct "assocs or Versioned Struct" fields)) + + (define/augride (decode stream [parent #f] [len 0]) + ;; _setup and _parse-fields are separate to cooperate with VersionedStruct + (let* ([sdr (_setup stream parent len)] ; returns StructDictRes + [sdr (_parse-fields stream sdr fields)]) + sdr)) + + (define/public-final (_setup port parent len) + (define sdr (make-object StructDictRes)) ; not mere hash + (dict-set*! sdr 'parent parent + '_startOffset (pos port) + '_currentOffset 0 + '_length len) + sdr) + + (define/public-final (_parse-fields port sdr fields) + (unless (assocs? fields) + (raise-argument-error '_parse-fields "assocs" fields)) + (for/fold ([sdr sdr]) + ([(key type) (in-dict fields)]) + (define val (if (procedure? type) + (type sdr) + (send type decode port sdr))) + (unless (void? val) + (dict-set! sdr key val)) + (dict-set! sdr '_currentOffset (- (pos port) (· sdr _startOffset))) + sdr)) + + + (define/augride (size [val #f] [parent #f] [include-pointers #t]) + (define ctx (mhasheq 'parent parent + 'val val + 'pointerSize 0)) + (+ (for/sum ([(key type) (in-dict fields)] + #:when (object? type)) + (send type size (and val (ref val key)) ctx)) + (if include-pointers (· ctx pointerSize) 0))) + + (define/augride (encode port val [parent #f]) + (unless (dict? val) + (raise-argument-error 'Struct:encode "dict" val)) + + ;; check keys first, since `size` also relies on keys being valid + (unless (andmap (λ (key) (memq key (dict-keys val))) (dict-keys fields)) + (raise-argument-error 'Struct:encode + (format "dict that contains superset of Struct keys: ~a" (dict-keys fields)) (dict-keys val))) + + (define ctx (mhash 'pointers empty + 'startOffset (pos port) + 'parent parent + 'val val + 'pointerSize 0)) + (ref-set! ctx 'pointerOffset (+ (pos port) (size val ctx #f))) + + (for ([(key type) (in-dict fields)]) + (send type encode port (ref val key) ctx)) + (for ([ptr (in-list (· ctx pointers))]) + (send (· ptr type) encode port (· ptr val) (· ptr parent))))) + + +(test-module + (require "number.rkt") + (define (random-pick xs) (list-ref xs (random (length xs)))) + (check-exn exn:fail:contract? (λ () (+Struct 42))) + + ;; make random structs and make sure we can round trip + (for ([i (in-range 20)]) + (define field-types (for/list ([i (in-range 40)]) + (random-pick (list uint8 uint16be uint16le uint32be uint32le double)))) + (define size-num-types (for/sum ([num-type (in-list field-types)]) + (send num-type size))) + (define s (+Struct (for/list ([num-type (in-list field-types)]) + (cons (gensym) num-type)))) + (define bs (apply bytes (for/list ([i (in-range size-num-types)]) + (random 256)))) + (check-equal? (send s encode #f (send s decode bs)) bs))) + + + diff --git a/xenomorph/xenomorph/private/utils.rkt b/xenomorph/xenomorph/private/utils.rkt new file mode 100644 index 00000000..32f90ba8 --- /dev/null +++ b/xenomorph/xenomorph/private/utils.rkt @@ -0,0 +1,13 @@ +#lang racket/base +(require "racket.rkt") +(provide (all-defined-out)) +(require "number.rkt") + +(define (resolve-length len-arg [stream #f] [parent #f]) + (cond + [(not len-arg) #f] + [(number? len-arg) len-arg] + [(procedure? len-arg) (len-arg parent)] + [(and parent (key? len-arg)) (ref parent len-arg)] ; treat as key into RStruct parent + [(and stream (NumberT? len-arg)) (send len-arg decode stream)] + [else (raise-argument-error 'resolveLength "fixed-size argument" len-arg)])) \ No newline at end of file diff --git a/xenomorph/xenomorph/private/versioned-struct.rkt b/xenomorph/xenomorph/private/versioned-struct.rkt new file mode 100644 index 00000000..a5ca65a5 --- /dev/null +++ b/xenomorph/xenomorph/private/versioned-struct.rkt @@ -0,0 +1,147 @@ +#lang racket/base +(require "racket.rkt") +(require racket/dict "struct.rkt") +(provide (all-defined-out)) + +#| +approximates +https://github.com/mbuttrackerick/restructure/blob/master/src/VersionedStruct.coffee +|# + + +(define-subclass Struct (VersionedStruct type [versions (dictify)]) + + (unless ((disjoin integer? procedure? xenomorph-base%? symbol?) type) + (raise-argument-error 'VersionedStruct "integer, function, symbol, or Restructure object" type)) + (unless (and (dict? versions) (andmap (λ (val) (or (dict? val) (Struct? val))) (map cdr versions))) + (raise-argument-error 'VersionedStruct "dict of dicts or Structs" versions)) + + (inherit _setup _parse-fields post-decode) + (inherit-field fields) + (field [forced-version #f] + [versionGetter void] + [versionSetter void]) + + (when (or (key? type) (procedure? type)) + (set-field! versionGetter this (if (procedure? type) + type + (λ (parent) (ref parent type)))) + (set-field! versionSetter this (if (procedure? type) + type + (λ (parent version) (ref-set! parent type version))))) + + (define/override (decode stream [parent #f] [length 0]) + (define res (_setup stream parent length)) + + (ref-set! res 'version + (cond + [forced-version] ; for testing purposes: pass an explicit version + [(or (key? type) (procedure? type)) + (unless parent + (raise-argument-error 'VersionedStruct:decode "valid parent" parent)) + (versionGetter parent)] + [else (send type decode stream)])) + + (when (ref versions 'header) + (_parse-fields stream res (ref versions 'header))) + + (define fields (or (ref versions (ref res 'version)) (raise-argument-error 'VersionedStruct:decode "valid version key" (cons version (· this versions))))) + + + (cond + [(VersionedStruct? fields) (send fields decode stream parent)] + [else + (_parse-fields stream res fields) + res])) + + (define/public-final (force-version! version) + (set! forced-version version)) + + (define/override (encode stream val [parent #f]) + (unless (hash? val) + (raise-argument-error 'VersionedStruct:encode "hash" val)) + + (define ctx (mhash 'pointers empty + 'startOffset (pos stream) + 'parent parent + 'val val + 'pointerSize 0)) + + (ref-set! ctx 'pointerOffset (+ (pos stream) (size val ctx #f))) + + (when (not (or (key? type) (procedure? type))) + (send type encode stream (or forced-version (· val version)))) + + (when (ref versions 'header) + (for ([(key type) (in-dict (ref versions 'header))]) + (send type encode stream (ref val key) ctx))) + + (define fields (or (ref versions (or forced-version (· val version))) (raise-argument-error 'VersionedStruct:encode "valid version key" version))) + + (unless (andmap (λ (key) (member key (ref-keys val))) (ref-keys fields)) + (raise-argument-error 'VersionedStruct:encode (format "hash that contains superset of Struct keys: ~a" (dict-keys fields)) (hash-keys val))) + + (for ([(key type) (in-dict fields)]) + (send type encode stream (ref val key) ctx)) + + (for ([ptr (in-list (ref ctx 'pointers))]) + (send (ref ptr 'type) encode stream (ref ptr 'val) (ref ptr 'parent)))) + + + (define/override (size [val #f] [parent #f] [includePointers #t]) + (unless (or val forced-version) + (raise-argument-error 'VersionedStruct:size "value" val)) + + (define ctx (mhash 'parent parent + 'val val + 'pointerSize 0)) + + (+ (if (not (or (key? type) (procedure? type))) + (send type size (or forced-version (ref val 'version)) ctx) + 0) + + (for/sum ([(key type) (in-dict (or (ref versions 'header) empty))]) + (send type size (and val (ref val key)) ctx)) + + (let ([fields (or (ref versions (or forced-version (ref val 'version))) + (raise-argument-error 'VersionedStruct:encode "valid version key" version))]) + (for/sum ([(key type) (in-dict fields)]) + (send type size (and val (ref val key)) ctx))) + + (if includePointers (ref ctx 'pointerSize) 0)))) + +#;(test-module + (require "number.rkt") + (define (random-pick xs) (list-ref xs (random (length xs)))) + (check-exn exn:fail:contract? (λ () (+VersionedStruct 42 42))) + + ;; make random versioned structs and make sure we can round trip + #;(for ([i (in-range 1)]) + (define field-types (for/list ([i (in-range 1)]) + (random-pick (list uint8 uint16be uint16le uint32be uint32le double)))) + (define num-versions 20) + (define which-struct (random num-versions)) + (define struct-versions (for/list ([v (in-range num-versions)]) + (cons v (for/list ([num-type (in-list field-types)]) + (cons (gensym) num-type))))) + (define vs (+VersionedStruct which-struct struct-versions)) + (define struct-size (for/sum ([num-type (in-list (map cdr (ref struct-versions which-struct)))]) + (send num-type size))) + (define bs (apply bytes (for/list ([i (in-range struct-size)]) + (random 256)))) + (check-equal? (send vs encode #f (send vs decode bs)) bs)) + + (define s (+Struct (dictify 'a uint8 'b uint8 'c uint8))) + (check-equal? (send s size) 3) + (define vs (+VersionedStruct uint8 (dictify 1 (dictify 'd s) 2 (dictify 'e s 'f s)))) + (send vs force-version! 1) + (check-equal? (send vs size) 6) + #| + (define s2 (+Struct (dictify 'a vs))) + (check-equal? (send s2 size) 6) + (define vs2 (+VersionedStruct (λ (p) 2) (dictify 1 vs 2 vs))) + (check-equal? (send vs2 size) 6) +|# + ) + + diff --git a/xenomorph/xenomorph/private/~stream.rkt b/xenomorph/xenomorph/private/~stream.rkt new file mode 100644 index 00000000..94b12cfa --- /dev/null +++ b/xenomorph/xenomorph/private/~stream.rkt @@ -0,0 +1,205 @@ +#lang racket/base +(require "racket.rkt") +(require racket/generic racket/private/generic-methods) +(provide (all-defined-out)) + +;; helper class +(define-subclass object% (PortWrapper _port) + (unless (port? _port) + (raise-argument-error 'PortWrapper:constructor "port" _port)) + (define/public (pos [where #f]) + (when where (file-position _port where)) + (file-position _port)) + (define/public (dump) (void))) + +(test-module + (check-not-exn (λ () (make-object PortWrapper (open-input-bytes #"Foo")))) + (check-not-exn (λ () (make-object PortWrapper (open-output-bytes)))) + (check-exn exn:fail? (λ () (make-object PortWrapper -42)))) + + + +#| approximates +https://github.com/mbutterick/restructure/blob/master/src/EncodeStream.coffee +|# + +;; basically just a wrapper for a Racket output port +(define EncodeStream + (class* PortWrapper (dumpable<%>) + (init-field [[maybe-output-port maybe-output-port] (open-output-bytes)]) + + (unless (output-port? maybe-output-port) + (raise-argument-error 'EncodeStream:constructor "output port" maybe-output-port)) + + (super-make-object maybe-output-port) + (inherit-field _port) + + (define/override-final (dump) (get-output-bytes _port)) + + (define/public-final (write val) + (unless (bytes? val) + (raise-argument-error 'EncodeStream:write "bytes" val)) + (write-bytes val _port) + (void)) + + (define/public-final (writeBuffer buffer) + (write buffer)) + + (define/public-final (writeUInt8 int) + (write (bytes int))) + + (define/public (writeString string [encoding 'ascii]) + ;; todo: handle encodings correctly. + ;; right now just utf8 and ascii are correct + (caseq encoding + [(utf16le ucs2 utf8 ascii) (writeBuffer (string->bytes/utf-8 string)) + (when (eq? encoding 'utf16le) + (error 'swap-bytes-unimplemented))] + [else (error 'unsupported-string-encoding)])) + + (define/public (fill val len) + (write (make-bytes len val))))) + +(define-class-predicates EncodeStream) + +(test-module + (define es (+EncodeStream)) + (check-true (EncodeStream? es)) + (send es write #"AB") + (check-equal? (· es pos) 2) + (send es write #"C") + (check-equal? (· es pos) 3) + (send es write #"D") + (check-equal? (· es pos) 4) + (check-exn exn:fail? (λ () (send es write -42))) + (check-exn exn:fail? (λ () (send es write 1))) + (define op (open-output-bytes)) + (define es2 (+EncodeStream op)) + (send es2 write #"FOOBAR") + (check-equal? (dump es2) #"FOOBAR") + (check-equal? (dump es2) #"FOOBAR") ; dump can repeat + (check-equal? (get-output-bytes op) #"FOOBAR") + (define es3 (+EncodeStream)) + (send es3 fill 0 10) + (check-equal? (dump es3) (make-bytes 10 0))) + + +#| approximates +https://github.com/mbutterick/restructure/blob/master/src/DecodeStream.coffee +|# + +;; basically just a wrapper for a Racket port +;; but needs to start with a buffer so length can be found + +(require "sizes.rkt") +(define-macro (define-reader ID) + #'(define/public (ID) + (define bs (*ref type-sizes (string->symbol (string-downcase (string-replace (symbol->string 'ID) "read" ""))))) + (readBuffer bs))) + +(define countable<%> + (interface* () + ([(generic-property gen:countable) + (generic-method-table gen:countable + (define (length o) (get-field length_ o)))]))) + + + +(define DecodeStreamT + (class* PortWrapper + (codable<%> dumpable<%> countable<%> posable<%>) + (init-field [buffer #""]) + (unless (bytes? buffer) ; corresponds to a Node Buffer, not a restructure BufferT object + (raise-argument-error 'DecodeStream:constructor "bytes" buffer)) + (super-make-object (open-input-bytes buffer)) + (inherit-field _port) + + (field [_pos 0] + [length_ (length buffer)]) + + (define/override (pos [where #f]) + (when where + (set! _pos (super pos where))) + _pos) + + (define/public (count-nonzero-chars) + ;; helper function for String + ;; counts nonzero chars from current position + (length (car (regexp-match-peek "[^\u0]*" _port)))) + + (public [-length length]) + (define (-length) length_) + + (define/public (readString length__ [encoding 'ascii]) + (define proc (caseq encoding + [(utf16le) (error 'bah)] + [(ucs2) (error 'bleh)] + [(utf8) bytes->string/utf-8] + [(ascii) bytes->string/latin-1] + [else identity])) + (define start (pos)) + (define stop (+ start length__)) + (proc (subbytes buffer start (pos stop)))) + + (define/public-final (readBuffer count) + (unless (index? count) + (raise-argument-error 'DecodeStream:read "positive integer" count)) + (define bytes-remaining (- length_ (pos))) + (when (> count bytes-remaining) + (raise-argument-error 'DecodeStream:read (format "byte count not more than bytes remaining = ~a" bytes-remaining) count)) + (increment-field! _pos this count) ; don't use `pos` method here because `read-bytes` will increment the port position + (define bs (read-bytes count _port)) + (unless (= _pos (file-position _port)) (raise-result-error 'DecodeStream "positions askew" (list _pos (file-position _port)))) + bs) + + (define/public (read count) (readBuffer count)) + + (define/public (readUInt8) (bytes-ref (readBuffer 1) 0)) + (define/public (readUInt16BE) (+ (arithmetic-shift (readUInt8) 8) (readUInt8))) + (define/public (readInt16BE) (unsigned->signed (readUInt16BE) 16)) + (define/public (readUInt16LE) (+ (readUInt8) (arithmetic-shift (readUInt8) 8))) + (define/public (readUInt24BE) (+ (arithmetic-shift (readUInt16BE) 8) (readUInt8))) + (define/public (readUInt24LE) (+ (readUInt16LE) (arithmetic-shift (readUInt8) 16))) + (define/public (readInt24BE) (unsigned->signed (readUInt24BE) 24)) + (define/public (readInt24LE) (unsigned->signed (readUInt24LE) 24)) + + (define/override-final (dump) + (define current-position (port-position _port)) + (set-port-position! _port 0) + (define bs (port->bytes _port)) + (set-port-position! _port current-position) + bs))) + + +(define-subclass DecodeStreamT (DecodeStream)) + +(test-module + (define ds (+DecodeStream #"ABCD")) + (check-true (DecodeStream? ds)) + (check-equal? (length ds) 4) + (check-equal? (dump ds) #"ABCD") + (check-equal? (dump ds) #"ABCD") ; dump can repeat + (check-equal? (send ds readUInt16BE) 16706) + (check-equal? (dump ds) #"ABCD") + (check-equal? (· ds pos) 2) + (check-equal? (send ds readUInt8) 67) + (check-equal? (· ds pos) 3) + (check-equal? (send ds readUInt8) 68) + (check-equal? (· ds pos) 4) + (check-exn exn:fail? (λ () (send ds read -42))) + (check-exn exn:fail? (λ () (send ds read 1)))) + + + +(test-module + (define-subclass xenomorph-base% (Dummy) + (define/augment (decode stream parent) "foo") + (define/augment (encode stream val parent) "bar") + (define/augment (size) 42)) + + (define d (+Dummy)) + (check-true (Dummy? d)) + (check-exn exn:fail:contract? (λ () (decode d 42))) + (check-not-exn (λ () (decode d #"foo"))) + (check-exn exn:fail:contract? (λ () (encode d 42 21))) + (check-not-exn (λ () (encode d 42 (open-output-bytes) )))) \ No newline at end of file diff --git a/xenomorph/xenomorph/reserved.rkt b/xenomorph/xenomorph/reserved.rkt new file mode 100644 index 00000000..117976dc --- /dev/null +++ b/xenomorph/xenomorph/reserved.rkt @@ -0,0 +1,5 @@ +#lang racket/base +(require "private/racket.rkt") + + +(r+p "private/reserved.rkt") \ No newline at end of file diff --git a/xenomorph/xenomorph/scribblings/xenomorph.scrbl b/xenomorph/xenomorph/scribblings/xenomorph.scrbl new file mode 100644 index 00000000..3dc75857 --- /dev/null +++ b/xenomorph/xenomorph/scribblings/xenomorph.scrbl @@ -0,0 +1,255 @@ +#lang scribble/manual + +@(require scribble/eval (for-label racket xenomorph)) + +@(define my-eval (make-base-eval)) +@(my-eval `(require xenomorph)) + + +@title{Xenomorph: binary encoding & decoding} + +@author[(author+email "Matthew Butterick" "mb@mbtype.com") "Devon Govett"] + +@defmodule[xenomorph] + +Hands up: who likes parsing and writing binary formats? + +OK, just a few of you, in the back. You're free to go. + +Everyone else: Xenomorph eases the pain of working with binary formats. Instead of fiddling with counting bytes: + +@itemlist[#:style 'ordered +@item{You define an @deftech{encoding} describing the binary format using smaller ingredients — e.g., integers, strings, arrays, pointers, and sub-encodings.} + +@item{This encoding can then be used as a binary compiler, converting Racket values to binary and writing them out to a file.} + +@item{But wait, there's more: this encoding can @emph{also} be used as a binary parser, reading bytes and parsing them into Racket values. So one encoding definition can be used for both input and output.} +] + +Derived principally from Devon Govett's @link["https://github.com/devongovett/restructure"]{@tt{restructure}} library for Node. Thanks for doing the heavy lifting, dude. + + +@section{Installation} + +At the command line: + +@verbatim{raco pkg install xenomorph} + +After that, you can update the package from the command line: + +@verbatim{raco pkg update xenomorph} + +Invoke the library in a source file by importing it in the usual way: + +@verbatim{(require xenomorph)} + + + +@section{Quick tutorial} + +@examples[#:eval my-eval +(define four-ints (+ArrayT uint8 4)) + +(decode four-ints #"\1\2\3\4") +(decode four-ints #"\1\2\3") +(decode four-ints #"\1\2\3\4\5\6") + +(define op (open-output-string)) +(encode four-ints '(1 2 3 4) op) +(get-output-bytes op) + ] + + + +@section{The big picture} + +@subsection{Bytes and byte strings} + +Suppose we have a file on disk. What's in the file? Without knowing anything else, we can at least say the file contains a sequence of @deftech{bytes}. A @deftech{byte} is the smallest unit of data storage. It's not, however, the smallest unit of information storage — that would be a @deftech{bit}. But when we read (or write) from disk (or other source, like memory), we work with bytes. + +A byte holds eight bits, so it can take on values between 0 and 255, inclusive. In Racket, a sequence of bytes is also known as a @deftech{byte string}. It prints as a series of values between quotation marks, prefixed with @litchar{#}: + +@racketblock[#"ABC"] + +Caution: though this looks similar to the ordinary string @racket["ABC"], we're better off thinking of it as a sequence of integers that are sometimes displayed as characters for convenience. For instance, the byte string above represents three bytes valued 65, 66, and 67. This byte string could also be written in hexadecimal like so: + +@(racketvalfont "#\"\\x41\\x42\\x43\"") + +Or octal like so: + +@(racketvalfont "#\"\\101\\102\\103\"") + +Both of these mean the same thing. (If you like, confirm this by trying them on the REPL.) + +We can also make an equivalent byte string with @racket[bytes]. As above, Racket doesn't care how we notate the values, as long as they're between 0 and 255: + +@bold{TODO}: escape the chars below + +@examples[#:eval my-eval +(bytes 65 66 67) +(bytes #x41 #x42 #x43) +(bytes #o101 #o102 #o103) +(apply bytes (map char->integer '(#\A #\B #\C))) +] + +Byte values between 32 and 127 are printed as characters. Other values are printed in octal: + +@examples[#:eval my-eval +(bytes 65 66 67 154 206 255) +] + +If you think this printing convention is a little weird, I agree. But that's how Racket does it. If we prefer to deal with lists of integers, we can always use @racket[bytes->list] and @racket[list->bytes]: + +@examples[#:eval my-eval +(bytes->list #"ABC\232\316\377") +(list->bytes '(65 66 67 154 206 255)) +] + +The important thing is that when we see the @litchar{#"} prefix, we know we're looking at a byte string, not an ordinary string. + + +@subsection{Encodings} + +Back to files. Typically, files on disk are classified as being either @deftech{binary} or @deftech{text}. (A distinction observed by Racket functions such as @racket[write-to-file].) When we speak of binary vs. text, we're saying something about the internal structure of the byte sequence — what values those bytes represent. This internal structure is also called an @deftech{encoding}. An encoding is a way of representing a sequence of arbitrary values as a sequence of bytes. + +@subsubsection{Text encodings} + +Text files are a just a particular subset of binary files that use a @deftech{text encoding} — that is, a binary encoding that stores human-readable characters. + +But since we all have experience with text files, let's use text encoding as a way of starting to understand what's happening under the hood with binary encodings. + +For example, ASCII is a familiar encoding that stores each character in seven bits, so it can describe 128 distinct characters. Because every ASCII code is less than 255, we can store ASCII text with one byte per character. + +But if we want to use more than 128 distinct characters, we're stuck. That's why Racket instead uses the UTF-8 text encoding by default. UTF-8 uses between one and three bytes to encode each character, and can thus represent up to 1,112,064 distinct characters. We can see how this works by converting a string into an encoded byte sequence using @racket[string->bytes/utf-8]: + +@examples[#:eval my-eval +(string->bytes/utf-8 "ABCD") +(bytes->list (string->bytes/utf-8 "ABCD")) +(string->bytes/utf-8 "ABÇ战") +(bytes->list (string->bytes/utf-8 "ABÇ战")) +] + +For ASCII-compatible characters, UTF-8 uses one byte for each character. Thus, the string @racket["ABCD"] is four bytes long in UTF-8. + +Now consider the string @racket["ABÇ战"], which has four characters, but the second two aren't ASCII-compatible. In UTF-8, it's encoded as seven bytes: the first two characters are one byte each, the @racket["Ç"] takes two bytes, and the @racket["战"] takes three. + +Moreover, for further simplicity, text files typically rely on a small set of pre-defined encodings, like ASCII or UTF-8 or Latin-1, so that those who write programs that manipulate text only have to support a smallish set of encodings. + +@subsubsection{Binary encodings} + + + +@subsubsection{In sum} + +Three corollaries follow: + +@itemlist[#:style 'ordered +@item{A given sequence of bytes can mean different things, depending on what encoding we use.} + +@item{We can only make sense of a sequence of bytes if we know its encoding.} + +@item{A byte sequence does not describe its own encoding.} + +] + +For those familiar with programming-language lingo, an encoding somewhat resembles a @deftech{grammar}, which is a tool for describing the syntactic structure of a program. A grammar doesn't describe one particular program. Rather, it describes all possible programs that are consistent with the grammar, and therefore can be used to parse any particular one. Likewise for an encoding. + +@margin-note{Can a grammar work as a binary encoding? In limited cases, but not enough to be practical. Most grammars have to assume the target program is context free, meaning that the grammar rules apply the same way everywhere. By contrast, binary files are nonrecursive and contextual.} + + + + +@section{Core functions} + +@defproc[ +(decode +[template (is-a?/c xenomorph-base%)] +[byte-source (or/c bytes? input-port?) (current-input-port)]) +any/c]{ +Hello +} + +@defproc[ +(encode +[template (is-a?/c xenomorph-base%)] +[v any/c] +[byte-dest (or/c output-port? #f) (current-output-port)]) +(or/c void? bytes?)]{ +Hello +} + +@defproc[ +(size +[template (is-a?/c xenomorph-base%)] +[v any/c]) +exact-nonnegative-integer?]{ +Hello +} + + +@section{Binary ingredients} + + + +@subsection{Numbers} + +@defmodule[xenomorph/number] + +@subsection{Strings} + +@defmodule[xenomorph/string] + +@subsection{Arrays} + +@defmodule[xenomorph/array] + +@subsection{Lazy arrays} + +@defmodule[xenomorph/lazy-array] + + +@subsection{Structs} + +@defmodule[xenomorph/struct] + +@subsection{Versioned structs} + +@defmodule[xenomorph/versioned-struct] + +@subsection{Pointers} + +@defmodule[xenomorph/pointer] + +@subsection{Bitfields} + +@defmodule[xenomorph/bitfield] + +@subsection{Enumerations} + +@defmodule[xenomorph/enum] + +@subsection{Optional} + +@defmodule[xenomorph/optional] + +@subsection{Reserved} + +@defmodule[xenomorph/reserved] + + + +@defproc[ +(array? +[type any/c]) +void?]{ +Hello +} + + +@section{License & source code} + +This module is licensed under the MIT license. + + +Source repository at @link["http://github.com/mbutterick/xenomorph"]{http://github.com/mbutterick/xenomorph}. Suggestions & corrections welcome. + diff --git a/xenomorph/xenomorph/string.rkt b/xenomorph/xenomorph/string.rkt new file mode 100644 index 00000000..b2586b2b --- /dev/null +++ b/xenomorph/xenomorph/string.rkt @@ -0,0 +1,5 @@ +#lang racket/base +(require "private/racket.rkt") + + +(r+p "private/string.rkt") \ No newline at end of file diff --git a/xenomorph/xenomorph/struct.rkt b/xenomorph/xenomorph/struct.rkt new file mode 100644 index 00000000..85ff4ae7 --- /dev/null +++ b/xenomorph/xenomorph/struct.rkt @@ -0,0 +1,5 @@ +#lang racket/base +(require "private/racket.rkt") + + +(r+p "private/struct.rkt") \ No newline at end of file diff --git a/xenomorph/xenomorph/test/array-test.rkt b/xenomorph/xenomorph/test/array-test.rkt new file mode 100644 index 00000000..b80f0340 --- /dev/null +++ b/xenomorph/xenomorph/test/array-test.rkt @@ -0,0 +1,89 @@ +#lang racket/base +(require "racket.rkt") + +#| +approximates +https://github.com/mbutterick/restructure/blob/master/test/Array.coffee +|# + +;describe 'Array', -> +; describe 'decode', -> +; it 'should decode fixed length', -> +(parameterize ([current-input-port (open-input-bytes (bytes 1 2 3 4 5))]) + (check-equal? (decode (+ArrayT uint8 4)) '(1 2 3 4))) + + +; it 'should decode fixed amount of bytes', -> +(parameterize ([current-input-port (open-input-bytes (bytes 1 2 3 4 5))]) + (check-equal? (decode (+ArrayT uint16be 4 'bytes)) '(258 772))) + + +; it 'should decode length from parent key', -> +(parameterize ([current-input-port (open-input-bytes (bytes 1 2 3 4 5))]) + (check-equal? (decode (+ArrayT uint8 'len) #:parent (mhash 'len 4)) '(1 2 3 4))) + + +; it 'should decode amount of bytes from parent key', -> +(parameterize ([current-input-port (open-input-bytes (bytes 1 2 3 4 5))]) + (check-equal? (decode (+ArrayT uint16be 'len 'bytes) #:parent (mhash 'len 4)) '(258 772))) + + +; it 'should decode length as number before array', -> +(parameterize ([current-input-port (open-input-bytes (bytes 4 1 2 3 4 5))]) + (check-equal? (decode (+ArrayT uint8 uint8)) '(1 2 3 4))) + + +; it 'should decode amount of bytes as number before array', -> +(parameterize ([current-input-port (open-input-bytes (bytes 4 1 2 3 4 5))]) + (check-equal? (decode (+ArrayT uint16be uint8 'bytes)) '(258 772))) + + +; it 'should decode length from function', -> +(parameterize ([current-input-port (open-input-bytes (bytes 1 2 3 4 5))]) + (check-equal? (decode (+ArrayT uint8 (λ _ 4))) '(1 2 3 4))) + + +; it 'should decode amount of bytes from function', -> +(parameterize ([current-input-port (open-input-bytes (bytes 1 2 3 4 5))]) + (check-equal? (decode (+ArrayT uint16be (λ _ 4) 'bytes)) '(258 772))) + + +; it 'should decode to the end of the parent if no length is given', -> +(parameterize ([current-input-port (open-input-bytes (bytes 1 2 3 4 5))]) + (check-equal? (decode (+ArrayT uint8) #:parent (mhash '_length 4 '_startOffset 0)) '(1 2 3 4))) + + +; decode to the end of the stream if parent exists, but its length is 0 +(parameterize ([current-input-port (open-input-bytes (bytes 1 2 3 4 5))]) + (check-equal? (decode (+ArrayT uint8) #:parent (mhash '_length 0 '_startOffset 0)) '(1 2 3 4 5))) + + +; it 'should decode to the end of the stream if no parent and length is given', -> +(parameterize ([current-input-port (open-input-bytes (bytes 1 2 3 4))]) + (check-equal? (decode (+ArrayT uint8)) '(1 2 3 4 ))) + + +; describe 'size', -> +; it 'should use array length', -> +(check-equal? (size (+ArrayT uint8 10) '(1 2 3 4)) 4) + + +; it 'should add size of length field before string', -> +(check-equal? (size (+ArrayT uint8 uint8) '(1 2 3 4)) 5) + + +; it 'should use defined length if no value given', -> +(check-equal? (size (+ArrayT uint8 10)) 10) + + +; describe 'encode', -> +; it 'should encode using array length', (done) -> +(check-equal? (encode (+ArrayT uint8 10) '(1 2 3 4) #f) (bytes 1 2 3 4)) + + +; it 'should encode length as number before array', (done) -> +(check-equal? (encode (+ArrayT uint8 uint8) '(1 2 3 4) #f) (bytes 4 1 2 3 4)) + + +; it 'should add pointers after array if length is encoded at start', (done) -> +(check-equal? (encode (+ArrayT (+Pointer uint8 uint8) uint8) '(1 2 3 4) #f) (bytes 4 5 6 7 8 1 2 3 4)) \ No newline at end of file diff --git a/xenomorph/xenomorph/test/bitfield-test.rkt b/xenomorph/xenomorph/test/bitfield-test.rkt new file mode 100644 index 00000000..64c3f829 --- /dev/null +++ b/xenomorph/xenomorph/test/bitfield-test.rkt @@ -0,0 +1,48 @@ +#lang racket/base +(require "racket.rkt") +(require racket/match) + +#| +approximates +https://github.com/mbutterick/restructure/blob/master/test/Bitfield.coffee +|# + +;describe 'Bitfield', -> +; bitfield = new Bitfield uint8, ['Jack', 'Kack', 'Lack', 'Mack', 'Nack', 'Oack', 'Pack', 'Quack'] +; JACK = 1 << 0 +; KACK = 1 << 1 +; LACK = 1 << 2 +; MACK = 1 << 3 +; NACK = 1 << 4 +; OACK = 1 << 5 +; PACK = 1 << 6 +; QUACK = 1 << 7 + +(define bitfield (+Bitfield uint8 '(Jack Kack Lack Mack Nack Oack Pack Quack))) +(match-define (list JACK KACK LACK MACK NACK OACK PACK QUACK) + (map (curry arithmetic-shift 1) (range 8))) + +; it 'should have the right size', -> +(check-equal? (size bitfield) 1) + +; it 'should decode', -> +(parameterize ([current-input-port (open-input-bytes (bytes (bitwise-ior JACK MACK PACK NACK QUACK)))]) + (check-equal? (decode bitfield) (mhasheq 'Quack #t + 'Nack #t + 'Lack #f + 'Oack #f + 'Pack #t + 'Mack #t + 'Jack #t + 'Kack #f))) + +; it 'should encode', (done) -> +(check-equal? (encode bitfield (mhasheq 'Quack #t + 'Nack #t + 'Lack #f + 'Oack #f + 'Pack #t + 'Mack #t + 'Jack #t + 'Kack #f) #f) + (bytes (bitwise-ior JACK MACK PACK NACK QUACK))) diff --git a/xenomorph/xenomorph/test/buffer-test.rkt b/xenomorph/xenomorph/test/buffer-test.rkt new file mode 100644 index 00000000..d9925cc7 --- /dev/null +++ b/xenomorph/xenomorph/test/buffer-test.rkt @@ -0,0 +1,44 @@ +#lang racket/base +(require "racket.rkt") + + +#| +approximates +https://github.com/mbutterick/restructure/blob/master/test/Buffer.coffee +|# + +;describe 'Buffer', -> +; describe 'decode', -> +; it 'should decode', -> +(parameterize ([current-input-port (open-input-bytes (bytes #xab #xff #x1f #xb6))]) + (define buf (+BufferT 2)) + (check-equal? (decode buf) (bytes #xab #xff)) + (check-equal? (decode buf) (bytes #x1f #xb6))) + + +; it 'should decode with parent key length', -> +(parameterize ([current-input-port (open-input-bytes (bytes #xab #xff #x1f #xb6))]) + (define buf (+BufferT 'len)) + (check-equal? (decode buf #:parent (hash 'len 3)) (bytes #xab #xff #x1f)) + (check-equal? (decode buf #:parent (hash 'len 1)) (bytes #xb6))) + + +; describe 'size', -> +; it 'should return size', -> +(check-equal? (size (+BufferT 2) (bytes #xab #xff)) 2) + + +; it 'should use defined length if no value given', ->x +(check-equal? (size (+BufferT 10)) 10) + + +; describe 'encode', -> +; it 'should encode', (done) -> +(let ([buf (+BufferT 2)]) + (check-equal? (bytes-append + (encode buf (bytes #xab #xff) #f) + (encode buf (bytes #x1f #xb6) #f)) (bytes #xab #xff #x1f #xb6))) + + +; it 'should encode length before buffer', (done) -> +(check-equal? (encode (+BufferT uint8) (bytes #xab #xff) #f) (bytes 2 #xab #xff)) \ No newline at end of file diff --git a/xenomorph/xenomorph/test/enum-test.rkt b/xenomorph/xenomorph/test/enum-test.rkt new file mode 100644 index 00000000..f1b1a230 --- /dev/null +++ b/xenomorph/xenomorph/test/enum-test.rkt @@ -0,0 +1,35 @@ +#lang racket/base +(require "racket.rkt") + +#| +approximates +https://github.com/mbutterick/restructure/blob/master/test/Enum.coffee +|# + +;describe 'Enum', -> +; e = new Enum uint8, ['foo', 'bar', 'baz'] +; it 'should have the right size', -> +; e.size().should.equal 1 + +(define e (+Enum uint8 '("foo" "bar" "baz"))) +(check-equal? (size e) 1) + + +; it 'should decode', -> +(parameterize ([current-input-port (open-input-bytes (bytes 1 2 0))]) + (check-equal? (decode e) "bar") + (check-equal? (decode e) "baz") + (check-equal? (decode e) "foo")) + + +; it 'should encode', (done) -> +(parameterize ([current-output-port (open-output-bytes)]) + (encode e "bar") + (encode e "baz") + (encode e "foo") + (check-equal? (dump (current-output-port)) (bytes 1 2 0))) + + +; it 'should throw on unknown option', -> + +(check-exn exn:fail:contract? (λ () (encode e "unknown" (open-output-bytes)))) \ No newline at end of file diff --git a/xenomorph/xenomorph/test/lazy-array-test.rkt b/xenomorph/xenomorph/test/lazy-array-test.rkt new file mode 100644 index 00000000..3df99125 --- /dev/null +++ b/xenomorph/xenomorph/test/lazy-array-test.rkt @@ -0,0 +1,59 @@ +#lang racket/base +(require "racket.rkt") + +#| +approximates +https://github.com/mbutterick/restructure/blob/master/test/LazyArray.coffee +|# + +;describe 'LazyArray', -> +; describe 'decode', -> +; it 'should decode items lazily', -> + +(parameterize ([current-input-port (open-input-bytes (bytes 1 2 3 4 5))]) + (define array (+LazyArray uint8 4)) + (define arr (decode array)) + (check-false (Array? arr)) + (check-equal? (ref arr 'len) 4) + (check-equal? (pos (current-input-port)) 4) + (check-equal? (get arr 0) 1) + (check-equal? (get arr 1) 2) + (check-equal? (get arr 2) 3) + (check-equal? (get arr 3) 4)) + +; it 'should be able to convert to an array', -> + +(parameterize ([current-input-port (open-input-bytes (bytes 1 2 3 4 5))]) + (define array (+LazyArray uint8 4)) + (define arr (decode array)) + (check-equal? (LazyArray->list arr) '(1 2 3 4))) + + +; it 'should have an inspect method', -> +; [skipped] + + +; it 'should decode length as number before array', -> + +(parameterize ([current-input-port (open-input-bytes (bytes 4 1 2 3 4 5))]) + (define array (+LazyArray uint8 uint8)) + (define arr (decode array)) + (check-equal? (LazyArray->list arr) '(1 2 3 4))) + +; +; describe 'size', -> +; it 'should work with LazyArrays', -> + +(parameterize ([current-input-port (open-input-bytes (bytes 1 2 3 4 5))]) + (define array (+LazyArray uint8 4)) + (define arr (decode array)) + (check-equal? (size array arr) 4)) + + +; describe 'encode', -> +; it 'should work with LazyArrays', (done) -> + +(parameterize ([current-input-port (open-input-bytes (bytes 1 2 3 4 5))]) + (define array (+LazyArray uint8 4)) + (define arr (decode array)) + (check-equal? (encode array arr #f) (bytes 1 2 3 4))) \ No newline at end of file diff --git a/xenomorph/xenomorph/test/main.rkt b/xenomorph/xenomorph/test/main.rkt new file mode 100644 index 00000000..7d8f9aa5 --- /dev/null +++ b/xenomorph/xenomorph/test/main.rkt @@ -0,0 +1,15 @@ +#lang racket/base +(require "racket.rkt") + +(require "array-test.rkt" + "bitfield-test.rkt" + "buffer-test.rkt" + "enum-test.rkt" + "lazy-array-test.rkt" + "number-test.rkt" + "optional-test.rkt" + "pointer-test.rkt" + "reserved-test.rkt" + "string-test.rkt" + "struct-test.rkt" + "versioned-struct-test.rkt") diff --git a/xenomorph/xenomorph/test/number-test.rkt b/xenomorph/xenomorph/test/number-test.rkt new file mode 100644 index 00000000..ef2a0a7e --- /dev/null +++ b/xenomorph/xenomorph/test/number-test.rkt @@ -0,0 +1,336 @@ +#lang racket/base +(require "racket.rkt") + + +#| +approximates +https://github.com/mbutterick/restructure/blob/master/test/Number.coffee +|# + +;describe 'Number', -> +; describe 'uint8', -> +; it 'should decode', -> +; it 'should have a size', -> +; it 'should encode', (done) -> +(parameterize ([current-input-port (open-input-bytes (bytes #xab #xff))]) + (check-equal? (decode uint8) #xab) + (check-equal? (decode uint8) #xff)) + +(check-equal? (size uint8) 1) + +(let ([port (open-output-bytes)]) + (encode uint8 #xab port) + (encode uint8 #xff port) + (check-equal? (dump port) (bytes #xab #xff))) + + +; describe 'uint16', -> +; it 'is an alias for uint16be', -> +; modified test: `uint16` is the same endianness as the platform +(check-equal? (decode uint16 (bytes 0 1)) (send (if (system-big-endian?) + uint16be + uint16le) decode (bytes 0 1))) + +; describe 'uint16be', -> +; it 'should decode', -> +; it 'should have a size', -> +; it 'should encode', (done) -> + +(check-equal? (decode uint16be (open-input-bytes (bytes #xab #xff))) #xabff) +(check-equal? (size uint16be) 2) +(check-equal? (encode uint16be #xabff #f) (bytes #xab #xff)) + +; +; describe 'uint16le', -> +; it 'should decode', -> +; it 'should have a size', -> +; it 'should encode', (done) -> + +(check-equal? (decode uint16le (open-input-bytes (bytes #xff #xab))) #xabff) +(check-equal? (size uint16le) 2) +(check-equal? (encode uint16le #xabff #f) (bytes #xff #xab)) + +; +; describe 'uint24', -> +; it 'is an alias for uint24be', -> +;; modified test: `uint24` is the same endianness as the platform +(check-equal? (decode uint24 (bytes 0 1 2)) (send (if (system-big-endian?) + uint24be + uint24le) decode (bytes 0 1 2))) + +; +; describe 'uint24be', -> +; it 'should decode', -> +; it 'should have a size', -> +; it 'should encode', (done) -> + +(check-equal? (decode uint24be (open-input-bytes (bytes #xff #xab #x24))) #xffab24) +(check-equal? (size uint24be) 3) +(check-equal? (encode uint24be #xffab24 #f) (bytes #xff #xab #x24)) + +; +; describe 'uint24le', -> +; it 'should decode', -> +; it 'should have a size', -> +; it 'should encode', (done) -> + +(check-equal? (decode uint24le (open-input-bytes (bytes #x24 #xab #xff))) #xffab24) +(check-equal? (size uint24le) 3) +(check-equal? (encode uint24le #xffab24 #f) (bytes #x24 #xab #xff)) + +; +; describe 'uint32', -> +; it 'is an alias for uint32be', -> +;; modified test: `uint32` is the same endianness as the platform +(check-equal? (decode uint32 (bytes 0 1 2 3)) (send (if (system-big-endian?) + uint32be + uint32le) decode (bytes 0 1 2 3))) + +; +; describe 'uint32be', -> +; it 'should decode', -> +; it 'should have a size', -> +; it 'should encode', (done) -> + +(check-equal? (decode uint32be (open-input-bytes (bytes #xff #xab #x24 #xbf))) #xffab24bf) +(check-equal? (size uint32be) 4) +(check-equal? (encode uint32be #xffab24bf #f) (bytes #xff #xab #x24 #xbf)) + +; +; describe 'uint32le', -> +; it 'should decode', -> +; it 'should encode', (done) -> + +(check-equal? (decode uint32le (open-input-bytes (bytes #xbf #x24 #xab #xff))) #xffab24bf) +(check-equal? (size uint32le) 4) +(check-equal? (encode uint32le #xffab24bf #f) (bytes #xbf #x24 #xab #xff)) + + +; +; describe 'int8', -> +; it 'should decode', -> +; it 'should have a size', -> +; it 'should encode', (done) -> + +(let ([port (open-input-bytes (bytes #x7f #xff))]) + (check-equal? (decode int8 port) 127) + (check-equal? (decode int8 port) -1)) + +(check-equal? (size int8) 1) + +(let ([port (open-output-bytes)]) + (encode int8 127 port) + (encode int8 -1 port) + (check-equal? (dump port) (bytes #x7f #xff))) + + +; +; describe 'int16', -> +; it 'is an alias for int16be', -> +; int16.should.equal int16be + +;; modified test: `int16` is the same endianness as the platform +(check-equal? (decode int16 (bytes 0 1)) (send (if (system-big-endian?) + int16be + int16le) decode (bytes 0 1))) + + +; +; describe 'int16be', -> +; it 'should decode', -> +; it 'should have a size', -> +; it 'should encode', (done) -> + +(let ([port (open-input-bytes (bytes #xff #xab))]) + (check-equal? (decode int16be port) -85)) + +(check-equal? (size int16be) 2) + +(let ([port (open-output-bytes)]) + (encode int16be -85 port) + (check-equal? (dump port) (bytes #xff #xab))) + + +; describe 'int16le', -> +; it 'should decode', -> +; it 'should have a size', -> +; it 'should encode', (done) -> + +(check-equal? (decode int16le (open-input-bytes (bytes #xab #xff))) -85) +(check-equal? (size int16le) 2) +(check-equal? (encode int16le -85 #f) (bytes #xab #xff)) + + +; +; describe 'int24', -> +; it 'is an alias for int24be', -> +; int24.should.equal int24be + +;; modified test: `int24` is the same endianness as the platform +(check-equal? (decode int24 (bytes 0 1 2)) (send (if (system-big-endian?) + int24be + int24le) decode (bytes 0 1 2))) + + +; +; describe 'int24be', -> +; it 'should decode', -> +; it 'should have a size', -> +; it 'should encode', (done) -> + +(check-equal? (decode int24be (open-input-bytes (bytes #xff #xab #x24))) -21724) +(check-equal? (size int24be) 3) +(check-equal? (encode int24be -21724 #f) (bytes #xff #xab #x24)) + +; +; describe 'int24le', -> +; it 'should decode', -> +; it 'should have a size', -> +; it 'should encode', (done) -> + +(check-equal? (decode int24le (open-input-bytes (bytes #x24 #xab #xff))) -21724) +(check-equal? (size int24le) 3) +(check-equal? (encode int24le -21724 #f) (bytes #x24 #xab #xff)) + + + +; describe 'int32', -> +; it 'is an alias for int32be', -> +; modified test: `int32` is the same endianness as the platform +(check-equal? (decode int32 (bytes 0 1 2 3)) (send (if (system-big-endian?) + int32be + int32le) decode (bytes 0 1 2 3))) + + + +; +; describe 'int32be', -> +; it 'should decode', -> +; it 'should have a size', -> +; it 'should encode', (done) -> + +(check-equal? (decode int32be (open-input-bytes (bytes #xff #xab #x24 #xbf))) -5561153) +(check-equal? (size int32be) 4) +(check-equal? (encode int32be -5561153 #f) (bytes #xff #xab #x24 #xbf)) + +; +; describe 'int32le', -> +; it 'should decode', -> +; it 'should have a size', -> +; it 'should encode', (done) -> + +(check-equal? (decode int32le (open-input-bytes (bytes #xbf #x24 #xab #xff))) -5561153) +(check-equal? (size int32le) 4) +(check-equal? (encode int32le -5561153 #f) (bytes #xbf #x24 #xab #xff)) + +; +; describe 'float', -> +; it 'is an alias for floatbe', -> +; modified test: `float` is the same endianness as the platform +(check-equal? (decode float (bytes 0 1 2 3)) (send (if (system-big-endian?) + floatbe + floatle) decode (bytes 0 1 2 3))) + +; +; describe 'floatbe', -> +; it 'should decode', -> +; it 'should have a size', -> +; it 'should encode', (done) -> + +(check-= (decode floatbe (open-input-bytes (bytes #x43 #x7a #x8c #xcd))) 250.55 0.01) +(check-equal? (size floatbe) 4) +(check-equal? (encode floatbe 250.55 #f) (bytes #x43 #x7a #x8c #xcd)) + +; +; describe 'floatle', -> +; it 'should decode', -> +; it 'should have a size', -> +; it 'should encode', (done) -> + +(check-= (decode floatle (open-input-bytes (bytes #xcd #x8c #x7a #x43))) 250.55 0.01) +(check-equal? (size floatle) 4) +(check-equal? (encode floatle 250.55 #f) (bytes #xcd #x8c #x7a #x43)) + +; +; describe 'double', -> +; it 'is an alias for doublebe', -> +; modified test: `double` is the same endianness as the platform +(check-equal? (decode double (bytes 0 1 2 3 4 5 6 7)) (send (if (system-big-endian?) + doublebe + doublele) decode (bytes 0 1 2 3 4 5 6 7))) + +; +; describe 'doublebe', -> +; it 'should decode', -> +; it 'should have a size', -> +; it 'should encode', (done) -> + +(check-equal? (decode doublebe (open-input-bytes (bytes #x40 #x93 #x4a #x3d #x70 #xa3 #xd7 #x0a))) 1234.56) +(check-equal? (size doublebe) 8) +(check-equal? (encode doublebe 1234.56 #f) (bytes #x40 #x93 #x4a #x3d #x70 #xa3 #xd7 #x0a)) + +; +; describe 'doublele', -> +; it 'should decode', -> +; it 'should have a size', -> +; it 'should encode', (done) -> + +(check-equal? (decode doublele (open-input-bytes (bytes #x0a #xd7 #xa3 #x70 #x3d #x4a #x93 #x40))) 1234.56) +(check-equal? (size doublele) 8) +(check-equal? (encode doublele 1234.56 #f) (bytes #x0a #xd7 #xa3 #x70 #x3d #x4a #x93 #x40)) + +; +; describe 'fixed16', -> +; it 'is an alias for fixed16be', -> +; modified test: `fixed16` is the same endianness as the platform +(check-equal? (decode fixed16 (bytes 0 1)) (send (if (system-big-endian?) + fixed16be + fixed16le) decode (bytes 0 1))) + +; +; describe 'fixed16be', -> +; it 'should decode', -> +; it 'should have a size', -> +; it 'should encode', (done) -> + +(check-= (decode fixed16be (open-input-bytes (bytes #x19 #x57))) 25.34 0.01) +(check-equal? (size fixed16be) 2) +(check-equal? (encode fixed16be 25.34 #f) (bytes #x19 #x57)) + +; +; describe 'fixed16le', -> +; it 'should decode', -> +; it 'should have a size', -> +; it 'should encode', (done) -> + +(check-= (decode fixed16le (open-input-bytes (bytes #x57 #x19))) 25.34 0.01) +(check-equal? (size fixed16le) 2) +(check-equal? (encode fixed16le 25.34 #f) (bytes #x57 #x19)) + +; +; describe 'fixed32', -> +; it 'is an alias for fixed32be', -> +; modified test: `fixed32` is the same endianness as the platform + +(check-equal? (decode fixed32 (bytes 0 1 2 3)) (send (if (system-big-endian?) + fixed32be + fixed32le) decode (bytes 0 1 2 3))) + +; +; describe 'fixed32be', -> +; it 'should decode', -> +; it 'should have a size', -> +; it 'should encode', (done) -> +(check-= (decode fixed32be (open-input-bytes (bytes #x00 #xfa #x8c #xcc))) 250.55 0.01) +(check-equal? (size fixed32be) 4) +(check-equal? (encode fixed32be 250.55 #f) (bytes #x00 #xfa #x8c #xcc)) + +; +; describe 'fixed32le', -> +; it 'should decode', -> +; it 'should have a size', -> +; it 'should encode', (done) -> + +(check-= (decode fixed32le (open-input-bytes (bytes #xcc #x8c #xfa #x00))) 250.55 0.01) +(check-equal? (size fixed32le) 4) +(check-equal? (encode fixed32le 250.55 #f) (bytes #xcc #x8c #xfa #x00)) \ No newline at end of file diff --git a/xenomorph/xenomorph/test/optional-test.rkt b/xenomorph/xenomorph/test/optional-test.rkt new file mode 100644 index 00000000..a1345c03 --- /dev/null +++ b/xenomorph/xenomorph/test/optional-test.rkt @@ -0,0 +1,114 @@ +#lang racket/base +(require "racket.rkt") + +#| +approximates +https://github.com/mbutterick/restructure/blob/master/test/Optional.coffee +|# + +;describe 'Optional', -> +; describe 'decode', -> +; it 'should not decode when condition is falsy', -> + +(parameterize ([current-input-port (open-input-bytes (bytes 0))]) + (define optional (+Optional uint8 #f)) + (check-equal? (decode optional) (void)) + (check-equal? (pos (current-input-port)) 0)) + +; it 'should not decode when condition is a function and falsy', -> + +(parameterize ([current-input-port (open-input-bytes (bytes 0))]) + (define optional (+Optional uint8 (λ _ #f))) + (check-equal? (decode optional) (void)) + (check-equal? (pos (current-input-port)) 0)) + + +; it 'should decode when condition is omitted', -> + +(parameterize ([current-input-port (open-input-bytes (bytes 0))]) + (define optional (+Optional uint8)) + (check-not-equal? (decode optional) (void)) + (check-equal? (pos (current-input-port)) 1)) + +; +; it 'should decode when condition is truthy', -> + +(parameterize ([current-input-port (open-input-bytes (bytes 0))]) + (define optional (+Optional uint8 #t)) + (check-not-equal? (decode optional) (void)) + (check-equal? (pos (current-input-port)) 1)) + + +; it 'should decode when condition is a function and truthy', -> + +(parameterize ([current-input-port (open-input-bytes (bytes 0))]) + (define optional (+Optional uint8 (λ _ #t))) + (check-not-equal? (decode optional) (void)) + (check-equal? (pos (current-input-port)) 1)) + + +; describe 'size', -> + +(check-equal? (size (+Optional uint8 #f)) 0) + +; +; it 'should return 0 when condition is a function and falsy', -> + +(check-equal? (size (+Optional uint8 (λ _ #f))) 0) + + +; it 'should return given type size when condition is omitted', -> + +(check-equal? (size (+Optional uint8)) 1) + + +; it 'should return given type size when condition is truthy', -> + +(check-equal? (size (+Optional uint8 #t)) 1) + + +; it 'should return given type size when condition is a function and truthy', -> + +(check-equal? (size (+Optional uint8 (λ _ #t))) 1) + + +; describe 'encode', -> +; it 'should not encode when condition is falsy', (done) -> + +(parameterize ([current-output-port (open-output-bytes)]) + (define optional (+Optional uint8 #f)) + (encode optional 128) + (check-equal? (dump (current-output-port)) (bytes))) + + +; it 'should not encode when condition is a function and falsy', (done) -> + +(parameterize ([current-output-port (open-output-bytes)]) + (define optional (+Optional uint8 (λ _ #f))) + (encode optional 128) + (check-equal? (dump (current-output-port)) (bytes))) + + +; +; it 'should encode when condition is omitted', (done) -> + +(parameterize ([current-output-port (open-output-bytes)]) + (define optional (+Optional uint8)) + (encode optional 128) + (check-equal? (dump (current-output-port)) (bytes 128))) + + +; it 'should encode when condition is truthy', (done) -> + +(parameterize ([current-output-port (open-output-bytes)]) + (define optional (+Optional uint8 #t)) + (encode optional 128) + (check-equal? (dump (current-output-port)) (bytes 128))) + + +; it 'should encode when condition is a function and truthy', (done) -> + +(parameterize ([current-output-port (open-output-bytes)]) + (define optional (+Optional uint8 (λ _ #t))) + (encode optional 128) + (check-equal? (dump (current-output-port)) (bytes 128))) \ No newline at end of file diff --git a/xenomorph/xenomorph/test/pointer-test.rkt b/xenomorph/xenomorph/test/pointer-test.rkt new file mode 100644 index 00000000..5a9c6d32 --- /dev/null +++ b/xenomorph/xenomorph/test/pointer-test.rkt @@ -0,0 +1,234 @@ +#lang racket/base +(require "racket.rkt") + +#| +approximates +https://github.com/mbutterick/restructure/blob/master/test/Pointer.coffee +|# + + +;describe 'Pointer', -> +; describe 'decode', -> +; it 'should handle null pointers', -> + +(parameterize ([current-input-port (open-input-bytes (bytes 0))]) + (check-false (decode (+Pointer uint8 uint8) #:parent (mhash '_startOffset 50)))) + + +; it 'should use local offsets from start of parent by default', -> + +(parameterize ([current-input-port (open-input-bytes (bytes 1 53))]) + (check-equal? (decode (+Pointer uint8 uint8) #:parent (mhash '_startOffset 0)) 53)) + + +; it 'should support immediate offsets', -> + +(parameterize ([current-input-port (open-input-bytes (bytes 1 53))]) + (check-equal? (decode (+Pointer uint8 uint8 (mhash 'type 'immediate))) 53)) + + +; it 'should support offsets relative to the parent', -> + +(parameterize ([current-input-port (open-input-bytes (bytes 0 0 1 53))]) + (pos (current-input-port) 2) + (check-equal? (decode (+Pointer uint8 uint8 (mhash 'type 'parent)) + #:parent (mhash 'parent (mhash '_startOffset 2))) 53)) + + +; it 'should support global offsets', -> + +(parameterize ([current-input-port (open-input-bytes (bytes 1 2 4 0 0 0 53))]) + (pos (current-input-port) 2) + (check-equal? (decode (+Pointer uint8 uint8 (mhash 'type 'global)) + #:parent (mhash 'parent (mhash 'parent (mhash '_startOffset 2)))) + 53)) + + +; it 'should support offsets relative to a property on the parent', -> + +(parameterize ([current-input-port (open-input-bytes (bytes 1 0 0 0 0 53))]) + (check-equal? (decode (+Pointer uint8 uint8 (mhash 'relativeTo (λ (ctx) (· ctx parent ptr)))) + #:parent (mhash '_startOffset 0 'parent (mhash 'ptr 4))) + 53)) + + +; it 'should support returning pointer if there is no decode type', -> + +(parameterize ([current-input-port (open-input-bytes (bytes 4))]) + (check-equal? (decode (+Pointer uint8 'void) + #:parent (mhash '_startOffset 0)) 4)) + + +; it 'should support decoding pointers lazily', -> + +(parameterize ([current-input-port (open-input-bytes (bytes 1 53))]) + (define res (decode (+Struct (dictify 'ptr (+Pointer uint8 uint8 (mhasheq 'lazy #t)))))) + (check-true (LazyThunk? (hash-ref (get-field _kv res) 'ptr))) + (check-equal? (· res ptr) 53)) + + + +; describe 'size', -> + +(let ([ctx (mhash 'pointerSize 0)]) + (check-equal? (size (+Pointer uint8 uint8) 10 ctx) 1) + (check-equal? (· ctx pointerSize) 1)) + + + +; it 'should add to immediate pointerSize', -> + +(let ([ctx (mhash 'pointerSize 0)]) + (check-equal? (size (+Pointer uint8 uint8 (mhash 'type 'immediate)) 10 ctx) 1) + (check-equal? (· ctx pointerSize) 1)) + + +; it 'should add to parent pointerSize', -> + +(let ([ctx (mhash 'parent (mhash 'pointerSize 0))]) + (check-equal? (size (+Pointer uint8 uint8 (mhash 'type 'parent)) 10 ctx) 1) + (check-equal? (· ctx parent pointerSize) 1)) + + + +; it 'should add to global pointerSize', -> + +(let ([ctx (mhash 'parent (mhash 'parent (mhash 'parent (mhash 'pointerSize 0))))]) + (check-equal? (size (+Pointer uint8 uint8 (mhash 'type 'global)) 10 ctx) 1) + (check-equal? (· ctx parent parent parent pointerSize) 1)) + + + +; it 'should handle void pointers', -> + +(let ([ctx (mhash 'pointerSize 0)]) + (check-equal? (size (+Pointer uint8 'void) (+VoidPointer uint8 50) ctx) 1) + (check-equal? (· ctx pointerSize) 1)) + + +; it 'should throw if no type and not a void pointer', -> + +(let ([ctx (mhash 'pointerSize 0)]) + (check-exn exn:fail:contract? (λ () (size (+Pointer uint8 'void) 30 ctx)))) + + +; it 'should return a fixed size without a value', -> + +(check-equal? (size (+Pointer uint8 uint8)) 1) + + +; describe 'encode', -> +; it 'should handle null pointers', (done) -> + +(parameterize ([current-output-port (open-output-bytes)]) + (define ctx (mhash 'pointerSize 0 + 'startOffset 0 + 'pointerOffset 0 + 'pointers null)) + (encode (+Pointer uint8 uint8) #f #:parent ctx) + (check-equal? (· ctx pointerSize) 0) + (check-equal? (dump (current-output-port)) (bytes 0))) + + +; it 'should handle local offsets', (done) -> + +(parameterize ([current-output-port (open-output-bytes)]) + (define ctx (mhash 'pointerSize 0 + 'startOffset 0 + 'pointerOffset 1 + 'pointers null)) + (encode (+Pointer uint8 uint8) 10 #:parent ctx) + (check-equal? (· ctx pointerOffset) 2) + (check-equal? (· ctx pointers) (list (mhasheq 'type uint8 + 'val 10 + 'parent ctx))) + (check-equal? (dump (current-output-port)) (bytes 1))) + + +; it 'should handle immediate offsets', (done) -> + +(parameterize ([current-output-port (open-output-bytes)]) + (define ctx (mhash 'pointerSize 0 + 'startOffset 0 + 'pointerOffset 1 + 'pointers null)) + (encode (+Pointer uint8 uint8 (mhash 'type 'immediate)) 10 #:parent ctx) + (check-equal? (· ctx pointerOffset) 2) + (check-equal? (· ctx pointers) (list (mhasheq 'type uint8 + 'val 10 + 'parent ctx))) + (check-equal? (dump (current-output-port)) (bytes 0))) + + +; it 'should handle offsets relative to parent', (done) -> + +(parameterize ([current-output-port (open-output-bytes)]) + (define ctx (mhash 'parent (mhash 'pointerSize 0 + 'startOffset 3 + 'pointerOffset 5 + 'pointers null))) + (encode (+Pointer uint8 uint8 (mhash 'type 'parent)) 10 #:parent ctx) + (check-equal? (· ctx parent pointerOffset) 6) + (check-equal? (· ctx parent pointers) (list (mhasheq 'type uint8 + 'val 10 + 'parent ctx))) + (check-equal? (dump (current-output-port)) (bytes 2))) + + + +; it 'should handle global offsets', (done) -> + +(parameterize ([current-output-port (open-output-bytes)]) + (define ctx (mhash 'parent + (mhash 'parent + (mhash 'parent (mhash 'pointerSize 0 + 'startOffset 3 + 'pointerOffset 5 + 'pointers null))))) + (encode (+Pointer uint8 uint8 (mhash 'type 'global)) 10 #:parent ctx) + (check-equal? (· ctx parent parent parent pointerOffset) 6) + (check-equal? (· ctx parent parent parent pointers) (list (mhasheq 'type uint8 + 'val 10 + 'parent ctx))) + (check-equal? (dump (current-output-port)) (bytes 5))) + + +; it 'should support offsets relative to a property on the parent', (done) -> + +(parameterize ([current-output-port (open-output-bytes)]) + (define ctx (mhash 'pointerSize 0 + 'startOffset 0 + 'pointerOffset 10 + 'pointers null + 'val (mhash 'ptr 4))) + (encode (+Pointer uint8 uint8 (mhash 'relativeTo (λ (ctx) (· ctx ptr)))) 10 #:parent ctx) + (check-equal? (· ctx pointerOffset) 11) + (check-equal? (· ctx pointers) (list (mhasheq 'type uint8 + 'val 10 + 'parent ctx))) + (check-equal? (dump (current-output-port)) (bytes 6))) + + +; it 'should support void pointers', (done) -> + +(parameterize ([current-output-port (open-output-bytes)]) + (define ctx (mhash 'pointerSize 0 + 'startOffset 0 + 'pointerOffset 1 + 'pointers null)) + (encode (+Pointer uint8 'void) (+VoidPointer uint8 55) #:parent ctx) + (check-equal? (· ctx pointerOffset) 2) + (check-equal? (· ctx pointers) (list (mhasheq 'type uint8 + 'val 55 + 'parent ctx))) + (check-equal? (dump (current-output-port)) (bytes 1))) + + +; it 'should throw if not a void pointer instance', -> + +(parameterize ([current-output-port (open-output-bytes)]) + (define ctx (mhash 'pointerSize 0 + 'startOffset 0 + 'pointerOffset 1 + 'pointers null)) + (check-exn exn:fail:contract? (λ () (encode (+Pointer uint8 'void) 44 #:parent ctx)))) diff --git a/xenomorph/xenomorph/test/racket.rkt b/xenomorph/xenomorph/test/racket.rkt new file mode 100644 index 00000000..f62f3b37 --- /dev/null +++ b/xenomorph/xenomorph/test/racket.rkt @@ -0,0 +1,6 @@ +#lang racket/base +(require rackunit xenomorph "../private/racket.rkt") +(provide (all-from-out rackunit xenomorph "../private/racket.rkt")) + +(module reader syntax/module-reader + #:language 'xenomorph/test/racket) \ No newline at end of file diff --git a/xenomorph/xenomorph/test/reserved-test.rkt b/xenomorph/xenomorph/test/reserved-test.rkt new file mode 100644 index 00000000..752c80f4 --- /dev/null +++ b/xenomorph/xenomorph/test/reserved-test.rkt @@ -0,0 +1,33 @@ +#lang racket/base +(require "racket.rkt") + +#| +approximates +https://github.com/mbutterick/restructure/blob/master/test/Reserved.coffee +|# + +;describe 'Reserved', -> +; it 'should have a default count of 1', -> + +(check-equal? (size (+Reserved uint8)) 1) + + +; it 'should allow custom counts and types', -> + +(check-equal? (size (+Reserved uint16be 10)) 20) + + +; it 'should decode', -> + +(parameterize ([current-input-port (open-input-bytes (bytes 0 0))]) + (define reserved (+Reserved uint16be)) + (check-equal? (decode reserved) (void)) + (check-equal? (pos (current-input-port)) 2)) + + +; it 'should encode', (done) -> + +(parameterize ([current-output-port (open-output-bytes)]) + (define reserved (+Reserved uint16be)) + (encode reserved #f) + (check-equal? (dump (current-output-port)) (bytes 0 0))) \ No newline at end of file diff --git a/xenomorph/xenomorph/test/string-test.rkt b/xenomorph/xenomorph/test/string-test.rkt new file mode 100644 index 00000000..a8bf4f94 --- /dev/null +++ b/xenomorph/xenomorph/test/string-test.rkt @@ -0,0 +1,129 @@ +#lang racket/base +(require "racket.rkt") + + +#| +approximates +https://github.com/mbutterick/restructure/blob/master/test/String.coffee +|# + +;describe 'String', -> +; describe 'decode', -> +; it 'should decode fixed length', -> + +(parameterize ([current-input-port (open-input-bytes #"testing")]) + (check-equal? (decode (+StringT 7)) "testing")) + + +; it 'should decode length from parent key', -> + +(parameterize ([current-input-port (open-input-bytes #"testing")]) + (check-equal? (decode (+StringT 'len) #:parent (mhash 'len 7)) "testing")) + + +; it 'should decode length as number before string', -> + +(parameterize ([current-input-port (open-input-bytes #"\x07testing")]) + (check-equal? (decode (+StringT uint8) #:parent (mhash 'len 7)) "testing")) + + +;; it 'should decode utf8', -> + +(parameterize ([current-input-port (open-input-bytes (string->bytes/utf-8 "🍻"))]) + (check-equal? (decode (+StringT 4 'utf8)) "🍻")) + +;; it 'should decode encoding computed from function', -> + +(parameterize ([current-input-port (open-input-bytes (string->bytes/utf-8 "🍻"))]) + (check-equal? (decode (+StringT 4 (λ _ 'utf8))) "🍻")) + + +; it 'should decode null-terminated string and read past terminator', -> + +(parameterize ([current-input-port (open-input-bytes (string->bytes/utf-8 "🍻\x00"))]) + (check-equal? (decode (+StringT #f 'utf8)) "🍻") + (check-equal? (pos (current-input-port)) 5)) + + +; it 'should decode remainder of buffer when null-byte missing', -> + +(parameterize ([current-input-port (open-input-bytes (string->bytes/utf-8 "🍻"))]) + (check-equal? (decode (+StringT #f 'utf8)) "🍻")) + + +; describe 'size', -> +; it 'should use string length', -> + +(check-equal? (size (+StringT 7) "testing") 7) + + +; it 'should use correct encoding', -> + +(check-equal? (size (+StringT 10 'utf8) "🍻") 4) + + +; it 'should use encoding from function', -> + +(check-equal? (size (+StringT 10 (λ _ 'utf8)) "🍻") 4) + + +; it 'should add size of length field before string', -> + +(check-equal? (size (+StringT uint8 'utf8) "🍻") 5) + + +; todo +; it 'should work with utf16be encoding', -> + + +; it 'should take null-byte into account', -> + +(check-equal? (size (+StringT #f 'utf8) "🍻") 5) + + +; it 'should use defined length if no value given', -> + +(check-equal? (size (+StringT 10)) 10) + +; +; describe 'encode', -> +; it 'should encode using string length', (done) -> + +(parameterize ([current-output-port (open-output-bytes)]) + (encode (+StringT 7) "testing") + (check-equal? (dump (current-output-port)) #"testing")) + + +; it 'should encode length as number before string', (done) -> + +(parameterize ([current-output-port (open-output-bytes)]) + (encode (+StringT uint8) "testing") + (check-equal? (dump (current-output-port)) #"\x07testing")) + + +; it 'should encode length as number before string utf8', (done) -> + +(parameterize ([current-output-port (open-output-bytes)]) + (encode (+StringT uint8 'utf8) "testing 😜") + (check-equal? (dump (current-output-port)) (string->bytes/utf-8 "\x0ctesting 😜"))) + + +; it 'should encode utf8', (done) -> + +(parameterize ([current-output-port (open-output-bytes)]) + (encode (+StringT 4 'utf8) "🍻" ) + (check-equal? (dump (current-output-port)) (string->bytes/utf-8 "🍻"))) + + +; it 'should encode encoding computed from function', (done) -> + +(parameterize ([current-output-port (open-output-bytes)]) + (encode (+StringT 4 (λ _ 'utf8)) "🍻") + (check-equal? (dump (current-output-port)) (string->bytes/utf-8 "🍻"))) + + +; it 'should encode null-terminated string', (done) -> + +(parameterize ([current-output-port (open-output-bytes)]) + (encode (+StringT #f 'utf8) "🍻" ) + (check-equal? (dump (current-output-port)) (string->bytes/utf-8 "🍻\x00"))) \ No newline at end of file diff --git a/xenomorph/xenomorph/test/struct-test.rkt b/xenomorph/xenomorph/test/struct-test.rkt new file mode 100644 index 00000000..96976c9c --- /dev/null +++ b/xenomorph/xenomorph/test/struct-test.rkt @@ -0,0 +1,121 @@ +#lang racket/base +(require "racket.rkt") + +#| +approximates +https://github.com/mbutterick/restructure/blob/master/test/Struct.coffee +|# + + +;describe 'Struct', -> +; describe 'decode', -> +; it 'should decode into an object', -> + +(parameterize ([current-input-port (open-input-bytes #"\x05roxyb\x15")]) + (check-equal? + (dump (decode (+Struct (dictify 'name (+StringT uint8) + 'age uint8)))) + (hasheq 'name "roxyb" 'age 21))) + + + +; it 'should support process hook', -> + +(parameterize ([current-input-port (open-input-bytes #"\x05roxyb\x20")]) + (define struct (+Struct (dictify 'name (+StringT uint8) + 'age uint8))) + (set-field! post-decode struct (λ (o . _) (ref-set! o 'canDrink (>= (· o age) 21)) o)) + (check-equal? (dump (decode struct)) + (hasheq 'name "roxyb" 'age 32 'canDrink #t))) + + + +; it 'should support function keys', -> + +(parameterize ([current-input-port (open-input-bytes #"\x05roxyb\x20")]) + (define struct (+Struct (dictify 'name (+StringT uint8) + 'age uint8 + 'canDrink (λ (o) (>= (ref o 'age) 21))))) + (check-equal? (dump (decode struct)) + (hasheq 'name "roxyb" 'age 32 'canDrink #t))) + + + + +; +; describe 'size', -> +; it 'should compute the correct size', -> + +(check-equal? (size (+Struct (dictify + 'name (+StringT uint8) + 'age uint8)) + (hasheq 'name "roxyb" 'age 32)) 7) + + + +; it 'should compute the correct size with pointers', -> + +(check-equal? (size (+Struct (dictify + 'name (+StringT uint8) + 'age uint8 + 'ptr (+Pointer uint8 (+StringT uint8)))) + (mhash 'name "roxyb" 'age 21 'ptr "hello")) 14) + + +; it 'should get the correct size when no value is given', -> + +(check-equal? (size (+Struct (dictify + 'name (+StringT 4) + 'age uint8))) 5) + +; it 'should throw when getting non-fixed length size and no value is given', -> + +(check-exn exn:fail:contract? (λ () (size (+Struct (dictify 'name (+StringT uint8) + 'age uint8))))) + + + +; +; describe 'encode', -> +; it 'should encode objects to buffers', (done) -> +; stream = new EncodeStream +; stream.pipe concat (buf) -> +; buf.should.deep.equal new Buffer '\x05roxyb\x15' +; done() +; +; struct = new Struct +; name: new StringT uint8 +; age: uint8 +; +; struct.encode stream, +; name: 'roxyb' +; age: 21 +; +; stream.end() + +(parameterize ([current-input-port (open-input-bytes #"\x05roxyb\x15")]) + (check-equal? (dump (decode (+Struct (dictify 'name (+StringT uint8) + 'age uint8)))) + (hasheq 'name "roxyb" 'age 21))) + + +; it 'should support preEncode hook', (done) -> + +(parameterize ([current-output-port (open-output-bytes)]) + (define struct (+Struct (dictify 'nameLength uint8 + 'name (+StringT 'nameLength) + 'age uint8))) + (set-field! pre-encode struct (λ (val port) (ref-set! val 'nameLength (length (ref val 'name))) val)) + (encode struct (mhasheq 'name "roxyb" 'age 21)) + (check-equal? (dump (current-output-port)) #"\x05roxyb\x15")) + + +; it 'should encode pointer data after structure', (done) -> + +(parameterize ([current-output-port (open-output-bytes)]) + (define struct (+Struct (dictify 'name (+StringT uint8) + 'age uint8 + 'ptr (+Pointer uint8 (+StringT uint8))))) + (encode struct (hasheq 'name "roxyb" 'age 21 'ptr "hello")) + (check-equal? (dump (current-output-port)) #"\x05roxyb\x15\x08\x05hello")) + diff --git a/xenomorph/xenomorph/test/test.rkt b/xenomorph/xenomorph/test/test.rkt new file mode 100644 index 00000000..0a6b5b35 --- /dev/null +++ b/xenomorph/xenomorph/test/test.rkt @@ -0,0 +1,19 @@ +#lang racket/base +(require "racket.rkt") + +(define Person + (make-object Struct + (list (cons 'name (make-object StringT uint8 'utf8)) + (cons 'age uint8)))) + +;; decode a person from a buffer +(define stream-in (make-object DecodeStream #"\4MikeA")) +(define x (send Person decode stream-in)) + +(test-module + (check-equal? (dict-ref x 'name) "Mike") + (check-equal? (dict-ref x 'age) 65)) + +;; encode a person from a hash +(test-module + (check-equal? (send Person encode #f (hasheq 'name "Mike" 'age 65)) #"\4MikeA")) \ No newline at end of file diff --git a/xenomorph/xenomorph/test/versioned-struct-test.rkt b/xenomorph/xenomorph/test/versioned-struct-test.rkt new file mode 100644 index 00000000..b02beea3 --- /dev/null +++ b/xenomorph/xenomorph/test/versioned-struct-test.rkt @@ -0,0 +1,340 @@ +#lang racket/base +(require "racket.rkt") + +#| +approximates +https://github.com/mbutterick/restructure/blob/master/test/VersionedStruct.coffee +|# + +;describe 'VersionedStruct', -> +; describe 'decode', -> +; it 'should get version from number type', -> + +(let ([struct (+VersionedStruct uint8 + (dictify + 0 (dictify 'name (+StringT uint8 'ascii) + 'age uint8) + 1 (dictify 'name (+StringT uint8 'utf8) + 'age uint8 + 'gender uint8)))]) + + (parameterize ([current-input-port (open-input-bytes #"\x00\x05roxyb\x15")]) + (check-equal? (dump (decode struct)) (hasheq 'name "roxyb" + 'age 21 + 'version 0))) + + (parameterize ([current-input-port (open-input-bytes (string->bytes/utf-8 "\x01\x0aroxyb 🤘\x15\x00"))]) + (check-equal? (dump (decode struct)) (hasheq 'name "roxyb 🤘" + 'age 21 + 'version 1 + 'gender 0)))) + + +; it 'should throw for unknown version', -> + +(let ([struct (+VersionedStruct uint8 + (dictify + 0 (dictify 'name (+StringT uint8 'ascii) + 'age uint8) + 1 (dictify 'name (+StringT uint8 'utf8) + 'age uint8 + 'gender uint8)))]) + + (parameterize ([current-input-port (open-input-bytes #"\x05\x05roxyb\x15")]) + (check-exn exn:fail:contract? (λ () (decode struct))))) + + +; +; it 'should support common header block', -> + +(let ([struct (+VersionedStruct uint8 + (dictify + 'header (dictify 'age uint8 + 'alive uint8) + 0 (dictify 'name (+StringT uint8 'ascii)) + 1 (dictify 'name (+StringT uint8 'utf8) + 'gender uint8)))]) + + (parameterize ([current-input-port (open-input-bytes #"\x00\x15\x01\x05roxyb")]) + (check-equal? (dump (decode struct)) (hasheq 'name "roxyb" + 'age 21 + 'alive 1 + 'version 0))) + + (parameterize ([current-input-port (open-input-bytes (string->bytes/utf-8 "\x01\x15\x01\x0aroxyb 🤘\x00"))]) + (check-equal? (dump (decode struct)) (hasheq 'name "roxyb 🤘" + 'age 21 + 'version 1 + 'alive 1 + 'gender 0)))) + + +; it 'should support parent version key', -> + +(let ([struct (+VersionedStruct 'version + (dictify + 0 (dictify 'name (+StringT uint8 'ascii) + 'age uint8) + 1 (dictify 'name (+StringT uint8 'utf8) + 'age uint8 + 'gender uint8)))]) + + (parameterize ([current-input-port (open-input-bytes #"\x05roxyb\x15")]) + (check-equal? (dump (decode struct #:parent (mhash 'version 0))) (hasheq 'name "roxyb" + 'age 21 + 'version 0))) + + (parameterize ([current-input-port (open-input-bytes (string->bytes/utf-8 "\x0aroxyb 🤘\x15\x00"))]) + (check-equal? (dump (decode struct #:parent (mhash 'version 1))) (hasheq 'name "roxyb 🤘" + 'age 21 + 'version 1 + 'gender 0)))) + + + +; +; it 'should support sub versioned structs', -> + +(let ([struct (+VersionedStruct uint8 + (dictify + 0 (dictify 'name (+StringT uint8 'ascii) + 'age uint8) + 1 (+VersionedStruct uint8 + (dictify + 0 (dictify 'name (+StringT uint8)) + 1 (dictify 'name (+StringT uint8) + 'isDessert uint8)))))]) + + (parameterize ([current-input-port (open-input-bytes #"\x00\x05roxyb\x15")]) + (check-equal? (dump (decode struct #:parent (mhash 'version 0))) (hasheq 'name "roxyb" + 'age 21 + 'version 0))) + + (parameterize ([current-input-port (open-input-bytes #"\x01\x00\x05pasta")]) + (check-equal? (dump (decode struct #:parent (mhash 'version 0))) (hasheq 'name "pasta" + 'version 0))) + + (parameterize ([current-input-port (open-input-bytes #"\x01\x01\x09ice cream\x01")]) + (check-equal? (dump (decode struct #:parent (mhash 'version 0))) (hasheq 'name "ice cream" + 'isDessert 1 + 'version 1)))) + + +; +; it 'should support process hook', -> + +(let ([struct (+VersionedStruct uint8 + (dictify + 0 (dictify 'name (+StringT uint8 'ascii) + 'age uint8) + 1 (dictify 'name (+StringT uint8 'utf8) + 'age uint8 + 'gender uint8)))]) + (set-field! post-decode struct (λ (o stream ctx) (ref-set! o 'processed "true") o)) + (parameterize ([current-input-port (open-input-bytes #"\x00\x05roxyb\x15")]) + (check-equal? (dump (decode struct)) (hasheq 'name "roxyb" + 'processed "true" + 'age 21 + 'version 0)))) + + +; +; describe 'size', -> +; it 'should compute the correct size', -> + +(let ([struct (+VersionedStruct uint8 + (dictify + 0 (dictify 'name (+StringT uint8 'ascii) + 'age uint8) + 1 (dictify 'name (+StringT uint8 'utf8) + 'age uint8 + 'gender uint8)))]) + + (check-equal? (size struct (mhasheq 'name "roxyb" + 'age 21 + 'version 0)) 8) + + (check-equal? (size struct (mhasheq 'name "roxyb 🤘" + 'gender 0 + 'age 21 + 'version 1)) 14)) + + + + +; +; it 'should throw for unknown version', -> + +(let ([struct (+VersionedStruct uint8 + (dictify + 0 (dictify 'name (+StringT uint8 'ascii) + 'age uint8) + 1 (dictify 'name (+StringT uint8 'utf8) + 'age uint8 + 'gender uint8)))]) + + (check-exn exn:fail:contract? (λ () (size struct (mhasheq 'name "roxyb" + 'age 21 + 'version 5))))) + + +; +; it 'should support common header block', -> + +(let ([struct (+VersionedStruct uint8 + (dictify + 'header (dictify 'age uint8 + 'alive uint8) + 0 (dictify 'name (+StringT uint8 'ascii)) + 1 (dictify 'name (+StringT uint8 'utf8) + 'gender uint8)))]) + + (check-equal? (size struct (mhasheq 'name "roxyb" + 'age 21 + 'alive 1 + 'version 0)) 9) + + (check-equal? (size struct (mhasheq 'name "roxyb 🤘" + 'gender 0 + 'age 21 + 'alive 1 + 'version 1)) 15)) + + + +; it 'should compute the correct size with pointers', -> + + +(let ([struct (+VersionedStruct uint8 + (dictify + 0 (dictify 'name (+StringT uint8 'ascii) + 'age uint8) + 1 (dictify 'name (+StringT uint8 'utf8) + 'age uint8 + 'ptr (+Pointer uint8 (+StringT uint8)))))]) + + (check-equal? (size struct (mhasheq 'name "roxyb" + 'age 21 + 'version 1 + 'ptr "hello")) 15)) + + +; +; it 'should throw if no value is given', -> + + + +(let ([struct (+VersionedStruct uint8 + (dictify + 0 (dictify 'name (+StringT uint8 'ascii) + 'age uint8) + 1 (dictify 'name (+StringT uint8 'utf8) + 'age uint8 + 'gender uint8)))]) + + (check-exn exn:fail:contract? (λ () (size struct)))) + + + +; describe 'encode', -> +; it 'should encode objects to buffers', (done) -> + +(let ([struct (+VersionedStruct uint8 + (dictify + 0 (dictify 'name (+StringT uint8 'ascii) + 'age uint8) + 1 (dictify 'name (+StringT uint8 'utf8) + 'age uint8 + 'gender uint8)))] + [port (open-output-bytes)]) + (encode struct (mhasheq 'name "roxyb" + 'age 21 + 'version 0) port) + (encode struct (mhasheq 'name "roxyb 🤘" + 'age 21 + 'gender 0 + 'version 1) port) + (check-equal? (dump port) (string->bytes/utf-8 "\x00\x05roxyb\x15\x01\x0aroxyb 🤘\x15\x00"))) + + +; +; it 'should throw for unknown version', -> + +(let ([struct (+VersionedStruct uint8 + (dictify + 0 (dictify 'name (+StringT uint8 'ascii) + 'age uint8) + 1 (dictify 'name (+StringT uint8 'utf8) + 'age uint8 + 'gender uint8)))] + [port (open-output-bytes)]) + (check-exn exn:fail:contract? (λ () (encode struct port (mhasheq 'name "roxyb" + 'age 21 + 'version 5))))) + + + +; it 'should support common header block', (done) -> + +(let ([struct (+VersionedStruct uint8 + (dictify + 'header (dictify 'age uint8 + 'alive uint8) + 0 (dictify 'name (+StringT uint8 'ascii)) + 1 (dictify 'name (+StringT uint8 'utf8) + 'gender uint8)))] + [stream (open-output-bytes)]) + + (encode struct (mhasheq 'name "roxyb" + 'age 21 + 'alive 1 + 'version 0) stream) + + (encode struct (mhasheq 'name "roxyb 🤘" + 'gender 0 + 'age 21 + 'alive 1 + 'version 1) stream) + + (check-equal? (dump stream) (string->bytes/utf-8 "\x00\x15\x01\x05roxyb\x01\x15\x01\x0aroxyb 🤘\x00"))) + + + +; it 'should encode pointer data after structure', (done) -> + +(let ([struct (+VersionedStruct uint8 + (dictify + 0 (dictify 'name (+StringT uint8 'ascii) + 'age uint8) + 1 (dictify 'name (+StringT uint8 'utf8) + 'age uint8 + 'ptr (+Pointer uint8 (+StringT uint8)))))] + [stream (open-output-bytes)]) + (encode struct (mhasheq 'version 1 + 'name "roxyb" + 'age 21 + 'ptr "hello") stream) + + (check-equal? (dump stream) (string->bytes/utf-8 "\x01\x05roxyb\x15\x09\x05hello"))) + + + + +; it 'should support preEncode hook', (done) -> + +(let ([struct (+VersionedStruct uint8 + (dictify + 0 (dictify 'name (+StringT uint8 'ascii) + 'age uint8) + 1 (dictify 'name (+StringT uint8 'utf8) + 'age uint8 + 'gender uint8)))] + [stream (open-output-bytes)]) + (set-field! pre-encode struct (λ (val port) (ref-set! val 'version (if (ref val 'gender) 1 0)) val)) + (encode struct (mhasheq 'name "roxyb" + 'age 21 + 'version 0) stream) + (encode struct (mhasheq 'name "roxyb 🤘" + 'age 21 + 'gender 0) stream) + (check-equal? (dump stream) (string->bytes/utf-8 "\x00\x05roxyb\x15\x01\x0aroxyb 🤘\x15\x00"))) diff --git a/xenomorph/xenomorph/versioned-struct.rkt b/xenomorph/xenomorph/versioned-struct.rkt new file mode 100644 index 00000000..08dd65cf --- /dev/null +++ b/xenomorph/xenomorph/versioned-struct.rkt @@ -0,0 +1,5 @@ +#lang racket/base +(require "private/racket.rkt") + + +(r+p "private/versioned-struct.rkt") \ No newline at end of file