Welcome, Guest
You have to register before you can post on our site.

Username/Email:
  

Password
  





Search Forums

(Advanced Search)

Forum Statistics
» Members: 326
» Latest member: hafsahomar
» Forum threads: 1,759
» Forum posts: 17,939

Full Statistics

Latest Threads
As technology rapidly evo...
Forum: Utilities
Last Post: Frankvab
06-15-2025, 06:09 AM
» Replies: 14
» Views: 165
Everybody's heard about t...
Forum: Utilities
Last Post: Frankvab
06-15-2025, 06:07 AM
» Replies: 22
» Views: 1,366
MBA Assignment Help in Du...
Forum: General Discussion
Last Post: hafsahomar
06-11-2025, 07:05 AM
» Replies: 0
» Views: 22
лучшие песни медляки слуш...
Forum: Petr
Last Post: WillieTop
06-08-2025, 02:21 AM
» Replies: 0
» Views: 30
пинк слушать онлайн беспл...
Forum: SMcNeill
Last Post: WillieTop
06-08-2025, 02:20 AM
» Replies: 0
» Views: 24
скачать музыку российскую...
Forum: madscijr
Last Post: WillieTop
06-08-2025, 02:18 AM
» Replies: 0
» Views: 25
нежная музыка mp3 скачать
Forum: Keybone
Last Post: WillieTop
06-08-2025, 02:17 AM
» Replies: 0
» Views: 26
лучшая песня слушать онла...
Forum: bplus
Last Post: WillieTop
06-08-2025, 02:16 AM
» Replies: 0
» Views: 30
пикник слушать онлайн луч...
Forum: Spriggsy
Last Post: WillieTop
06-08-2025, 02:15 AM
» Replies: 0
» Views: 25
какая сейчас популярная м...
Forum: RhoSigma
Last Post: WillieTop
06-08-2025, 02:14 AM
» Replies: 0
» Views: 20

 
  Found a bug in QB64
Posted by: Coolman - 05-24-2022, 11:57 AM - Forum: General Discussion - Replies (9)

i found a bug in qb64. if you have in the same location a *.bas file and a directory with the same name. the compilation will fail. example :

file test.bas and directory test

Print this item

  Wiki Downloader
Posted by: SMcNeill - 05-24-2022, 11:41 AM - Forum: SMcNeill - Replies (6)

Lots of folks are always asking about how to download the wiki for off-line use, and over the years we've always used tools such as HTTrack to download and copy the website to save a local copy.  The problem with this is that the archive we get is often huge as BLEEP!  The last wiki I downloaded and shared was an archive of over 1.1GB in size!

So, I wanted a much simpler alternative, and thus I came up with this little solution:

Code: (Select All)
$Console:Only
DefLng A-Z
Const HomePage$ = "https://qb64phoenix.com"
ReDim Shared PageNames(10000) As String
NumberOfPageLists = DownloadPageLists 'As of mid 2022, there are only 2 pages listing all the page names.
'NumberOfPageLists = 2 'hard coded for counting without having to download pages repeatedly while testing code

PageCount = CountPages(NumberOfPageLists)
Print PageCount
t# = Timer: t$ = Time$
For i = 1 To PageCount
    Cls
    Print "Downloading... (Started at: "; t$; ")"
    FileName$ = Mid$(PageNames(i), _InStrRev(PageNames(i), "/") + 1) + ".HTML"
    FileName$ = CleanHTML(FileName$)
    Print i; "of"; PageCount, FileName$
    Download PageNames(i), FileName$
    _Display
Next
_AutoDisplay
Print "FINISHED!!  (Finsihed at: "; Time$; ")"
Print
Print Using "##,###.## seconds to download everything on this PC."; Timer - t#



Function CountPages (NumberOfPageLists)
    FileLeft$ = "Page List("
    FileRight$ = ").txt"
    For i = 1 To NumberOfPageLists
        file$ = FileLeft$ + _Trim$(Str$(i)) + FileRight$
        Open file$ For Binary As #1
        l = LOF(1): t$ = Space$(l)
        Get #1, 1, t$
        Close #1
        start = InStr(t$, "<ul") 'skip down to the part of the page with the page listins
        finish = InStr(start, t$, "</ul") 'and we can quit parsing when we get down to this point
        p = start 'current position in file we're parsing
        Do Until p > finish
            p = InStr(p, t$, "<li><a href=") + 13
            If p = 13 Then Exit Do 'we've parsed all the lists from the page.  No need to keep going
            p2 = InStr(p, t$, Chr$(34))
            count = count + 1
            PageNames(count) = Mid$(t$, p, p2 - p)
        Loop
    Next
    CountPages = count
    ReDim _Preserve PageNames(count) As String
End Function


Function DownloadPageLists
    FileLeft$ = "Page List("
    FileRight$ = ").txt"
    FileCount = 1
    CurrentFile$ = ""
    url$ = "/qb64wiki/index.php/Special:AllPages" 'the first file that we download
    Do
        file$ = FileLeft$ + _Trim$(Str$(FileCount)) + FileRight$
        Download url$, file$
        url2$ = GetNextPage$(file$)
        P = InStr(url2$, "from=")
        If P = 0 Then Exit Do
        If Mid$(url2$, P + 5) > CurrentFile$ Then
            CurrentFile$ = Mid$(url2$, P + 5)
            FileCount = FileCount + 1
            url$ = url2$
        Else
            Exit Do
        End If
    Loop
    DownloadPageLists = FileCount
End Function

Function CleanHTML$ (OriginalText$)
    text$ = OriginalText$ 'don't corrupt incoming text
    Type ReplaceList
        original As String
        replacement As String
    End Type

    'Expandable HTML replacement system
    Dim HTML(200) As ReplaceList
    HTML(0).original = "&amp;": HTML(0).replacement = "&"
    '    HTML(1).original = "%24": HTML(1).replacement = "$"
    For i = 1 To 200
        HTML(i).original = "%" + Hex$(i + 16)
        HTML(i).replacement = Chr$(i + 16)
        'Print HTML(i).original, HTML(i).replacement
        'Sleep
    Next


    For i = 0 To UBound(HTML)
        Do
            P = InStr(text$, HTML(i).original)
            If P = 0 Then Exit Do
            text$ = Left$(text$, P - 1) + HTML(i).replacement + Mid$(text$, P + Len(HTML(i).original))
        Loop
    Next
    CleanHTML$ = text$
End Function

Sub Download (url$, outputFile$)
    url2$ = CleanHTML(url$)
    'Print "https://qb64phoenix.com/qb64wiki/index.php?title=Special:AllPages&from=KEY+n"
    'Print HomePage$ + url2$
    Shell _Hide "curl -o " + Chr$(34) + outputFile$ + Chr$(34) + " " + Chr$(34) + HomePage$ + url2$ + Chr$(34)
End Sub

Function GetNextPage$ (currentPage$)
    SpecialPageDivClass$ = "<div class=" + Chr$(34) + "mw-allpages-nav" + Chr$(34) + ">"
    SpecialPageLink$ = "<a href="
    SpecialPageEndLink$ = Chr$(34) + " title"
    Open currentPage$ For Binary As #1
    l = LOF(1)
    t$ = Space$(l)
    Get #1, 1, t$
    Close
    sp = InStr(t$, SpecialPageDivClass$)
    If sp Then
        lp = InStr(sp, t$, SpecialPageLink$)
        If lp Then
            lp = lp + 9
            lp2 = InStr(lp, t$, SpecialPageEndLink$)
            link$ = Mid$(t$, lp, lp2 - lp)
            GetNextPage$ = CleanHTML(link$)
        End If
    End If
End Function

With all of 130 lines of code, we fetch and save the whole wiki to disk!

NOTE:  If you run this, this will save over 600 files into the same directory where this program is ran from!  I'd suggest saving it into its own directly and running it from there!  Complaining over a messy QB64 folder after this warning wil only get me to laugh at you.  Tongue

Now, this creates a whole bunch of files with a *.HTML extension to them.  You can click on any of these files and open them in your web browser, but you should know in advance that the links between them aren't going to work as they expect a specific file structure on the wiki and we're not providing that here.  You'll have to click and open each file individually yourself.

There's a little more work with working with these files, but there's also a couple of large advantages as well:

1) Anytime you run the program, you'll know you have the most up to date version of information from the wiki.
2) You don't have to wait for someone to run HTTrack, grab a copy from the web, and share it with you.
3) The total size of this on disk is about 20MB -- not 1.2GB!!  It's a helluva lot more portable!

Pages aren't quite as pretty as what you'll find when you go to the wiki itself, as it doesn't have the templates to pull upon to format everything properly, but they're more than readable in my opinion.  Below is the way the scancode page looks for me, in microsoft edge, as an example page.

   

If there's anyone who just wants the files themselves, without having to download the pages on their own (as they take about 10 minutes or so on my machine to download all of them), I've zipped them all up in a 7z archive, which is available via the attachment below.



Attached Files
.7z   wiki.7z (Size: 845.61 KB / Downloads: 81)
Print this item

  The "Ulam Conjecture" (Collatz conjecture)
Posted by: Kernelpanic - 05-23-2022, 07:15 PM - Forum: Programs - Replies (6)

The Ulam conjecture is a popular task in IT teaching. This is an implementation in QB64.

A "problem" arises when the output is very long, because then the heading can no longer be read because the side scroll bars are missing.

Code: (Select All)
' EP in C' S.47, šb.4.6 'Ulamsches Problem': Von einer beliebigen Startzahl
' Erweitert fuer grosse Zahlen (Formatierung noch anpassen)                 -  09.04.2022
' QuickBasic 64 Version                                                     -  23.05.2022
'========================================================================================

OPTION _EXPLICIT

DIM startzahl AS LONG, sum AS LONG
DIM z AS INTEGER

CLS
PRINT TAB(25); "** ULAMSCHES PROBLEM **"
PRINT TAB(25); "======================="
PRINT TAB(10); "Erzeugt eine Folge von Zahlen aus einer gegebenen Startzahl"
PRINT TAB(10); "nach der Regel:"
PRINT TAB(10); "   1. Ist die Zahl 1, dann Stop (Ende)."
PRINT TAB(10); "   2. Ist die Zahl gerade, wird sie halbiert. Gehe nach (1.)"
PRINT TAB(10); "   3. Ist die Zahl ungerade, wird sie verdreifacht und um eins"
PRINT TAB(10); "      vermehrt. Gehe nach (1.)"

PRINT
INPUT "Geben Sie eine (ganze) Startzahl ein: ", startzahl

PRINT "Ergibt die Folge -->"
PRINT

z = 0
sum = 0
WHILE (startzahl <> 1)
  IF startzahl MOD 2 = 0 THEN
    startzahl = startzahl / 2 'Wenn startzahl gerade ist (Regel 2)
  ELSE
    startzahl = startzahl * 3 'Wenn startzahl ungerade ist (Regel 3)
    startzahl = startzahl + 1
  END IF
  PRINT USING "######"; startzahl;
  sum = sum + startzahl
  z = z + 1

  IF z MOD 11 = 0 THEN 'Fuer Formatierung der Ausgabe
    PRINT
  END IF
WEND

PRINT: PRINT
PRINT USING "Diese Folge besteht aus #### Zahlen. Ihre Summe betraegt ######"; z, sum

END


[Image: Normale-Darstellung2022-05-23.jpg]

Print this item

  Old vs. new version of QB64
Posted by: Kernelpanic - 05-23-2022, 06:55 PM - Forum: General Discussion - No Replies

I'll make a new thread.
I just read that there are new versions of QB64. Is there a special change compared to the versions from the old forum?

I'm using the latest version by the Old-Forum I think so: Version 2.02 from December 21, 2021.

Print this item

  Is there a 2001 trip effect written in QB64?
Posted by: TarotRedhand - 05-23-2022, 08:55 AM - Forum: General Discussion - Replies (4)

Simple question. Has anyone written a slit-scan effect program for QB64? That is like the "trip" sequence in the movie "2001 a Space Oddity". If not, is anyone up to the challenge of making one? If so one little rule, it should use an external image to scan. Here is a short YouTube video that shows the technique. I can almost understand how to do it from that myself. Final thought - it might make a good screensaver project too.

Thanks.

TR

Print this item

  Wiki TEXT pages downloader
Posted by: SMcNeill - 05-23-2022, 04:15 AM - Forum: Works in Progress - Replies (4)

Code: (Select All)
On Error GoTo errorchecker
GoTo skip_errorchecker

errorchecker:
glitch = glitch + 1
Locate 8 + glitch, 1
Print "Glitch in a file somewhere.  Something didn't get downloaded properly. :P"
Resume Next
skip_errorchecker:

Dim Shared Cache_Folder As String
Cache_Folder$ = "./"
If InStr(_OS$, "WIN") = 0 Then Cache_Folder$ = ".\"

'If _DirExists(Cache_Folder$) = 0 Then MkDir Cache_Folder$
Dim Shared Help_sx, Help_sy, Help_cx, Help_cy
Dim Shared Help_Select, Help_cx1, Help_cy1, Help_SelX1, Help_SelX2, Help_SelY1, Help_SelY2
Dim Shared Help_MSelect
Help_sx = 1: Help_sy = 1: Help_cx = 1: Help_cy = 1
Dim Shared Help_wx1, Help_wy1, Help_wx2, Help_wy2 'defines the text section of the help window on-screen
Dim Shared Help_ww, Help_wh 'width & height of text region
Dim Shared help_h, help_w 'width & height
Dim Shared Help_Txt$ '[chr][col][link-byte1][link-byte2]
Dim Shared Help_Txt_Len
Dim Shared Help_Line$ 'index of first txt element of a line
Dim Shared Help_Link$ 'the link info [sep][type:]...[sep]
Dim Shared Help_Link_Sep$: Help_Link_Sep$ = Chr$(13)
Dim Shared Help_LinkN
Dim Shared Help_NewLineIndent
Dim Shared Help_Underline
'Link Types:
' PAGE:wikipagename
' EXTL:external link url
Dim Shared Help_Pos, Help_Wrap_Pos
Dim Shared Help_BG_Col
Dim Shared Help_Col_Normal: Help_Col_Normal = 7
Dim Shared Help_Col_Link: Help_Col_Link = 9
Dim Shared Help_Col_Bold: Help_Col_Bold = 15
Dim Shared Help_Col_Italic: Help_Col_Italic = 15
Dim Shared Help_Col_Section: Help_Col_Section = 8
Dim Shared Help_Bold, Help_Italic, Help_DList
Dim Shared Help_LockWrap, Help_LockParse
Dim Shared Help_Center, Help_CIndent$
ReDim Shared Help_LineLen(1)
ReDim Shared Back$(1)
ReDim Shared Back_Name$(1)
Type Help_Back_Type
    sx As Long
    sy As Long
    cx As Long
    cy As Long
End Type
ReDim Shared Help_Back(1) As Help_Back_Type
Back$(1) = "QB64 Help Menu"
Back_Name$(1) = Back2BackName$(Back$(1))
Help_Back(1).sx = 1: Help_Back(1).sy = 1: Help_Back(1).cx = 1: Help_Back(1).cy = 1
Dim Shared Help_Back_Pos
Help_Back_Pos = 1
Dim Shared Help_Search_Time As Double
Dim Shared Help_Search_Str As String
Dim Shared Help_PageLoaded As String
Dim Shared Help_Recaching, Help_IgnoreCache

'Unicode replacements
Type wikiUtf8Replace
    utf8 As String * 4 '= MKI$(reversed hex 2-byte UTF-8 sequence) or MKL$(reversed hex 3/4-byte UTF-8 sequence)
    repl As String * 8 '= replacement string (1-8 chars)
End Type
Dim Shared wpUtfRepl(0 To 50) As wikiUtf8Replace
Dim Shared wpUtfReplCnt: wpUtfReplCnt = -1 'wpUtfRepl index counter (pre-increment, hence
'you don't need "wpUtfReplCnt - 1" when used in loops, just do "0 TO wpUtfReplCnt"
'Note: All UTF-8 values must be reversed in MKI$/MKL$, as it flips them to little endian.
'      In the wiki text they are noted in big endian, hence we need to pre-flip them.
'2-byte sequences
wpUtfReplCnt = wpUtfReplCnt + 1: wpUtfRepl(wpUtfReplCnt).utf8 = MKI$(&HA9C2): wpUtfRepl(wpUtfReplCnt).repl = "(c)" 'copyright
wpUtfReplCnt = wpUtfReplCnt + 1: wpUtfRepl(wpUtfReplCnt).utf8 = MKI$(&HA9C3): wpUtfRepl(wpUtfReplCnt).repl = Chr$(130) 'accent (é)
wpUtfReplCnt = wpUtfReplCnt + 1: wpUtfRepl(wpUtfReplCnt).utf8 = MKI$(&HA2C3): wpUtfRepl(wpUtfReplCnt).repl = Chr$(131) 'accent (â)
wpUtfReplCnt = wpUtfReplCnt + 1: wpUtfRepl(wpUtfReplCnt).utf8 = MKI$(&HA0C3): wpUtfRepl(wpUtfReplCnt).repl = Chr$(133) 'accent (à)
wpUtfReplCnt = wpUtfReplCnt + 1: wpUtfRepl(wpUtfReplCnt).utf8 = MKI$(&HA5C3): wpUtfRepl(wpUtfReplCnt).repl = Chr$(134) 'accent (å)
wpUtfReplCnt = wpUtfReplCnt + 1: wpUtfRepl(wpUtfReplCnt).utf8 = MKI$(&HA7C3): wpUtfRepl(wpUtfReplCnt).repl = Chr$(135) 'accent (ç)
wpUtfReplCnt = wpUtfReplCnt + 1: wpUtfRepl(wpUtfReplCnt).utf8 = MKI$(&HAAC3): wpUtfRepl(wpUtfReplCnt).repl = Chr$(136) 'accent (ê)
wpUtfReplCnt = wpUtfReplCnt + 1: wpUtfRepl(wpUtfReplCnt).utf8 = MKI$(&HABC3): wpUtfRepl(wpUtfReplCnt).repl = Chr$(137) 'accent (ë)
wpUtfReplCnt = wpUtfReplCnt + 1: wpUtfRepl(wpUtfReplCnt).utf8 = MKI$(&HA8C3): wpUtfRepl(wpUtfReplCnt).repl = Chr$(138) 'accent (è)
wpUtfReplCnt = wpUtfReplCnt + 1: wpUtfRepl(wpUtfReplCnt).utf8 = MKI$(&HAFC3): wpUtfRepl(wpUtfReplCnt).repl = Chr$(139) 'accent (ï)
wpUtfReplCnt = wpUtfReplCnt + 1: wpUtfRepl(wpUtfReplCnt).utf8 = MKI$(&HAEC3): wpUtfRepl(wpUtfReplCnt).repl = Chr$(140) 'accent (î)
wpUtfReplCnt = wpUtfReplCnt + 1: wpUtfRepl(wpUtfReplCnt).utf8 = MKI$(&HA2C2): wpUtfRepl(wpUtfReplCnt).repl = Chr$(155) 'cents (ø)
wpUtfReplCnt = wpUtfReplCnt + 1: wpUtfRepl(wpUtfReplCnt).utf8 = MKI$(&HBDC2): wpUtfRepl(wpUtfReplCnt).repl = Chr$(171) 'fraction (½)
wpUtfReplCnt = wpUtfReplCnt + 1: wpUtfRepl(wpUtfReplCnt).utf8 = MKI$(&HBCC2): wpUtfRepl(wpUtfReplCnt).repl = Chr$(172) 'fraction (¼)
wpUtfReplCnt = wpUtfReplCnt + 1: wpUtfRepl(wpUtfReplCnt).utf8 = MKI$(&HA0C2): wpUtfRepl(wpUtfReplCnt).repl = Chr$(255) 'non-breaking space
'3-byte sequences
wpUtfReplCnt = wpUtfReplCnt + 1: wpUtfRepl(wpUtfReplCnt).utf8 = MKL$(&HA680E2): wpUtfRepl(wpUtfReplCnt).repl = "..." 'ellipsis
wpUtfReplCnt = wpUtfReplCnt + 1: wpUtfRepl(wpUtfReplCnt).utf8 = MKL$(&H8C94E2): wpUtfRepl(wpUtfReplCnt).repl = Chr$(218) 'single line draw (top/left corner)
wpUtfReplCnt = wpUtfReplCnt + 1: wpUtfRepl(wpUtfReplCnt).utf8 = MKL$(&H9094E2): wpUtfRepl(wpUtfReplCnt).repl = Chr$(191) 'single line draw (top/right corner)
wpUtfReplCnt = wpUtfReplCnt + 1: wpUtfRepl(wpUtfReplCnt).utf8 = MKL$(&H9494E2): wpUtfRepl(wpUtfReplCnt).repl = Chr$(192) 'single line draw (bottom/left corner)
wpUtfReplCnt = wpUtfReplCnt + 1: wpUtfRepl(wpUtfReplCnt).utf8 = MKL$(&H9894E2): wpUtfRepl(wpUtfReplCnt).repl = Chr$(217) 'single line draw (bottom/right corner)
wpUtfReplCnt = wpUtfReplCnt + 1: wpUtfRepl(wpUtfReplCnt).utf8 = MKL$(&H8094E2): wpUtfRepl(wpUtfReplCnt).repl = Chr$(196) 'single line draw (horizontal line)
wpUtfReplCnt = wpUtfReplCnt + 1: wpUtfRepl(wpUtfReplCnt).utf8 = MKL$(&H8294E2): wpUtfRepl(wpUtfReplCnt).repl = Chr$(179) 'single line draw (vertical line)
wpUtfReplCnt = wpUtfReplCnt + 1: wpUtfRepl(wpUtfReplCnt).utf8 = MKL$(&HB494E2): wpUtfRepl(wpUtfReplCnt).repl = Chr$(193) 'single line draw (hori. line + up connection)
wpUtfReplCnt = wpUtfReplCnt + 1: wpUtfRepl(wpUtfReplCnt).utf8 = MKL$(&HAC94E2): wpUtfRepl(wpUtfReplCnt).repl = Chr$(194) 'single line draw (hori. line + down connection)
wpUtfReplCnt = wpUtfReplCnt + 1: wpUtfRepl(wpUtfReplCnt).utf8 = MKL$(&HA494E2): wpUtfRepl(wpUtfReplCnt).repl = Chr$(180) 'single line draw (vert. line + left connection)
wpUtfReplCnt = wpUtfReplCnt + 1: wpUtfRepl(wpUtfReplCnt).utf8 = MKL$(&H9C94E2): wpUtfRepl(wpUtfReplCnt).repl = Chr$(195) 'single line draw (vert. line + right connection)
wpUtfReplCnt = wpUtfReplCnt + 1: wpUtfRepl(wpUtfReplCnt).utf8 = MKL$(&HBC94E2): wpUtfRepl(wpUtfReplCnt).repl = Chr$(197) 'single line draw (hori./vert. line cross)
wpUtfReplCnt = wpUtfReplCnt + 1: wpUtfRepl(wpUtfReplCnt).utf8 = MKL$(&HB296E2): wpUtfRepl(wpUtfReplCnt).repl = Chr$(30) 'triangle up
wpUtfReplCnt = wpUtfReplCnt + 1: wpUtfRepl(wpUtfReplCnt).utf8 = MKL$(&HBC96E2): wpUtfRepl(wpUtfReplCnt).repl = Chr$(31) 'triangle down
wpUtfReplCnt = wpUtfReplCnt + 1: wpUtfRepl(wpUtfReplCnt).utf8 = MKL$(&H8497E2): wpUtfRepl(wpUtfReplCnt).repl = Chr$(17) 'triangle left
wpUtfReplCnt = wpUtfReplCnt + 1: wpUtfRepl(wpUtfReplCnt).utf8 = MKL$(&HBA96E2): wpUtfRepl(wpUtfReplCnt).repl = Chr$(16) 'triangle right
wpUtfReplCnt = wpUtfReplCnt + 1: wpUtfRepl(wpUtfReplCnt).utf8 = MKL$(&H9186E2): wpUtfRepl(wpUtfReplCnt).repl = Chr$(24) 'arrow up
wpUtfReplCnt = wpUtfReplCnt + 1: wpUtfRepl(wpUtfReplCnt).utf8 = MKL$(&H9386E2): wpUtfRepl(wpUtfReplCnt).repl = Chr$(25) 'arrow down
wpUtfReplCnt = wpUtfReplCnt + 1: wpUtfRepl(wpUtfReplCnt).utf8 = MKL$(&H9086E2): wpUtfRepl(wpUtfReplCnt).repl = Chr$(27) 'arrow left
wpUtfReplCnt = wpUtfReplCnt + 1: wpUtfRepl(wpUtfReplCnt).utf8 = MKL$(&H9286E2): wpUtfRepl(wpUtfReplCnt).repl = Chr$(26) 'arrow right
'4-byte sequences
wpUtfReplCnt = wpUtfReplCnt + 1: wpUtfRepl(wpUtfReplCnt).utf8 = MKL$(&H80989FF0): wpUtfRepl(wpUtfReplCnt).repl = ":)" 'smily
wpUtfReplCnt = wpUtfReplCnt + 1: wpUtfRepl(wpUtfReplCnt).utf8 = MKL$(&H88989FF0): wpUtfRepl(wpUtfReplCnt).repl = ";)" 'wink
'========= END OF WIKI.BI

updatestep = 1
Do 'main loop

    '-------- custom display changes --------
    'update steps
    Select Case updatestep
        Case 1
            Print "Generating list of cached content..."
        Case 2
            Print "Adding core help pages to list..."
        Case 3
            Print "Regenerating keyword list..."
        Case 4
            Print "Building download queue..."
        Case 5
            Locate 8, 1: Print "Updating help content file...";
    End Select

    If updatestep = 5 Then
        maxprogresswidth = 52 'arbitrary
        percentage = Int(n / c * 100)
        percentagechars = Int(maxprogresswidth * n / c)
        'percentageMsg$ = "[" + STRING$(percentagechars, 254) + SPACE$(maxprogresswidth - percentagechars) + "]" + STR$(percentage) + "%"
        percentageMsg$ = Str$(percentage) + "%"
        Print percentageMsg$
    ElseIf updatestep = 6 Then
        percentageMsg$ = " 100%"
        Print percentageMsg$
    End If
    '-------- end of custom display changes --------

    '-------- update routine -------------------------------------
    Select Case updatestep
        Case 1
            'Create a list of all files to be recached
            f$ = Chr$(0)

            'Prepend core pages to list
            f$ = Chr$(0) + "Keyword_Reference_-_By_usage.txt" + f$
            f$ = Chr$(0) + "QB64_Help_Menu.txt" + f$
            f$ = Chr$(0) + "QB64_FAQ.txt" + f$
            updatestep = updatestep + 1
        Case 2
            updatestep = updatestep + 1
        Case 3
            'Download and PARSE alphabetical index to build required F1 help links
            FullMessage$(1) = "Regenerating keyword list..."
            Help_Recaching = 1: Help_IgnoreCache = 1
            Print "Downloading: Keyword Reference - Alphabetical "
            a$ = Wiki$("Keyword Reference - Alphabetical")
            Help_Recaching = 0: Help_IgnoreCache = 0
            WikiParse a$

            fh1 = FreeFile
            Open "Keyword_Reference_-_Alphabetical_1000000_100000000_-_100000000000.txt" For Binary As #fh1
            temp$ = Space$(LOF(fh1))
            Get #fh1, 1, temp$
            Close #fh1
            Open "links.txt" For Output As #fh1
            Print "GENERATING KEYWORDS..."

            Do
                p = InStr(p + 2, temp$, "]]")
                If p = 0 Then Exit Do
                p1 = _InStrRev(p, temp$, "[[")
                If p1 < oldp Or p1 = 0 Then Exit Do
                l$ = Mid$(temp$, p1 + 2, p - p1 - 2)
                If Left$(l$, 1) = "_" Then l$ = Mid$(l$, 2)
                If Left$(l$, 1) <> "#" Then Print #fh1, l$
                oldp = p + 2
            Loop
            Close #fh1
            Print "GENERATED KEYWORDS..."
            updatestep = updatestep + 1
        Case 4
            'Add all linked pages to download list (if not already in list)
            fh = FreeFile
            Open "links.txt" For Input As #fh
            Do Until EOF(fh)
                Line Input #fh, l$
                If Len(l$) Then
                    c = InStr(l$, ","): l$ = Right$(l$, Len(l$) - c)
                    'Escape all invalid and other critical chars in filenames
                    PageName2$ = ""
                    For i = 1 To Len(l$)
                        c = Asc(l$, i)
                        Select Case c
                            Case 32 '                                    '(space)
                                PageName2$ = PageName2$ + "_"
                            Case 34, 38, 42, 47, 58, 60, 62, 63, 92, 124 '("&*/:<>?\|)
                                PageName2$ = PageName2$ + "%" + Hex$(c)
                            Case Else
                                PageName2$ = PageName2$ + Chr$(c)
                        End Select
                    Next
                    PageName2$ = PageName2$ + ".txt"
                    If InStr(f$, Chr$(0) + PageName2$ + Chr$(0)) = 0 Then
                        f$ = f$ + PageName2$ + Chr$(0)
                    End If
                End If
            Loop
            Close #fh

            'Redownload all listed files
            If f$ <> Chr$(0) Then
                c = 0 'count files to download
                For x = 2 To Len(f$)
                    If Asc(f$, x) = 0 Then c = c + 1
                Next
                c = c - 1

                f$ = Right$(f$, Len(f$) - 1)
                z$ = Chr$(0)
                n = 0
            Else
                GoTo stoprecache
            End If
            FullMessage$(2) = ""
            updatestep = updatestep + 1
        Case 5
            If Len(f$) > 0 Then
                x2 = InStr(f$, z$)
                f2$ = Left$(f$, x2 - 1): f$ = Right$(f$, Len(f$) - x2)

                If Right$(f2$, 4) = ".txt" Then
                    f2$ = Left$(f2$, Len(f2$) - 4)
                    n = n + 1
                    FullMessage$(2) = "Page title: " + f2$
                    Help_IgnoreCache = 1: Help_Recaching = 1: ignore$ = Wiki(f2$): Help_Recaching = 0: Help_IgnoreCache = 0
                End If
            Else
                updatestep = updatestep + 1
            End If
        Case 6
            stoprecache:
            FullMessage$(1) = "All pages updated."
            FullMessage$(2) = ""
            Print "Finished!"
            End
            _Limit 20
    End Select
    '-------- end of update routine ------------------------------

    mousedown = 0
    mouseup = 0
Loop







'========= START OF WIKI.BM
Function Back2BackName$ (a$)
    If a$ = "Keyword Reference - Alphabetical" Then Back2BackName$ = "Alphabetical": Exit Function
    If a$ = "Keyword Reference - By usage" Then Back2BackName$ = "By Usage": Exit Function
    If a$ = "QB64 Help Menu" Then Back2BackName$ = "Help": Exit Function
    If a$ = "QB64 FAQ" Then Back2BackName$ = "FAQ": Exit Function
    Back2BackName$ = a$
End Function

Function Wiki$ (PageName$) 'Read cached wiki page (download, if not yet cached)
    Help_PageLoaded$ = PageName$

    'Escape all invalid and other critical chars in filenames
    PageName2$ = ""
    For i = 1 To Len(PageName$)
        c = Asc(PageName$, i)
        Select Case c
            Case 32 '                                    '(space)
                PageName2$ = PageName2$ + "_"
            Case 34, 38, 42, 47, 58, 60, 62, 63, 92, 124 '("&*/:<>?\|)
                PageName2$ = PageName2$ + "%" + Hex$(c)
            Case Else
                PageName2$ = PageName2$ + Chr$(c)
        End Select
    Next
    PageName3$ = wikiSafeName$(PageName2$) 'case independent name

    'Is this page in the cache?
    If Help_IgnoreCache = 0 Then
        If _FileExists(Cache_Folder$ + PageName3$ + ".txt") Then
            fh = FreeFile
            Open Cache_Folder$ + PageName3$ + ".txt" For Binary As #fh
            a$ = Space$(LOF(fh))
            Get #fh, , a$
            Close #fh
            chr13 = InStr(a$, Chr$(13))
            removedchr13 = 0
            Do While chr13 > 0
                removedchr13 = -1
                a$ = Left$(a$, chr13 - 1) + Mid$(a$, chr13 + 1)
                chr13 = InStr(a$, Chr$(13))
            Loop
            If removedchr13 Then
                fh = FreeFile
                Open Cache_Folder$ + PageName3$ + ".txt" For Output As #fh: Close #fh
                Open Cache_Folder$ + PageName3$ + ".txt" For Binary As #fh
                Put #fh, 1, a$
                Close #fh
            End If
            Wiki$ = a$
            Exit Function
        End If
    End If

    'Check for curl
    If _ShellHide("curl --version") <> 0 Then
        Print "Can not find cURL.  Terminating program."
        _Delay 3
        System
    End If

    'Download message (Status Bar)
    If Help_Recaching = 0 Then
        a$ = "Downloading '" + PageName$ + "' page..."
        If Len(a$) > 60 Then a$ = Left$(a$, 57) + String$(3, 250)
        If Len(a$) < 60 Then a$ = a$ + Space$(60 - Len(a$))
        Color 0, 3
        Print a$
    End If


    'Url query and output arguments for curl
    url$ = Chr$(34) + "https://www.qb64phoenix.com/qb64wiki/index.php?title=" + PageName2$ + "&action=edit" + Chr$(34)
    outputFile$ = Cache_Folder$ + PageName3$ + ".txt"
    'Wikitext delimiters
    s1$ = "name=" + Chr$(34) + "wpTextbox1" + Chr$(34) + ">"
    s2$ = "</textarea>"

    'Download page using curl
    Shell _Hide "curl -o " + Chr$(34) + outputFile$ + Chr$(34) + " " + url$
    fh = FreeFile
    Open outputFile$ For Binary As #fh 'get new content
    a$ = Space$(LOF(fh))
    Get #fh, 1, a$
    Close #fh



    'Find wikitext in the downloaded page
    s1 = InStr(a$, s1$)
    If s1 > 0 Then a$ = Mid$(a$, s1 + Len(s1$)): s2 = InStr(a$, s2$): Else s2 = 0
    If s2 > 0 Then a$ = Left$(a$, s2 - 1)
    If s1 > 0 And s2 > 0 And a$ <> "" Then
        'If wikitext was found, then substitute stuff & save it
        '--- first HTML specific entities
        While InStr(a$, "&amp;") > 0 '         '&amp; must be first and looped until all
            a$ = StrReplace$(a$, "&amp;", "&") 'multi-escapes are resolved (eg. &amp;lt; &amp;amp;lt; etc.)
        Wend
        a$ = StrReplace$(a$, "&lt;", "<")
        a$ = StrReplace$(a$, "&gt;", ">")
        a$ = StrReplace$(a$, "&quot;", Chr$(34))
        '--- then other entities
        a$ = StrReplace$(a$, "&verbar;", "|")
        a$ = StrReplace$(a$, "&pi;", Chr$(227))
        a$ = StrReplace$(a$, "&theta;", Chr$(233))
        a$ = StrReplace$(a$, "&sup1;", Chr$(252))
        a$ = StrReplace$(a$, "&sup2;", Chr$(253))
        a$ = StrReplace$(a$, "&nbsp;", Chr$(255))
        '--- useless styles in blocks
        a$ = StrReplace$(a$, "Start}}'' ''", "Start}}")
        a$ = StrReplace$(a$, "Start}} '' ''", "Start}}")
        a$ = StrReplace$(a$, "Start}}" + Chr$(10) + "'' ''", "Start}}")
        a$ = StrReplace$(a$, "'' ''" + Chr$(10) + "{{", Chr$(10) + "{{")
        a$ = StrReplace$(a$, "'' '' " + Chr$(10) + "{{", Chr$(10) + "{{")
        a$ = StrReplace$(a$, "'' ''" + MKI$(&H0A0A) + "{{", Chr$(10) + "{{")
        '--- wiki redirects
        a$ = StrReplace$(a$, "#REDIRECT", "See page")
        '--- put a download date/time entry
        a$ = "{{QBDLDATE:" + Date$ + "}}" + Chr$(10) + "{{QBDLTIME:" + Time$ + "}}" + Chr$(10) + a$
        '--- now save it
        fh = FreeFile
        Open outputFile$ For Output As #fh
        Print #fh, a$
        Close #fh
    Else
        'Delete page, if empty or corrupted (force re-download on next access)
        Kill outputFile$
        a$ = CHR$(10) + "{{PageInternalError}}" + CHR$(10) +_
             "* Either the requested page is not yet available in the Wiki," + CHR$(10) +_
             "* or the download from Wiki failed and corrupted the page data." + CHR$(10) +_
             "** You may try ''Update Current Page'' from the ''Help'' menu." + CHR$(10)
    End If



    Wiki$ = a$
End Function

Sub Help_AddTxt (t$, col, link) 'Add help text, handle word wrap
    If t$ = Chr$(13) Then Help_NewLine: Exit Sub

    For i = 1 To Len(t$)
        c = Asc(t$, i)

        If Help_LockParse = 0 And Help_LockWrap = 0 Then

            If c = 32 Then
                If Help_Pos = Help_ww Then Help_NewLine: _Continue

                Help_Txt_Len = Help_Txt_Len + 1: Asc(Help_Txt$, Help_Txt_Len) = 32
                Help_Txt_Len = Help_Txt_Len + 1: Asc(Help_Txt$, Help_Txt_Len) = col + Help_BG_Col * 16
                Help_Txt_Len = Help_Txt_Len + 1: Asc(Help_Txt$, Help_Txt_Len) = link And 255
                Help_Txt_Len = Help_Txt_Len + 1: Asc(Help_Txt$, Help_Txt_Len) = link \ 256

                Help_Wrap_Pos = Help_Txt_Len 'pos to backtrack to when wrapping content
                Help_Pos = Help_Pos + 1: _Continue
            End If

            If Help_Pos > Help_ww Then
                If Help_Wrap_Pos Then 'attempt to wrap
                    'backtrack, insert new line, continue

                    b$ = Mid$(Help_Txt$, Help_Wrap_Pos + 1, Help_Txt_Len - Help_Wrap_Pos)

                    Help_Txt_Len = Help_Wrap_Pos

                    Help_NewLine

                    Mid$(Help_Txt$, Help_Txt_Len + 1, Len(b$)) = b$: Help_Txt_Len = Help_Txt_Len + Len(b$)

                    Help_Pos = Help_Pos + Len(b$) \ 4
                End If
            End If

        End If

        Help_Txt_Len = Help_Txt_Len + 1: Asc(Help_Txt$, Help_Txt_Len) = c
        Help_Txt_Len = Help_Txt_Len + 1: Asc(Help_Txt$, Help_Txt_Len) = col + Help_BG_Col * 16
        Help_Txt_Len = Help_Txt_Len + 1: Asc(Help_Txt$, Help_Txt_Len) = link And 255
        Help_Txt_Len = Help_Txt_Len + 1: Asc(Help_Txt$, Help_Txt_Len) = link \ 256

        Help_Pos = Help_Pos + 1
    Next
End Sub

Sub Help_NewLine 'Start a new help line, apply indention (if any)
    If Help_Pos > help_w Then help_w = Help_Pos

    Help_Txt_Len = Help_Txt_Len + 1: Asc(Help_Txt$, Help_Txt_Len) = 13
    Help_Txt_Len = Help_Txt_Len + 1: Asc(Help_Txt$, Help_Txt_Len) = Help_BG_Col * 16
    Help_Txt_Len = Help_Txt_Len + 1: Asc(Help_Txt$, Help_Txt_Len) = 0
    Help_Txt_Len = Help_Txt_Len + 1: Asc(Help_Txt$, Help_Txt_Len) = 0

    help_h = help_h + 1
    Help_Line$ = Help_Line$ + MKL$(Help_Txt_Len + 1)
    Help_Wrap_Pos = 0

    If Help_Underline Then
        w = Help_Pos
        Help_Pos = 1
        If Help_Underline = Help_Col_Section Then
            Help_AddTxt String$(w - 1, 205), Help_Underline, 0
        Else
            Help_AddTxt String$(w - 1, 196), Help_Underline, 0
        End If
        Help_Underline = 0 'keep before Help_NewLine (recursion)
        Help_NewLine
    End If
    Help_Pos = 1

    If Help_Center > 0 Then 'center overrides regular indent
        Help_NewLineIndent = 0
        Help_AddTxt Space$(Asc(Help_CIndent$, 1)), Help_Col, 0
        Help_CIndent$ = Mid$(Help_CIndent$, 2)
    ElseIf Help_NewLineIndent > 0 Then
        Help_AddTxt Space$(Help_NewLineIndent), Help_Col, 0
    End If
End Sub

Sub Help_CheckFinishLine 'Make sure the current help line is finished
    If Help_Txt_Len >= 4 Then
        If Asc(Help_Txt$, Help_Txt_Len - 3) <> 13 Then Help_NewLine
    End If
End Sub

Sub Help_CheckBlankLine 'Make sure the last help line is a blank line (implies finish current)
    If Help_Txt_Len >= 8 Then
        If Asc(Help_Txt$, Help_Txt_Len - 3) <> 13 Then Help_NewLine
        If Asc(Help_Txt$, Help_Txt_Len - 7) <> 13 Then Help_NewLine
    End If
End Sub

Sub Help_CheckRemoveBlankLine 'If the last help line is blank, then remove it
    If Help_Txt_Len >= 8 Then
        If Asc(Help_Txt$, Help_Txt_Len - 3) = 13 Then
            Help_Txt_Len = Help_Txt_Len - 4
            help_h = help_h - 1
            Help_Line$ = Left$(Help_Line$, Len(Help_Line$) - 4)
        End If
        For i = Help_Txt_Len - 3 To 1 Step -4
            If Asc(Help_Txt$, i) <> 32 Then
                Help_Txt_Len = i + 3: Exit For
            End If
        Next
        If Asc(Help_Txt$, Help_Txt_Len - 3) <> 13 Then Help_NewLine
    End If
End Sub

Function Help_Col 'Helps to calculate the default color
    col = Help_Col_Normal
    If Help_Italic Then col = Help_Col_Italic
    If Help_Bold Then col = Help_Col_Bold 'Note: Bold overrides italic
    Help_Col = col
End Function

Sub WikiParse (a$) 'Wiki page interpret

    'Clear info
    help_h = 0: help_w = 0: Help_Line$ = "": Help_Link$ = "": Help_LinkN = 0
    Help_Txt$ = Space$(1000000)
    Help_Txt_Len = 0

    Help_Pos = 1: Help_Wrap_Pos = 0
    Help_Line$ = MKL$(1)
    'Word wrap locks (lock wrapping only, but continue parsing regularly)
    Help_LockWrap = 0
    'Parser locks (neg: soft lock, zero: unlocked, pos: hard lock)
    'hard:  2 = inside code blocks,  1 = inside output blocks
    'soft: -1 = inside text blocks, -2 = inside fixed blocks
    '=> all parser locks also imply a wrapping lock
    '=> hard locks almost every parsing except utf-8 substitution and line breaks
    '=> soft allows all elements not disrupting the current block, hence only
    '   paragraph creating things are locked (eg. headings, lists, rulers etc.),
    '   but text styles, links and template processing is still possible
    Help_LockParse = 0
    Help_Bold = 0: Help_Italic = 0
    Help_Underline = 0
    Help_BG_Col = 0
    Help_Center = 0: Help_CIndent$ = ""
    Help_DList = 0

    link = 0: elink = 0: cb = 0: nl = 1

    col = Help_Col

    'Syntax Notes:
    '=============
    'everywhere in text
    '------------------
    ' ''' = bold text style
    ' ''  = italic text style
    ' [url text]    = external link to url with text to appear (url ends at 1st found space)
    ' [[page]]      = link to another wikipage
    ' [[page|text]] = link to another wikipage with alternative text to appear
    ' {{templatename|param|param|param}} or simply {{templatename}} = predefined styles
    '---------------------
    'at start of line only
    '---------------------
    ' *  = dot list point
    ' ** = sub (ie. further indented) dot list point
    ' ;def:desc = full definition/description list
    ' :desc     = description only, but indented as in a full def/desc list
    ' ;* def:desc = combi list, list dot always belongs to description
    ' :* desc     = combi, description only

    'First find and write the page title and last update
    d$ = "Page not yet updated, expect visual glitches.": i = InStr(a$, "{{QBDLDATE:")
    If i > 0 Then
        d$ = "Last updated: " + Mid$(a$, i + 11, InStr(i + 11, a$, "}}") - i - 11)
        i = InStr(a$, "{{QBDLTIME:")
        If i > 0 Then d$ = d$ + ", at " + Mid$(a$, i + 11, InStr(i + 11, a$, "}}") - i - 11)
    ElseIf InStr(a$, "{{PageInternalError}}") > 0 Then
        d$ = "Page not found."
    End If
    t$ = Help_PageLoaded$: i = InStr(a$, "{{DISPLAYTITLE:")
    If i > 0 Then t$ = Mid$(a$, i + 15, InStr(i + 15, a$, "}}") - i - 15)
    If Left$(t$, 4) = "agp@" Then
        d$ = "Auto-generated temporary page."
        t$ = Mid$(t$, 5)
    End If
    i = Len(d$): ii = Len(t$)
    Help_AddTxt "   Ú" + String$(ii + 2, "Ä") + "¿", 14, 0: Help_NewLine
    Help_AddTxt "   ³ ", 14, 0: Help_AddTxt t$, 12, 0: Help_AddTxt " ³", 14, 0
    Help_AddTxt Space$(Help_ww - i - 2 - Help_Pos) + Chr$(4), 14, 0
    If Left$(d$, 4) = "Page" Then i = 8: Else i = 7
    Help_AddTxt " " + d$, i, 0: Help_NewLine
    Help_AddTxt "ÄÄÄÁ" + String$(ii + 2, "Ä") + "Á" + String$(Help_ww - ii - 7, "Ä"), 14, 0: Help_NewLine

    'Init prefetch array
    prefetch = 20
    Dim c$(prefetch)
    For ii = 1 To prefetch
        c$(ii) = Space$(ii)
    Next

    'BEGIN_PARSE_LOOP
    n = Len(a$)
    i = 1
    Do While i <= n

        'Get next char and fill prefetch array
        c = Asc(a$, i): c$ = Chr$(c)
        For i1 = 1 To prefetch
            ii = i
            For i2 = 1 To i1
                If ii <= n Then
                    Asc(c$(i1), i2) = Asc(a$, ii)
                Else
                    Asc(c$(i1), i2) = 32
                End If
                ii = ii + 1
            Next
        Next

        'Wiki specific code handling (no restrictions)
        s$ = "__NOEDITSECTION__" + Chr$(10): If c$(Len(s$)) = s$ Then i = i + Len(s$) - 1: GoTo charDone
        s$ = "__NOEDITSECTION__": If c$(Len(s$)) = s$ Then i = i + Len(s$) - 1: GoTo charDone
        s$ = "__NOTOC__" + Chr$(10): If c$(Len(s$)) = s$ Then i = i + Len(s$) - 1: GoTo charDone
        s$ = "__NOTOC__": If c$(Len(s$)) = s$ Then i = i + Len(s$) - 1: GoTo charDone
        s$ = "<nowiki>": If c$(Len(s$)) = s$ Then i = i + Len(s$) - 1: GoTo charDone
        s$ = "</nowiki>": If c$(Len(s$)) = s$ Then i = i + Len(s$) - 1: GoTo charDone

        'Direct HTML code is not handled in Code/Output blocks (hard lock), as all text
        'could be part of the code example itself (just imagine a HTML parser/writer demo)
        If Help_LockParse <= 0 Then
            s$ = "<sup>": If c$(Len(s$)) = s$ Then Help_AddTxt "^", col, 0: i = i + Len(s$) - 1: GoTo charDone
            s$ = "</sup>": If c$(Len(s$)) = s$ Then i = i + Len(s$) - 1: GoTo charDone

            s$ = "<center>" 'centered section
            If c$(Len(s$)) = s$ Then
                i = i + Len(s$) - 1
                wla$ = wikiLookAhead$(a$, i + 1, "</center>")
                If InStr(wla$, "#toc") > 0 Or InStr(wla$, "to Top") > 0 Then
                    i = i + Len(wla$) + 9 'ignore TOC links
                Else
                    Help_Center = 1: Help_CIndent$ = wikiBuildCIndent$(wla$)
                    Help_AddTxt Space$(Asc(Help_CIndent$, 1)), col, 0 'center content
                    Help_CIndent$ = Mid$(Help_CIndent$, 2)
                End If
                GoTo charDone
            End If
            s$ = "</center>"
            If c$(Len(s$)) = s$ Then
                i = i + Len(s$) - 1
                Help_Center = 0
                Help_NewLine
                GoTo charDone
            End If
            s$ = "<p style=" 'custom paragraph (maybe centered)
            If c$(Len(s$)) = s$ Then
                i = i + Len(s$) - 1
                For ii = i To Len(a$) - 1
                    If Mid$(a$, ii, 1) = ">" Then
                        wla$ = wikiLookAhead$(a$, ii + 1, "</p>")
                        If InStr(wla$, "#toc") > 0 Or InStr(wla$, "to Top") > 0 Then
                            i = ii + Len(wla$) + 4 'ignore TOC links
                        ElseIf InStr(Mid$(a$, i, ii - i), "center") > 0 Then
                            Help_Center = 1: Help_CIndent$ = wikiBuildCIndent$(wla$)
                            Help_AddTxt Space$(Asc(Help_CIndent$, 1)), col, 0 'center (if in style)
                            Help_CIndent$ = Mid$(Help_CIndent$, 2)
                            i = ii
                        End If
                        Exit For
                    End If
                Next
                GoTo charDone
            End If
            s$ = "</p>"
            If c$(Len(s$)) = s$ Then
                i = i + Len(s$) - 1
                Help_Center = 0
                Help_NewLine
                GoTo charDone
            End If
            s$ = "<span" 'custom inline attributes ignored
            If c$(Len(s$)) = s$ Then
                i = i + Len(s$) - 1
                For ii = i To Len(a$) - 1
                    If Mid$(a$, ii, 1) = ">" Then i = ii: Exit For
                Next
                GoTo charDone
            End If
            s$ = "</span>"
            If c$(Len(s$)) = s$ Then
                i = i + Len(s$) - 1
                GoTo charDone
            End If

            s$ = "<div" 'ignore divisions (TOC and letter links)
            If c$(Len(s$)) = s$ Then
                i = i + Len(s$) - 1
                For ii = i To Len(a$) - 1
                    If Mid$(a$, ii, 6) = "</div>" Then i = ii + 5: Exit For
                Next
                GoTo charDone
            End If
            s$ = "<!--" 'ignore HTML comments
            If c$(Len(s$)) = s$ Then
                i = i + Len(s$) - 1
                For ii = i To Len(a$) - 1
                    If Mid$(a$, ii, 3) = "-->" Then i = ii + 2: Exit For
                Next
                GoTo charDone
            End If
        End If

        'Wiki text styles are not handled in Code/Output blocks (hard lock),
        'as they could be part of the code example itself
        If Help_LockParse <= 0 Then
            'Bold style
            If c$(3) = "'''" Then
                i = i + 2
                If Help_Bold = 0 Then Help_Bold = 1 Else Help_Bold = 0
                col = Help_Col
                GoTo charDone
            End If
            'Italic style
            If c$(2) = "''" Then
                i = i + 1
                If Help_Italic = 0 Then Help_Italic = 1 Else Help_Italic = 0
                col = Help_Col
                GoTo charDone
            End If
        End If

        'Wiki links ([ext], [[int]]) are not handled in Code/Output blocks (hard lock),
        'as all text could be part of the code example itself
        If Help_LockParse <= 0 Then
            'External links
            If c$(5) = "[http" And elink = 0 Then
                elink = 1
                elink$ = ""
                GoTo charDone
            End If
            If elink = 1 Then
                If c$ = "]" Then
                    elink = 0
                    etext$ = elink$
                    i2 = InStr(elink$, " ")
                    If i2 > 0 Then
                        etext$ = Right$(elink$, Len(elink$) - i2)
                        elink$ = Left$(elink$, i2 - 1)
                    End If

                    Help_LinkN = Help_LinkN + 1
                    Help_Link$ = Help_Link$ + "EXTL:" + elink$ + Help_Link_Sep$

                    If Help_LockParse = 0 Then
                        Help_AddTxt etext$, Help_Col_Link, Help_LinkN
                    Else
                        Help_AddTxt etext$, Help_Col_Bold, Help_LinkN
                    End If
                    GoTo charDone
                End If
                elink$ = elink$ + c$
                GoTo charDone
            End If
            'Internal links
            If c$(2) = "[[" And link = 0 Then
                i = i + 1
                link = 1
                link$ = ""
                GoTo charDone
            End If
        End If
        'However, the internal link logic must run always, as it also handles
        'the template {{Cb|, {{Cl| and {{KW| links used in code blocks
        If link = 1 Then
            If c$(2) = "]]" Or c$(2) = "}}" Then
                i = i + 1
                link = 0
                text$ = link$
                i2 = InStr(link$, "|")
                If i2 > 0 Then
                    text$ = Right$(link$, Len(link$) - i2)
                    link$ = Left$(link$, i2 - 1)
                End If

                If InStr(link$, "#") Then 'local page links not supported
                    Help_AddTxt text$, 8, 0
                    GoTo charDone
                ElseIf Left$(link$, 9) = "Category:" Then 'ignore category links
                    Help_CheckRemoveBlankLine
                    GoTo charDone
                End If

                Help_LinkN = Help_LinkN + 1
                Help_Link$ = Help_Link$ + "PAGE:" + link$ + Help_Link_Sep$

                If Help_LockParse = 0 Then
                    Help_AddTxt text$, Help_Col_Link, Help_LinkN
                Else
                    Help_AddTxt text$, Help_Col_Bold, Help_LinkN
                End If
                GoTo charDone
            End If
            link$ = link$ + c$
            GoTo charDone
        End If

        'Wiki tables ({|...|}) are not handled in Code/Output blocks (hard lock),
        'as everything could be part of the code example itself
        If Help_LockParse <= 0 Then
            'Tables (ignored, give info, if not in blocks)
            If c$(2) = "{|" Then
                wla$ = wikiLookAhead$(a$, i + 2, "|}"): iii = 0
                For ii = 1 To Len(wla$)
                    If Mid$(wla$, ii, 1) = "|" And Mid$(wla$, ii, 2) <> "|-" Then iii = iii + 1
                Next
                i = i + 1 + Len(wla$) + 2
                If iii > 1 Or InStr(wla$, "__TOC__") = 0 Then 'ignore TOC only tables
                    If Help_LockParse = 0 Then
                        Help_AddTxt Space$((Help_ww - 52) \ 2) + "ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»", 8, 0: Help_NewLine
                        Help_AddTxt Space$((Help_ww - 52) \ 2) + "º ", 8, 0: Help_AddTxt "The original help page has a table here, please ", 15, 0: Help_AddTxt " º", 8, 0: Help_NewLine
                        Help_AddTxt Space$((Help_ww - 52) \ 2) + "º ", 8, 0: Help_AddTxt "use the ", 15, 0: ii = Help_BG_Col: Help_BG_Col = 3: Help_AddTxt " View on Wiki ", 15, 0: Help_BG_Col = ii: Help_AddTxt " button in the upper right", 15, 0: Help_AddTxt " º", 8, 0: Help_NewLine
                        Help_AddTxt Space$((Help_ww - 52) \ 2) + "º ", 8, 0: Help_AddTxt "corner to load the page into your browser.      ", 15, 0: Help_AddTxt " º", 8, 0: Help_NewLine
                        Help_AddTxt Space$((Help_ww - 52) \ 2) + "ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ", 8, 0
                    End If
                End If
                GoTo charDone
            End If
        End If

        'Wiki templates are handled always, as these are the basic building blocks of all
        'the wiki pages, but look for special conditions inside (Help_LockParse checks)
        If c$(5) = "{{Cb|" Or c$(5) = "{{Cl|" Or c$(5) = "{{KW|" Then 'just nice wrapped links
            i = i + 4 '                                               'KW is deprecated (but kept for existing pages)
            link = 1
            link$ = ""
            GoTo charDone
        End If
        If c$(2) = "{{" Then 'any other templates
            i = i + 1
            cb = 1
            cb$ = ""
            GoTo charDone
        End If
        If cb > 0 Then
            If c$ = "|" Or c$(2) = "}}" Then
                If c$ = "|" And cb = 2 Then
                    wla$ = wikiLookAhead$(a$, i + 1, "}}")
                    cb = 0: i = i + Len(wla$) + 2 'after 1st, ignore all further template parameters
                ElseIf c$(2) = "}}" Then
                    If LCase$(Left$(cb$, 5)) = "small" Then
                        If Asc(cb$, 6) = 196 Then
                            Help_AddTxt " " + String$(Help_ww - Help_Pos, 196), 15, 0
                            Help_BG_Col = 0: col = Help_Col
                        Else
                            Help_Center = 0
                        End If
                        Help_NewLine: cb$ = "" 'avoid reactivation below
                    End If
                    cb = 0: i = i + 1
                End If
                If c$ = "|" And cb = 1 Then cb = 2

                If Help_LockParse = 0 Then 'no section headings in blocks
                    cbo$ = ""
                    'Standard section headings (section color, h3 w/o underline, h2 with underline)
                    'Recommended order of main page sections (h2) with it's considered sub-sections (h3)
                    If cb$ = "PageSyntax" Then cbo$ = "Syntax:"
                    If cb$ = "PageLegacySupport" Then cbo$ = "Legacy support" 'sub-sect
                    If cb$ = "PageParameters" Or cb$ = "Parameters" Then cbo$ = "Parameters:" 'w/o Page suffix is deprecated (but kept for existing pages)
                    If cb$ = "PageDescription" Then cbo$ = "Description:"
                    If cb$ = "PageQBasic" Then cbo$ = "QBasic/QuickBASIC" 'sub-sect
                    If cb$ = "PageNotes" Then cbo$ = "Notes" 'sub-sect
                    If cb$ = "PageErrors" Then cbo$ = "Errors" 'sub-sect
                    If cb$ = "PageUseWith" Then cbo$ = "Use with" 'sub-sect
                    If cb$ = "PageAvailability" Then cbo$ = "Availability:"
                    If cb$ = "PageExamples" Then cbo$ = "Examples:"
                    If cb$ = "PageSeeAlso" Then cbo$ = "See also:"
                    'Independent main page end sections (centered, no title)
                    If cb$ = "PageCopyright" Then cbo$ = "Copyright"
                    If cb$ = "PageNavigation" Then cbo$ = "" 'ignored for built-in help
                    'Internally used templates (not available in Wiki)
                    If cb$ = "PageInternalError" Then cbo$ = "Sorry, an error occurred:"
                    '----------
                    If cbo$ <> "" Then
                        If Right$(cbo$, 1) = ":" Then Help_Underline = Help_Col_Section
                        Help_AddTxt cbo$, Help_Col_Section, 0: Help_NewLine
                        If cbo$ = "Copyright" Then '_gl commands only
                            Help_NewLine: Help_AddTxt "1991-2006 Silicon Graphics, Inc.", 7, 0: Help_NewLine
                            Help_AddTxt "This document is licensed under the SGI Free Software B License.", 7, 0: Help_NewLine
                            Help_AddTxt "https://spdx.org/licenses/SGI-B-2.0.html https://spdx.org/licenses/SGI-B-2.0.html", 15, 0: Help_NewLine
                        End If
                    End If
                End If

                'Code Block
                If cb$ = "InlineCode" And Help_LockParse = 0 Then
                    Help_BG_Col = 1: Help_LockParse = 2
                End If
                If cb$ = "InlineCodeEnd" And Help_LockParse <> 0 Then
                    Help_BG_Col = 0: Help_LockParse = 0
                    Help_Bold = 0: Help_Italic = 0: col = Help_Col
                End If
                If cb$ = "CodeStart" And Help_LockParse = 0 Then
                    Help_CheckBlankLine
                    Help_BG_Col = 1: Help_LockParse = 2
                    Help_AddTxt String$(Help_ww - 15, 196) + " Code Block " + String$(3, 196), 15, 0: Help_NewLine
                    If c$(3) = "}}" + Chr$(10) Then i = i + 1
                End If
                If cb$ = "CodeEnd" And Help_LockParse <> 0 Then
                    Help_CheckFinishLine: Help_CheckRemoveBlankLine
                    Help_AddTxt String$(Help_ww, 196), 15, 0: Help_NewLine
                    Help_BG_Col = 0: Help_LockParse = 0
                    Help_Bold = 0: Help_Italic = 0: col = Help_Col
                End If
                'Output Block
                If Left$(cb$, 11) = "OutputStart" And Help_LockParse = 0 Then 'does also match new OutputStartBGn templates
                    Help_CheckBlankLine
                    Help_BG_Col = 2: Help_LockParse = 1
                    Help_AddTxt String$(Help_ww - 17, 196) + " Output Block " + String$(3, 196), 15, 0: Help_NewLine
                    If c$(3) = "}}" + Chr$(10) Then i = i + 1
                End If
                If cb$ = "OutputEnd" And Help_LockParse <> 0 Then
                    Help_CheckFinishLine: Help_CheckRemoveBlankLine
                    Help_AddTxt String$((Help_ww - 54) \ 2, 196), 15, 0
                    Help_AddTxt " This block does not reflect the actual output colors ", 15, 0
                    Help_AddTxt String$(Help_ww - Help_Pos + 1, 196), 15, 0: Help_NewLine
                    Help_BG_Col = 0: Help_LockParse = 0
                    Help_Bold = 0: Help_Italic = 0: col = Help_Col
                End If
                'Text Block
                If cb$ = "TextStart" And Help_LockParse = 0 Then
                    Help_CheckBlankLine
                    Help_BG_Col = 6: Help_LockParse = -1
                    Help_AddTxt String$(Help_ww - 15, 196) + " Text Block " + String$(3, 196), 15, 0: Help_NewLine
                    If c$(3) = "}}" + Chr$(10) Then i = i + 1
                End If
                If cb$ = "TextEnd" And Help_LockParse <> 0 Then
                    Help_CheckFinishLine: Help_CheckRemoveBlankLine
                    Help_AddTxt String$(Help_ww, 196), 15, 0: Help_NewLine
                    Help_BG_Col = 0: Help_LockParse = 0
                    Help_Bold = 0: Help_Italic = 0: col = Help_Col
                End If
                'Fixed Block
                If (cb$ = "FixedStart" Or cb$ = "WhiteStart") And Help_LockParse = 0 Then 'White is deprecated (but kept for existing pages)
                    Help_CheckBlankLine
                    Help_BG_Col = 6: Help_LockParse = -2
                    Help_AddTxt String$(Help_ww - 16, 196) + " Fixed Block " + String$(3, 196), 15, 0: Help_NewLine
                    If c$(3) = "}}" + Chr$(10) Then i = i + 1
                End If
                If (cb$ = "FixedEnd" Or cb$ = "WhiteEnd") And Help_LockParse <> 0 Then 'White is deprecated (but kept for existing pages)
                    Help_CheckFinishLine: Help_CheckRemoveBlankLine
                    Help_AddTxt String$(Help_ww, 196), 15, 0: Help_NewLine
                    Help_BG_Col = 0: Help_LockParse = 0
                    Help_Bold = 0: Help_Italic = 0: col = Help_Col
                End If

                'Template wrapped table
                If Right$(cb$, 5) = "Table" And Help_LockParse = 0 Then 'no table info in blocks
                    Help_AddTxt Space$((Help_ww - 52) \ 2) + "ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»", 8, 0: Help_NewLine
                    Help_AddTxt Space$((Help_ww - 52) \ 2) + "º ", 8, 0: Help_AddTxt "The original help page has a table here, please ", 15, 0: Help_AddTxt " º", 8, 0: Help_NewLine
                    Help_AddTxt Space$((Help_ww - 52) \ 2) + "º ", 8, 0: Help_AddTxt "use the ", 15, 0: ii = Help_BG_Col: Help_BG_Col = 3: Help_AddTxt " View on Wiki ", 15, 0: Help_BG_Col = ii: Help_AddTxt " button in the upper right", 15, 0: Help_AddTxt " º", 8, 0: Help_NewLine
                    Help_AddTxt Space$((Help_ww - 52) \ 2) + "º ", 8, 0: Help_AddTxt "corner to load the page into your browser.      ", 15, 0: Help_AddTxt " º", 8, 0: Help_NewLine
                    Help_AddTxt Space$((Help_ww - 52) \ 2) + "ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ", 8, 0
                End If

                'Small template text will be centered (maybe as block note)
                If LCase$(cb$) = "small" And Help_LockParse <= 0 Then 'keep as is in Code/Output blocks
                    wla$ = wikiLookAhead$(a$, i + 1, "}}")
                    Help_CIndent$ = wikiBuildCIndent$(wla$): iii = 0
                    If i > 31 And Asc(Help_CIndent$, 1) >= Help_ww / 4 Then
                        If InStr(Mid$(a$, i - 30, 30), "{{CodeEnd}}") > 0 Then iii = -1
                        If InStr(Mid$(a$, i - 30, 30), "{{TextEnd}}") > 0 Then iii = -6
                        If InStr(Mid$(a$, i - 31, 31), "{{FixedEnd}}") > 0 Then iii = -6
                        If InStr(Mid$(a$, i - 31, 31), "{{WhiteEnd}}") > 0 Then iii = -6
                    End If
                    If iii <> 0 Then
                        For ii = Help_Txt_Len - 3 To 1 Step -4
                            If Asc(Help_Txt$, ii) = 13 And iii < 0 Then
                                help_h = help_h - 1: Help_Line$ = Left$(Help_Line$, Len(Help_Line$) - 4)
                            ElseIf Asc(Help_Txt$, ii) = 196 And iii < 0 Then
                                iii = -iii
                            ElseIf Asc(Help_Txt$, ii) = 13 And iii > 0 Then
                                Help_Txt_Len = ii + 3: Exit For
                            End If
                        Next
                        Help_BG_Col = iii: cb$ = cb$ + Chr$(196) 'special signal byte
                        Help_AddTxt String$(Asc(Help_CIndent$, 1) - 1, 196) + " ", 15, 0
                        col = 15 'further text color until closing
                    Else
                        Help_Center = 1: cb$ = cb$ + Chr$(0) 'no special signal
                        Help_AddTxt Space$(Asc(Help_CIndent$, 1)), col, 0 'center content
                    End If
                    Help_CIndent$ = Mid$(Help_CIndent$, 2)
                End If

                GoTo charDone
            End If

            If cb = 1 Then cb$ = cb$ + c$ 'reading macro name
            If cb = 2 Then Help_AddTxt Chr$(c), col, 0 'copy macro'd text
            GoTo charDone
        End If

        'Wiki headings (==...==}) are not handled in blocks (soft- and hard lock), as it would
        'disrupt the block, also in code blocks it could be part of the code example itself
        If Help_LockParse = 0 Then
            'Custom section headings (current color, h3 w/o underline, h2 with underline)
            ii = 0
            If c$(5) = " === " Then ii = 4
            If c$(4) = "=== " Then ii = 3
            If c$(4) = " ===" Then ii = 3
            If c$(3) = "===" Then ii = 2
            If ii > 0 Then i = i + ii: GoTo charDone
            ii = 0
            If c$(4) = " == " Then ii = 3
            If c$(3) = "== " Then ii = 2
            If c$(3) = " ==" Then ii = 2
            If c$(2) = "==" Then ii = 1
            If ii > 0 Then i = i + ii: Help_Underline = col: GoTo charDone
        End If

        'Wiki/HTML rulers (----, <hr>) are not handled in blocks (soft- and hard lock), as it would
        'disrupt the block, also in code blocks it could be part of the code example itself
        If Help_LockParse = 0 Then
            'Rulers
            If c$(4) = "----" And nl = 1 Then
                i = i + 3
                Help_AddTxt String$(Help_ww, 196), 8, 0
                GoTo charDone
            End If
            If c$(4) = "<hr>" Or c$(6) = "<hr />" Then
                If c$(4) = "<hr>" Then i = i + 3
                If c$(6) = "<hr />" Then i = i + 5
                Help_CheckFinishLine
                Help_AddTxt String$(Help_ww, 196), 8, 0
                GoTo charDone
            End If
        End If

        'Wiki definition lists (;...:...) are not handled in blocks (soft- and hard lock), as it would
        'disrupt the block, also in code blocks it could be part of the code example itself
        If Help_LockParse = 0 Then
            'Definition lists
            If c$ = ";" And nl = 1 Then 'definition (new line only)
                If c$(2) = "; " Then i = i + 1
                Help_Bold = 1: col = Help_Col: Help_DList = 1
                If c$(3) = ";* " Then i = i + 2: Help_DList = 3 'list dot belongs to description
                If c$(2) = ";*" Then i = i + 1: Help_DList = 2 'list dot belongs to description
                GoTo charDone
            End If
            If c$ = ":" And Help_DList > 0 Then 'description (same or new line)
                If c$(2) = ": " Then i = i + 1
                Help_Bold = 0: col = Help_Col
                If nl = 0 Then Help_NewLine
                Help_AddTxt "   ", col, 0
                Help_NewLineIndent = Help_NewLineIndent + 3
                If Help_DList > 1 Then
                    Help_AddTxt Chr$(4) + " ", 14, 0
                    Help_NewLineIndent = Help_NewLineIndent + 2
                End If
                Help_DList = 0
                GoTo charDone
            End If
            If c$ = ":" And nl = 1 Then 'description w/o definition (new line only)
                If c$(2) = ": " Then i = i + 1
                Help_AddTxt "   ", col, 0
                Help_NewLineIndent = Help_NewLineIndent + 3
                GoTo charDoneKnl 'keep nl state for possible <UL> list bullets
            End If
        End If

        'Wiki lists (*, **) are not handled in blocks (soft- and hard lock), as it would
        'disrupt the block, also in code blocks it could be part of the code example itself
        If Help_LockParse = 0 Then
            'Unordered lists
            If nl = 1 Then
                If c$(2) = "**" Then
                    If c$(3) = "** " Then i = i + 2: Else i = i + 1
                    Help_AddTxt "   " + Chr$(4) + " ", 14, 0
                    Help_NewLineIndent = Help_NewLineIndent + 5
                    GoTo charDone
                End If
                If c$ = "*" Then
                    If c$(2) = "* " Then i = i + 1
                    Help_AddTxt Chr$(4) + " ", 14, 0
                    Help_NewLineIndent = Help_NewLineIndent + 2
                    GoTo charDone
                End If
            End If
        End If

        'Unicode handling (no restrictions)
        If ((c And &HE0~%%) = 192) And ((Asc(c$(2), 2) And &HC0~%%) = 128) Then '2-byte UTF-8
            i = i + 1
            For ii = 0 To wpUtfReplCnt
                If wpUtfRepl(ii).utf8 = c$(2) + MKI$(&H2020) Then
                    Help_AddTxt RTrim$(wpUtfRepl(ii).repl), col, 0: Exit For
                End If
            Next
            GoTo charDone
        End If
        If ((c And &HF0~%%) = 224) And ((Asc(c$(2), 2) And &HC0~%%) = 128) And ((Asc(c$(3), 3) And &HC0~%%) = 128) Then '3-byte UTF-8
            i = i + 2
            For ii = 0 To wpUtfReplCnt
                If wpUtfRepl(ii).utf8 = c$(3) + Chr$(0) Then
                    Help_AddTxt RTrim$(wpUtfRepl(ii).repl), col, 0: Exit For
                End If
            Next
            GoTo charDone
        End If
        If ((c And &HF8~%%) = 240) And ((Asc(c$(2), 2) And &HC0~%%) = 128) And ((Asc(c$(3), 3) And &HC0~%%) = 128) And ((Asc(c$(4), 4) And &HC0~%%) = 128) Then '4-byte UTF-8
            i = i + 3
            For ii = 0 To wpUtfReplCnt
                If wpUtfRepl(ii).utf8 = c$(4) Then
                    Help_AddTxt RTrim$(wpUtfRepl(ii).repl), col, 0: Exit For
                End If
            Next
            GoTo charDone
        End If

        'Line break handling (no restrictions)
        If c = 10 Or c$(4) = "<br>" Or c$(6) = "<br />" Then
            If c$(4) = "<br>" Then i = i + 3
            If c$(6) = "<br />" Then i = i + 5
            Help_NewLineIndent = 0

            If Help_LockParse > -2 Then 'everywhere except in fixed blocks
                If Help_Txt_Len >= 8 Then 'allow max. one blank line (ie. collapse multi blanks to just one)
                    If Asc(Help_Txt$, Help_Txt_Len - 3) = 13 And Asc(Help_Txt$, Help_Txt_Len - 7) = 13 Then
                        If Help_Center > 0 Then Help_CIndent$ = Mid$(Help_CIndent$, 2) 'drop respective center indent
                        GoTo skipMultiBlanks
                    End If
                End If
            End If
            Help_AddTxt Chr$(13), col, 0

            skipMultiBlanks:
            If Help_LockParse <> 0 Then 'in all blocks reset styles at EOL
                Help_Bold = 0: Help_Italic = 0: col = Help_Col
            Else
                If c = 10 Then Help_DList = 0: Help_Bold = 0: col = Help_Col 'def list incl. style ends after real new line
            End If
            nl = 1
            GoTo charDoneKnl 'keep just set nl state
        End If
        Help_AddTxt Chr$(c), col, 0

        charDone:
        nl = 0
        charDoneKnl: 'done, but keep nl state
        i = i + 1
    Loop
    'END_PARSE_LOOP

    'Trim Help_Txt$
    Help_Txt$ = Left$(Help_Txt$, Help_Txt_Len) + Chr$(13) 'chr13 stops reads past end of content
End Sub

Function wikiSafeName$ (page$) 'create a unique name for both case sensitive & insensitive systems
    ext$ = Space$(Len(page$))
    For i = 1 To Len(page$)
        c = Asc(page$, i)
        Select Case c
            Case 65 To 90: Asc(ext$, i) = 49 'upper = 1
            Case 97 To 122: Asc(ext$, i) = 48 'lower = 0
            Case Else: Asc(ext$, i) = c 'non-letter = take as is
        End Select
    Next
    wikiSafeName$ = page$ + "_" + ext$
End Function

Function wikiLookAhead$ (a$, i, token$) 'Prefetch further wiki text
    wikiLookAhead$ = "": If i >= Len(a$) Then Exit Function
    j = InStr(i, a$, token$)
    If j = 0 Then
        wikiLookAhead$ = Mid$(a$, i)
    Else
        wikiLookAhead$ = Mid$(a$, i, j - i)
    End If
End Function

Function wikiBuildCIndent$ (a$) 'Pre-calc center indentions
    wikiBuildCIndent$ = "": If a$ = "" Then Exit Function

    org$ = a$: b$ = "" 'eliminate internal links
    For i = 1 To Len(org$)
        If Mid$(org$, i, 2) = "[[" Then
            For ii = i + 2 To Len(org$)
                If Mid$(org$, ii, 1) = "|" Then i = ii + 1: Exit For
                If Mid$(org$, ii, 2) = "]]" Then i = i + 2: Exit For
            Next
        End If
        If Mid$(org$, i, 2) = "]]" Then i = i + 2
        b$ = b$ + Mid$(org$, i, 1)
    Next
    org$ = b$: b$ = "" 'eliminate external links
    For i = 1 To Len(org$)
        If Mid$(org$, i, 5) = "[http" Then
            For ii = i + 5 To Len(org$)
                If Mid$(org$, ii, 1) = " " Then i = ii + 1: Exit For
                If Mid$(org$, ii, 1) = "]" Then i = i + 1: Exit For
            Next
        End If
        If Mid$(org$, i, 1) = "]" Then i = i + 1
        b$ = b$ + Mid$(org$, i, 1)
    Next
    org$ = b$: b$ = "" 'eliminate templates
    For i = 1 To Len(org$)
        If Mid$(org$, i, 2) = "{{" Then
            For ii = i + 2 To Len(org$)
                If Mid$(org$, ii, 1) = "|" Then i = ii + 1: Exit For
                If Mid$(org$, ii, 2) = "}}" Then i = i + 2: Exit For
            Next
        End If
        If Mid$(org$, i, 1) = "|" Then
            For ii = i + 1 To Len(org$)
                If Mid$(org$, ii, 2) = "}}" Then i = ii: Exit For
            Next
        End If
        If Mid$(org$, i, 2) = "}}" Then i = i + 2
        b$ = b$ + Mid$(org$, i, 1)
    Next
    org$ = b$: b$ = "" 'eliminate text styles
    For i = 1 To Len(org$)
        If Mid$(org$, i, 3) = "'''" Then i = i + 3
        If Mid$(org$, i, 2) = "''" Then i = i + 2
        b$ = b$ + Mid$(org$, i, 1)
    Next
    b$ = StrReplace$(b$, "<br>", Chr$(10)) 'convert HTML line breaks
    b$ = StrReplace$(b$, "<br />", Chr$(10)) 'convert XHTML line breaks
    b$ = _Trim$(b$) + Chr$(10) 'safety fallback

    i = 1: st = 1: br = 0: res$ = ""
    While i <= Len(b$)
        ws = InStr(i, b$, " "): lb = InStr(i, b$, Chr$(10))
        If lb > 0 And (ws > lb Or lb - st <= Help_ww) Then Swap ws, lb
        If ws > 0 And ws - st <= Help_ww Then
            br = ws: i = ws + 1
            If Asc(b$, ws) <> 10 And i <= Len(b$) Then _Continue
        End If
        If br = 0 Then
            If lb < ws Then
                br = lb
            Else
                If ws > 0 Then br = ws: Else br = lb
            End If
        End If
        ci = (Help_ww - (br - st)) \ 2: If ci < 0 Then ci = 0
        res$ = res$ + Chr$(ci)
        i = br + 1: st = br + 1: br = 0
    Wend
    wikiBuildCIndent$ = res$
End Function



'===== Strings.bas
Function StrRemove$ (myString$, whatToRemove$) 'noncase sensitive
    Dim a$, b$
    Dim As Long i

    a$ = myString$
    b$ = LCase$(whatToRemove$)
    i = InStr(LCase$(a$), b$)
    Do While i
        a$ = Left$(a$, i - 1) + Right$(a$, Len(a$) - i - Len(b$) + 1)
        i = InStr(LCase$(a$), b$)
    Loop
    StrRemove$ = a$
End Function

Function StrReplace$ (myString$, find$, replaceWith$) 'noncase sensitive
    Dim a$, b$
    Dim As Long basei, i
    If Len(myString$) = 0 Then Exit Function
    a$ = myString$
    b$ = LCase$(find$)
    basei = 1
    i = InStr(basei, LCase$(a$), b$)
    Do While i
        a$ = Left$(a$, i - 1) + replaceWith$ + Right$(a$, Len(a$) - i - Len(b$) + 1)
        basei = i + Len(replaceWith$)
        i = InStr(basei, LCase$(a$), b$)
    Loop
    StrReplace$ = a$
End Function

Function AddQuotes$ (s$)
    AddQuotes$ = Chr$(34) + s$ + Chr$(34)
End Function


"So what is this, and what does it do," you ask?

It takes a look at our wiki and basically does the same thing externally that QB64.bas does internally with the Help menu -- it downloads our wiki in a simplified TEXT format.  

Now, one important caveat before you guys load this and run it:  Save this program in a directory by itself, as it *WILL* download about 870 files from the internet into that directory.  If you run this is your main QB64 folder, and come back later to complain about the mess it made of things, I *WILL* giggle at you and point at the big red warning here.   Remember -- make a directory for this program, save it inside that directory, and OUTPUT EXE TO SOURCE FOLDER.

Or not... And have a very cluttered directory which this download tons of junk off the web to...  The choice is yours.  Wink



I just figured this might be something nice which folks who code without using the IDE might want to use for offline reference from time to time, without having to grab the whole wiki itself.  

Note2: As is, this doesn't download any of the _gl keywords.  We almost never see programs which use _gl commands in them on the forums here, so I figured there wasn't a large demand to have those files downloaded from the wiki.  Why waste bandwidth and tie up the wiki with requests for something which folks don't generally use?  The files which are downloaded here are all the QB45 A-Z commands, and all the QB64 _A-_Z commands.  Other pages can be added later, if wanted/needed.  Smile

Note3: This is still a work in progress, hence the forum I posted it under.  Don't expect it to be 100% glitch free yet. Big Grin

Print this item

  Either 0.7.0 is bad, or I'm doing something wrong
Posted by: hanness - 05-23-2022, 04:05 AM - Forum: General Discussion - Replies (8)

I downloaded 0.7.0 this evening. I deleted all files from my 0.6.0 location and extracted 0.7.0 to this location.

Problem 1: If I go to Help / About it still reports that it is 0.6.0.

Problem 2: My program that compiled fine under 0.6.0 fails to compile on 0.7.0. Something odd about this as well. My program file is named "WordClock 1.0.1.9.bas" but when it compiles it, an EXE called "WordClock.EXE" is created.

If I rename the program to "WordClock.bas" it still compiles to "WordClock.exe", but I still get an error and the EXE file size is significantly larger than it was with 0.6.0 (5.53MB vs 3.54MB).

Error reported is: C++ Compilation failed (Check .\internal\temp\compilelog.txt)

The contents of that log:

internal\c\c_compiler\bin\c++.exe -w -DGLEW_STATIC -DFREEGLUT_STATIC -DDEPENDENCY_NO_SOCKETS -DDEPENDENCY_NO_PRINTER -DDEPENDENCY_ICON -DDEPENDENCY_NO_SCREENIMAGE -DDEPENDENCY_LOADFONT internal\c/qbx.cpp -c -o internal\c/qbx.o
internal\c\c_compiler\bin\windres.exe -i internal\temp\icon.rc -o internal\temp\icon.o
internal\c\c_compiler\bin\objcopy.exe -Ibinary -Oelf64-x86-64 -Bi386:x86-64 internal\temp/data.bin internal\temp/data.o
internal\c\c_compiler\bin\c++.exe -w -DGLEW_STATIC -DFREEGLUT_STATIC -DDEPENDENCY_NO_SOCKETS -DDEPENDENCY_NO_PRINTER -DDEPENDENCY_ICON -DDEPENDENCY_NO_SCREENIMAGE -DDEPENDENCY_LOADFONT internal\c/libqb/libqb_make_0000010100000.o  internal\c/qbx.o internal\temp\icon.o internal\temp/data.o -o C:\Users\hanness\Desktop\WordClock  internal\c/parts/video/font/ttf/src.a internal\c/parts/core/src.a  -static-libgcc -static-libstdc++ -mwindows -lopengl32 -lglu32 -lwinmm -lgdi32
internal\c\c_compiler\bin\objcopy.exe --only-keep-debug C:\Users\hanness\Desktop\WordClock internal\temp/C:\Users\hanness\Desktop\WordClock.sym
internal\c\c_compiler\bin\objcopy.exe: 'C:\Users\hanness\Desktop\WordClock': No such file
mingw32-make: *** [Makefile:346: C:\Users\hanness\Desktop\WordClock] Error 1


My questions:

1) Other than extracting the files, is there something else I should be doing?

2) I am running on what may possibly be the final build of Windows 11 22H2. This is as yet to be determined, but I thought that it was important that I mention this. Is it possible that this could be contributing to the problem?

One last piece of info: As a test, I disabled real time virus scanning to be sure that is not a contributing factor.

Print this item

  Map Movement Example
Posted by: SierraKen - 05-22-2022, 11:09 PM - Forum: Utilities - Replies (4)

A couple years ago I got this code from Felippe and made a cave shooter game with it as well as a gold hunting game. Today I decided to use Felippe's original example and add my own funny little game map to it. You use the arrow keys to move your guy around the map I drew. The map itself moves unless you are near an edge of the map. This is just an example but feel free to use any or all of the code as well as my map but please keep my "SierraKen" name on the bottom right corner of the map. I'm no artist as you can see, but I like it. Attached is the zip file called Map Movement Example.zip with the .bas and the .jpg files inside. Put both in the same directory. Tell me what you think, thanks.



Attached Files
.zip   Map Movement Example.zip (Size: 725.78 KB / Downloads: 73)
Print this item

  Announcing QB64 Phoenix Edition v0.7.1 Release!
Posted by: admin - 05-22-2022, 07:47 PM - Forum: Announcements - Replies (8)

Release v0.7.1 - QB64 Phoenix Edition/QB64pe (github.com)

  • If a .bas file had a space in the name, it would not compile properly.
  • When multiple instances of the IDE were used, the second instance would not always recompile the program after changes are made.
  • The symbol file was fixed to work correctly even when the EXE variable provided to the Makefile includes a path.
  • The version number was fixed to correctly reflect the release version.
  • Fix to windows setup_win.bat cleaning up the mingw compilers after installation.
  • Fix to IDE freeze occurring due to invalid line endings coming from git.
  • Fix to Run Only not deleting the temporary executable on some distros of Linux.
  • Fix to _DESKTOPWIDTH and _DESKTOPHEIGHT. They no longer require a valid window handle to generate a proper response.
Enhancements:
  • IDE wiki parser has been enhanced and replaced for more versatile and professional looking pages inside Help.
  • Creation of a new MakeFile system.

Release v0.6.0 Notes
  • Add "Run Only" option to IDE menu.
  • Swap out PNG library for modern version -- we now load PNG files about 30% faster.
  • Fix to page width with variable width fonts.
  • _Bin$ added to the language. (see wiki for more information)
  • Removed/Replaced several more links which were pointing to the old qb64.org sites and forums.
  • Using the number-based $VERSIONINFO flags will now also set the string versions of those flags, if values for them are not provided.



Release v0.5.0 Notes

Another step forward in making our first version "1.0" as the new team working on QB64. This release (version 0.5) now:
  • Has swapped out the mingw compilers to updated versions for Windows users.
  • Reduced the size of the repo considerably for those who wish to download direct and setup QB64 manually, for whatever reason.
  • Prepacked Linux and max versions of QB64, which come in at less than 10MB each now.
  • We've swapped out all the references to the now defunct .net and .org sites that we could find, and replaced them to proper, working links which now connect to our new wiki, forum, and all at qb64phoenix.com.
  • $Color:0 and $Color:32 has now been tweaked to work with $NoPrefix. Color names will remain the same in all cases, if $Color is used without $NoPrefix. When $Color is used in conjunction with $NoPrefix, the colors of Red, Green, and Blue which would normally conflict with the now underscoreless commands of _Red, _Green, _Blue, have been altered to have NP_appended to them (for No Prefix). Example: Color NP_Red, Orange for a red on orange color.


Click on the big title above to go directly to the release page and grab yourself a copy of the latest version for all your QB64 needs!

Print this item

  Scrolling fog/cloud image for moving background
Posted by: Dav - 05-22-2022, 06:16 PM - Forum: Programs - Replies (15)

Here's something I made to use for several things, thought I'd share it here.  It's a scrolling fog or cloud background you can easily add to programs.  The image is seamless so it looks like the fog/cloud just keeps rolling.  I threw in a flying witch to show how you can use it as a background with other things.

This uses a real image converted to bas code -  I'm trying to figure out how to make a good looking seamless fog image using just QB64 drawing commands instead, so I can eliminate using a real image (and a lot of BAS code).  Anyway, here's an example of scrolling an image as a background.

- Dav

Code: (Select All)
'=============
'FOGSCROLL.BAS
'=============
'Scrolls a seamless fog image on screen.
'Coded by Dav, MAY/2022

'I made a seamless fog image in a paint program and
'converted it into BAS code using the BASIMAGE program.
'This demo puts two images side by side so it scrolls them.
'The result is an effect of a constant moving fog or cloud.
'You may freely use this in your programs.

'I threw in a flying witch to show how easy it is to use.
'Press SPACE to raise the witch up.


SCREEN _NEWIMAGE(1000, 600, 32)

fog& = BASIMAGE1&
witch& = BASIMAGE2&

DO

    '===================================================
    'This way scrolls fog images left...
    _PUTIMAGE (spos, 0)-(spos + _WIDTH, _HEIGHT), fog&
    _PUTIMAGE (spos + _WIDTH, 0)-(spos + (_WIDTH * 2), _HEIGHT), fog&
    spos = spos - 6: IF spos <= -_WIDTH THEN spos = 0

    'Use this one to scroll right...
    '_PUTIMAGE (spos, 0)-(spos + _WIDTH, _HEIGHT), fog&
    '_PUTIMAGE (spos - _WIDTH, 0)-(spos, _HEIGHT), fog&
    'spos = spos + 6: IF spos >= _WIDTH THEN spos = 0

    '===================================================

    'Here's the witch code....
    'if pressed space, move witch up& forward
    IF INP(&H60) = 57 THEN
        witchflyy = witchflyy - 4
        witchflyx = witchflyx + 3
        spos = spos - 2 '<-- scroll fog faster too (remove it wanted)
    ELSE
        ' else wich drifts down
        witchflyy = witchflyy + 2
        witchflyx = witchflyx - 1
    END IF

    'keep witch in screen bounds
    IF witchflyx < 5 THEN witchflyx = 5
    IF witchflyx > _WIDTH - 100 THEN witchflyx = _WIDTH - 100
    IF witchflyy < 5 THEN witchflyy = 5
    IF witchflyy > _HEIGHT - 100 THEN witchflyy = _HEIGHT - 100

    _PUTIMAGE (witchflyx, witchflyy), witch&

    LOCATE 1, 1: PRINT "Press SPACE to fly...";

    '===========================================================

    _DISPLAY
    _LIMIT 60

LOOP

FUNCTION BASIMAGE1& 'fog.png
    v& = _NEWIMAGE(262, 198, 32)
    DIM m AS _MEM: m = _MEMIMAGE(v&)
    A$ = ""
    A$ = A$ + "haIcMN]\\DT\4mkk>J=`XH6DSF;nmiJma\2;`7G5IEKP7B3>k^kBVa:m`SXj"
    A$ = A$ + "nkomonOn?h7l3nO6o`Oh?loIlSnAoX_dh7oSoafa?iWlCnO6Zgc?kWmcTSOj"
    A$ = A$ + "?mWJ7_N?_gkmN_Kln_okoiO`7l1eSG_oiPmj^?o?oWocoRa_hGl;Nc6_fn=7"
    A$ = A$ + "3\SSOi_lGJ7Zm7Kk=oLoZOe_j;=neojOmocO3gGh[Omi`Qjcnjen`?l3olOc"
    A$ = A$ + "_igliofOk_mcoX?jSNghSoh?n;6ObWl9OYaeOojmR_OleEKW?mCod_dhcn\?"
    A$ = A$ + "k;=^nkZmi[a[SiGSG7oGSiilll>M]LN_kJnaL^l[h1Gld<NlEll<Fok;h2<f"
    A$ = A$ + "0b5L\16CPa5^N_GagKI2<^P:FVmJ9^#:6l9i2^He_Ya5Hag=cSE<2T9POnik"
    A$ = A$ + "Kb5H\16G0S?Af0k_oFa4HL1fe]V[U\i7Wb5V\QGLQ[a9J6D\Q6N0b5Vai=l0"
    A$ = A$ + "7GhTaGW<17GhJOLZVU]<17GhJkaH0\i`=W[Ye6I\S=\Qkb5#VPJdb4VLQGW7"
    A$ = A$ + "]\DljWJMS9G`a6HLQ;f`T;<I3<VPR?TbWXIP\1L<I<>^`Cc6`o^S=Pa#gQOP"
    A$ = A$ + "O^=<;W^oCH3ZHjfeaLG7D\1Fn38GhR=XbY`5WZh2ZlABl0LOQL05C#UcDcm7"
    A$ = A$ + "ej68GPa6#^0b6JmF#a6Vae^hNV>3lcWh1h#a5N:fPj_WH3W<D<Q=NUTRk>9O"
    A$ = A$ + "RkXoHciLCn6:f#b_15GhjmYn<9o5fb4Vi>LMLghM#cJ7\i\:^0;?2<>mDV`T"
    A$ = A$ + ";hbI#a3#f06[kh1=LQ6fPcW1gWY9>oTHIgfX=_W_>I3KelL2KPU?A3K#a5BN"
    A$ = A$ + "AZbY0i1cmaT1hH2XFQfLjLcEJe:<SaH[Sch1X74calmZh2Gk;77PYG`=HNGT"
    A$ = A$ + "h2=l1F<GJKhRW?aCcCH2^]kMh2gUGdXkQYmRa7Di^hh38KHkXQ=hZc1b5`1b"
    A$ = A$ + "4^h2=iBVFcYA[PR;PaJ>_3DLQ;f#;GPi71j;aMh2gU=hh1Kh2KeOXRWMg_gX"
    A$ = A$ + "Kh[C^#ceVFOCMlQkb6Vjlg`=BK_97PiW`eXQ5hH09V#3GP=fTg0Z]h^j5JI2"
    A$ = A$ + "ZnN0i2GSCi3Kh2hli6^]kh`U[1KkeV?aC`6NBV#R;dh7a6fP:^WY_giE8SKT"
    A$ = A$ + "lFLVSSCS#KnW]ijfj]06O=og\hF6;Pi1aT;Pk;WN1FM<>Q;XH3^hK5K8mIBm"
    A$ = A$ + "6Q;o^]<Zf]IKn9YeNKFcjYH2KbUJniO:fPZ^0ceeE3U7R\m3b5HN9Tl885cg"
    A$ = A$ + "^nFR;`R[D[Y[h2X62Go:`h<Ki2ZJM`lP\Ec0N=]96NniJhh:=LKc]YI>aVh]"
    A$ = A$ + "Cm4XMKL2C`U3ES?49fP:^MZ]7m`T=BLS[m3jS0CW`6O3g^^bG5LQ]eZL^OHK"
    A$ = A$ + "WF=3hO7o_^JCdb6>Ihb[;a4`S[Ch2=j;f^VLK>]:^`6_aB7GYL=Bn=Xjo9F]"
    A$ = A$ + "1Va]<fPSchH5Wb4^>_IckJVoXVc^YN4]iATh4\j:hh2>M3^jVTb_HSVQk`<f"
    A$ = A$ + "\V^S9TfFKI7KR3ClRkbDDi0dlJ<N[JK\]F5\lmaHGfcZQKk`h1<V`<7RT_;Y"
    A$ = A$ + "eE^V7]AW#3G8i?XJ]m=mmH;?Y]W9Ki2=\1geKGLl6^`MgFKFCXQ?L:;i4N`M"
    A$ = A$ + "6:m2]\Q4S#=B?[7]iJTH2:^`6V0Cg0KM_ioEe_SYhZTG0]\S=iRl4LQD^4c["
    A$ = A$ + "Q^[aY?K;GXE[`F]PKeaTH2=lQ_:i1Gj[MLQDN==m4UREdlLPMRn3E]MDJSBJ"
    A$ = A$ + "oMcWJd9Wh2Gk7FO9f4cW6]NC`b5iDfPZ^U:>0nOEOFF\W;6]Ekafhm]i2MgL"
    A$ = A$ + "#N2_8`HgkXG8]OBeM1I5ZHHGn9ZLDBK;VW<:VPS;\Y^K^iV<^`LkoF`5fdC4"
    A$ = A$ + "?5G#mLFVd7Th2ZhCE<?bM>ASBkmfCeTlTNCLgL#V_?Ug2:M?=kWF>1[O2H_O"
    A$ = A$ + "7SPa4L\AV?SYiZ]\Q4_Aa5^NMG^4_U<Q=KcCi2W>JI2gMohb1RM?^U=`V_lF"
    A$ = A$ + "b3LK?FlYCWQcKUF^fFn`fnf#UKBZo4#NX;VMkLDge\Cd;Pn?NWhgWV7\Q=LB"
    A$ = A$ + "lhV[iCV0;^NcaUkmj^OkV3]U=LWho=aY<?4Dj3Jc7J;[k4O?Ci3Qj7BN8Xd5"
    A$ = A$ + "QgCMcAJVS^U;XjQhVj:f`3DlQkhAQR=Tj9JeJa=a]9OMBaf^NbTmN`gG:NVM"
    A$ = A$ + "\dTgdefMC<D3C8aMDL15C8i]cflTJbaIK^A^lAJd4i>_C[gdXGHSo2ZH9\fR"
    A$ = A$ + "KG__=nWE?dWR;`HMK6=L1Lmi4C#Y_1_>`jo2eLO5SJ3O`57YRIJH2H<ZK=gV"
    A$ = A$ + "HSiiRKNNkJU?InC9O>K_nih2^njea5B3L>\Jn:S;TnnNL3G8iUH:7TWbo1ll"
    A$ = A$ + "]Ec0coWV]OK_RLMlWh2WV7JKNYGa>]L1lhi]T;dL=YUKeXahD?<Ln8T>fJd;"
    A$ = A$ + "dNMIcJKZebH[o[h2<f`C`5^S_4G_F3K`]N>cgQ=l0LO`>gEGc#^#:>#iE]Rc"
    A$ = A$ + "]a3U9KP=W^I>HS6TWV;PkGfaGJk\UCL2GXUekH3^cYD^T8k9]N=>WMSNQkXo"
    A$ = A$ + "_U;hl`0I3]JDH[W[hc]iT`^VZd5ih2=[5dVCJkJ>H\l6V#JKUlad=Wn^<16C"
    A$ = A$ + "LSfk=J9Je6]E3XJ=[]LQTFQ4GhY[YPcO1Lkglm:Wkin^mLEa]fj?1C[#ciYc"
    A$ = A$ + "S1E<AKn=YlCMLQVeMCa_=ic[b9I;CH^o`]E[FZdiD;K`EOSWP;TVSPc;BcED"
    A$ = A$ + "a:YeQObJ=^U9XH3Kmnh^JJJi6WVK4^]M[9X^?k^GWh2ZioKH2\HH7KHSG0]J"
    A$ = A$ + "lC<Q=JYJiV=jRHLQif^ImMT]enIL3G>f:o2^;KHSo0]NJ\imMbaNS635K0I2"
    A$ = A$ + "G7C\OK>LL1dc3eL0gmiT?:Z][CKbVeFEaA^L8^;CPU;RS;ThmKH3]<QCH]Zc"
    A$ = A$ + "Sfi5:=BY[9OCS;hRSVo=g_7>]\RCh2:f0S;PofLPonL`fVcoM[?RYik>f#:F"
    A$ = A$ + "_EgMCLm9LQdjccoFJMFee8eme6=E]i:ehSB;KHclQCc3nD^`lcaRa>Q;XRQD"
    A$ = A$ + "lPVgoVOo\^SW4cg;NLnmnNO_8G8aOJ^_OWLPHakZeYfb5#f#BoOR;XdWkFcD"
    A$ = A$ + "MMRM=OKnFOEb5N;h1c[;HLIR;Lb_MUYhYin\E7`ELfLd`9LoVJUlGPMMBa4V"
    A$ = A$ + "<>ea9S=dhm`C>^kL8U63V>idJoZ?CCnlHlfF=E:^PCGE;KX9GWkh?`Ca3#]2"
    A$ = A$ + "]LQ=[1_U;XbS#5KSaJ=lQFml9V#[f7gaY;?9WNV=ig\Ag3nifb6Dj7JRSBLQ"
    A$ = A$ + "=n=fToP;726GHnI#]BW`5JmFH;CH;o_INbF^#k_a]]j7fhM`ElfgmknMol_c"
    A$ = A$ + "gikl^a[ooG3GLXj_[dc[^6i>gH<Q[S=lHLc_C`K^FjdT]mc]97ld`UKP:FYU"
    A$ = A$ + "UP<QVe4MWKY?cD[DSo9^JBfb4J?OLg;g`4Jh2YLk?eS?gnB]mAV`LPaP:Nal"
    A$ = A$ + "_oJkg4gi>?#_AD<1faC[o8ZSaCSoE\^=J=f`6JlPH3G`EgQ]iAiFKMNnchQh"
    A$ = A$ + "ai6?EKh2KHL]LnVi?^hHUOO>]kWDc`=i\PLQ_mgnKo537WP5[Vd<Td:<?NIl"
    A$ = A$ + "P6VUB7a9efL;KX=W57G4eGoFb5HN9PJ4>A_3;g8V?LKH3=eIAMnORFQFmOKV"
    A$ = A$ + "K`RQClPdJOK[GH3C0cQh5;hKm]nF_K<i38S857N7>F3CXU?TH3^hg]J5BLQF"
    A$ = A$ + "mB\l^EN<`ReEa6:miHm8Ej4LWg:^P:_m4Ghe#YGX]6=>fPSIeL__97Q]L17C"
    A$ = A$ + "XI^mVj6jNMVNQ9G8a7BaOW`6#FER9d`:J?fN:>`F^0;n#a4LeZHC<36_QeMX"
    A$ = A$ + "=>AMlkb5J[V17G0oK>?9EJ6N:^#[NQiL?Woo^inKd4ObH63N5gSL1TAP7OKZ"
    A$ = A$ + "[IbGU9cTMMaUSc6fPRGmTlP=KCELa6^P:oQ6_6Mi?\A_CSoY=N<`d;Tn>GXi"
    A$ = A$ + "l[YV[>O1JWGTh2\e\?ESLK^5]j9#m2=LQYn1TKeF3C7CHNM1_Fhb[Aa9^KN>"
    A$ = A$ + "]<1UfSV][;Fj4^`F_6W[WRiJ_Q5fXkaiU9NnSj5Jn^HICmFKh2gE3XkjG3Gh"
    A$ = A$ + ":>h^nXM2GhefHV71b6nonononR1CgPR;TdAXZ1:b:W\0E^==NQXj1Zk<>a_7"
    A$ = A$ + "<6B]fjYJ5LN:db5#]2Ke7=i2:oAVk75C`YG`MNUZGKZ_5LJo?EWHJnScK1gO"
    A$ = A$ + "[YGNLn;X>^HN?>S1WL16KPa5Bm6U[?ZLLQfA;Gh>NSZ^^gX1E5;\Idj9OKL3"
    A$ = A$ + "C_`Y\Q[c?fa:S?`^>hh2KlMdEoBeab\VA=a#=nEe`5Ba6]S=ma3NlZh2]\Qg"
    A$ = A$ + ":^`MI3KH2\[G=i?NbW5e<gZ=`iI`MH2X>KFmkLN<db5JZSX;gWigo29f`9<1"
    A$ = A$ + "U>V6FHkj3GK;fe>GneHlcG5L1T=XlhCU?agdi2>O5J_Gfjg6;f_9oikZ9h4O"
    A$ = A$ + "hLL1E]mElQDN4KhHhimeagV__GCLQdnFYIH;G`]fPS=TlXC5GMG^PbSD6G#a"
    A$ = A$ + "7HN?VRm?U;P\Q6o5fXEXmnIK<_ZWNfd;B]an=?WQKRQHiMgd;P>^0boLWKG7"
    A$ = A$ + "3<]2GOW#_il4SkKHBKmHYIN4[f;>=X9n0;VJ[o2]L1dO1EmADaOOEc5L\Qg2"
    A$ = A$ + "^P;nOC^0KSEM<QdgiQ?1GXQ=Th2\[=Zc?l_ojlQmk?IkcOMb;RTW7=i#iV7e"
    A$ = A$ + "d[XY]WbGBUNQCh2\l8^f^^hn[h;F_8g4koe=G8a6Jd:hj]PfelKn>8J>oFmj"
    A$ = A$ + "ZO7j>Q=XR=Bm=lFfPbGaii9SmenK]gMh3hi]R3Vb3`YGXYoYMjAJmGh9lF7c"
    A$ = A$ + "QP5SQ[iV>NN2^PcSQCi2Yl^Lg;E<Q=ij[R]Co^]Qo=g_o:KH3YHS4G#iK?b5"
    A$ = A$ + "L\Qie5fi9nkMIc_aM>6ASFQ6fPckQfl?KmbJ;G0WWkhG=L1U?2_N=63J6S?O"
    A$ = A$ + "mCi2\GK[oS^WI26;=a4Li;LR7P]LQVQkgTYdgE1]a6Zn6ViK?K=cDoJQi4in"
    A$ = A$ + "=bfmKFkFm3ZJEL2Kh4oX`?OBGbfjH^Q;Xd\`h2cnDhELf[meLkah3:VA3G`m"
    A$ = A$ + "jYN2]Q9TH3]<QI?gLJm1N[H3_EOGZcF[O6g\U;`j?QYf0f_SegA_0;_<7K`i"
    A$ = A$ + "e`fQcKVdW1eT\Q=XVOcdeidY<mGHFCBT;TlKY]V;>]m\gKkc#US9TN>9DN<b"
    A$ = A$ + "R;^Km4N:^#k_=C>f063hd8Pa==iBXlPLb5#V`_nGo[Yo6gWhOK6=N>TZO;;V"
    A$ = A$ + "gmnLlQfldJbY`a5LilldL16CZU9PaW>M7YhNFoQN:KHC>4Ki2ZJ:hd4lTl1F"
    A$ = A$ + "M8BeJMN^?SIJlN4_6jd:lR9L=JH3>OIgj=9;O[D>6W>JI9<M39f`6^P;gU[h"
    A$ = A$ + "7VgNGLQTGnXO<8K`iKJb7f=N^hl`\U=hd<Xh2YJ^M2G8mKj\;V#miAf#R;X>"
    A$ = A$ + "_A=3ZiK9^0b4n`?l3OgPa6J^>LGm4W`8L<S=<4Wo6ZL:BJ`Kd;`lCMb5DeT8"
    A$ = A$ + "a5Hi6=?nM<1<VTa7^;K8UC1bVBc[EeP_MmX6?6#ogLe`W]=MNg=eAg<?7?OW"
    A$ = A$ + "a9ci]YNn0i2C]2CV`Y\Q6mB]J;N2n`6fQkmid<hFgMCN49^0[?6HN3RL1VnW"
    A$ = A$ + "if?YE`eW7?=G#Mm[a[1Gmg_cJE:^P:^fi[f<N37c]1>7?eKFHLbT;XlGo9h2"
    A$ = A$ + "G\QTG39=Fhe^FnQS=TZY1jE;6ccN_^N\Ri]gF^PcgALmLF=1Cm^4S;PNEgLL"
    A$ = A$ + "kZGb9J6Ln<\Q?ijQQYFHVnmkb7Hae:=3<V#3GH6OcbC#a4HiPdha^S;PiAPL"
    A$ = A$ + "15KHN]VEkfClVYEk#3GXQKXHb]\1EL1;nGi;HR;hjYAElddS9DoC:O2F]2I\"
    A$ = A$ + "1V7T9]1:?IDl]D=XEL1gjEYN<#a6LL1efAU32KKP[3jd=kR;Li?k^fYlL\Ec"
    A$ = A$ + "0kJ2N>O7?KgTG1[f>=ak9=JKcWXQ;Pe=BUo^[O1JR_De[NNNdb5DNSb>FMOg"
    A$ = A$ + "DlF`4Jh29V#;K8U7PK]#enTaE`ik<Mc>ojKZU1kJW[F48GHb7Hme0NNUhX]i"
    A$ = A$ + "CTbY`YOZ=^?=`]5j1PS=<ceGUSNR;XH3][kjZ=1CKRS[hZKBC]KC\0EOGhh1"
    A$ = A$ + "Ki2\hIE?j\9?2gf;=D<UFOiCa1]n]O7^PS=T^^TRggjIIRE^Q;`b;9i1Y:O2"
    A$ = A$ + "fLME>jZQcCC7C#a5DjFDNXf4GVf6>O7LNUVZUkK9G8eG_KH2Zn3\UQhR3Vj8"
    A$ = A$ + "DL1gLhWT;PJ6J>OO:^#:_?geTFV#;G`U?a<nHn_g`5LaHZn?ZQ;`RmH_^Z60"
    A$ = A$ + "9f#RARJADk_Dm7N:^`LNLZNK=\5LKaj38fn[ASaFOiKW7o==^#[g<]\Q6o8E"
    A$ = A$ + "\0G=>LL1EoTaRcDeMH;CXU;`>6Di`gh3ZBgPjLYIOVbW2iA:OcLL1EM0La^>"
    A$ = A$ + "moW`4HngWdMORo7Yjem=9^`6fPbKV=J6BLQD_afb5`iV:]iYjAf6?eFC`FV#"
    A$ = A$ + "Km0aSCF_FhH3KI2\QZWDCeJSYIH67cREEN[gV_0S9TlaGES_]a2][=RcU_ng"
    A$ = A$ + "YNPn4^#RCdX1`iIkfL9DGGJjKn=LfTGL>^`ekEEg?F<N:WminDa5JZOQjhdY"
    A$ = A$ + "I`iM:S9X^Vd`4D[gUh2cijcHHeLlDN0KI2>_jfFc4FLdYmh3;o[WT;d`6LiA"
    A$ = A$ + "h^FhH2:f0N=ZQ;hj;25G#5G`j10F_YRe6PiIX[>5H]5Cik[h2>fPbc?7GPMn"
    A$ = A$ + "\Mkg`4Vc]MmkXR=hVc[Vkkh2GOVOc_iglo<H\QfLG`H8L=cF^PJmbWR;hlCQ"
    A$ = A$ + "a:Be1ZQ;`jUmfjHVjo167Aa6JR=HNZch9<M6:=gZJ2nj_=SiLNRbbU`]VNZN"
    A$ = A$ + "0^jL`>GfZ;#e;J\el`kc>o[Dck_RQo]ofOkk6Gac]\1ffhJkP\QDN4<mhZhS"
    A$ = A$ + "]n\YH2_6>V0bifZ[:ie[kNF[NQ]mi#C_Aid#Pe\T]n_R;\974F^gKh2Km3<e"
    A$ = A$ + "g3ZljCN\dT3aC`4`kKWb6VacOd7mA_Kdb6Vj5#V`T;PK;7G#E3Sk`5`if<OJ"
    A$ = A$ + "EGGDJPJZoR:o<V^Q4C8a6fd_3<Va6o8HJ7D[Kf<__aKOGn6hJn9O3MN2Zd?X"
    A$ = A$ + "hJ\nW<iEbF^#3CPYGPa7BiDPacG<16K0S3H3T=XbU8U7QR;P[cNZ7KKH28W3"
    A$ = A$ + "eCe`7BeU1I3ZlZLN?NJo>XlRXeSB7K`USLboBV?OZl=H[aWlhdYM`ecA\LQD"
    A$ = A$ + "7oWb5HKGE?XdXG#YK#Egb[iY>^P:nFa:BiTgj_`YL16K#a<ajf`HU^1NmPa6"
    A$ = A$ + "BnlfFGVTVQD_#QL2TIdhc0NMLNmVUCAR9hjk\93#U3OC^k]ighb[#m\BXFO7"
    A$ = A$ + "I3KIG:^`F_cBLQG36GH67`h2Cf0b7fXSHKM:Cnj_Q=hdBYh2CV0kJ2b<E\15"
    A$ = A$ + "[TEOHF=:BL1f8mj>m4KH3<=J=mQNJ=?Gn58K`a5Ll4G>5YJQfTGQRO]Q;`hX"
    A$ = A$ + "\id>_cL3VNI6G#YI0I3^l3fh5W[N3\NTPa6Hc[CN\k^^PL15CPYUB5kkd>Qn"
    A$ = A$ + "#jRc_;G0o\ZLBLnAZnkYn5AE3=6C9egD:Mj:M2=eAmDf`<n^UOYZCYkH?UOP"
    A$ = A$ + "Kn]jnjC`5JR5H<Q=m0HR;hbW`=_6W7gb5BG?DJXDLRT?;KH2Ke3\=WT]e_HK"
    A$ = A$ + "?S<_?XlaDE7d6_9Kbmga6Hmk#jIMR]oMJKDn;P7o=GkLN:VZO5cgAEm4B\Q6"
    A$ = A$ + "^`Y<QCi2^cOU>ZFo5>Q;<_nXZUaMh2]\1W7>\LbLe_XQ;LZ6Glcil[#iE0VO"
    A$ = A$ + "NjiiXEgPS;TnNJ8EcFd?eFV#:gP[kmKVSTh2Yh1W^IF=jKW;Wh2YlaM<2W6Z"
    A$ = A$ + "FO7g`4`[A=mhU;F>a4Ic5L\0E>I>n#:G]W#W;b6Lm6Qcc^VW1d6O6LiATn>L"
    A$ = A$ + "YU9`lWmDV0C7`9LQVN#8a4DccIjlCeLWU[c9LQ4W0_N\]N4Zl5f<LeWISN[V"
    A$ = A$ + "AcfZiJWJ]nTOh^ee`]?S;hh0ZJNTj?CV75<o5LOW9dd3f\QkhWicXRWfTO`V"
    A$ = A$ + "eSI\1VVgDNccig\eoJmnPa5Be[LC>f=G;fFSbVjffFoFF^G]NgVh4gQaPa^Z"
    A$ = A$ + "e[Hi<dTo6C[RR=TZoIC=?f`5B?KF=?cF<M89?6OJV#SVM5K0e<d`3H<15GX9"
    A$ = A$ + "O86G`]fFSnS=WoC=o9^#:O:7G8eoT^NSJ3W`=LNfd`6HiDXh2>]J9f#C]?al"
    A$ = A$ + "6LNPRJ6LiAXRmKnNISmLNYZUJZNTZl5DcoM[9L:K#U?lG5LQVegVKgF>3KmC"
    A$ = A$ + "EO7YH2GiBmaOl7Gk1KR9XlXXUeXj=4F<?Sc\AgQR3[lJhJnlVec#f0j1Ikc6"
    A$ = A$ + "#Zn8CfPcga6^PjkIBgcc9ZG#e?S:O5>U9XH3^h#GOh\U9PjlKbSXAkkllYYn"
    A$ = A$ + "S^]K3G0mLm5CH>LmgTS5dZ5i4o;JdELMnfDoX4GH^fN;GPi3J:ORCje_4K0c"
    A$ = A$ + "U#ekb=<1lk\nCi2=?kC=aA=i<R[_Zf>:f`MjQAlnLCnVYLSD[Ce`6Ji2\Ja`"
    A$ = A$ + "h2>f#BkAC_RdDgSVN9AMnVdIdb5Hg;LJ5JdgReWhTNo]Q;`ZM#jI]4I3h_W5"
    A$ = A$ + "G?kFW`5LmaTS=dT;>NMNN_Sa6#ogfZKEY1]Q;`l58iEbFf`6_ELLQ?iCnTg="
    A$ = A$ + "L\1UfP6N`9m9Q[oCI<1T;XH8>]O9O8CgKMi8bd<LjXeoAEO8eb6f`5Hn;dn<"
    A$ = A$ + "CWZm[;WL7C0iihm:fLXFOaCNF]MnCcHkf=i]b6m2<fPR;L2C#]Mg`5Vgo#^#"
    A$ = A$ + "cmhTVQ4G`a4Lk77o7g?Ki2YWmR;fPZfU\jHRiB`jci6O7KNV8f`7Ba<^LoHi"
    A$ = A$ + "CLR?gWb5DNYX>_`mAB;bVL:BmlYS=lF`5^K^4:^#;gg5_^aCIW^DLoXl5c=o"
    A$ = A$ + "i4^`T=hNF8MmS0b6^6_nkZlCDiBTZgJ[6YDLEb[h6]7K7gQ=hRWCjSDNXhZ?"
    A$ = A$ + "a9J6D\1Fm9DNHfjmXR9dh3lfJG\U;dhW\bG16SjeO;=g9i_QJ^^S;XN6_IeZ"
    A$ = A$ + "#e3S_RcWiDljobj7j[gKkccA;G`igB3;UiaICmSDS=LRfeIBJAahI6K`Yg`E"
    A$ = A$ + "O2V?3^jEZh2=N?N2Ch^\PTg#<]m>O1I\1W^?T;PNOf\^2NOe=OR5kdf?4\JE"
    A$ = A$ + "`N^7HedlbKQIl>^mDKgCbSh>L1gWI[^M5K8E?ldmBWF8U?8cmGb;Rdi`6f0b"
    A$ = A$ + "5fDCRF_2NbNKPa5>E7XR=X6cgkMh2YLVCJUg`6H?C6^WYcY7UcWmjiflKRLQ"
    A$ = A$ + "TNQTG5]<QTWTKl0Ai3RR;hV3eZmQU?ABc0;7RifH^ML[moDLQd[[d2Td0f`5"
    A$ = A$ + "^^Oilg1_>OMLYb5]iNZR?UH3^W_ZTgT\WoZdgG;8K0i=Wjkh9LQT_SW`4HiW"
    A$ = A$ + "_YN5W`6DL1gJ=WTGd[]G;G#m<UQj>Baf>fPb?QVaVN=YQ?\aW1eL<W73:^PR"
    A$ = A$ + "_\97W=\Q=OgAYj3Rk`5fjkhYLQie5G^3W67M7fPkn7N<kh2gU=Xd<TZ]0;72"
    A$ = A$ + "L]K7?8a5HOfFNQS;`^GL2KHC]VVadWb5H7KKH3<^0[77>AoPjIjBm\McbAAY"
    A$ = A$ + "I#a6>=?2em96k]Yn2Kh2YeXHgoHnQ<e<Tl8KciPjLW]FO3GHV71CGoYLQ97P"
    A$ = A$ + "mggD_BgmQdmGUOAKVcQiBhh2Ze]L7G=[kTjObTfQT_4:]2<_<CN<dl\OL7VP"
    A$ = A$ + "Zf3Kl7H3GHkLb4Ghe0iH]\1fiPkmbd<Xd=Xl>`ik7SCL7o8CmfDSg2Z[=?1G"
    A$ = A$ + "H>okjcScCBe5==_cY[Qig`6^`Vl=Jl`<mm9QZ78C?_H\j9\aGhfekEaF]i#d"
    A$ = A$ + ">WDa5DmKaYiad<V7k^Hgdcj4S;bH3HLmM[OAR;TH3^[[:MkgAc0Sk\U9h>>?"
    A$ = A$ + "AgP[OTEmEMS6RknM>US=\Y6S:?K>U;XF7YQ;XZ?fea3coHeiJSFWCh5ha]:7"
    A$ = A$ + "0F<\:^DMm8aIL\Qdk=YGaY1O[naTgSYkOGk?F\\:Gg=gKM<\Cm`[Y^WKjiJT"
    A$ = A$ + ";\Q9PLQ6V#;KHkX=^3[C]S=ljhRiAZbk:L>\JNOkl77C#]>O[NQ[S95GHK?>"
    A$ = A$ + "YZA2FcDlHfa6Dla=\Q]J6DN8jh2WL_eUg:cKnVLeML1FN6KlZ<i5:C?3ZY^U"
    A$ = A$ + "9XH3]3emU=iA[RIO]MIg[Di0Q7?Ye4gb5Dn4^Q;dha#:>W]m?YO:DW;<^0kN"
    A$ = A$ + "[RQ<WOdXIXQ=lF`5H7c\h4U6Ria=ZI#a5>9?35GXa[aCe:L7f#JNSS9PinZR"
    A$ = A$ + "IA=YZSc6_0HciKegh>fE<QDL8SAd`5HnJNWnbfYK#alKSeLLM6KXU;TV3fb4"
    A$ = A$ + "Dj7DNLM7^`F?8Vl17G`e33Ki2gEcP;?RVl`KbmmjNFcL2elG6GHKn?9?1EJn"
    A$ = A$ + "Ml3E^5hk9YI`E_d]L1VVQk\6\R=Tji9D;0K]ldLAfmfVGca6f`5`Ho=i0hlV"
    A$ = A$ + "#ek2ZLOLj[oZbSQFV`F^0NoZeOS6m2Wb5L[Q_YV1HlHjJEji_dmLN^9GRCbi"
    A$ = A$ + ":Y?O^6T;O2F\?K^[Jm:WOYKh28K;iaUS=`F[Gi90S=XN_:O>LL16gc=BN6hV"
    A$ = A$ + "?PaQ^H1UGi\iXYiM9^#Z^L\g_R=\Q;T>gKd<hdHe`4BOO^\U;`^6gLOI3KP="
    A$ = A$ + "7^Eo[CKkVib\eNLi3e`6LenDEcCD_A3KX9?2UVX]<QVe#`LSEn_]=7ldjFYL"
    A$ = A$ + "IL3739a5^>?flmURS7fh?k9\QfLKJi2c[a]lJU_o<nP;GhDoghVC[Vcj>GV_"
    A$ = A$ + "VbW;Fn6:nP[fWZG[U=\agaWP;d4Cah2=eH;57]U=hRcMcoI_Win\=oOeaoFm"
    A$ = A$ + "29oJgL]EMmUa4`SUk`5LNCYH3^hM6C`=Vc[KW?kba#E?4Fn68O8i10[?8VnG"
    A$ = A$ + "blS\]O7O;h2][eRLQWHN;F[RVS1lN_K^OJ\9>=adL__]\QWVinF`5LnD[V7V"
    A$ = A$ + "d0\U;`Z]1SaghU2;^Gie5SmYbk`Egf4KX]_VJi29?LJh2=iAl4<Q4G`U?`LN"
    A$ = A$ + "NSoOH\b9kW[m5KK`Rofb6^N?^[SgQ9hdXeVc0S;dVKAbG<ElOC_#`d=PG_Kh"
    A$ = A$ + "2=WK>?EJHM9o;KI2gU;`>?_;G`iS#J^Z:FYM=mFNPcSSFMVKbEYU=`f6hW9M"
    A$ = A$ + "MMKn3<FL3C0Omfh67WXUOd`5DcaKm=KV7a6^PCKD;KXiIij^n;Tbi3?7KmSc"
    A$ = A$ + "i;g9[CObh^<Q4K`5KTd?Th2^Se]_o6^0KkROV9GP=?GU3nMh2KdOPaE=nFb>"
    A$ = A$ + "^L\P]J5Jn\gQ=hN6=ffGCgiNCce<W^jgB>#Jd6gTH3?1GHcaKK=3^3c[icmj"
    A$ = A$ + "o7?_CaE>V`9iRdb6HL1WFidi#cnFa6Ki:KI3Zn`^Yg5DLQT^?eiAjeLj:N[S"
    A$ = A$ + "YObA3K8MMI3GdMnVZ[1niBlUFOMD_N3K`5od6g]InFbg1EM2>mhk><QTVSfl"
    A$ = A$ + ";JOfBD_G7GHcJoY[;^[AgQ?Lgeh_Sfj[]Ujk[eWB[d9lZT6;LO??GBofd<7h"
    A$ = A$ + "[QLaVL4Ba>WX?]U=hF?\Iof<Wo>aC\]WS=LJMHD<SWR;dLL[f?YJ8XZ1G:V]"
    A$ = A$ + "M>N[?mhj\=O7\=c_#a4LaM=m6IbkS4G8mKQ5kg<?f_]VW`6>I>gMGc:UkLB_"
    A$ = A$ + ";Nneh;ofSkCh2K78KhYi2Kl91gO?5K0SWBo>#^]fX]J`Cl1efXigU:DO26Gc"
    A$ = A$ + "jQiTV[[?oLoLmK[kWnYOjG<`O_MM?SE:f0>oj]T9dZQ8=_?a5VcaMlV_:i2K"
    A$ = A$ + "n\]mje9i3eh?R;gUC^GS\16ChJ^lL>m6m3^eNKbiF]>MS6ndi`lcfnkP[R]a"
    A$ = A$ + "fOCV`WmIO6UAPo^L[H3hlZVjm]INPKXRcI<Qfj\[h2ZnPHKLUCSC;CHS?5:V"
    A$ = A$ + "P;?[=W39]:\[OWVg8b6#^06?YH3]n]iFkU5SkbgGa4`hkiam<V4ecglkT]b3"
    A$ = A$ + "A67Jb3`QB31c[5V^Pfh^CH2ZlVHk?5[JcW_Q;LZf1<^FiKZS9Tl0IS^37K8M"
    A$ = A$ + "=R]_BJDJHZYSYCI3Wh7YR=`Ra^ng\eZCim`FgV]N]BK?KmLlLFY?1i2o^Og_"
    A$ = A$ + "k;68S#a6VJ6JFO_=>A]mHJQDah=j?Mi3N2Gh^\QD\46?adfdb6LNYfZcRU;Y"
    A$ = A$ + "S=`>6fhaSREiH3H<5b5^;CHb5HaUG\QFo#L<QTNNWo08S0i2c?7S9XH3\[[<"
    A$ = A$ + "f#S_A9]R9^#jn6Ko`b9EU39>W?=on^N>db5D<Q=\Q6N0b6BJ]B\Q=G_VGg#m"
    A$ = A$ + "#>^0b6HL1eLhk`5HkcinmjgUFWGS9V#SNN<_3fWAY_XA[PSATH3:MnhjaGgC"
    A$ = A$ + "Ic[MJ?#^#K\=CcIbO9UVQk<??a5DJCJH2>MgKI1Kh2Z[EgaoDfi#cJ6=LQI\"
    A$ = A$ + "D;K#a3HngQaGCf`6V0;oN5OPi5Q:>VEOQF]2>nPSiZ^^Yh38K0__gFO:fa`9"
    A$ = A$ + "L1ffHclmVie^lXE[gjF[dM]l]P=X^gn4\Q]N?`VKhRAI[Ofhoh9L1LOad`_Q"
    A$ = A$ + "9hF[njLIniW_gOo_ogo^aeoFaC`meeWK>HK_iacfLeJI3]L1G\=KOhh2GON5"
    A$ = A$ + "O1m1`5oNGf0;6^Q9X^Fn4\17GPU;i9iDTH\^i7>=m>]a:f0cGBU>h6^0KmDE"
    A$ = A$ + "N7:>P:FDUc1kc>olhWEa4n3oQo`GJ`H5GKGeiYRm^a70emL7CPYIH;GHSf3<"
    A$ = A$ + ">K[?N=iGhlPO[o=]\1V63lH0I3^[A>O>JI39V#3G#=W7I3^NT<UCaenE]?Ei"
    A$ = A$ + "hWH2Zh`I\HBKAJ=NW>1T;`6:fPZ_ABJ9`eTEi<Vh1hn#a4>U;hHIKF7>YK8Y"
    A$ = A$ + "Q:a3BL\k>Bn?jf_?5KXinZS;`R]Lm[SJ>L;GhJoRiDPLQ6=lZHbFO0JN_^mi"
    A$ = A$ + "Ol?n7oRQkhPE[RDOUYh3=i<XHj:?#?AcQknOR?hH4<>`FM0=<1U^n]idhd]X"
    A$ = A$ + "^fZhl:=FKi2=g;MeNC]fYBc?^NWKMS[SSG_o4GhJkV>nJG_>Y__9ng=#V0S="
    A$ = A$ + "`d<`h]]mL:S=db4Dm#BR9Xf^=nT`>NKm7`5oM23Pa4D7OYm?kHQMNaHI8C:Y"
    A$ = A$ + "O8Y[BigZBKPJNA[Gk9?oCmf7b5DN<`fV>^#;CXQA\U5`HCWXG8Y5[ao16o]i"
    A$ = A$ + "No\oADL1Voa]iDfb6Jm=\e?U]3E>JWVGR:G9T=Pkk6_ID3ee]inQY=XITjGX"
    A$ = A$ + "6nP[g7#^PKkZfoGa_Wb4Bj7fhUXR=Xn\ZJU`Z=Z[?[BaP<^PZ7bWm?belAUN"
    A$ = A$ + "cdlYFn`gTi2:?Ng>DLQD=:JIC^LG#f3S;XRoM\1g85;[H3X_6=mW4[V0]LQC"
    A$ = A$ + "beXag#U7U=j=>Q;PaL=aO^hHFORSn<PcSf\]BePU=WgYC^=7RfhLLo[n<ZSg"
    A$ = A$ + "]L1\n4haO;KXMOjHUXV?gJ59fPjeHabZNVTM\`H3H><\hWVl8JGK_ac`T?4\"
    A$ = A$ + "jEXZiAjLCaRg^flMh2W\=H\=UVagJ^#C><HlF;K`aGLiBT>7NBf#BoTR=<_G"
    A$ = A$ + "f<oS]NUJmNFOCZb_ea5Va`<=3Yj?Xl<eiIYS;d4C[dld`6Dn#j6KH3]L1Lhb"
    A$ = A$ + "KPa5D[;le5G`E[4FLDjc]UETlUTYeoYH3^S?Do>cc_]ih^a;2L>RS9`h2_R;"
    A$ = A$ + "AOjDeCUYI7SkBNGfXE#MMkDn#bCU6M4>oL>AkO:?ddmaiJ2:oAMJ^KmG`a5L"
    A$ = A$ + "eaaa5BmXQccg6M49=o9oHNJ=3Gg;aj>XF_BikE3G#ii#Jnd<VM6ONe35hkiT"
    A$ = A$ + "lhK[[Q;o1E<Kb[Tk`6D\27K#EGj6^PC[#SfAdCCF<TCgMKm1CL1FmLHaJKi2"
    A$ = A$ + "9f`G7L1F]Bfb5LJSMJ<Wc7JdAScCDJ#IJ5LJiM\17_SMnWh;\[EYhf=LQCI4"
    A$ = A$ + "?1GP]=Bmk0C?1jcPjh:53ejm^cS]6=3ch=FlBJP<V=<1F^49O6N2m2:MTZh2"
    A$ = A$ + "fjQ]L1G];M\1L]6F]6Vik_aooD>kXV9ff\9n]E_D3;JS76<=3hLEfm;WVOUn"
    A$ = A$ + "#El#C^6:o?DjKMaEWFCR=[c_Q;`ZQcF]2]\QCh2:m7^i5>^`eLD6K`iC1;>c"
    A$ = A$ + "E7C5[jR;Pn0fFK#Uf7U7jW\fn9jnIi_TdX`b1ZU=db4LiUd`5>ImEfPYc_A;"
    A$ = A$ + "QK=bVjB`h2>=CheWClH0cG:a6fb5JI2]J5`iW\hHFN0]jTAfPC_`;N`Oj?mW"
    A$ = A$ + "Ng#a6fV3AR?P<27SkD^#ZNY>oAJh2hLIgi:KkPg_KI3>NQK=KFLXR=dXI8a6"
    A$ = A$ + "LjDD7?>m#<FGSf7U7::^#Rchh::mM\lhKdTS[IUR_L[9bH3>^`5CPa6NB^PR"
    A$ = A$ + "CdTOdMh2YnXJC^4=<Q=\A6O#UK`MH3ZLAfb6N2^PJME<>Ba6JbC1?7DN[fb6"
    A$ = A$ + "Lm3alcWd?R[3jjg7Won\i=GkW6OlHjSMj5f`6DaC=a7^[IKh2ZLEJd;PjRJh"
    A$ = A$ + "K9^`MZeXcSb6n#C>683K6_iR[BN]ibS`=D[]^QGZhA]N[RaeZ]AC^8=n2bRW"
    A$ = A$ + "fd?`GcEEiG\Q=P7GXWS_H1oiolOn;6_ngKh2]J6JRGL[KgZoXQ7O:G#Eo#gl"
    A$ = A$ + "HVNbd`aRJRoK^FO]mInjMBNeWb4Dj^JmIUiIRJ]NfcT]cg5gWCa5#VP;WQ6N"
    A$ = A$ + "`\OOJlN#]nHb[o4G0I3=LWVhgCF;M[g5Yk5>]J=jkIg3N:^#C]UDa8]iePkC"
    A$ = A$ + "Enk>o1H<QVLMJb3_InR:_25KP]^?nLEQiR=g6ZLAJh2=\0ggK0\o>b6HG[HN"
    A$ = A$ + "6XRWagSS;lJPn#^Q=XRW?U=\U;hd^a>WHNb\9_Pf?C3CXA3Fjh:YY2mV^YF6"
    A$ = A$ + "W`2JmkHciHR;db6`HKUW\]ek4cS#UC;kk#T6^0S=XF3IbVBn_S_nen2i2oUo"
    A$ = A$ + "bOiMS9K`]m>Y?0f6ghH3=NDTZMYb[f]LQD>CKh2\SWdfo4f3V_B3Oh4o=H_O"
    A$ = A$ + "7;k>LQ6oDEae:=3ZNi`i_0^NDR9Th28K`=oUU?AC>;<^`;N`Om_nGOgHb6L?"
    A$ = A$ + "3T<o6>eW0EL^kcScmEa3>fPK=j][;gb5BL]]JADJ2`]][Vf<n#:?PC7Y[SKi"
    A$ = A$ + "2:>T;g8UO7:=7>_FLL1W7oKh2^?3C3a6f0KkNa5^H28KPMlhl`KC]5f\f_:V"
    A$ = A$ + ":=Ha4>m>WZIOCN4]\#F<;j_hFMC\JFQW7YJQLRgW]\eii[R;<?f`mKRAXb32"
    A$ = A$ + "OogU;LYSWa5^R[DaF<VPKPl1fLO6K`YMAa5#f0NNXH3Zn]ZA?1KNLcWK;GPM"
    A$ = A$ + "\YRKKVGg47Td>Y>nCLQ4C`MNkddaRa>]F8=j\JHPZS9WfRC6=LQI^4:^`[[c"
    A$ = A$ + "8GPicO:oRiWMV[?^=HmVCb3N7GHV31S;`>GBj8DNlije`fHh=<Rdf=igGR;d"
    A$ = A$ + "\n8b6JcS2e<hfVY[M^ci6_7^[>Pg:^#keodXQ;XlNLF?27G0macY9WU_olcY"
    A$ = A$ + "f6HO6XZ;9ck3DCc5Gh_mgnKOaHb6H77X>26[`eg0Zl>DW3^?cVASVQCh2][M"
    A$ = A$ + "j6ZL:>iceb5#MV:_7DkcFM?^A:?2gejWT=L]]EiBXh2XW9>^0^6<CC>KPL1G"
    A$ = A$ + ">o\NRba7H\15GPa6fb:LeIYQ;hZijMh4^e>ghI#JM<fLgCh2^l?>Q=P_>FWK"
    A$ = A$ + "U7g=noXdZeXeSMMWYYh>ieh^?TH3_ULQ4KPEOP[HFWOP^H>dKDFn>>=3=3EN"
    A$ = A$ + "?Xg8YSC5?X]o]N[h2^iKCmWKV[N2GhYH3\i4^JTghocYSdifYNOLgLNNmnV\"
    A$ = A$ + "Qg:^P:Om[H8\G2V<QI\Zb?#V_38GXAc`Oo_ogOgHb6#]49]5:o8JlYda2Jlj"
    A$ = A$ + "LK^4Zl8Dj1>U;POfWD_PJKdb4L\QVLaBGgKmfQYA1O=U6=FmBf`5Dk;UO3Co"
    A$ = A$ + "5BLQ6O2Hj_I3eJh>MkZL:He\Ta5^H2Cf#kh4f06OWd8dh[ifiW:f0;n?iGeY"
    A$ = A$ + "<1WFmD^hc]ISV1FmcfT_g6_;f`BLN7[HfWb5LLIljm[]3fC3\jDbh2<MjgU="
    A$ = A$ + "PJ6BiTPiDXjW1WNQ;N`ohOl?Ng`a7`o^COTKnGkX]N7]L16oT=7<iiP;nWi_"
    A$ = A$ + "Pc3^iaiF^PR=`H^hl0fm4ElKR;X>O`S1fm:W75]jiLg7BNnhd<Pm9EjiS0Wg"
    A$ = A$ + "ZjW`=e3dmnO=DNEdD7DWO68GHb6^h0:=5>?7f`5^nk\okVjP^a33gLkTgH9O"
    A$ = A$ + "bHJ<IcgIaMZHRF=3ZcGL^jVJ;gb4B77Wh?a6N]:G?W^2T=<mc#eWhZNG0WcZ"
    A$ = A$ + "h2:o2DNlkh2=eg#m\?hlc0i2ocoiolM3T?Xbeh>L1<VGa3DlTdjH=NHhdLhb"
    A$ = A$ + "a#]V3ngEam>V`6f#;GXQcV^Vb^VUh2CMJKI2gQGS<1ec\1N=4miTa6N2^P;_"
    A$ = A$ + "l]no[RaMejTYaOnn^d3<I2Cf0C31;?35G#ecTZaVi`]c[EjCJF7;a5Li8lJX"
    A$ = A$ + "RYJbA_ImB6o1_6f`JEiCh^>gb5#M#?9G`U[WZWXCLQ;?6BKSVl8HmS0jg_C3"
    A$ = A$ + ">FSbDnk>N`d?PIM6D_GT;l_nGo;9O`i1a6O6f>fh;AJ^mMi2]<1LnBB_nC`5"
    A$ = A$ + "DLeC_>[N=5G#a4Ln8lEQN1egA<:^#3K9YIH3GXacOFM3MiNPk_ifH6;SK?lm"
    A$ = A$ + "Ma4VS6m3YJDP\QCeB\U?LBN4<__DN7Pl1E>4WT3CK^4YiUheFeekfk3Ki2>="
    A$ = A$ + "5\QbWU6_FBn;XH2=N<`H;Zlh^^7hlL<a5Di`[H3YaLkZFWW=DL17O8i7Y[g8"
    A$ = A$ + "KNFBVcIO2M3<O`Dc3CaU83PmgBikg`6La4hnB]FEjid9mL_hh2\[I^[[8C8i"
    A$ = A$ + "ADjN0SEkZ9AR9TH3Z_C9>Q;d4okRSCm?0cOCefDa9HLQomonOo^aMh3\lOHe"
    A$ = A$ + "]]I>\B?K3C8=74GK[E7[Jm<FLBCnlKR9Bc7_VCfD3[fWiU[Sk6ODCJQB<CV^"
    A$ = A$ + "T4O^EK1nID\hfJNbd7ZjOQ4G0[10;GnFOoLJ#VK7gnJb5^H2hPa7He`hjHai"
    A$ = A$ + "iIS^RDoimTL1flhT72>^P:Ok6^`<N`53PaG\eYL?cKZJKUh2^Sk4?XU9TbII"
    A$ = A$ + "k#Y?HSgB9fbllRa5DiakH2^AKn0=lWI\]jeNa0n?oWocG<H\QT62VOW<oAMm"
    A$ = A$ + "e1Kn:>gLCN4ckKco[KnlMW?ZH3]j5L<QF^#jjZZGEC\Q]nUdb5NB6dfA3G^U"
    A$ = A$ + "A_Q;XR5M[5WdCT6]k[[onT9\U?hH3\LNB\1U62eLYkj5aYcWf`5JVSWdQhdR"
    A$ = A$ + "`RgMGCE_fMlMX9fCa\CjCJh5Z]]khdaWEiXdZMCE;#6G#icGKM1Li8`RiMi6"
    A$ = A$ + "Xd:Xh2]N?Tl2Ae_G=lQ=e_8mjW^6TJnCBWJ[N47G0W;[lHHSNQFoNL?kE9mC"
    A$ = A$ + "ha=NnXH3Ke5Zh=:f0C33knKC>S:f`Cb5JdBXd4`lBL6kcH58?honOo_[I3C?"
    A$ = A$ + "7fn<HmT\QD=iN[i2:f#SGJ9M[Zie8KXIdh_SS=LM=\9gN7K4??fXek4^0SG]"
    A$ = A$ + "aoC7_ca6De8X9>N3KXicRan_RgWalHLoC`5JH3>^PK^lCa5f`4Dal9MVZhUd"
    A$ = A$ + "cRESWG\H:L=GGMPgDgBekY=Wl6O1O]MDihib=#Y1XQ;`^nah2^c76GPiePBg"
    A$ = A$ + "\cgaCI3KH;>^`<nGmgC7;\jY<I0YWaR9GXY^JKlD`UGlfehEaiYWU2FMfEmN"
    A$ = A$ + "Ccc\UC[nChoBb3P;^PR9hHJ\gO:G3U75>=M9=0Z[Mc]=N_[9o^ie:6KPeS1:"
    A$ = A$ + "o1>EkPkm`Z5Yb71Wo2Kh1H];KN>#fb5`jDXF;Aig];WH6GP]N1;>Gm\mbH7^"
    A$ = A$ + "Wm_f_G7D7o\HRk`4L[ojReEG;H_>N]?i?1V;7^=f`5H[kO7^#;K`eGR\hKG_"
    A$ = A$ + "4hd=XRGAO8_3CXYG;JO^#Ji2H>aCf`Vibce<A]09^#ZoKgVG#ji2Nkgi;=NR"
    A$ = A$ + "M2?P]FH:>Ca2CL1g#YWPUko6o4CL7fmo=e9bi3YjiCX]gRHL1U^3do_4o1mJ"
    A$ = A$ + "4mE`a4BmNeFV#R;`lRTYIXAo[J>5KM;5GXmInOnMmTjccH1^l<fhCIR?X^fi"
    A$ = A$ + "dWkN?>fPkHO;KH3GXe;Y]J6LL15K`mMc`9\Q[HdILY[_6Klm4mJlR;XH2]mP"
    A$ = A$ + "IccfQZF4Kh29=3Yl8Bc;Ei;XN>MLo^Yenm3I;_Ya?RF]3=i\g67mJhh2]iJi"
    A$ = A$ + "he\mSS=\iLkD=3Z[cC_KE\1F]:LmJPS9`NN7HaaZNO`ikPKO^mIkZQ;TNVZL"
    A$ = A$ + "eV`=?7mH8UG\B?L;C0SUM?g_^L5L?o>Wb6Li3XRKBn_XdId`5^>nfheJB;Wb"
    A$ = A$ + "7CllI3k3W;`V[\Q=`NnZ`L:Jd;<caWm<9PK;VFOl_QkGWo2HO9Tb5#mj^WAR"
    A$ = A$ + "VN[AeCN^lUEoMemJeJH:F#jg4Je[aH2hn=a6Hi[XfV:_eDnhe>LJkMN[dhES"
    A$ = A$ + "CkPKO`H8=an>?VBJ;Mlb4K#ekC_RiJI2^J0fj9hLhH3>^#ZGTBOgAhNf8D<0"
    A$ = A$ + "E?gMRGkZiE<^PCSPkg<nVO;iEL17KXIPKg=Nkcd<YdBQKgTg2>mAKmKEaKDj"
    A$ = A$ + ";>U;P\QdkUa8LiDXN^;_h2C=mZJ1Xlk7i<9NP;G66KHb5LlP]lQDojjN6;_C"
    A$ = A$ + "=iEcOMJ5`HDlgHm[omlobN?Y_SaJIB=\QfldE[;f>BeR`a6Dn\VH3>Vb6M3>"
    A$ = A$ + "M#YGOSW5<f0cW1GLIbg_fWiJG=4IiPP739^#COfbH58c`m\nl4<1FNd=iojl"
    A$ = A$ + "D0SiK7^l:DkOW>UTgW=i4O2CXMMldedTg\W\mH\f]i6UdCdDo6lmjd<hh2Ga"
    A$ = A$ + "UZn6XikUQ]LQiWSi1jea1V7QjiRfE7Q]J8L?3`Wb5`hPCI2Wb5Jh39=2g97U"
    A$ = A$ + "DLa6V`fA[o]]\QV]aYlQ4k`iE3SCTj[1G?>Yj]aVN8Ba6LJ=HmT9[?:_>6#o"
    A$ = A$ + "5B?c=<f`F_7BL1E]9ML1WNQVi^>^0nKF4ke`O[cD[kgb5Je;\9^Xe;fT_0^["
    A$ = A$ + "_]nT\A;eFf#:?[6oFO;d;XZeX[73Kb[Pa5LmH`lchjE:lk>1gJj<f0[n4^JE"
    A$ = A$ + "Xfn^Nb1i4<oeBcaKR;KRkI_6nkS:ZO85g_E_PR=hh5:VPkJER=LZO9hf\Mkh"
    A$ = A$ + "^6hl9i4=3Zl;DeUH6C`jQ1fJkZJ:\iiAP]OBmM4jgPjIXNb5L[YWZGkenDa5"
    A$ = A$ + "BiAd`5HllGgGKbG`53>i2H<oEL?SKLmj\OoTMiKThB=\Qfh3WFZ]a`W`6Jd1"
    A$ = A$ + "elIDJVN2f#[OS\n[cmLH?SIMm>X:_0Gm9Jn^BRmNO=Hm89Zi#]^^[g3Dmh5>"
    A$ = A$ + "DJ5JbQXU9La5BccLN2PoFWRalHl>kmL2K8i[A[WV=<P6=D9ODMiKd`QgVKeG"
    A$ = A$ + "ELQ4K0cM8mlBTH0\elMn9bH2Ho4affZnAbY;Q]_LO7ZPiAdLMPaJD?c`Ki2<"
    A$ = A$ + "VPJ>Vb_05Gh:6oGn;oU_KPJ6LLQ9O#a:Ll8TYhlcLK^oWfO69NPc?g6fPB35"
    A$ = A$ + "S=hh2<NiMmTDic8^>Y:FGa4Dm0UBOQ:gLE^lZnDL;oYYo3fb6Wi#TZ3a9J5V"
    A$ = A$ + "i9ScaJRmHi#<S]_h2CfPBCAJTlY#a6L[Mbh3>FPCcDC>??=GH3KJb5D\1lJ`"
    A$ = A$ + "MI3GceD<QIO;XlGcUO]:Fea3HaZ8K#E30Wg7cmGK?9i>6f`5LOoR\E[PR9Tl"
    A$ = A$ + "=0GkOb=`HIT;`d2\U;`6\G7SAKl1`iIafAb3dFV0KkihA\gkK9G8E[RGckLO"
    A$ = A$ + "OGe4GVdfO7VPZfP\oN:VeE[Pk`4`c?5G8e[B_U<1UGR>]2<f`C`5B_7gJgYL"
    A$ = A$ + "cMJBD\PfmK[W2Yhm=<:Vo:]iBXH3=ml4[NTcooDOoVZWoD_#K^39fPKogT_A"
    A$ = A$ + "R9hZ;9b3HNX>i2gU9PeLKb5JH2>^PbGQGSOa_hGl^A3KXa?BfnJ3K#Ye>Ugd"
    A$ = A$ + "faMHB^Hn6^UbS5FNC9fPc;B5GPi[0kI1Fe[_^HWTnnk`5JH6<6PR[YNF6HWo"
    A$ = A$ + "\JWZlf\U;`j]IV7S<mR>OmC[=ch2<V0b6DiFd<DjAJlS8U;^jL7ggWb6LlQ6"
    A$ = A$ + "^\knCca#K=I^VSLBM:BmdXR;hRUfb6HiCd`6f\OCL4GO>Zh29V`5G#E;RTN1"
    A$ = A$ + "67W]F#;Ch4^`5;hWocoiB^`<N^Q5TbCAaJJeKg`4Jd`\Eg`6ndF^`eWI^oKZ"
    A$ = A$ + "7CZNVYNLRECBfg5Q=NegfW`X7T]j6Lkg4?#ml?efkc:o<MmW5b5JI3=L1UFQ"
    A$ = A$ + "VHCgkIb5Na4^6>]3?1GP]=C\1UVmfSQFo#L\QD^3]an]L1d7b4OhYh2\jCZd"
    A$ = A$ + "IkNMW>oDn4:?8Ki2]eFXmLBa5LJ5NmNLLQDm8fb5NRiOche9CPa5VlQ=N;jl"
    A$ = A$ + "`PiSQC7n9jT`mM3K0IA>O>O;h2=\1fPe73=iBXh2\JBd\^ZR?`dkWjOAE>1Z"
    A$ = A$ + "hhCZ_#b_A5G8YEhjlAY7I[V16GH>_\I]Jl_eXEh3nP?h;6>^`9mg0CGBJK^="
    A$ = A$ + "g1fa#:g5W_9H\ICM5JHaKHCYNL`e7D]L1\W5B\1fJN\L?JNF4AokJZO0b6Hm"
    A$ = A$ + "VlGELQVWm;63[]^4\J7YZ3AcL<fkaa5N=VLQ6=3gQ9PkSF=3KSeDi]dhM2;f"
    A$ = A$ + "TMllD<QinWUoDJTjAb=n>Nj8a=DJ6Ji19m0=N6\e[46K`YGh4^#C]9A^0ZO5"
    A$ = A$ + "WSMJ?7PJj_;G`5cQ<1LodjYiVH\fj\db6>9OQdaFKn<=LRVNQREcBec?iY3E"
    A$ = A$ + "ole`6DnC^U;TbgYYn6WXI0kYYG__6]2=?34HmWHn:dXAN3G#5_VlH`aIVSYg"
    A$ = A$ + "59^PS?\Q7h>NBnZZR?_;?PMO[il^Q?PL1gc?AjI[>=JI3\o>S;\Id67kNF8_"
    A$ = A$ + ";KPiaPZ?[MJXJlD`e;C=<Q=L1Fm9Ki2<o2a]UJL]mOogomSLQILb9i7THDYc"
    A$ = A$ + "YF];gQ9\AW4S9<og9^`T=`d;dl<Ffb6Li?[j90\62gQ;PaQ]LQ6>1S;hZeJ:"
    A$ = A$ + "g[;^#cg[>C^0cCQW#[0;FN;G8]MBS9GHciQZ^6<NPSCUd<XRICom]<QF6Tcc"
    A$ = A$ + "C6KHfofhc#QR1hN]Cci0Of]MjiM\Q=J5fFge=j7fdgVW`5DN4ch2KbAm]V;<"
    A$ = A$ + "SS>U9Xh2=WG]i8hH2Ynd#a7D<S43XeCSCI3HO#aNV>H?OE=?g4>n#3?0OoHm"
    A$ = A$ + ";JI3Ke9\]O<>Yf4>oBOmnJH2:?6MeQ0mJlJ^dY<QWR;`Ro`HNU_2=L1GlIK^"
    A$ = A$ + "2=S=\QCd4\ilJK>;9^0fg5:f`Y<26K8mM6`YJ7Bn9Zlece3WWb4Dii`>NM<1"
    A$ = A$ + "7GPe[k\nHR=gc=_ZInZbC`I<C3SP5ggb5JR=InILJ^3g9WRVJ<L7^0Kdb6`n"
    A$ = A$ + "OBegfH_CfZM8EWc6O:#n#R=\a?AWGWKe;hjI;U>6eam9J5#F`TcS??>=iXZH"
    A$ = A$ + "3Ki2HLm9LQif8U;Acna5O]U9XHGZn]jYbIH;G8i[iT=`ji9EOGhd>hl3ga6J"
    A$ = A$ + "h8^nV#5_fdCE>O>gZGXQ9djCIjH=eCS^_[A^[WSKH2Ge9P5cdb4VK3fhe[O="
    A$ = A$ + "N:n`6^#3SBa5N:M2WZG`mj8K`mLXkH3^WGWVNUbmNVo=T=Pn>TH0=elK;G8e"
    A$ = A$ + "OgKh2GONllRYE0_FS<Qdc^k9\1E<4[fQHlZR=XRcDalh[a6KHA?QF1lhbika"
    A$ = A$ + "K1CXU?TldPU?1[?hVk;T=Xd<XReCSV__JM\QT60Gm#_3G0I3]l0Wo7Zc9gc<"
    A$ = A$ + "iT;dll2NWiT^Hj[HSgkmN_g=L\1gJ^YHoWT=L7?5D7_>M3chgWR7\Ek#B?1K"
    A$ = A$ + "^clhmjlIb6BNA^ik16leKN6?I\1GM=fDo3<VlDO7CmEASNQ=<1\^3Za6?3Je"
    A$ = A$ + "HcR=^h2>f`K5C#a5JI3?1GPM<dD_4ljLJlTLQTgTGcE`mo[o^:O2W>PVAZO\"
    A$ = A$ + "Anc9mOifjRZh2=maDZ_<MLQoO\;[%%h1"
    btemp$ = ""
    FOR i& = 1 TO LEN(A$) STEP 4: B$ = MID$(A$, i&, 4)
        IF INSTR(1, B$, "%") THEN
            FOR C% = 1 TO LEN(B$): F$ = MID$(B$, C%, 1)
                IF F$ <> "%" THEN C$ = C$ + F$
            NEXT: B$ = C$: END IF: FOR j = 1 TO LEN(B$)
            IF MID$(B$, j, 1) = "#" THEN
        MID$(B$, j) = "@": END IF: NEXT
        FOR t% = LEN(B$) TO 1 STEP -1
            B& = B& * 64 + ASC(MID$(B$, t%)) - 48
            NEXT: X$ = "": FOR t% = 1 TO LEN(B$) - 1
            X$ = X$ + CHR$(B& AND 255): B& = B& \ 256
    NEXT: btemp$ = btemp$ + X$: NEXT
    btemp$ = _INFLATE$(btemp$, m.SIZE)
    _MEMPUT m, m.OFFSET, btemp$: _MEMFREE m
    BASIMAGE1& = _COPYIMAGE(v&): _FREEIMAGE v&
END FUNCTION

FUNCTION BASIMAGE2& 'witch.png
    v& = _NEWIMAGE(100, 96, 32)
    DIM m AS _MEM: m = _MEMIMAGE(v&)
    A$ = ""
    A$ = A$ + "haIkMV\Bc4447?7mP??NcCRGl5#?XRXX8j11AAa=R8^P;h2^S2^7#Aa3NaK2"
    A$ = A$ + "nDhIO7lJomm_CjhT9Cb<IVNjZ<CMh767UTdeoYk^ZZ[^WLiEib98888THFMe"
    A$ = A$ + "EEGNiUZc>k<=hehJK^iVJXnkGF0H_Q]OQ5FhoG8GMIWMfA]hR;:jB:aXS>JX"
    A$ = A$ + "J#md5Y?Sm0S557]`?mfK_R^`8m``<c<SFC`HOH<#ZKOo5a<?]OVJZYDOla79"
    A$ = A$ + "BOFNiUEgOomR^H9Nla7EaMn53_mfKJ=9OnlR^H9#o5<7Q=VWQjfBc4f#C`k3"
    A$ = A$ + "6;TjfBc2FAC:Y;[_njR^H1#\7fbW\a6K<eMgMWFGfMgM3dgR`0nbMk]gVIeF"
    A$ = A$ + "MliFd?iK^iVRfb4nn0o\Yffd<d7aJ`0k2UPh;8G3:Qnk23\9T3QJ`:[\RF3T"
    A$ = A$ + "HKXG?THIZV17L#WZ18G1VeRQjf>gX[^jbij0e]I^BBcYEDY]fJ;C7GADHXQ6"
    A$ = A$ + "b9JaLc=WJ_mfCdRj`6K\QCd2=<XmbIRbJ[Kki<dS;bPf>k`QjPGJ]eF5m`38"
    A$ = A$ + "o[DWG4MoB6H;X6[UGM;PnN26HCX2MlF<#7lR^f;HP]QUjAnR[aWY^7NomgCM"
    A$ = A$ + "m8;W;MSVH\gj[Eb^<a4CDQMiR;^#eIWM:jQSY#Q2:Pg[ISJ2:8VLb9EC?mdZ"
    A$ = A$ + ":RgQ1f0>CJ>O?dM\>^Dg6i<GMeE:`lc?_2SA5GK=lE:<]DWC66dVi8WNjYaf"
    A$ = A$ + "f74VJS7o\Naf8iD?HniWOdm;\UNhe>OmeGG<?jRN4Idm?`[]PFHZgJo0=YRL"
    A$ = A$ + "hcPf=ga6cOkgo<oHl]^lm02YZN#MKXI1KiKkQ7NXX990oaVWDTH\3Wc?oL]="
    A$ = A$ + "b<f>^76f]dHMI5mXbJ53_foNPZlo[U]m1AF>7]0K_o0C2XOX>^N6HG4mXXN\"
    A$ = A$ + "eFKUYe3>E_c0T;H\W4Yf^#5mdC?Za7OLbe1_8e<RkZQ]X2bKRaO>hSQ>oH<`"
    A$ = A$ + ">iBX^>A2SdNm>>iTCD7MdAj?Sbk7;RQKcWD5ioMMi3RJe^<oM\f<V[QGK^>j"
    A$ = A$ + "32OKVMfI;oIa5=9ZWS?L4ciTB]FKo6Q`ZCKoWkD1ank_O5_7VcGWJAm6GVmm"
    A$ = A$ + "EBA2[N^ZeJbH3NjYW2<?NjhfIP]9]1i^7aQj=g4Q=6R;RK3OW<SYR?cQ7NHb"
    A$ = A$ + "]EF3?fB<6RIl4lkH_]Sk9KTadMMLdMdA7dK3S9X6PlN_n17L#Z<_\[fcAoEI"
    A$ = A$ + "P168e\me2_Wo3K_mfZ?olCb]3L0X5nmUQ2#MH^dB;A^mPJhB]V<b8S#^]P3#"
    A$ = A$ + "UNlmgOGnl7\onkWLk07PZeL7af]fJ[YJ_mf9g6`9XB?<m=diEQ1f1>0b?b3?"
    A$ = A$ + "l0YcM8SCm;DOna5glVPLSmlc?[NmeG9g6J;dkm32e2#DggNX?<F?7<fZYV=P"
    A$ = A$ + "?j`ghFJY5b]UF1Re2_JBLcI[I>8XA8W27Ola>]NN\5IQj#YZJ8WahMMUJfQk"
    A$ = A$ + "JBFX_QG#mfT6k1CKY5Q]W4J61[A3gdT\ni_7b5`;_l2ijPX5o27jW8e7GUX["
    A$ = A$ + "A3Rd2i<c=HXh\lAjGDK#><ek;77Y5MgMgRFD7POV^B?j[_n4]84LAm]PaWbj"
    A$ = A$ + "W[HLA?Ti:J<B[jSDNFN6O\MN]THlB>fhl>6aG:?_^\3je;91JQllOdn4ga]T"
    A$ = A$ + "cc]dS6Jo6V_dI9>3nNg\BDmoEVcf=4Vo_bc75gBmZc59f>gC#?_7oj[_Zj\#"
    A$ = A$ + "F`Qh[?1GfO`IA#MLIfoMbIjVPPPPPPPP#S`o0XLK%%h1"
    btemp$ = ""
    FOR i& = 1 TO LEN(A$) STEP 4: B$ = MID$(A$, i&, 4)
        IF INSTR(1, B$, "%") THEN
            FOR C% = 1 TO LEN(B$): F$ = MID$(B$, C%, 1)
                IF F$ <> "%" THEN C$ = C$ + F$
            NEXT: B$ = C$: END IF: FOR j = 1 TO LEN(B$)
            IF MID$(B$, j, 1) = "#" THEN
        MID$(B$, j) = "@": END IF: NEXT
        FOR t% = LEN(B$) TO 1 STEP -1
            B& = B& * 64 + ASC(MID$(B$, t%)) - 48
            NEXT: X$ = "": FOR t% = 1 TO LEN(B$) - 1
            X$ = X$ + CHR$(B& AND 255): B& = B& \ 256
    NEXT: btemp$ = btemp$ + X$: NEXT
    btemp$ = _INFLATE$(btemp$, m.SIZE)
    _MEMPUT m, m.OFFSET, btemp$: _MEMFREE m
    BASIMAGE2& = _COPYIMAGE(v&): _FREEIMAGE v&
END FUNCTION

Print this item