REBOL[
  file: %bdf-font-library.r
  date: 01-Mar-2011
  title: "BDF font library for REBOL."
  purpose: {To make REBOL capable of rendering nice fonts on all
    platforms, not just Windows}
  descrition: {
    This is a very basic font library written in REBOL.
    Compatible with BDF v2.1 (BDF v2.2 is the latest, but it is not supported).
    Contains a BDF font parser, a renderer and an example font in
    compresed format.

    Currently composite glyphs are not supported. For example, some
    thai glyphs can write above or below some others.

    No antialias (well, BDF fonts are bitmap fonts).

    It should run on REBOL3, just change hash! to map!

    You can use the otf2bdf tool to create BDF font files:
    http://www.math.nmsu.edu/~mleisher/Software/otf2bdf/

    The source is about 8kB, the rest is the example font...
    }
  license: {http://unlicense.org/}
  author: {Andras Suller}
  version: {0.5}
]

bdf-font: make object! [
    debug: func[s][] ;if parsing fails, write "print s" here
    ;BDF font attributes
    font-name: ""
    font-size: ""
    x-dpi: 0
    y-dpi: 0
    global-width: 0
    global-height: 0
    global-x-displacement: 0
    global-y-displacement: 0
    properties: copy []
    characters: copy []

    ;temporary variables for font parsing
    char-name: ""
    char-code: 0
    swidth-x: 0
    swidth-y: 0
    dwidth-x: 0
    dwidth-y: 0
    box-width: 0
    box-height: 0
    x-displacement: 0
    y-displacement: 0
    lines: none
    line: none
    cache: make hash! copy []!

    ;parser rules (kinda ugly, but it works :))
    whitespace: charset reduce [#" " tab]
    whitespaces: [some whitespace]
    numchar: charset [#"0" - #"9"]
    number: [0 1 #"-" some numchar]
    hexnumchar: charset [#"0" - #"9" #"a" - #"f" #"A" - #"F"]
    hexnumber: [some [hexnumchar hexnumchar]]
    wordchar: charset [#"0" - #"9" "_-+" #"a" - #"z" #"A" - #"Z"]
    string-literal: [#"^"" thru #"^""]
    word: [some wordchar | string-literal]

    startfont: ["STARTFONT" whitespaces "2.1" (debug "STARTFONT")]
    COMMENT: ["COMMENT" copy line to newline (debug rejoin ["COMMENT: " line])]
    font: ["FONT" whitespaces copy font-name to newline (debug "FONT")]
    size: ["SIZE" whitespaces copy font-size number whitespaces copy x-dpi number whitespaces copy y-dpi number (debug "SIZE")]
    FONTBOUNDINGBOX: ["FONTBOUNDINGBOX" whitespaces copy global-width number (global-width: to-integer global-width)
                                        whitespaces copy global-height number (global-height: to-integer global-height)
                                        whitespaces copy global-x-displacement number (global-x-displacement: to-integer global-x-displacement)
                                        whitespaces copy global-y-displacement number (global-y-displacement: to-integer global-y-displacement) (debug "FONTBOUNDINGBOX")]
    STARTPROPERTIES: ["STARTPROPERTIES" whitespaces number (debug "STARTPROPERTIES")]
    PROPERTY: [copy prop-name word whitespaces copy prop-value word (append properties to-word prop-name append properties load prop-value)]
    ENDPROPERTIES: ["ENDPROPERTIES" (debug "ENDPROPERTIES")]
    CHARS: ["CHARS" whitespaces number (debug "CHARS")]
    STARTCHAR: ["STARTCHAR" whitespaces copy char-name word (debug "STARTCHAR")]
    ENCODING: ["ENCODING" whitespaces copy char-code number]
    SWIDTH: ["SWIDTH" whitespaces copy swidth-x number whitespaces copy swidth-y number]
    DWIDTH: ["DWIDTH" whitespaces copy dwidth-x number whitespaces copy dwidth-y number]
    BBX: ["BBX" whitespaces copy box-width number (box-width: load box-width)
                whitespaces copy box-height number
                whitespaces copy x-displacement number
                whitespaces copy y-displacement number]
    BITMAP: ["BITMAP" any whitespaces (debug "BITMAP")]
    BITMAP-LINE: [copy line to "ENDCHAR" (lines: bitmap-lines-to-bin line)]
    ENDCHAR: ["ENDCHAR" (add-char) (debug "ENDCHAR")]
    ENDFONT: ["ENDFONT" (debug "ENDFONT")]

    ;convert font bitmap to binary format (0/1, where 1 means a pixel what we should display)
    bitmap-lines-to-bin: funct[lines][
        res: copy []
        if not none? lines [
            parse lines [some [copy line hexnumber (append res hex-to-bin line) newline]]
            res
        ]
        res
    ]
    hex-to-bin: func [s /local ss i][
        ss: none
        ss: select cache s
        if none? ss [
            ss: copy ""
            foreach i s [
                insert tail ss switch i [
                    #"0" ["0000"] #"1" ["0001"] #"2" ["0010"] #"3" ["0011"]
                    #"4" ["0100"] #"5" ["0101"] #"6" ["0110"] #"7" ["0111"]
                    #"8" ["1000"] #"9" ["1001"] #"A" ["1010"] #"B" ["1011"]
                    #"C" ["1100"] #"D" ["1101"] #"E" ["1110"] #"F" ["1111"]
                ]
            ]
            append cache reduce [s  ss]
        ]
        copy/part ss box-width
    ]
    ;a class for a character
    char: make object! [
        char-name: ""
        char-code: 0
        swidth-x: 0
        swidth-y: 0
        dwidth-x: 0
        dwidth-y: 0
        box-width: 0
        box-height: 0
        x-displacement: 0
        y-displacement: 0
        lines: []
    ]
    add-char: does [
        c: make char []
        c/char-name: char-name
        c/char-code: to-integer char-code
        c/swidth-x: to-integer swidth-x
        c/swidth-y: to-integer swidth-y
        c/dwidth-x: to-integer dwidth-x
        c/dwidth-y: to-integer dwidth-y
        c/box-width: to-integer box-width
        c/box-height: to-integer box-height
        c/x-displacement: to-integer x-displacement
        c/y-displacement: to-integer y-displacement
        c/lines: lines
        append characters c
    ]
    parse-font: func [string /local success][
        success: parse/all string [
            startfont newline
            any [COMMENT newline]
            font newline
            size newline
            FONTBOUNDINGBOX newline
            0 1 [STARTPROPERTIES newline
                 any [PROPERTY newline]
                 ENDPROPERTIES newline]
            CHARS newline
            some [
                STARTCHAR newline
                ENCODING newline
                SWIDTH newline
                DWIDTH newline
                BBX newline
                BITMAP newline
                BITMAP-LINE
                ENDCHAR newline
            ]
            ENDFONT
            any skip
        ]
        ;print length? cache
        cache: none
        if not success [
            throw "Cannot parse BDF file"
        ]
    ]
    get-char: func [char-code /local char][
        foreach char characters [
            if char/char-code == char-code [
                return char
            ]
        ]
        none
    ]

    ; RENDERER functions

    render-char-bitmap: funct[img basex basey ch][
        y: basey - ch/box-height - ch/y-displacement
        foreach line ch/lines [
            x: basex + ch/x-displacement
            foreach char line [
                if char = #"1" [
                    attempt [poke img as-pair x y 0.0.0.0]
                ]
                x: x + 1
            ]
            y: y + 1
        ]
    ]
    render: funct[str][
        ;determine the size of the rendered text, so we know the size for the image creation
        left: 0  right: 0  top: 0  bottom: 0  basex: 0  basey: 0
        foreach ch str [
            glyph: get-char to-integer ch
            if none? glyph [attempt [glyph: get-char to-integer #"?"]]
            left:   min left    (basex + glyph/x-displacement)
            top:    min top     (basey - glyph/box-height - glyph/y-displacement)
            right:  max right   (basex + glyph/x-displacement + glyph/box-width)
            bottom: max bottom  (basey - glyph/y-displacement)
            basex: basex + glyph/dwidth-x
            basey: basey + glyph/dwidth-y
        ]
        ;print rejoin ["basex: " basex ", basey: " basey ", left: " left ", right: " right ", top: " top ", bottom: " bottom]
        ;create the image and render characters onto the image
        width: right - left
        height: bottom - top
        img: make image! as-pair width height
        img/alpha: 255
        ;img/rgb: 255.255.255
        basex: - left
        basey: - top
        foreach ch str [
            glyph: get-char to-integer ch
            if none? glyph [attempt [glyph: get-char to-integer #"?"]]
            render-char-bitmap img basex basey glyph
            basex: basex + glyph/dwidth-x
            basey: basey + glyph/dwidth-y
        ]
        
        img
    ]
]

comic-sans-font-compressed: #{
789CDD7D5BAF24B791E6FBF915077A6F834C6626998FA7B2488F00EB02A967C7
DE1761662CEF1AF058038D30C0FCA4FD979B712119CC248B59DD5DAA96AD63B2
4E9FAACAE02D18D72FBE7FFFF6DDFBF0CDD7EF5F87DFE997F59BAFBEF25FBF8F
FDEBFAD3DFFFFBC79F7FF9F1CFAF7FF9F9A7FF78FDE63F7FFCFBFBFFF9CF1F5F
FFF2D3DF7F79FD62FDE93FFEFAEFAFDFFFEBDFFFEBF5ABEF5F2F3FFDEDCFBFFB
E597BF7CF1FA6FFFF3FAC54FBFFC65F8B73FFFE5D5FC4E7DF1BBF4BDF8A077E1
E71F7F84AF79475FA01D7EF61D365FBEFBFAA79FFFE35FFFF6EEDD30BDD34EBD
D38AFEFFED3B6DDCBB2FBFFF46AB799CDFE997EFBFFCDF1E3EBBFD11FE8FDF7D
F9E69FBFBE7EF9F5EF2FDFFCF1D58CAF667A7D675EDFB997EF6194DF7EF7CDB7
FEBBF75FFAEF5FF5B2BD7D7BEB777F7AFD2252F3C54B78FBEACB3FFCE987AFDF
BEF271704CDB172FFFE2BFFCFD3FBDE7BFD13F7DFF87B76D345F7CB9BDF2EFFF
E5CBEBFB7FE23FD308BE7879BB5E7FF8FEFD9FFEE0F9DFBF78F9F6CB3FFA3FFC
80940FD3CBB7DF7CF9F5FB1F781CEAE53BFFFD377FF8E7F75F7EF3F50F7FC411
897FF813FEC3F7DFBEADDBE85EBFF876FBF2FFE5BF7BFBBDFF011FFCBACDCDCB
FA4F6FDF6D94FCF09DFFFD97DFBF87A1C5D9FA22FDCD7FBD7E73C5AFD05FE08C
FDF0F6FD0A2B3D58FAF5EAE977BBADD9B77FFA0E06FDFAC5FF7B1D949A5FBFFA
EBBFFFFCD37FFDF4975FB67DF1F37FFEF4F3BFFEF2D79FFEFEBBD7B7BFFDEDF5
E7BFFE9FFFFBCB7FBDFEFCE37FFDF8F37FFFF8E7DF7DF1F2C337EFC30FF095E1
CB3FF8E65EA1B77DFBBD987378CF57DFBFA339F65F5FF3B2D1285E2737D082C2
AFAF4A0DEA250DCB6C7FA2191947F5AA5EAE3C3D7A7B7DB9FCF155D17F2F972F
DF7FF5F62D7C3D7C49F9755A7C9D895F37C8AF9BF9DBCC362FAF5A7C9DBAEF67
5BD2155FCCAA4ECA2048196F8F6C7EDD8EC2AB1E222DEB5AFFA93EC788E74CF1
394E3E6788CFD95E6C837E2746BD6D0DBDC260BCECB437DB9E3661FB9FDB75CA
38BB0D3D76963BE573076F5CA9DBA6C752A7D7ED9BA133D099757BC0D639D955
47378AD1CD7174B393B36879747ADC4EC2EBF0FA6E4AA363E2628384F060DC8B
857FF36513B001F237BAF9CDCA9A756B74D96CFFE6AD752F382B01DE6CE163FB
47DAD6C02631307B7BD980512E72AF1A9A4CEBB10B01E7D45B9AC58D28FCC7ED
C9F096A070BE3D74DBC252B76267AE01BB4B70406920FA2D6E81409DC74E7B0B
6FD9168F3AF89AFAA866312A9796ABD8F4F1006E2F6084AFEFD2B607F2367202
3638EFA9B1D0E01FE02D16680ADB8130C1FB17BB6E4DD816773B8D169B6D69D4
B63EF86FDBB03CBC2F6C637276DBE2CAD649B782F4E5F6791DB6F33ACAF3AAEA
3FD5E7B8FC9C51C5E798593C67E1C7B8EDA2D9965DEEE76D10DBC8B705D99674
3B372F56C14F68B3A9A0F83DDB0C6E1FD93EB87D436B0A16419AEE93A60469F4
283855F49CED88F8F8631B3F81DF40A381634454D7487B13A4A57B621AE4EA98
B8B136560A3785CE5C0EB9136E5A60012135060E006E6A3CBCF6B235C810AB34
5C040DE9729995A4618A34C0E3B77D92F7361CD15DC36C723DFC019B2A09AB20
A173A94CDBB5B2095063621A0E378C13BBA5F684AB78C2D41DE4B03D22ED813C
9EEA377BF1CDF36DDA0DFEB7098A87CBB9F6C5417CB1EDEC8D6177ED6FEC40C5
26E00DA8980F21FF33D8207B74E916899B09D920DD67C07291EF22D7459EEB73
5321DA08C167749D79665925CF87423E0C336DF08E7578CCF1A06F6BEC4F36FC
09CB5F60E87A44EEEF1A540BF96A5C6E53BDC0A565C44CAF71B62C6EFEB2D177
372160E3B8A9922B64B049752679D85DB2380934BDC82F1C9E9B72B7D085054D
C02B093EE1E356D8ED02E63A81458B2ABD42969B7497DEDAA63024BB00D5B49F
4B820D0A35719DF195D2216DFEF8661C6750914D5A7A736B2B0B196D1A3A544F
40B59254C35190531AC9A4FBDE5A9442500681ED839BD5E244AED0E005BF16E3
DC3543836A21804D3D6E7E388036AD23CEF50C0B4C0D5D2671A903D20A872DA4
63A744635D9CEB706EAE8580358D77B30DA322272306A278BF9AC4BA2C1DA844
3F5178E41DF807E23B21F28E36DB10B2D5D4BB54C6DD398C2BCD0DCE99387D74
046BBCBAC1B0A9496CA44AAF90D1A6F9DC2CAB1D6FF615DEDC60B706F7916B4C
37CD74C89F684DB290DE26DB25BACDEC6E11C314854411AC43C817E7CAACD006
543E222BACD22B44BAC9DD960740D88626923B93B489CAB7123F3EFEBB6D3C53
88705347C89F4043D9841093042814A241BE2D1F4A3F245BF5C42B2304B8B973
232D408B112264DEDB21EE63BA4A5DBC45F130AB90DE675A732FA4BCB977D1A8
4D90DCE4BCA394A7508B5485245B7D9A90FCE6CE0581831EF3A08929B9283AE8
DD001307A389B82D720939714E1C7F92EACDC67C1AD200F24A668E30568D5CBF
72C3EE458282E3E064E9341A1A52EB808C42449C13AF5FA45C3B44B976FBC761
005E2F9469DC160AEE223464B07002BAF3F65C6096D679A0D66EFF0A07C7E24D
E4ED15EE2C1F0C769E3B1B3BD8DE64D2096431B066C53BCF29C543429D0AD787
1F0BB60587777B8BE38E42B09CD30D610B19DE09C3812AC7AAE624C20819C245
3B42882684008DB7A00783920AF789E1661324DCA688DA6D01B77DB4E9D8DBCA
05D84CD8CC75AA857C39CF1D7307DE13432143640116D88546B611A54CD1E8A0
84CE8AF7727C5F62CBF0CAE4F7ADCC7DAB540B2973EE5D14E34186D034AF6003
83266898CDAD39A308ED24625242823B23438C42CA9C5D67874CFBB946D92C24
B5C123AB327E37916037D2D028DF68B48FEF8BA63FB613B6A81652E6BC7476C8
B0A75AC861B8439A1379F27DF9CD79C2AB540B29D3F6F4A6839419A97171AB7E
0AAA7333B6F8FB28A44C9B2FB5BAAD783EE821C8B891550047C02DAD13931602
32EDDCB0B1050B4DC0266F0E9D8D8FA7C4B651C89A365D8EB6B89596E6BEDE26
63BCB55F53B309A4A42E51E3FB9F8086BEBE46B510366DEF2ED547ED6995DA4E
36CF7D4CB3FBD22AD542E4B4E3DD3B64BB4A6173047ED556396B4D809D8BC7C1
73135CB42D18B2BCB77688105A6D4F7B3260549777E3880A305D2621DE32C8F9
4012F074FDC096F68943BA42A60C6437850629C4CFC225E055E0EBA77D2485B8
6BE7CE36393092F1244738DF04C9986CF3480AE9D866DF8CDC269BB0957C33BB
23A9D64D724379CF8BCE73473643CFAA37776C86969DB5E6829D35D80510FEAD
C12E18F4CFF9D4A1C55A7307BEA19755C17FF5D10969DCA68BD4C9ED84976A1C
5DB99DB66D07FEEE8D4478CC3683B25BA9F3B2DB760E769B74851D92E7CD2A69
06210237E9829DB95287C718854694C3A8B3D40111B03F5A1B4FC8FA76E90FF2
28E364D9198E3C8AD0784241767678216814A1A9E3E9A0CEEF3BC39D4B5D50F8
6556A10663C9A306A228C9EAF4F4A6263309CDC0A5FBB9E90DD9735F9FE54E5A
0BC995A8212E11953A7AB3FFC8FB791232BED3B78FD5F6821C4C7396F169310C
A912E463DED609D81168809EE4CE4037B4E5CE214DA6D7CD2C89B271660D686A
C47BDBD3159515197490870B2A1B240CC38356EC0C75DAD52740A80B6EE80883
23F195A48092822B566D2FBC16AA802A54013290A390654879C0F7AD49E6BDC1
C227A12D3873BF54450A185E9C7EEF31A157EC685FE3B5AA3C796973C35A182A
65D6931D10544A329F55A916DA82EBDDF496A856C2B84BAA5920636E2037B953
BF6AA79BCC6D124A853BAB2CCB5B7540467A4F73900C2D08BAD438E3E22246B3
47956AA154B85E28C7B4A77A7BE89A446CD0D00D3C9E1AF46481ED0D6C7360A7
30685F05F14A5F73B326EF567471B12149A9769CC624940A976401AD8A408D59
702DB5735C1AD20870AA80BF20C936F21B5680D1A888BE02B3A40E6674B9E228
2ED7853B247DB9524763283A4BD6EED4F9DC558727B40FD7D3AAEDFE74CF0A2D
8C1BDFB564010A7441862CEA280A4E51E1B2D28DEA8889D316A78E7FB3B173F9
7360A7214909457CFAEA400FE23B9489A88E4E6829AEA77D1F78573E00680ADA
9E05710AD8449B0750094D343299E4BCCABE89A61FB9B9E58496B2A87B39AE65
252FD02B050C53A950F84C76D464FF48F28AECF5DDF24BAB540B2D65B91D3C32
C3DD2EE3B4C0B7833FF706E1E53097F40D35D28416B20C7D6555037183D806D1
6091E6830CD2D92A9D4DD3B9092A2DB48BD34DCD1A77052E868A4D9574A18A2C
E60367557FE8CFED59157AC4D273456AF421E8148C42DB2D47DF5CA24DDD3767
4248F4CBD439CB0E353211FC2262121BD7D32C64EAA5A3AACEBBD1709C558C7C
D2F5099B85FCBBD8CE361CD0117A2BE4035DFCA5D45E36389FD951AD43C32936
0BB17439118AA2EF56D2773E6557935A0BF935D4E4D71AE942385D968E228453
5A1A74B2A736705CC16DB33529087D63F52CC44F0CFEBE6F4E370D4215610295
265C9C8C65755686181C1CB686DF62D327F00BAAB44F9276FD41FB5444A138F6
3091CD9D04EBD2577798D4D6099D2561FD20C0C10061C96F497CD7C627EC2E3C
0AA82D4D88F7C724E546B5BC7AB395A330DD3D4BD7BBCD7B76ADECD9D25F5465
03311E41FB74E92459201FB2A6D3687692ECB1B32B145FA27771091B43B9889C
05AF84D8F87E33AAD6695C24EDE9EE18A44415052A0C8C185E2BA1870A7FC673
F2C8D8A0E44D529283200BBE10ED520B5CE8708B89C5CF320592939AA1FC43BB
D9892245E3C9B8181B4BD773146DAAE3B9C8F1F4EE34FD2177875AD50DA3756A
D8369D3744DCFEA36AADC52A69779D5D01AA5D6155FF7059F5C6F6B84A92D27D
D67006CDF85310851301261D10D5515E0F176F61392DACEEA96684460183AD92
28A43EADFBB6C7DDEDC0873CB2D9B0463F08051BDE94673ACB192461FA5EC2D4
2E121CB9CF4D4A3033C292401683E96A845925093B716DE1197149C716510291
2DDE9E223C00C26E1BBA87AC69FCB35AD2DEBBAC22EDD5CBAA90599B338B7FC8
971566EC640DA9DE3436841D24ED3958BED0A3877C63DDD8A9C575C42E8B8F98
5423099B3A84E983D49A758010E793222E7CE4D724E098A458A640DE409F6D11
26A5563DF70973256163A900579CB21FE0DA1D5BC44A3155F7C2FE0FE79DF848
9FDFEC0F7D9A77DD0A9EB0524CD5AE338B07A524CB71819C19698D61079A25F2
1B663A91F364234ED3D667A5E4A9978E6169E219CB76100DB65FE36263176CD6
9760AF608EC726C46605A524356C956D28A056CA96435F5BDA2DA5C9DACD0A3A
B82F4CD16CE28AC65F7BF5AC8172782B46139B066152701C7AAAD0B897D567B2
F96263D8504E24AE18D09EE9CCC456EC8477872F5B29650EBD1B67C0D785F743
893C0561314C81E339FED49057CA17813C3592A4A038DC36642DFBDC329C069D
F6BBC9C6B79BCD2E0923EC0C779586A65578061A0A8595A2E3D0C9C3DA64C7F1
7514B6A88F111C8B9F1A6552821CA6FE3CBF93F98564FC483939A7797428550B
7C75F3133A27FFE445AA0D474A9B432F127F7C057938798CD1426F033697ED0C
42CCA2D7D1125E7BDC9B14D57278769D759F48477F93E2538EB36EE5A3972A33
4A191CE0FE8976C79B14897A91D8607B00712EDFEF332C5F6ED86F1B2D116057
B0339851E1AF876663B1610663C51C928497FC70E53757499742538EDE6E4474
2C9CE72E4D6AE840579A9DB9ECCE77CC660D6F59B5EFC0DFA1C80192BBF816BB
EF7CEE02AAA08AB3DF395C616DCA5E6F52F69A7BE6F49178B6110717EF17BE7D
B337169DA0A24999EDC10627333C6A2449096B3E1178B6F7D896192C29F1C562
78C5D5E7582C0E94242F62BA7928B9E4A63DA34AB694BFE66EA2E9C603EF62CE
2AFE7CD80994329808BEBE1132AE8FB23FCD10E65F397680BBACBEC239D49474
E4A2773E1A8B39FE231A8B83B409ABB6E9F54D4A6839FABA2E0841D6A7F48E58
02568806A6EAF74B416BEEC56B4D2804BE0AF9C0475C07F0CC5AB3AE9BDABCCE
2FD7556D8DC366DB096BF0DB1F505A8519E80C590A51DD20680DB7E9D6E57491
6449C83156D8D8428B30BEB551A4C024A299EB1BC5E28E2E52858CE06F20EF62
9C2139D1396988433C397128A60E49BEB87D4BEB904909C8F66E1285A9E889BA
6CCD50EAD8541F27C51ADBCFBDBF232DFD4D8A183928B8B1F566DC7DAFD98F69
43B9F5FCBC6DBD605F56BF91795DC3D6046C56689C7DB95EB7B75807B815C0AF
3B9B501AB5EC49AFE72022F17B5ECF8B94786C47C05A5E1DD8C7B3E2451ABEE2
83BDEAD8F86C3E6E29A317291AD95E168A425E5806D9AAFBE014942ADE52A549
8A47B6E309E544B50C3241A9ED385E60782B292D710E44A25E4A59B72D61E022
851DDBC9B3B77B4280B96FE22E426B986D9B61AB20E81FFEDDD62FFB8B943F44
4CE929FF3766FF60FAA3BA81E17191F284EB651D4E6C5ECA5CDE6F7C5C79840C
D11E01856203E768457C8BDCA458B03253FB2C3EC3454A113958B3618A770728
1B6516E4A08142B502459F0532DFA015673BFED829C351CFCD6EE3C617928C0C
E5D4116FA70E00724487F7AC529EFC43B2AB8E528A23AEC3570192637AB54749
A9F6C55260701D77A1DDFE1B45A82F088A0455E3373E0AFBD6D6232A2E526C70
1D09D5EDCF89A6745DFC31E2075D27F0537DA4140B5C4F236514182117241B2D
E592961ECC805999C41ADC0DB7DB450A07AE27452283807B21AF1C1B44D82482
6C8925001DD89CE8C8DEC29816F8B72832283E3FEDC323A503D70B291919E628
5FAA261A158469B314FC7532C192058D83D45C011480FA5E6995B8C2A016C706
74F231E05B52531D8F143F5C871FC378E612B6A91C8FFE98F1086B26BC19FC67
7A4916BA640ED64939572D93DC450A3ECB8918158C2ECB8B14A2AD8C826A750E
AA8DBFEA6475A525E44149BD8F0665D25CE09742E28BC1C0D22440D35B52531D
8F9495967EDCCA21E72387E5AD4AFAD65BA019FB947361699C55C478C836DEC6
DE5AA50496A313DBD1DC7697FA8CDB8512D1D1940D3B45A70647F19CECE8558A
783978B13DB27937324C04806B800615015338A1EE49839232620E7B3CBF5C94
0CE830191E20F8001FCD414A21253B3C716452E85C7A6905119B4E8C2CD0E141
1947190A4737E9E4F3C8140D4B742908DC898E83C009CB10851A85635529245C
53B294491D1E494771E208748823A723CA2E70EE5A36C655CAC03906B4BDB6A5
834CE96B5C5170903D7731A5AC9D834DDB81FDE37E9B7A5A225C3EBDE20DCA1D
FF23E7637D7EAB2825F71CCFAA55916816FD9C434C6A907C87B3BCC0584CB7B1
09FC2F38227AC1EB1BD8FA0BF85434056B7C1172D25888496481053B7ACF7662
E885892F2097A27C01690E8AEF16C2D1F048105F52CDD8D855CAF6CB09A1652C
85968CF3103E10E7C1A868FADDA5C22727A77149DE5537820F57A14D40A45B17
46C195C682BD93AA71D33F0B6E615DE4F07AB6BEE3F0728649C569FC190CEF4D
0EAF97F7781C1E8D2745BF83E320836A7D06C3BBC8E199FEF0A66278E612F31F
EC67B21B57399E5EA4AF66B1EDE4617B16F2C37A95839AEE1E542D592A39B29F
36282F07D58357185816BDE7603D6D64418EEC445CF12E22A872A69E3594AB92
43E9A558BAA3E39A00B534091EA04B42770D14AF42B2D41AF7A2A50ECD84D46D
773785837AD169026AC81D7FC052C70604B2BDC4AC7B6421B5F16939BE13500B
3B2D0F8242E1392B0D8110101C898AA436FC462027AE42331C7264747B226C79
CDA194871A2E7694364B2230A8C245C722F7670D527135723EF4C98DA1A5FA2F
6780E7C3383949F6373111A39C88E1CC445437063D8730F440CDA42B968D89F6
B73011939C885E0C8FDB4B4A5C964219F67F50A8F3AC7F4B67629633D07336BB
FDBDA6E06283077032BD5E7F4343B772E87D6479F2E2A7505A24F512BDB739E3
42A758E89CB7615A610457A947E600F7FAF403FCCA0ECC64BB10AC22C51E679A
0CBB94E540C89A707B62B015475F617C877576F5148F831D2539680A28A76B69
5382A9C37907984E1C16CD748A3DC380DF1B57B1D42375CFE8331FE441919D2E
8CCAA951EA69D82157A942EA9E10751CD90E9E7507C9F0D49149ED3107E59F1F
198E27591537CE00A61ACF8EF2A78E4CEA9139AABF634D157AA48F31F2EBD3B7
9FD41E879E8166060BC60EE23EB92E325476DA8849E3CF64FFBA802357A9479E
C81728F1CEE76C5C2036E5A225A209689B80084FA38BD5A8963AE2D0CB4D53FB
0C4EE9898726A5BDFADCE4DA50481D1A9ED1DCBA4F362D1BDC4604B9A5008AAF
31002F35C3A1676819F6C9B3027464177F9F98DAE33023BCD4FA869E3DE540FB
1993E5E368978ADA70C26CA2EF359B3C9076A9540D27404496D23082F5333CC2
7C6F0F5CCDFA788AA5F6337442878162D735E53C9058A9A10CCBDD5B230566E4
84379189F660DAA56E61D27DDBC08B3FA695DA95A8E7C25881EB4010C0442036
1E087590381CBB9E14C3794430332E57916A06C29867DBB859BDD40ACC89AC6D
DCCF1914925480DD6CAA96430AFFE09544C3482982C64445C2A414B72AC55287
C8252B3F35D77E08828A970A82E99740D86FEF9B56F047D32E550073F76D7996
6B3F867629E49BFE6DB9E3DA085D881463124F16181F48B114DE73E1CD2A38C6
BC9F6BAFF67058DB9307150B11DEFC69546BF25202CFF532CFD1730C4FFE787A
A4C86C6E8387102EC2BB8347BA097F466B5BC9A6BFAF6965CE7B2938E7529755
DA17B88F0BD277D93C0FA6354819793C01755CAEBC01EA38677E4D374592F943
E4FBB1A268BC47D6D6AD8C4ACB0EF8C3B7689732F2D8BBDBCCE1D47B544EE152
05056FD671673C0E432548C9F84499CD5DC6EAA9BB2DEDF94F0CB312A4643C9E
852AB9EF6E7B18ED5246CE753DCFCEFB196EF238DAA5C89C2B86B6C1064A78AD
1B1AC9C328968272AE44DA9639CF68240F23560AC8633F4FCA49AB7933FB8988
BE596A3648393757286D73AF3D4ACD92F109593481D402AA664469A850DB31C0
D2072AEBE85330CB46E2DA9C1129C48E3DD0C70F61528FC3860952889D4E5D67
77467A3D907629C44E7D55ED7E26F540DAA5383BF52F36EDBA315A0F2456CABA
534F4BC3A2F70542647F933C0B982648A9793A71CF4D059C58B634EF1BD4741E
8B91561D8F94A4A79E5E8721B672A56A7ADD9396462B29684FF7C7BE63E986DC
908AFA94D877C0AC15433961232DEFF77C426D4AC57A98D58E601613B1673D9B
62DE216D841AC8223130F93A25567D9A65B87CD83248817CEAD9520F50172297
17B6BF4E79F28F5E10298BCF3DB7A56394E19C16F7E41C17122415A13950FAB0
A27836A55A396880892BC6DC4B9D9B31A5B44805FCD0C560F011CD15842D2656
BC70C5D80A9D5272EFE2178D476779DF0FFB9CEA96809D2B467602155AEF3CCC
692835C7AF8A82EE23C0CE013B57D0DE872EDAAF0AC92B5E119806B221E2406B
CA607CD6AA485563EEE9B6E6B02AC9B484B7355EDEC8CC90AD3D7A55A4AA31F7
A1D348D6D2928FC95B837E7DE65A48F563EEE17DA29DA12C4495829B28C2C93D
FE5C48A5633E9105BF3B178068B1F1442C48EA08E4684FFBB3D6426A2873BFEE
C2EE5C18E05666F1C90797AC6EF3AFC0ADA40E627BF7FBB40FD33E41FB936A0D
6B25B5910C19750BB264577482AE41161A62E7F837273B1259301A95433F0D75
D631EC26BEC5DFE8F82DFC015B7C0B7F756D945A2A2AA260EE3F483E0540978B
F1F5A0AEA6CA2A166542844AF6094B87842A8810A09B0BDAB324D04C851B7705
D18F9AD793B2E000EC5C0CE584CBF6A412F9086F2DA09B0B627B85E8877D8601
4133267C46C1D89EBA025229B17D35FE003FB95336A2EBEFD16B217514012276
321D94A155D5E15679DA3248CDC4F643A2765ECCE6781EB802521F71BD6C71C3
5C48C0053E7EA2593733D108833E91DA50A402E24ED462AA28E61F3DC7001FC6
BA99696D12A96C744BDB0E1F20543D6DFB4BB5C3DD1D3285792BD6AC920191F3
E9F121535A4B05A45B05776647C23DB9056472B02413B0EE812666A180A8D804
B4975B68023659CAD55C8A38EC91221AA2AE960A88EB3B9DF72E9213C160CFA9
B3A5B5544FBA657211344915DECD848AE8315320698E4F5D2EA999B89EEE6E78
50F6A429F8492B3548454480DC35576ADA9DAE55C9AC0DB53E799106A978B813
4AFD549EA90C93462E75F5ECF591CAC8993ABABB7AF38F5E86B4FC38B2D5B395
503542A5A16A86184FCFFF3E7012D26E7D4CBA549BA5E49EB55C528711387875
EBC5C12E73C2D63A2AF0EDB4ED2DA9D154EC3836BEFF0968E8EB6B23938ACC72
CA9F5F09FAF0AA6A1F7F666145A8C8214696D3990BA4AD21A71CECF269E13859
F249A3BC16612153477FF3CD8E013343D1AD373E50EB5CABF8B21EA4EAB3F46C
0068FE2F4C4D3AD794216B60E026FF9B5ED1A2470D5C6DC651E027356BBF71F5
EA0D7A905A50AFA031B1F35399424FC251D183548596DB11E0A486BE33A7E20C
4F97CE6C35438BA349A568E9653E1D406C6A26A4A74DBED48296DB21E390BBEF
CA8320CAE865B1AD3C1CF737AD0ABB7A106A0FDC7777623DDD361C3D6D05AE72
50FAF60A20A77D379CB7863D2A7E5F0F5E92DDCB96D27B10C25F63B6D9D6DF97
BF821C8AB9B9020EAF3D618949E0E238E52F5A1588E3D51FB4CA6FDC6AA3F2A5
110F619424E97EA8B6A66DEE993BDD6839A86EB5E6D285F051E599B519E4A3D3
9DA9B59CD0210AA1041D5AB2EC55C5C40C9D4619E2F4A569F8542F34BF70FC02
24C2DD8BA019A12EB047D253D81112A61AA7D618390F3DD3BB621B76AE0C50A6
D1E72D356298E12EC9BEDAB424511D637031C4DEA66A98D964581DCF28C77342
55BFDF10862E36D0FDD8D99661534E3401766428742A9775AA18C95B1DD92447
962EE67A4171E0007657511C99DFEDD4918CCEFE6BD616D7462817469FC2A797
A9C1A31A92BA1AE126AA25C4E1F921576771E957240CB71465BBC16721E0C27B
68C0893A26704BBDAC51A76FD9578C95E3E9D9F223B316E3515D45EF236AA563
16D91446B98E3925BA959EA28D9383EA6743EFD8B587B0225E9F90C8762A4674
ABA8B8E2504C1A1E67A32B8A4BAA12B648C27A4AB76960632A2562A7B3E1279A
13FA0B725743EAA17BE1E2ABAD7DF4264736DEBC1F6706D3CDA8278754D88754
B2D7E622893CA13AEF0FEFE3E756DD7578A54EA16FE743DBFDD13D996A5CFF59
B97AD3AD4238DA48ED40F72EEC43ACF5581AF4F854AEA979D85696DA41AF54F6
B247F019774203551E53B1F974BBA755C95D1BA912E8BB43DCEFDCE5BB35FAF0
69C7331BC9CEC85C75A1C11DA6FD364BB0F1E73E86314AA9FF0CC4D60E9AEFB6
3521B9FA720678588BE6F0311DD0A4480DD6BAAD922D35860C9DD5AAB7ACEF21
FAEA12E5F10A36BE20FAFA11569251CAF8C309304EB7AB105122B172BA03EE43
D44B88B7F265A97E2B28BE7A94AAC2702A15FBCE34F287A5EFEB512A031994EB
16BEAABCA69EBC42C69190E76985784311F6ED6C59C92285C437574FEA0C433F
B59B1872565C3F7669A675E4937A97143D4AD520A37A9D3E8B33ED2E4B18C936
104270906751FD16CFA2542E865E0AFAE12C9E88BD79E05994FA4746126BDC67
235CB292F6B52506CCC998824DF41F39CAD783E24B2F3AA501B0D3FA56B3DD0F
75FFD128D50C7302CE7CDEE7EA9EDD62E1D616630D95F71667F6DA137B0BD67D
5531B38B3B3647518DCC5D19A3E645295599331065AE30617FF416234B0C1593
5F53D312EDA49E92D1C9CE034CD3A4941D9DD0CF1C605A8F5207327D00985311
DBEA31B01E7A949A8F3901043EEFCD136C7763CB1B2F9717EBF41B5935A94299
5E249FBE37CAFB51EB372949760749BC56DC802CE3DA738D1C1219165CA3DF12
ACBB9EA4DE664E84F6EDAA6E52AC03E21B80CABAC43578F4FA49BD2DE3B7E941
2EA0890B38B863B5D0B010FCBB0D11E432C40814B882142D0FBD70AC0AD9F442
F18B8045E6489FC714217EE1E362A9DA8BA0F811166F3D5A367A612219E07622
C2B6F3605BE1CD93D40233165C23826738A2FC388B43F614D846596A2EAC9839
846943201052DA9BC54191DF8FEA0B6E17BA0318EE6D8F835512CBE4C56FD9A6
B1E5219CA48E36F602FC8F01557DDB2E95764D2153C7ECBDD4E0AF31DA3C87B9
799C7043666A7C1F87017AC8CF6A1A9426A9C165C8B8BA410C1C6F1FA57DAE32
188C85F886D879C2183649DD2B83C7B557652AD22E1E38E516A61C4303EF89B7
9CA4529601E51A6BA139E138173127C5230915082998901172E868BBC94055D0
607D24BC046C0BC36592FAD2D84BBF3B9C8B13FAD2D3CE85D4A632C8DCD97371
A726F889CF8554A4C61311FD7BE773B77605A581B307DA33B27D626886B14314
A988119F071B2B1A4F682E08EE6231F6758DE81CAD132235A38C4DD73C217578
845BDC4A655091908E0E862F909012DF42E1B159164C9BCE340500A9288D0F09
0978D6AA483D28E3E39D5E15AFBA11018F5B15A9164D1F10B3FFF829BFEF0E91
DACDD4BBCF0F77C8A799E8BB4C91B3546C3252DEAD73514A20309F66F1051455
0540E4D73F17B3D454A65300B14510EB19D48A871D8C59EA2B532F95CF32D2DC
988D1B1C4B4139188C4560A896F5AFD0B13FE8836CFAB35451A6DEDDAFB1C681
3C4395D8D68F0F6DBC3B8060963ACBD49302ECFEBED1CE4673AFA28401DE4B7C
BE710A935958A9A7AF38755A3557556A3A19A4AFE9EFD5BB924A2330022F1A03
6B39C3AACE1FBCAAAD28E659AA36534F58B0C4C645F4BB5C8A5814FEC6B465BC
37EEDC47AD816BAE81D470A6BEA4B05F83F53885CCCA62533B779DC5692937B3
546EBAB87CF301CF0A9D22E01E310BE098D09DA49E56534CCF52A599FBE97C67
2BF93C0C9756CF5291C9E87B670BBA452F1537CF9D7CA9B974E1F64EF90A1E38
EF5255C9F87AED792F6DCDB753C29FB602524BE942EBDD69F77FE05A4805653E
0193BB0F2B25CBAC12197C8A8A893E7D41A4AAD2C5D73B38DB7546B15051F4E5
9A1BEEE1AB62A5D2329F00D19DF766538FDE97172CAF88EE88A7179DD456EA2B
5D90BD3B3D2B0F5C0BA9A974F1F5E67DC6D7C367DB47C1DD6CB200C40EBC70AD
83CA50A4E6617B57F4B8F7FC7F9A393E4DAC5430322E9E5652A21EA2443D2026
8A292C5A31A08FAC6FEC4BF6A437AC6C4388364710D2368503C10D2CA1955BC4
2B878ECAC0319EA445610BCBE12DA983E558AE600DD797EBC21DAA4FCB953AD2
AE8BCE72C186D8F9DC5527446A180248AF2EB44720BD61679D5C551B50C02398
24300F6A80836CCD3619F60AD6086C426C56708DA5261708ACD22E158E2E90DE
D13AA99391A105A99BCF4FF8356BCD6A2B758E2EAEDEB1B8417F559E85A06FA5
82D205E19BD944234403AB22067BDA60CF5A24A99B64E8BD3B8DE3BEF154364F
A0D12ED02B05363C646DC2D3B1FB6C5E90B40C7B1496F24BAB23933A8CED8514
0E1466AEEE28AD6113C803BE1223A141C49164B3E71EB1AC46B554573206DF59
50A836F6717D29D65F6729A45AE37AB57006B23E2861684EAB80A37BEC02486D
25E3F0B51760672999E1A45A13719AF3F9CCA84F4F3D1552ABC9F07D274F85C6
32B709C844A584D5472F8AD4585C4789C734965166C2854D2C84DC7ACC10BDFB
A721B42F42FA1D33DE412369750663F5BBB27C84C2FA07212E3E6A215E499EAA
A3D99980A9B87132E3B6969E9BAE3191ECDAB20CCA3A5593EAA9B9F61090CE99
1FA6B04F5BF69150E779DB5B629D649FD61C16178C88D0D5248AFE0AC5336237
B7A6E522A7E50424EDCE06D9BF3E9A15A41F52EB4496C59A725EBC5645F857E4
6B43F44A882420A5D29DAEA2F945C7D1243FBE492F72642ABDB00C08C3E84DB0
F3F95F2C01742B7210E16EE00DB429B58AB7577C118DEA1442A63818CFE186A7
F7E8955F98F8625B82DD8BA0F88547C238443241D684966F4716EC9A72127EB3
F2F6A17807AF3F4F1CCF56995F65559AB997A794EAD6B278D7A43B0901DB8B83
50C8DB8187578EAB481F8BBB03CB02E2E2D2D2A2BC4EF8749EBA55D151E11363
3C9E0F2EDFCA07852A7E6BD2AD2965C506471D1E46E3299A3650002C318A406C
C3B781DA65F1AF49F7CBBB7E40C99647D5501C2444F264CEA28C8A1273BF429C
45BEF5A89993B854DFA083044B9ECC897024550EEAD3045BECB02F7492834C6B
2DE45D6BFACE455A8B1C67F819397AE3BD5F769C7AA63BEEC841422D4FE644E0
52594DEF318EFE1A3216C67BACB1A90D6515F61BABFB106480C7AFB31088A25A
2B04ABFA3C2B9FD7C11659B6C719F1B815930130072021749204D548891AD645
3EAE07AEA1B6A7C9E1EDD0E06A0FB80AFE64873E74DE543CA0E91CAA3E4A8E65
E8E4F08FDB7F72EA66B84DE1A78E42325CC5D9B6A6B70F142D4C2ADFCB95CA61
7552242AD52C6F0EE6229FD7D9070E1F576094F531C786EB2A1FD1477C198BA5
A9B9ADAB4FB9CAA7F461D7CB0D80CE9BECF608F8145397DE8C547E5D06311D0B
BB9DE6474D701B6E9396D748219A0A18B95FD4E187A69467957E2A143861BA5F
5467974CF89FDEAD5A8273A97EFF24BF5F779452D8E35A7223C46B32976D1060
C1F0B3A962901837CBA79C080F50A5CEE8E7689D85853357682E0FAF16BA6958
926C737BF90DFE97F3C56FAEAA935F9C53FC0A7F4CFC62A88ABEAB7FB904CA79
A2EB4B13C3A42BD557EFD9D891C2424944E9B75B1FA87D5CB13ED682E9336E91
C39BB2EE58E80371570D070FBED976BA86CBCDA13262B00BD479EA54A3634377
283A77E303ED4E2311D5F1BDC9F16513481D8FFA000508CB07DCFB4262992621
8D943A1F75BB07743A65EEBAF45B7578AB1C5EBA611B895FEA589D15C504D89D
C81D687762F22062777992952C999C18E4D9925C61494F28BB409DCFDD8ACA91
C624BA98F1C8F98F311B52B792B6D11D97862794D5EAE13B2253C3050BBB923B
B01038BC46E0E2429B02AA6E9E54573A280B77787A4C346B38D1450B097785D2
5F2AC77249ABC30B727889A32F054E65BC3106C3C31BF2EA2145D625DE02528C
25B4BC402783860ED461A0CAEDCEA6E5569E6CD581F1F3515BC2FC3ECC0002F3
37761ECC90A66E8FDE58831C5EBA4AEA60B7E301EBB97663917EF228AC67B368
49B1B9FBF27B4EA96C23CDD58BEEF999711F9505DB544A07F3AAC0E62B0B06E8
9C0916CDFA87B43178658A8CB156AD00B31849F60927F21EA695BC112B351EAF
00B6FB7DB2A646B694F37427699C78AEF478ED2B4BBBCC02110303B70C75578A
8DE08ED0010277D16F64C93CCA1630EC88E55AEE880F737AB3E81AF2CE22A54C
DD8BE81EF67BE949059ECC22C5567D2211ACBC299EE4B2338B145B33F45CBB5C
86DAE1243FA5168659A4503C9C409539A4DD7F141A02C4E4E4EE93A32198450A
C5C3098CD7237EF41320B7CD2265DD8C62D786DA2D43A51E08B54B49C2A69D1A
6C968BA4BD17E6650FC0811118CBB36F49760CA15576D1F348325A2089CDD359
F61C27142DE29ECE366E25F432C1C6B2B4CDC4A69BC9E3511D9E94D3874E8915
3A3005D6C18A164CBD4686C35E609FA9359EA105B9336478949DDD8429ECACC1
8E209C0DC339330467EC242618E290BFAC6A6DD8ECCD7295C33B015957EEBCDF
069019A4438A51F6DDE9983FA4C415134DFBB94B4EB276A7C993658AEEC4E7AA
F94AD561492DE40C6CDDA765E60F86B6316F520BC946E8B65B1786A7B23C1391
5845A7F785A21FDDB996B7CCBC498D65E885971FAF2A729266248835BA277243
F74036F6BBC8E9FBE27393DDBF49D13F5BB86F1F25A9D80776F20A5F2F86A9A0
144CC7860E037731B9B216D1C2210AF44EEDE5B7D8359D2577E62CBD49DD209B
D56F5F63058BC84FFBECB23DCD9BD40DB239FF2CBAAF7F4E1CAC7993BA414669
6BD762DF9959A47ABEF2531928094C9E10299EA3C7CB06FFCADEF01029364E95
3A7FDD12FF2675838CA9D68EDE2A677B1B9E6181058D4454A096CBD893CC10C5
9E7059854814114777E292949AE8731CA165E8CB2C7D75A00731CF6622AAC393
3A84E9DDA6D39E73CDBA31E5B201B18BD6E7B29229C9A6380C8E0270379A2AD9
5237C8E109676D76C98A98ECFA9C366689113DDB66F72675087377B5B36D8AD9
D39D93949EA50EBD4995C2F4B05B3FE7487EF326D587B1E7801E0E225A2D1522
A3F3D80BC7FC527CD21AC3669A187D148B953EA18369902DD582333868F790AD
43DE06D1AD4ED622C7173769A54224D1F1CD376309CC9B94F333045A5BA63265
B9F69B647F2220D9B2A98E428AF5E3ED426707EEBA73476F749FAC7E31D489B9
48217CECE1B1932FE0008957F305709EDA8906C7836EAA6847E4FCA106A3BF48
C97AEC59A71153B1DCBC8F3A551769ED1748644D338F29F219597B52314EC894
0DA8C288F16821E70C67ECC67CC6D86436E7BA8306B0B664C98BD400C65EA2F2
B0CFCA9C53C9210C94B5313A948B895DB0714A145DD03944BBD93422C6CD458A
F5631FC21C511ED4CE261EEF2A9D00374470D8A70546351729A977D1C3D47EF3
3E8EB75EA42C3EF5D38548BE104167310385615B8B94139D30406D6989AF3A15
B049B284A1EF4B6C35A71536198494CFA71388E2B618CAAF76115CA4A03DF5CC
C2E3C1B45A561237CE26168079C3B1C99EB8E88E938DE01C984BDC4D9C371729
684FB7EFAF4F5B40D25CA4103CF50A7256CAA1ADAA309F3B75AC84E6A2B5C5EC
5CAE0198663D10D15CA448DB05D11A0E503FF32DEE97B924A340B8C448237322
0E8B85E612B173935829B44EFD2A1E7BC4FD93276067A912FE69DF722CD68895
A2EAD48B3A3F20286727B9B88E54BA8E5281CB5CE55287424AC4A64A981446A7
13D533A66216F9F4AE11D5A3E48BF8AB29973CBF253C846B4AB174EA1B2CF762
D5C3AECC558AA8730F8E7AC268C2D224995DACDBCEF7A8916303A2E69A9B909A
7A3ED7A64B4A4A4E604AE129174BEE64A29921C8629B84B95D1353526C12506C
682C7E9558298DCE7D656977CA552888E5649F7B365FB863F3AD52E89CFBE524
71F3E5D00DB61D394ECA5BBAF7F47EEFB50EF92AE5CB8C0DD586701BEBF2E587
5A541A09106695626417DEE90657EC35214D984F13B6DE3AAC528C9C7B280DD3
61D761A0A246F32DA42B918D10AD856D43EED65C2E2B6D0006A0D9990C5BC44A
413163323505306D4BD44F06C0E106713218FF22C45D8FD01784A711A53506D5
C0E30D618FF05984D240648D2A9D5250CCF84BCD30B2BD4A062932DE421458A7
816B121A8B0D8996F1D8D6E2F5AAC44AF170EE45CED8FD3D62D93AAE306DC66A
CA9E39D72914DD300CC078EC0ADF2C560369102D05CB8CAA5495691798DF7745
9C1E3C8B2547178D77B5CCA6BB9A065AA659A5ACD9854D3AC89A1AFCED10C1B6
690C3EDABE1EC70FA4AC69FBB7D07D06D2C7C91C52EAB43D00C3E1A09AEDCCC7
6512FA03675BCAA419D7E86C507D3D5DB8566DF229A7745442FED22A87B3B463
20A742FFAB3941D88DEC9F111C09081672403964B599C482264323AC2E3BBF34
DF79AAD95D701B72FE0227DF9B957D1E9A2FCF7E479E12479FA30B2E47E3E3B4
B664AA519962D03D9887F100F2781E25E8578E401ED5580CCD9D31E9EC427618
C3866147B09E384819C97646A2B65E4B85BA269243BE8F8B39DFE696497D5453
41F70904A41DBF7B0EE6FCA86649773701F473090805706D49F78940D6CFD69B
3B2A578CA5175A73DC3BBC6D42DC1808C973B60954CB565CF121E9CC26212555
E95E0ABAD31DDFCAB03BD85F750A74F3A22B2341F71D41D312B0D04A6705FEC6
9DED7670361C7E0EBB15DDDDA131C0B76280491A6844441C9CD3BEC8A63BD189
28AC98D140D1C59C84826588E0EA6877F416FE1CA5B1B40FFFA518DFD4BF3C0F
018467EFCE8B4CFA8B97A6E7DBF2FCA559EB5A0184A35A8BE1F554697328C3D6
BF265796321D239EA480426AC83C5E46978B20F2644B3FA425714CF98A8947B5
A1F962683D85F600B8771B727B866C2C0C03E158108D61202916043E81812318
4282695FB6120B92F1FC687F38B6BFB5CA838D2A14A3CA9A6F33496D2884B915
B3C85A90BBF7372114B92542756FD843464CD54D23184F800B7F166976A32EF4
82B197811F73A306C10A9468EAC2BC924E41DEF32DC54DE4E3ADF1D0D4E82EC4
FF6E4DBFCF253F70D485043FF6CCB59F4B82E0A80BF17C3CA11F97EA564C8F2E
3B1FF1FF4E767A6D77863B4E66A946371721F8BBAE36E842B61F4F28CD9F45E2
E0A80BD97EECE8C6C71C73BB3123B0673A40C906F82ED051CC6A29EB1DE566ED
2D31781B93DFF1A28C39F0B4C89612392D6570E2C7B903DF4D481D2074231289
A543853E75F0C1D6A385465DE80063DFFABC979BC91C44813E08D0BC629E7B6C
F057BB26DEAB9801ABDDFB529800DAA19313A52976E942DECF3137678D4C6BDA
B196BA203B4D9DA1CE32ACDE054D4741264259B22705844C0F81F2517CD1518E
0BC6EEAA98112612C35A4CA2D00BC6BE01BB520F040FB416A1D8AAC8866123DA
673F13850231F53CAF87EBE959E2A52E1483A997C432EFF176512D0385949A95
74AF0F6E80A7C3DCC746A101AC427621F0E778A07F905CC4515F8BF199CEC1FA
5C72AA475D682B39EAE81F240F6FD485DE928397FE3112F1C6A1506A4E843B7D
1E9978E3502835D329F960BFED10B18241D1434C84C886D9DB1145425A535C6C
44886C4D5BF250283527AAF9FDA652EDC6A1D07DA613D92B87ECAFA758278642
F71161549F77B2DD3814EACBDCCF48FD6D65DB8D43A1E688B27FF55B71A9588D
2C9DD35FA78383B952E75307A7E5D055475B283D39D0AB9D23B1571E4C32589C
6B28B439058891AD10B3F95A4D95EE42E9C98160B7EFC87C7A565207FDAFDC55
EFE6EAF80AA5270794B5B327CBDC95678E6FA5CEC70E95AB7D571D74A1DFCC3D
0C42B7BBA902E5A507CA52E7EEF6E51251A40A7782E3DA5FEC52BFD55957B821
F277568757A84139BCAD557EA0A2BFA1E4E0312716CF3FFDA6D8BC73E8802236
1EB2AD9185233696F63A1D11BF292576A545A5C7D60658284C73CFDB7EB06CAD
7DE9EC4EB36FB6B0DE32FB0E852234F74488836467764491C1DD968C2C197848
F84B8DB41039FA18656BE534A8A664572842394A4EEB820BC6BB7838DCC5206A
E276B58AB7AF8D95204077C168122C1D425A105CABBE78C19869E9054A87C717
940791D4A8FCC2A1C884261232B918CF3549D87D4B9B9C5ED0CD5F9D884263CA
2178CD28D73DD21C15298AD1126113910C68A9E013A4DC65AB5283A9CCE82226
2F4E6A82F7B0153C6828E80F0687C9D6CC2D3789293421118C773673B21A127E
2BDCEE64A194D114BA4E37DEAE52ECC144F3669232F76A4ED2E0E8843ADE238D
E31C52D05D0E826DEC0653283CB697437BC89CB03E339A6CF98AAAA6D0284332
89A982D134FD34A6D0556C2F2DE94859289E73BF13666E9D20536823B6972B3B
62897AE9690C31CC9A1A2C3D5836B9C00F365102AA67C155692C340FDB2F4754
3B2E94DC938F0B2695A5DB81EBC5643DDBAA42C56E98344CA133D83EA8E22EFC
DFEA75D341973540C8ECC64496EBA6795EAFD193CE47680590F04D6F5BAE9EDE
17F4F6896D675A6E6A9415F27D2EA55787FB5EF653C6A5C9F251888A62AC20C3
0D973F8B6F09C98A6C9A47A110E05DCF963DEE29DB76092A145890151AD84358
E0092C2C28B07828481A0228C2606B09606B092B7A566E6EB342F476BDCBE428
0D60055E6C30012143A8D0BE7A18DD85F49CABDA9D652ECCE27C6CF042B669FD
6BEE80D227B0B6944C5308BEAE078734D1F190D9445E3670BB9E6840E8A506AF
EC2A6185C0EA7AA5E6DDFEDCA26D3D992D7636FD501AF3C91AC49D45276669C5
878E265598EFAB5417E2AABB1B70A12D2FDB22EC02EB6BD5DE477EA41A658540
EA4EDC227B24199FA120A08A2DA6F2C4F2B6F28AE0D03548223D6504358584E8
7A68BD78388C3482E68BF7967C75A3A9E7FE8E632103BA1369AB8808E992394D
849CC02DB654ACE17BE3F84E8AE94A0D4D93F8588889AE97A37A487BE3044C1F
FDE6947B595CC107CBF7EE466EACF758C8808B3AC30CD531C8220A9C1F10ADDB
B2028C850CB8F4428D639881CDF6D3A7947B1EC742425CB237B4EE758B610689
6E906790111680841AF34E4E26AAB8F401FE78CC5021CFDAF9A21FD5F115D2E5
D2B784EE452515211B6835C442A4904FD2E64100BDA2CA43512A1CECA55A8129
63215D2E3D58BE019D1CC2224DBCE76E96B50BC2CB41DE551A0B3973F9C409B0
193EC724B5B5167E5EA5AC1034977E6193C36DB9EA737BF34457468EF12EAE52
5D08A14B0F6B763960A67C6AAAB38BC1DEE962180BB974E90517EFA5BF20F040
54E45E1C3D15AD695663386D6AF0D7FCD7463CFE5888A5CBD29FE3691F8F4FC2
40D9B15786BB55741E2BB9C2E9929D6621FB2AFC3721C4822AADD4BB518AAE5A
F52EB8037051F572159EF5D2F021AC1F49BD6B6976E3B5A0EC04DCCF8E91EEFC
FB9450E3B9D1028F2CFE9B2A259AA6F965F40565E90A6B3A8D8E734666175E69
CB71BB984FA1D129EF0389A518E195BA4D28C3B7700056C4AF89DF82DFD9CA21
1DC75050DDB3C51D814028DBDD972817D15488AF32C81B36D667839C6FE3D68C
932E283BA1882C65645E25F3999A87596AA6A12079EE4B5F13E2EB6550385748
4AB6BC24F90F640673316970E1CC418CF610B912CDC6259F00C68CE8585EA33A
22538CE84419585D6E8F2C18B6D2BA1F67769CC682F89EF673542068A324A336
EDD9B429F2D591827FD8F65C804254299B0ACAFAD5590F9425B37CC8674DA9FB
AAEB562993E2A0D6B7B1110C4628143C8C7F70713F0EFE6B9C6C418ABE49CA93
611AC6C915C466FB582146AB442D9FFC5C6F7787B791B9D5E92A5BC97A5A69D8
06141B9B6CABCDBCED692906942E86464DBBE3168D513361159DD76547B9AB74
583C7235856261EC56B03D3BB052A2419FDE69D766B8FAF45650DDCFF9A89829
49653C7681C6203209E96FB626D9D23FF25B62D7D27EA74B4175EFAA9B60BA0B
5CD6E6BD81ECE123EF0D4A578567D44DC353212CE64A5C9FF08E789CF5782AA4
36DD43DA1EF7C5DB6FDBE39F654E990AA92E17B46A2BF57B58577343616E367B
A5BEC2406BD4CA0285DBFE3911D951023D722262D4D3E70A29B785077B77D394
3996426A9D4FDCEC3BB80B5528241F2D1CF93AA1DA3B31E9DB4E4B930E99A082
C147CD1912C6ED6B51175279BAA4183EC672954D3AB4BAE8D83965C8BC6EE940
583C128A214953D431567F46EF805952070765B98200A62FD7853BD43C962B75
1825557656B14ECF9DCF5D75467431233D588C695F3E495EC34093F67225998F
A9225CD62ED86CB361AF10338B4D88CD8A5E8AD864E77695F841129FE5B63B96
5317455379396B1041BF91E534C58CE8BB9793947F1F9773C7931FBC9C6341FC
706239C77239F55516AF0415F8B7B3725331F85E15BA082B288A9FFB78B9AEF6
E14B15E4C993F5FE9A2902762728F7D9C653EA5D6C4333C5D04E647EDB4238A2
850EBBF1A5E67912D2A06452BB1B3277A887AE80D0BA8DCC66B371BC96ABDF3D
16DFDD49ED1B0EDF7D3B7C7BFBFEA9F8FEBE6A76EFF7DBE2FB7B39E4F3EB04AB
3ECB0750A3586DE25FABCF72C5B392F230C867C5479957880BD3C90FB1967684
AA21717BC4523CC2DEF588B97C4455EDDC1EF1563CC2DDDE4DD3F60C23DC29A8
41BC6036797C52ED1997E219CB2386B1CA47E482B2AD782E5085B440D2574A34
BB8A16D5E75D8BE7750EE1B21BD3FE01E5E3ABCFF3C5F386CEA157F840B14E09
441CC1B88275BD07CA6CC4ED813DE7EAC8C85F1982E2A6F1C7A620474B9838B7
DE7CBAA91765DFC6A28BB14C9DB14CD1C4950BF268A5AAC629CB719A9E5E358D
583976679758D669746B444331A24E4011B0B931B35138AE2BFFD83A1F95C95E
6EC878750D39C66CA7B630A6EEF07A2B4F30C5FECA103EBA600A26C1661CE019
0CD9B6600D74ACB178A1171E60E7E8457091932B7E33BF30DE2B955503A53806
A278B1898D04296C2E9B3C883778F4F25A80E9C00898FD0BED6DB8509916439F
C23AC075B3F5A04CB194195BE713324753480C1906A7CE3CDCFE19DBA76DFE59
6B31FB8332C5553576EC360B3C6EDB330D435A4C5054A236B421892CBDAF9EA7
B811525C6853277F140919332136F9423865B27C680ADDB5A59BAD4A4871254D
1D96ED76D9EA72CACFFC6C44C0CA585CAE1A35C50532F5F8B943DCA9AD97A2D1
9A421E6A4F180BD971EED4748714A761971BC1D63006E622542EC55A0549E094
A5AA083FA04470DDABFF9C154B7ABFA1CE52B01365C0717DD75D9D56E6174A45
5B596375ADB0533AA33B217E0BF84DB66B398EF59AECBE21F938DA4DE5F1B2FC
AD33190BA1050A794850C50831CA3648FCF1C5472D7BD761C53485D93C98F486
298C76A5DF1CA5DC291F633CCE77A36ADED9B20EEE36C0F9F66E8A398F25422D
2E7982C0A2F38B91952B5FDEE4F92C3ABE4BD295E245C76FA10B033AD405A9E3
329926B093129FB769DE754BC1363E5B8C6FC9F79FBC624D54858CDA9504B381
4D22E8DA61220D1B0C3CE5717AD0AAE9854D2F02583630CA82F24B74CA4D5D8D
C3907A00E861E7C43600B2DD1A6702BF409C1C7C819618284D1F5F50C20ABEE0
F7D8864A20EB513A33F7D811A21394F5FC007917B2E130C1148E7680836D8947
67F339676AC4E81CCCB3120D6BDA00056C3C671E9215A24EB89608C46ECCE030
27C13C156D7C43086B3666F5A10160253BE64A8C8CB14A2DA18C2300B9CA764C
9F0515304EB0079544946545838376C04D3D767AEBC89DC6F5E3EA60B3832E8C
0BE3DCABAAD7F288C5C81AB467EDEBD75CB189219F3A414290332CD93E44E3E7
6446F1FCF555E2A5D43A8ABCCF41EE2A93AE20BBC757F42A9E7BF1C2F3C5905E
F0F9C7E4614574D33AC20B8CCEF141BCC02A2FC0262905D1ACF185F796BC7C81
DF9C5EC0306963581FED9E9EC3A234BDD8C85B5B661C5D286FA3EB4E84C3B8DD
D764070166E634859018C7BCD2AE58D951C5170ECE1C0564D08BED53C17BB273
79AC9DB511EBB12C1D8C88EAD341C81FA5B95DE9850900B55FB5506E03198A81
F4ED515042428B4B2E38125A60CFA9D570873AD86A65E75153517E9DEB0A8B2E
54A231E770FC63D46DDEC62705C4713951B3CE94A58D60BB0016EB08B6036C56
D0F2709CC8A772335233C027DA89DC8396D1056EEA56608E08FC73E6462A6A14
A9D9190D72749F8ED1BBFB144CBAEDE90B62FC5D36A8E85490CD884A6D2B17EE
68A97D5A861EB8693C8159B794434BF450248A4EF6657A6C61AFCEF4B0C42CAE
48470D0D5244E3173C9B8B62957C3C4F5AEB3699AEC5204FA40CBAC26C251267
733408919702D5544AA62DE969AF64BA9DC4202B63E6EF5B6F8DCF17E3EB3950
46866014859E33DC308E65562272979B6C11523747E52AA3F269D5F22C25BF44
E31A1D64B18F8D43DF0F4456D5A15393F61807B24283574335270BFEA0E3FB6E
D540DBE8961CDAEA130AE80EED60564273541404A663C78828D23569B9733438
EEA2A580E058516F35DCADC8A02D77091A22A1D0A738F7EAF04231BCC40CDBD0
3E250093150F72F1B75F1DFFAEE8D43605F5A33548A86C67B381BD8D79331435
CF4C4E25C91DEBFA86347FCD4838DCD9284C4BC3810E724F448CAD359E38F171
FE4E7E42344D4AA349DB7632E8E2C8094F6C2BC9AA10D76C62E514795F7BC054
3C60FA8736CE0C85DFCC0E1D6324CCE694CDE3D9A05AFB66695DB4A6874EB787
6C051B4A6CD0CB989CE582E1A7A67406AC3B27958F0D1A244DD296AA64FB82EC
B1A3B5DA5788B031D9D44E364F8A1B5D8D873B6953FAB1DBE47797130F7D03D8
601824CA93B31946BA91533E724DAC7C573252FFCA8DB9DEF0B7DCDF782AF715
6797B230D3C4D6062413E89C3D030D02472A3BC8BC5A51F9D91A401DBC803726
65346008B1F508090799322023F81414512367963A1F9CB2DBE4288C46141678
5D4C07332CB26FC926FF810C28AD23388F05393D038FDE97C0DE790484D1BDED
11C852DF8D1887619E0ACA3ADEC08532DEF7D28D5247E9E6A68780098B76A80A
6193122BB88C19F6A889BA70088EB879C94C52AEDBBEBF83EA3080F3CD898CFA
553DF0A74AAF2CC93876512814F02D4970DEAA3BF5F3639A1AA1BA58B88C5570
8B5055259463683F4553255456091E97DE0E537081B9BCC53ECD0CE6D1564974
0589F31912C529F83473779BC4B7A2BA762EC8D52651BD8E5906C0EF75602939
D1B489908560E79EEA0917FA94993DA28DEF7FAA4FB9144FE920D4B8EDBFE955
58DF5E9CDEFFD483A9A6A2AEEDDCE34DC0FB76C06AD1145E8A94246706943A75
42C1A56B1DE55340C1756CCC44768D3633FA8DFFC6B8353A30AB8FE0BBAC103A
A11868699DAF0E3314C3EC18B468D50480D246525EAFED75DD54397959DBDAAA
CEDE80551BC553D6976D37C925DB7E35B5FC99619EE5AA39730251CE1636439B
9C0558146B040D0370D0B951F5866ED64A63EBD31E2EB21EEB7656A61ECCCD78
28A883D98848245A5C44E25114BB0B25CC91007767A363E2503DB97D1BC7508E
A38F19B057E374AA6BC9F52F638A546AB68D8D7E5D7EB5FBEBB9662C87B0F5E1
9BAFDFBFFC7F57E0E334A8A40100
}

comic: make bdf-font [parse-font decompress comic-sans-font-compressed]

l: copy []
append l 'image  append l comic/render "This is a basic BDF library for REBOL."
append l 'image  append l comic/render "Created by:"
append l 'image  append l comic/render "Andras Suller "
append l 'image  append l comic/render "Thanks to Tamas Herman for the inspiration :)"
append l [sensor 0x0 keycode [#"^(ESC)" #"q"] [unview]]
view layout l