Daniel Covington 1 день тому
джерело
коміт
6cdf8b041f
12 змінених файлів з 2643 додано та 62 видалено
  1. +7
    -0
      .claude/settings.local.json
  2. +3
    -0
      .gitignore
  3. +152
    -11
      App/Controllers/Jurisdiction/JurisdictionController.asp
  4. +9
    -7
      App/Views/Jurisdiction/import.asp
  5. +1
    -1
      Data/Update_Addresses.ps1
  6. +7
    -8
      Dockerfile
  7. BIN
      ImportService/TrackingDataImport.vbs
  8. +15
    -9
      MVC/lib.Flash.asp
  9. +917
    -0
      MVC/lib.IMBCodec.asp
  10. +2
    -1
      MVC/lib.all.asp
  11. +6
    -25
      docker-compose.yml
  12. +1524
    -0
      uploads/BRM Permit Infor 1-30-26.txt

+ 7
- 0
.claude/settings.local.json Переглянути файл

@@ -0,0 +1,7 @@
{
"permissions": {
"allow": [
"Bash(powershell -Command \"Get-Content ''d:\\\\Development\\\\Tracking_Kits\\\\ImportService\\\\TrackingDataImport.vbs'' -Encoding Unicode | Out-String\")"
]
}
}

+ 3
- 0
.gitignore Переглянути файл

@@ -2,3 +2,6 @@
*.mdb
*.ldb
/volumes
/codex
*nul
gittoken.txt

+ 152
- 11
App/Controllers/Jurisdiction/JurisdictionController.asp Переглянути файл

@@ -169,22 +169,163 @@ Class JurisdictionController

Public Sub ImportPost
Dim Upload:Set Upload = New FreeASPUpload
Upload.Save(server.mappath("/uploads"))
Chilkat_CSV.LoadFile(Upload.UploadedFiles("filename").path)
set Model = new PagedIndex_ViewModel_Class
Dim Upload: Set Upload = New FreeASPUpload
Dim uploadPath, uploadedFile, fileName, fileExt, fileSize
Dim maxFileSize, dotPos, recordCount
maxFileSize = 10485760 '10 MB in bytes
uploadPath = Server.MapPath("/uploads")
'Parse upload data
Upload.Upload
'Validate file upload
If Upload.FileExists("filename") = False Then
Flash.AddError "No file selected for upload."
MVC.RedirectToAction "Import"
Exit Sub
End If
Set uploadedFile = Upload.UploadedFiles("filename")
fileName = uploadedFile.FileName
fileSize = uploadedFile.Length
'Extract file extension
dotPos = InStrRev(fileName, ".")
If dotPos > 0 Then
fileExt = LCase(Mid(fileName, dotPos))
Else
fileExt = ""
End If
'Validate file type
If fileExt <> ".csv" And fileExt <> ".txt" Then
Flash.AddError "Only .csv and .txt files are allowed."
MVC.RedirectToAction "Import"
Exit Sub
End If
'Validate file size
If fileSize > maxFileSize Then
Flash.AddError "File size exceeds 10 MB limit."
MVC.RedirectToAction "Import"
Exit Sub
End If
'Save the file to configured folder
Upload.Save uploadPath

'Remove the first line of the CSV (non-header info line)
StripFirstLine uploadedFile.Path

'Open CSV with Jet driver and iterate records
Dim conn, rs, connString, folderPath, csvFileName, fso
Set fso = Server.CreateObject("Scripting.FileSystemObject")
folderPath = fso.GetParentFolderName(uploadedFile.Path)
csvFileName = fso.GetFileName(uploadedFile.Path)
Set fso = Nothing

Dim fmtType
If fileExt = ".txt" Then
fmtType = "TabDelimited"
Else
fmtType = "Delimited"
End If
connString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & folderPath & ";Extended Properties=""text;HDR=YES;FMT=" & fmtType & """;"

Model.RecordCount = Chilkat_CSV.NumRows
Dim RowNumber
Set conn = Server.CreateObject("ADODB.Connection")
On Error Resume Next
for RowNumber = 1 to Model.RecordCount
conn.Open connString
If Err.Number <> 0 Then
Flash.AddError "Unable to read CSV file."
MVC.RedirectToAction "Import"
Exit Sub
End If
On Error Goto 0

Dim Record: Set Record = JurisdictionRepository.FindByJCode(Chilkat_CSV.GetCell(CLng(RowNumber),0))
Dim sql
sql = "SELECT q.[County], q.[Jurisdiction], q.JCODE, " & _
"IIf(InStr(1, UCase(q.NameRaw), ' CITY') > 0, " & _
"'CITY OF ' & Trim(Replace(UCase(q.NameRaw), ' CITY', '')), " & _
"q.NameRaw) AS [Name], " & _
"q.[Mailing Address] AS Mailing_Address, " & _
"q.[City & Township] & ' ' & q.[ZIP + 4] AS CSZ, " & _
"'' AS IMB, " & _
"'007' & q.[Mailer ID Option 1] & '000000' & Replace(q.[ZIP + 4], '-', '') AS IMB_Digits " & _
"FROM (" & _
"SELECT [County], [Jurisdiction], [Mailing Address], [City & Township], [ZIP + 4], [Mailer ID Option 1], " & _
"IIf(InStr(1,[Jurisdiction],'(') > 0 And InStr(1,[Jurisdiction],')') > InStr(1,[Jurisdiction],'('), " & _
"Trim(Mid([Jurisdiction], InStr(1,[Jurisdiction],'(') + 1, InStr(1,[Jurisdiction],')') - InStr(1,[Jurisdiction],'(') - 1)), " & _
"Null) AS JCODE, " & _
"IIf(InStr(1,[Jurisdiction],'(') > 0, " & _
"Trim(Left([Jurisdiction], InStr(1,[Jurisdiction],'(') - 1)), " & _
"Trim([Jurisdiction])) AS NameRaw " & _
"FROM [" & csvFileName & "]) AS q"

Set rs = conn.Execute(sql)

recordCount = 0
Do While Not rs.EOF
Dim jurisdiction : Set jurisdiction = New JurisdictionModel_Class
jurisdiction.JCode = Trim(rs.Fields("JCODE").Value & "")
jurisdiction.Name = Trim(rs.Fields("Name").Value & "")
jurisdiction.Mailing_Address = Trim(rs.Fields("Mailing_Address").Value & "")
jurisdiction.CSZ = Trim(rs.Fields("CSZ").Value & "")
jurisdiction.IMB_Digits = Trim(rs.Fields("IMB_Digits").Value & "")
jurisdiction.IMB = GetIMBCodec.EncodeDigits(jurisdiction.IMB_Digits)

'JurisdictionRepository.AddNew jurisdiction
recordCount = recordCount + 1
rs.MoveNext
Loop

rs.Close
conn.Close
Set rs = Nothing
Set conn = Nothing

'Set success message with record count
Flash.Success = "File '" & fileName & "' uploaded successfully. Records imported: " & recordCount
MVC.RedirectToAction "Import"

Next
On Error Goto 0
%> <!--#include file="../../Views/Jurisdiction/import.asp"--> <%
End Sub
Private Sub StripFirstLine(filePath)
Dim fso, ts, remainingText

Set fso = Server.CreateObject("Scripting.FileSystemObject")
If Not fso.FileExists(filePath) Then
Set fso = Nothing
Exit Sub
End If

Set ts = fso.OpenTextFile(filePath, 1) ' 1 = ForReading
If ts.AtEndOfStream Then
ts.Close
Set ts = Nothing
Set fso = Nothing
Exit Sub
End If

'Skip the first line
ts.ReadLine

'Read the rest of the file
If Not ts.AtEndOfStream Then
remainingText = ts.ReadAll
Else
remainingText = ""
End If
ts.Close

'Rewrite the file without the first line
Set ts = fso.OpenTextFile(filePath, 2) ' 2 = ForWriting
ts.Write remainingText
ts.Close

Set ts = Nothing
Set fso = Nothing
End Sub
End Class
MVC.Dispatch


+ 9
- 7
App/Views/Jurisdiction/import.asp Переглянути файл

@@ -1,23 +1,25 @@
<h2>Create Jurisdiction</h2>
<h2>Import Jurisdiction</h2>

<% Flash().ShowErrorsIfPresent %>
<% Flash().ShowSuccessIfPresent %>

<%= HTML.FormTag("Jurisdiction", "ImportPost", empty, Array("enctype","multipart/form-data")) %>
<%= HTML.Hidden("nonce", HTMLSecurity.GetAntiCSRFToken("JurisdictionImportForm")) %>
<hr />
<div><p>This will delete all records and import the new records from the file</p></div>
<% if Model.RecordCount <> 0 Then %>
<p>Records in the CSV: <%= Model.RecordCount %></p>
<% End If %>
<div><p>Upload a CSV (.csv) or tab-delimited (.txt) file to import jurisdiction data</p></div>

<div class="form-group">
<div class="row">
<div class="col-md-4">
<div class="form-group">
<label for="Name">Name</label>
<input type="file" id="myFile" name="filename">
<label for="filename">Select File</label>
<input type="file" id="filename" name="filename" accept=".csv,.txt" required>
</div>
</div>
</div>
<p></p>
<%= HTML.Button("submit", "<i class='glyphicon glyphicon-ok'></i> Upload", "btn-primary") %>
<small class="form-text text-muted">Accepted formats: .csv, .txt | Max size: 10 MB</small>
</div>

</form>

+ 1
- 1
Data/Update_Addresses.ps1 Переглянути файл

@@ -1,5 +1,5 @@
# Define file paths
$excelFilePath = "C:\Users\danielc\Desktop\Changed Addrs17.xlsx"
$excelFilePath = "C:\Users\danielc\Desktop\Changed Addrs18.xlsx"
$accessDbPath = "\\kci-app01\c$\inetpub\Data\webdata - Copy.mdb"
$tableName = "Jurisdiction"



+ 7
- 8
Dockerfile Переглянути файл

@@ -1,15 +1,14 @@
FROM node:20-bookworm

# Useful dev tools (git is handy because Codex often interacts with repos)
RUN apt-get update && apt-get install -y --no-install-recommends \
# Install GitHub Copilot CLI
RUN npm install -g @github/copilot

# Install useful dev tools
RUN apt-get update && apt-get install -y \
git \
openssh-client \
ca-certificates \
ripgrep \
curl \
&& rm -rf /var/lib/apt/lists/*

# Install Codex CLI
RUN npm i -g @openai/codex@latest

WORKDIR /workspace

CMD ["bash"]

BIN
ImportService/TrackingDataImport.vbs Переглянути файл


+ 15
- 9
MVC/lib.Flash.asp Переглянути файл

@@ -55,18 +55,24 @@ Class Flash_Class
Public Sub ShowErrors
if HasErrors then
%>
<div class="alert alert-error">
<button type="button" class="close" data-dismiss="alert">&times;</button>
<h4>Error!</h4>
<ul>
<div class="alert alert-danger alert-dismissible fade show" role="alert">
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
<h4 class="alert-heading">Error!</h4>
<ul class="mb-0">
<%
dim ary, i
ary = Errors
for i = 0 to ubound(ary)
if IsArray(ary) then
for i = 0 to ubound(ary)
put "<li>"
put H(ary(i))
put "</li>"
next
else
put "<li>"
put H(ary(i))
put H(ary)
put "</li>"
next
end if
%>
</ul>
</div>
@@ -97,8 +103,8 @@ Class Flash_Class
Public Sub ShowSuccess
if HasSuccess then
%>
<div class="alert alert-success">
<button type="button" class="close" data-dismiss="alert">&times;</button>
<div class="alert alert-success alert-dismissible fade show" role="alert">
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
<%= H(Success) %>
</div>
<%


+ 917
- 0
MVC/lib.IMBCodec.asp Переглянути файл

@@ -0,0 +1,917 @@
<%
'==============================================================================
' USPS Intelligent Mail Barcode (IMB) Encoder/Decoder Class
' Based on USPS-B-3200 Specification
'==============================================================================

Class IMBCodec
' Lookup tables
Private Table5of13(1286)
Private Table2of13(77)
Private BarCharMap(64, 3)
Private CharToCodeword
Private IsInitialized
'============================================================================
' Constructor
'============================================================================
Private Sub Class_Initialize()
Set CharToCodeword = CreateObject("Scripting.Dictionary")
IsInitialized = False
End Sub
Private Sub Class_Terminate()
Set CharToCodeword = Nothing
End Sub
'============================================================================
' Public Methods
'============================================================================
' Encode tracking and routing codes to IMB barcode string
Public Function Encode(ByVal trackingCode, ByVal routingCode)
If Not IsInitialized Then Call InitializeTables()
Dim binaryData, crc, codewords(9), characters(9), i
' Step 1: Convert to binary
binaryData = ConvertToBinary(trackingCode, routingCode)
' Step 2: Generate CRC
crc = GenerateCRC(binaryData)
' Step 3: Convert binary to codewords
Call BinaryToCodewords(binaryData, codewords)
' Step 4: Insert additional information
Call InsertAdditionalInfo(codewords, crc)
' Step 5: Convert codewords to characters
Call CodewordsToCharacters(codewords, characters, crc)
' Step 6: Convert characters to barcode
Encode = CharactersToBarcode(characters)
End Function
' Encode combined IMB digits (20-digit tracking + 0/5/9/11-digit routing) to barcode string
Public Function EncodeDigits(ByVal imbDigits)
Dim tracking, routing
imbDigits = Trim(imbDigits)
tracking = Left(imbDigits, 20)
routing = Mid(imbDigits, 21)
EncodeDigits = Encode(tracking, routing)
End Function

' Decode IMB barcode string to tracking and routing codes
Public Function Decode(ByVal barcode, ByRef trackingCode, ByRef routingCode, ByRef errMsg)
If Not IsInitialized Then Call InitializeTables()
Decode = False
trackingCode = ""
routingCode = ""
errMsg = ""
' Validate barcode
If Len(barcode) <> 65 Then
errMsg = "Invalid length (expected 65, got " & Len(barcode) & ")"
Exit Function
End If
Dim i, ch
For i = 1 To 65
ch = Mid(barcode, i, 1)
If ch <> "A" And ch <> "D" And ch <> "T" And ch <> "F" Then
errMsg = "Invalid character at pos " & i & ": " & ch
Exit Function
End If
Next
On Error Resume Next
Call DecodeInternal(barcode, trackingCode, routingCode, errMsg)
If Err.Number <> 0 Then
errMsg = "Decode error (" & Err.Number & "): " & Err.Description
Err.Clear
On Error GoTo 0
Exit Function
End If
On Error GoTo 0
If Len(trackingCode) = 0 And Len(routingCode) = 0 Then
If Len(errMsg) = 0 Then errMsg = "Decode failed"
Exit Function
End If
Decode = True
End Function
'============================================================================
' Private Encoding Methods
'============================================================================
Private Function ConvertToBinary(tracking, routing)
Dim routingArr, i, digit
Dim binaryData(12)
For i = 0 To 12
binaryData(i) = 0
Next
routingArr = ConvertRoutingCode(routing)
For i = 0 To 12
binaryData(i) = routingArr(i)
Next
For i = 0 To Len(tracking) - 1
digit = CLng(Mid(tracking, i + 1, 1))
If i = 0 Then
Call MultiplyAndAdd(binaryData, 10, digit)
ElseIf i = 1 Then
Call MultiplyAndAdd(binaryData, 5, digit)
Else
Call MultiplyAndAdd(binaryData, 10, digit)
End If
Next
ConvertToBinary = binaryData
End Function
Private Function ConvertRoutingCode(routing)
Dim result(12), i
For i = 0 To 12
result(i) = 0
Next
Select Case Len(routing)
Case 0
' result already 0
Case 5
Call AddStringToArray(result, routing)
Call AddValueToArray(result, 1)
Case 9
Call AddStringToArray(result, routing)
Call AddValueToArray(result, 100001)
Case 11
Call AddStringToArray(result, routing)
Call AddValueToArray(result, 1)
Call AddValueToArray(result, 1000000000)
Call AddValueToArray(result, 100000)
End Select
ConvertRoutingCode = result
End Function
Private Sub AddStringToArray(ByRef arr, numStr)
Dim i, digit
For i = 1 To Len(numStr)
digit = CLng(Mid(numStr, i, 1))
Call MultiplyAndAdd(arr, 10, digit)
Next
End Sub
Private Sub AddValueToArray(ByRef arr, value)
Dim i, carry, temp
carry = value
For i = 12 To 0 Step -1
If carry = 0 Then Exit For
temp = arr(i) + (carry Mod 256)
arr(i) = temp Mod 256
carry = Int(carry / 256) + Int(temp / 256)
Next
End Sub
Private Sub MultiplyAndAdd(ByRef arr, mult, add)
Dim i, carry, temp
carry = add
For i = 12 To 0 Step -1
temp = CLng(arr(i)) * mult + carry
arr(i) = temp And &HFF
carry = Int(temp / 256)
Next
End Sub
Private Function GenerateCRC(binaryData)
Dim fcs, data, bit, i, byteIdx, genPoly
genPoly = &HF35
fcs = &H7FF
data = (binaryData(0) And &H3F) * 32
For bit = 2 To 7
If ((fcs Xor data) And &H400) <> 0 Then
fcs = ((fcs * 2) Xor genPoly) And &H7FF
Else
fcs = (fcs * 2) And &H7FF
End If
data = (data * 2) And &H7FF
Next
For byteIdx = 1 To 12
data = binaryData(byteIdx) * 8
For bit = 0 To 7
If ((fcs Xor data) And &H400) <> 0 Then
fcs = ((fcs * 2) Xor genPoly) And &H7FF
Else
fcs = (fcs * 2) And &H7FF
End If
data = (data * 2) And &H7FF
Next
Next
GenerateCRC = fcs
End Function
Private Sub BinaryToCodewords(binaryData, ByRef codewords)
Dim quotient(12), i
For i = 0 To 12
quotient(i) = binaryData(i)
Next
codewords(9) = DivideArray(quotient, 636)
codewords(8) = DivideArray(quotient, 1365)
codewords(7) = DivideArray(quotient, 1365)
codewords(6) = DivideArray(quotient, 1365)
codewords(5) = DivideArray(quotient, 1365)
codewords(4) = DivideArray(quotient, 1365)
codewords(3) = DivideArray(quotient, 1365)
codewords(2) = DivideArray(quotient, 1365)
codewords(1) = DivideArray(quotient, 1365)
codewords(0) = ArrayToInt(quotient)
End Sub
Private Function DivideArray(ByRef arr, divisor)
Dim i, temp, remainder
remainder = 0
For i = 0 To 12
temp = CLng(remainder) * 256 + CLng(arr(i))
arr(i) = Int(temp / divisor)
remainder = temp Mod divisor
Next
DivideArray = remainder
End Function
Private Function ArrayToInt(arr)
Dim val, i
val = 0
For i = 0 To 12
If arr(i) <> 0 OR val <> 0 Then
val = val * 256 + arr(i)
End If
Next
ArrayToInt = val
End Function
Private Sub InsertAdditionalInfo(ByRef codewords, crc)
codewords(9) = codewords(9) * 2
If (crc And &H400) <> 0 Then
codewords(0) = codewords(0) + 659
End If
End Sub
Private Sub CodewordsToCharacters(codewords, ByRef characters, crc)
Dim i, cw, ch
For i = 0 To 9
cw = codewords(i)
If cw <= 1286 Then
ch = Table5of13(cw)
Else
ch = Table2of13(cw - 1287)
End If
If (crc And (2 ^ i)) <> 0 Then
ch = ch Xor &H1FFF
End If
characters(i) = ch
Next
End Sub
Private Function CharactersToBarcode(characters)
Dim bars(64), i, ascCharIdx, ascBitIdx, descCharIdx, descBitIdx
Dim ascVal, descVal, barcode
For i = 0 To 64
ascCharIdx = BarCharMap(i, 2)
ascBitIdx = BarCharMap(i, 3)
ascVal = (characters(ascCharIdx) And (2 ^ ascBitIdx)) <> 0
descCharIdx = BarCharMap(i, 0)
descBitIdx = BarCharMap(i, 1)
descVal = (characters(descCharIdx) And (2 ^ descBitIdx)) <> 0
If ascVal And descVal Then
bars(i) = "F"
ElseIf ascVal And Not descVal Then
bars(i) = "A"
ElseIf descVal And Not ascVal Then
bars(i) = "D"
Else
bars(i) = "T"
End If
Next
barcode = ""
For i = 0 To 64
barcode = barcode & bars(i)
Next
CharactersToBarcode = barcode
End Function
'============================================================================
' Private Decoding Methods
'============================================================================
Private Sub DecodeInternal(barcode, ByRef trackingCode, ByRef routingCode, ByRef errMsg)
Dim characters(9), codewords(9), binaryData, fcs
errMsg = ""
trackingCode = ""
routingCode = ""
Call BarcodeToCharacters(barcode, characters)
fcs = CharactersToCodewords(characters, codewords, errMsg)
If fcs = -1 Then Exit Sub
Call ExtractAdditionalInfo(codewords, fcs)
binaryData = CodewordsToBinary(codewords)
Call BinaryToFields(binaryData, trackingCode, routingCode)
End Sub
Private Sub BarcodeToCharacters(barcode, ByRef characters)
Dim i, charIdx, bitIdx, bar
For i = 0 To 9
characters(i) = 0
Next
For i = 0 To 64
bar = Mid(barcode, i + 1, 1)
charIdx = BarCharMap(i, 2)
bitIdx = BarCharMap(i, 3)
If bar = "A" Or bar = "F" Then
characters(charIdx) = characters(charIdx) Or (2 ^ bitIdx)
End If
charIdx = BarCharMap(i, 0)
bitIdx = BarCharMap(i, 1)
If bar = "D" Or bar = "F" Then
characters(charIdx) = characters(charIdx) Or (2 ^ bitIdx)
End If
Next
End Sub
Private Function CharactersToCodewords(ByRef characters, ByRef codewords, ByRef errMsg)
Dim fcs, i, ch, cw, comp
fcs = 0
errMsg = ""
For i = 0 To 9
ch = characters(i) And &H1FFF
cw = FindCodeword(ch)
If cw <> -1 Then
codewords(i) = cw
Else
comp = ch Xor &H1FFF
cw = FindCodeword(comp)
If cw = -1 Then
errMsg = "Invalid IMB character idx=" & i & " value=0x" & Hex(ch)
CharactersToCodewords = -1
Exit Function
End If
fcs = fcs Or CLng(2 ^ i)
codewords(i) = cw
End If
Next
CharactersToCodewords = fcs
End Function
Private Function FindCodeword(character)
Dim key
key = CStr(character And &H1FFF)
If CharToCodeword.Exists(key) Then
FindCodeword = CLng(CharToCodeword(key))
Else
FindCodeword = -1
End If
End Function
Private Sub ExtractAdditionalInfo(ByRef codewords, ByRef fcs)
If codewords(0) >= 659 Then
codewords(0) = codewords(0) - 659
fcs = fcs Or &H400
End If
codewords(9) = codewords(9) \ 2
End Sub
Private Function CodewordsToBinary(ByRef codewords)
Dim binaryData(12), i
For i = 0 To 12
binaryData(i) = 0
Next
Call IntToArray(binaryData, codewords(0))
Call MultiplyArrayByValue(binaryData, 1365) : Call AddValueToArray(binaryData, codewords(1))
Call MultiplyArrayByValue(binaryData, 1365) : Call AddValueToArray(binaryData, codewords(2))
Call MultiplyArrayByValue(binaryData, 1365) : Call AddValueToArray(binaryData, codewords(3))
Call MultiplyArrayByValue(binaryData, 1365) : Call AddValueToArray(binaryData, codewords(4))
Call MultiplyArrayByValue(binaryData, 1365) : Call AddValueToArray(binaryData, codewords(5))
Call MultiplyArrayByValue(binaryData, 1365) : Call AddValueToArray(binaryData, codewords(6))
Call MultiplyArrayByValue(binaryData, 1365) : Call AddValueToArray(binaryData, codewords(7))
Call MultiplyArrayByValue(binaryData, 1365) : Call AddValueToArray(binaryData, codewords(8))
Call MultiplyArrayByValue(binaryData, 636) : Call AddValueToArray(binaryData, codewords(9))
CodewordsToBinary = binaryData
End Function
Private Sub MultiplyArrayByValue(ByRef arr, mult)
Dim i, carry, temp
carry = 0
For i = 12 To 0 Step -1
temp = CLng(arr(i)) * mult + carry
arr(i) = temp And &HFF
carry = Int(temp / 256)
Next
End Sub
Private Sub IntToArray(ByRef arr, value)
Dim i
For i = 12 To 0 Step -1
arr(i) = value And &HFF
value = Int(value / 256)
Next
End Sub
Private Sub BinaryToFields(binaryData, ByRef trackingCode, ByRef routingCode)
Dim workData(12), i, trackDigits(19), routingValue
For i = 0 To 12
workData(i) = binaryData(i)
Next
For i = 19 To 2 Step -1
trackDigits(i) = DivideArray(workData, 10)
Next
trackDigits(1) = DivideArray(workData, 5)
trackDigits(0) = DivideArray(workData, 10)
routingValue = ArrayToDouble(workData)
trackingCode = ""
For i = 0 To 19
trackingCode = trackingCode & trackDigits(i)
Next
If routingValue = 0 Then
routingCode = ""
ElseIf routingValue <= 100000 Then
routingValue = routingValue - 1
routingCode = Right("00000" & CLng(routingValue), 5)
ElseIf routingValue <= 1000100000 Then
routingValue = routingValue - 100001
routingCode = Right("000000000" & CStr(CLng(routingValue)), 9)
Else
routingCode = BuildRoutingString(workData)
End If
End Sub
Private Function BuildRoutingString(arr)
Dim tempArr(12), i, digits(10), j, result
For i = 0 To 12
tempArr(i) = arr(i)
Next
Call SubtractValue(tempArr, 1000100001)
For j = 10 To 0 Step -1
digits(j) = DivideArray(tempArr, 10)
Next
result = ""
For j = 0 To 10
result = result & digits(j)
Next
BuildRoutingString = result
End Function
Private Sub SubtractValue(ByRef arr, value)
Dim i, borrow, temp
borrow = value
For i = 12 To 0 Step -1
If borrow = 0 Then Exit Sub
temp = CLng(arr(i)) - (borrow And &HFF)
If temp < 0 Then
arr(i) = temp + 256
borrow = Int(borrow / 256) + 1
Else
arr(i) = temp
borrow = Int(borrow / 256)
End If
Next
End Sub
Private Function ArrayToDouble(arr)
Dim result, i
result = CDbl(0)
For i = 0 To 12
If arr(i) <> 0 Or result <> 0 Then
result = result * 256 + CDbl(arr(i))
End If
Next
ArrayToDouble = result
End Function
'============================================================================
' Initialize Lookup Tables
'============================================================================
Private Sub InitializeTables()
Dim i
' Table 19: 5 of 13 Characters (1287 entries) - abbreviated for space
Table5of13(0)=31:Table5of13(1)=7936:Table5of13(2)=47:Table5of13(3)=7808:Table5of13(4)=55
Table5of13(5)=7552:Table5of13(6)=59:Table5of13(7)=7040:Table5of13(8)=61:Table5of13(9)=6016
Table5of13(10)=62:Table5of13(11)=3968:Table5of13(12)=79:Table5of13(13)=7744:Table5of13(14)=87
Table5of13(15)=7488:Table5of13(16)=91:Table5of13(17)=6976:Table5of13(18)=93:Table5of13(19)=5952
Table5of13(20)=94:Table5of13(21)=3904:Table5of13(22)=103:Table5of13(23)=7360:Table5of13(24)=107
Table5of13(25)=6848:Table5of13(26)=109:Table5of13(27)=5824:Table5of13(28)=110:Table5of13(29)=3776
Table5of13(30)=115:Table5of13(31)=6592:Table5of13(32)=117:Table5of13(33)=5568:Table5of13(34)=118
Table5of13(35)=3520:Table5of13(36)=121:Table5of13(37)=5056:Table5of13(38)=122:Table5of13(39)=3008
Table5of13(40)=124:Table5of13(41)=1984:Table5of13(42)=143:Table5of13(43)=7712:Table5of13(44)=151
Table5of13(45)=7456:Table5of13(46)=155:Table5of13(47)=6944:Table5of13(48)=157:Table5of13(49)=5920
Table5of13(50)=158:Table5of13(51)=3872:Table5of13(52)=167:Table5of13(53)=7328:Table5of13(54)=171
Table5of13(55)=6816:Table5of13(56)=173:Table5of13(57)=5792:Table5of13(58)=174:Table5of13(59)=3744
Table5of13(60)=179:Table5of13(61)=6560:Table5of13(62)=181:Table5of13(63)=5536:Table5of13(64)=182
Table5of13(65)=3488:Table5of13(66)=185:Table5of13(67)=5024:Table5of13(68)=186:Table5of13(69)=2976
Table5of13(70)=188:Table5of13(71)=1952:Table5of13(72)=199:Table5of13(73)=7264:Table5of13(74)=203
Table5of13(75)=6752:Table5of13(76)=205:Table5of13(77)=5728:Table5of13(78)=206:Table5of13(79)=3680
Table5of13(80)=211:Table5of13(81)=6496:Table5of13(82)=213:Table5of13(83)=5472:Table5of13(84)=214
Table5of13(85)=3424:Table5of13(86)=217:Table5of13(87)=4960:Table5of13(88)=218:Table5of13(89)=2912
Table5of13(90)=220:Table5of13(91)=1888:Table5of13(92)=227:Table5of13(93)=6368:Table5of13(94)=229
Table5of13(95)=5344:Table5of13(96)=230:Table5of13(97)=3296:Table5of13(98)=233:Table5of13(99)=4832
Table5of13(100)=234:Table5of13(101)=2784:Table5of13(102)=236:Table5of13(103)=1760:Table5of13(104)=241
Table5of13(105)=4576:Table5of13(106)=242:Table5of13(107)=2528:Table5of13(108)=244:Table5of13(109)=1504
Table5of13(110)=248:Table5of13(111)=992:Table5of13(112)=271:Table5of13(113)=7696:Table5of13(114)=279
Table5of13(115)=7440:Table5of13(116)=283:Table5of13(117)=6928:Table5of13(118)=285:Table5of13(119)=5904
Table5of13(120)=286:Table5of13(121)=3856:Table5of13(122)=295:Table5of13(123)=7312:Table5of13(124)=299
Table5of13(125)=6800:Table5of13(126)=301:Table5of13(127)=5776:Table5of13(128)=302:Table5of13(129)=3728
Table5of13(130)=307:Table5of13(131)=6544:Table5of13(132)=309:Table5of13(133)=5520:Table5of13(134)=310
Table5of13(135)=3472:Table5of13(136)=313:Table5of13(137)=5008:Table5of13(138)=314:Table5of13(139)=2960
Table5of13(140)=316:Table5of13(141)=1936:Table5of13(142)=327:Table5of13(143)=7248:Table5of13(144)=331
Table5of13(145)=6736:Table5of13(146)=333:Table5of13(147)=5712:Table5of13(148)=334:Table5of13(149)=3664
Table5of13(150)=339:Table5of13(151)=6480:Table5of13(152)=341:Table5of13(153)=5456:Table5of13(154)=342
Table5of13(155)=3408:Table5of13(156)=345:Table5of13(157)=4944:Table5of13(158)=346:Table5of13(159)=2896
Table5of13(160)=348:Table5of13(161)=1872:Table5of13(162)=355:Table5of13(163)=6352:Table5of13(164)=357
Table5of13(165)=5328:Table5of13(166)=358:Table5of13(167)=3280:Table5of13(168)=361:Table5of13(169)=4816
Table5of13(170)=362:Table5of13(171)=2768:Table5of13(172)=364:Table5of13(173)=1744:Table5of13(174)=369
Table5of13(175)=4560:Table5of13(176)=370:Table5of13(177)=2512:Table5of13(178)=372:Table5of13(179)=1488
Table5of13(180)=376:Table5of13(181)=976:Table5of13(182)=391:Table5of13(183)=7216:Table5of13(184)=395
Table5of13(185)=6704:Table5of13(186)=397:Table5of13(187)=5680:Table5of13(188)=398:Table5of13(189)=3632
Table5of13(190)=403:Table5of13(191)=6448:Table5of13(192)=405:Table5of13(193)=5424:Table5of13(194)=406
Table5of13(195)=3376:Table5of13(196)=409:Table5of13(197)=4912:Table5of13(198)=410:Table5of13(199)=2864
Table5of13(200)=412:Table5of13(201)=1840:Table5of13(202)=419:Table5of13(203)=6320:Table5of13(204)=421
Table5of13(205)=5296:Table5of13(206)=422:Table5of13(207)=3248:Table5of13(208)=425:Table5of13(209)=4784
Table5of13(210)=426:Table5of13(211)=2736:Table5of13(212)=428:Table5of13(213)=1712:Table5of13(214)=433
Table5of13(215)=4528:Table5of13(216)=434:Table5of13(217)=2480:Table5of13(218)=436:Table5of13(219)=1456
Table5of13(220)=440:Table5of13(221)=944:Table5of13(222)=451:Table5of13(223)=6256:Table5of13(224)=453
Table5of13(225)=5232:Table5of13(226)=454:Table5of13(227)=3184:Table5of13(228)=457:Table5of13(229)=4720
Table5of13(230)=458:Table5of13(231)=2672:Table5of13(232)=460:Table5of13(233)=1648:Table5of13(234)=465
Table5of13(235)=4464:Table5of13(236)=466:Table5of13(237)=2416:Table5of13(238)=468:Table5of13(239)=1392
Table5of13(240)=472:Table5of13(241)=880:Table5of13(242)=481:Table5of13(243)=4336:Table5of13(244)=482
Table5of13(245)=2288:Table5of13(246)=484:Table5of13(247)=1264:Table5of13(248)=488:Table5of13(249)=752
Table5of13(250)=527:Table5of13(251)=7688:Table5of13(252)=535:Table5of13(253)=7432:Table5of13(254)=539
Table5of13(255)=6920:Table5of13(256)=541:Table5of13(257)=5896:Table5of13(258)=542:Table5of13(259)=3848
Table5of13(260)=551:Table5of13(261)=7304:Table5of13(262)=555:Table5of13(263)=6792:Table5of13(264)=557
Table5of13(265)=5768:Table5of13(266)=558:Table5of13(267)=3720:Table5of13(268)=563:Table5of13(269)=6536
Table5of13(270)=565:Table5of13(271)=5512:Table5of13(272)=566:Table5of13(273)=3464:Table5of13(274)=569
Table5of13(275)=5000:Table5of13(276)=570:Table5of13(277)=2952:Table5of13(278)=572:Table5of13(279)=1928
Table5of13(280)=583:Table5of13(281)=7240:Table5of13(282)=587:Table5of13(283)=6728:Table5of13(284)=589
Table5of13(285)=5704:Table5of13(286)=590:Table5of13(287)=3656:Table5of13(288)=595:Table5of13(289)=6472
Table5of13(290)=597:Table5of13(291)=5448:Table5of13(292)=598:Table5of13(293)=3400:Table5of13(294)=601
Table5of13(295)=4936:Table5of13(296)=602:Table5of13(297)=2888:Table5of13(298)=604:Table5of13(299)=1864
Table5of13(300)=611:Table5of13(301)=6344:Table5of13(302)=613:Table5of13(303)=5320:Table5of13(304)=614
Table5of13(305)=3272:Table5of13(306)=617:Table5of13(307)=4808:Table5of13(308)=618:Table5of13(309)=2760
Table5of13(310)=620:Table5of13(311)=1736:Table5of13(312)=625:Table5of13(313)=4552:Table5of13(314)=626
Table5of13(315)=2504:Table5of13(316)=628:Table5of13(317)=1480:Table5of13(318)=632:Table5of13(319)=968
Table5of13(320)=647:Table5of13(321)=7208:Table5of13(322)=651:Table5of13(323)=6696:Table5of13(324)=653
Table5of13(325)=5672:Table5of13(326)=654:Table5of13(327)=3624:Table5of13(328)=659:Table5of13(329)=6440
Table5of13(330)=661:Table5of13(331)=5416:Table5of13(332)=662:Table5of13(333)=3368:Table5of13(334)=665
Table5of13(335)=4904:Table5of13(336)=666:Table5of13(337)=2856:Table5of13(338)=668:Table5of13(339)=1832
Table5of13(340)=675:Table5of13(341)=6312:Table5of13(342)=677:Table5of13(343)=5288:Table5of13(344)=678
Table5of13(345)=3240:Table5of13(346)=681:Table5of13(347)=4776:Table5of13(348)=682:Table5of13(349)=2728
Table5of13(350)=684:Table5of13(351)=1704:Table5of13(352)=689:Table5of13(353)=4520:Table5of13(354)=690
Table5of13(355)=2472:Table5of13(356)=692:Table5of13(357)=1448:Table5of13(358)=696:Table5of13(359)=936
Table5of13(360)=707:Table5of13(361)=6248:Table5of13(362)=709:Table5of13(363)=5224:Table5of13(364)=710
Table5of13(365)=3176:Table5of13(366)=713:Table5of13(367)=4712:Table5of13(368)=714:Table5of13(369)=2664
Table5of13(370)=716:Table5of13(371)=1640:Table5of13(372)=721:Table5of13(373)=4456:Table5of13(374)=722
Table5of13(375)=2408:Table5of13(376)=724:Table5of13(377)=1384:Table5of13(378)=728:Table5of13(379)=872
Table5of13(380)=737:Table5of13(381)=4328:Table5of13(382)=738:Table5of13(383)=2280:Table5of13(384)=740
Table5of13(385)=1256:Table5of13(386)=775:Table5of13(387)=7192:Table5of13(388)=779:Table5of13(389)=6680
Table5of13(390)=781:Table5of13(391)=5656:Table5of13(392)=782:Table5of13(393)=3608:Table5of13(394)=787
Table5of13(395)=6424:Table5of13(396)=789:Table5of13(397)=5400:Table5of13(398)=790:Table5of13(399)=3352
Table5of13(400)=793:Table5of13(401)=4888:Table5of13(402)=794:Table5of13(403)=2840:Table5of13(404)=796
Table5of13(405)=1816:Table5of13(406)=803:Table5of13(407)=6296:Table5of13(408)=805:Table5of13(409)=5272
Table5of13(410)=806:Table5of13(411)=3224:Table5of13(412)=809:Table5of13(413)=4760:Table5of13(414)=810
Table5of13(415)=2712:Table5of13(416)=812:Table5of13(417)=1688:Table5of13(418)=817:Table5of13(419)=4504
Table5of13(420)=818:Table5of13(421)=2456:Table5of13(422)=820:Table5of13(423)=1432:Table5of13(424)=824
Table5of13(425)=920:Table5of13(426)=835:Table5of13(427)=6232:Table5of13(428)=837:Table5of13(429)=5208
Table5of13(430)=838:Table5of13(431)=3160:Table5of13(432)=841:Table5of13(433)=4696:Table5of13(434)=842
Table5of13(435)=2648:Table5of13(436)=844:Table5of13(437)=1624:Table5of13(438)=849:Table5of13(439)=4440
Table5of13(440)=850:Table5of13(441)=2392:Table5of13(442)=852:Table5of13(443)=1368:Table5of13(444)=865
Table5of13(445)=4312:Table5of13(446)=866:Table5of13(447)=2264:Table5of13(448)=868:Table5of13(449)=1240
Table5of13(450)=899:Table5of13(451)=6200:Table5of13(452)=901:Table5of13(453)=5176:Table5of13(454)=902
Table5of13(455)=3128:Table5of13(456)=905:Table5of13(457)=4664:Table5of13(458)=906:Table5of13(459)=2616
Table5of13(460)=908:Table5of13(461)=1592:Table5of13(462)=913:Table5of13(463)=4408:Table5of13(464)=914
Table5of13(465)=2360:Table5of13(466)=916:Table5of13(467)=1336:Table5of13(468)=929:Table5of13(469)=4280
Table5of13(470)=930:Table5of13(471)=2232:Table5of13(472)=932:Table5of13(473)=1208:Table5of13(474)=961
Table5of13(475)=4216:Table5of13(476)=962:Table5of13(477)=2168:Table5of13(478)=964:Table5of13(479)=1144
Table5of13(480)=1039:Table5of13(481)=7684:Table5of13(482)=1047:Table5of13(483)=7428:Table5of13(484)=1051
Table5of13(485)=6916:Table5of13(486)=1053:Table5of13(487)=5892:Table5of13(488)=1054:Table5of13(489)=3844
Table5of13(490)=1063:Table5of13(491)=7300:Table5of13(492)=1067:Table5of13(493)=6788:Table5of13(494)=1069
Table5of13(495)=5764:Table5of13(496)=1070:Table5of13(497)=3716:Table5of13(498)=1075:Table5of13(499)=6532
Table5of13(500)=1077:Table5of13(501)=5508:Table5of13(502)=1078:Table5of13(503)=3460:Table5of13(504)=1081
Table5of13(505)=4996:Table5of13(506)=1082:Table5of13(507)=2948:Table5of13(508)=1084:Table5of13(509)=1924
Table5of13(510)=1095:Table5of13(511)=7236:Table5of13(512)=1099:Table5of13(513)=6724:Table5of13(514)=1101
Table5of13(515)=5700:Table5of13(516)=1102:Table5of13(517)=3652:Table5of13(518)=1107:Table5of13(519)=6468
Table5of13(520)=1109:Table5of13(521)=5444:Table5of13(522)=1110:Table5of13(523)=3396:Table5of13(524)=1113
Table5of13(525)=4932:Table5of13(526)=1114:Table5of13(527)=2884:Table5of13(528)=1116:Table5of13(529)=1860
Table5of13(530)=1123:Table5of13(531)=6340:Table5of13(532)=1125:Table5of13(533)=5316:Table5of13(534)=1126
Table5of13(535)=3268:Table5of13(536)=1129:Table5of13(537)=4804:Table5of13(538)=1130:Table5of13(539)=2756
Table5of13(540)=1132:Table5of13(541)=1732:Table5of13(542)=1137:Table5of13(543)=4548:Table5of13(544)=1138
Table5of13(545)=2500:Table5of13(546)=1140:Table5of13(547)=1476:Table5of13(548)=1159:Table5of13(549)=7204
Table5of13(550)=1163:Table5of13(551)=6692:Table5of13(552)=1165:Table5of13(553)=5668:Table5of13(554)=1166
Table5of13(555)=3620:Table5of13(556)=1171:Table5of13(557)=6436:Table5of13(558)=1173:Table5of13(559)=5412
Table5of13(560)=1174:Table5of13(561)=3364:Table5of13(562)=1177:Table5of13(563)=4900:Table5of13(564)=1178
Table5of13(565)=2852:Table5of13(566)=1180:Table5of13(567)=1828:Table5of13(568)=1187:Table5of13(569)=6308
Table5of13(570)=1189:Table5of13(571)=5284:Table5of13(572)=1190:Table5of13(573)=3236:Table5of13(574)=1193
Table5of13(575)=4772:Table5of13(576)=1194:Table5of13(577)=2724:Table5of13(578)=1196:Table5of13(579)=1700
Table5of13(580)=1201:Table5of13(581)=4516:Table5of13(582)=1202:Table5of13(583)=2468:Table5of13(584)=1204
Table5of13(585)=1444:Table5of13(586)=1219:Table5of13(587)=6244:Table5of13(588)=1221:Table5of13(589)=5220
Table5of13(590)=1222:Table5of13(591)=3172:Table5of13(592)=1225:Table5of13(593)=4708:Table5of13(594)=1226
Table5of13(595)=2660:Table5of13(596)=1228:Table5of13(597)=1636:Table5of13(598)=1233:Table5of13(599)=4452
Table5of13(600)=1234:Table5of13(601)=2404:Table5of13(602)=1236:Table5of13(603)=1380:Table5of13(604)=1249
Table5of13(605)=4324:Table5of13(606)=1250:Table5of13(607)=2276:Table5of13(608)=1287:Table5of13(609)=7188
Table5of13(610)=1291:Table5of13(611)=6676:Table5of13(612)=1293:Table5of13(613)=5652:Table5of13(614)=1294
Table5of13(615)=3604:Table5of13(616)=1299:Table5of13(617)=6420:Table5of13(618)=1301:Table5of13(619)=5396
Table5of13(620)=1302:Table5of13(621)=3348:Table5of13(622)=1305:Table5of13(623)=4884:Table5of13(624)=1306
Table5of13(625)=2836:Table5of13(626)=1308:Table5of13(627)=1812:Table5of13(628)=1315:Table5of13(629)=6292
Table5of13(630)=1317:Table5of13(631)=5268:Table5of13(632)=1318:Table5of13(633)=3220:Table5of13(634)=1321
Table5of13(635)=4756:Table5of13(636)=1322:Table5of13(637)=2708:Table5of13(638)=1324:Table5of13(639)=1684
Table5of13(640)=1329:Table5of13(641)=4500:Table5of13(642)=1330:Table5of13(643)=2452:Table5of13(644)=1332
Table5of13(645)=1428:Table5of13(646)=1347:Table5of13(647)=6228:Table5of13(648)=1349:Table5of13(649)=5204
Table5of13(650)=1350:Table5of13(651)=3156:Table5of13(652)=1353:Table5of13(653)=4692:Table5of13(654)=1354
Table5of13(655)=2644:Table5of13(656)=1356:Table5of13(657)=1620:Table5of13(658)=1361:Table5of13(659)=4436
Table5of13(660)=1362:Table5of13(661)=2388:Table5of13(662)=1377:Table5of13(663)=4308:Table5of13(664)=1378
Table5of13(665)=2260:Table5of13(666)=1411:Table5of13(667)=6196:Table5of13(668)=1413:Table5of13(669)=5172
Table5of13(670)=1414:Table5of13(671)=3124:Table5of13(672)=1417:Table5of13(673)=4660:Table5of13(674)=1418
Table5of13(675)=2612:Table5of13(676)=1420:Table5of13(677)=1588:Table5of13(678)=1425:Table5of13(679)=4404
Table5of13(680)=1426:Table5of13(681)=2356:Table5of13(682)=1441:Table5of13(683)=4276:Table5of13(684)=1442
Table5of13(685)=2228:Table5of13(686)=1473:Table5of13(687)=4212:Table5of13(688)=1474:Table5of13(689)=2164
Table5of13(690)=1543:Table5of13(691)=7180:Table5of13(692)=1547:Table5of13(693)=6668:Table5of13(694)=1549
Table5of13(695)=5644:Table5of13(696)=1550:Table5of13(697)=3596:Table5of13(698)=1555:Table5of13(699)=6412
Table5of13(700)=1557:Table5of13(701)=5388:Table5of13(702)=1558:Table5of13(703)=3340:Table5of13(704)=1561
Table5of13(705)=4876:Table5of13(706)=1562:Table5of13(707)=2828:Table5of13(708)=1564:Table5of13(709)=1804
Table5of13(710)=1571:Table5of13(711)=6284:Table5of13(712)=1573:Table5of13(713)=5260:Table5of13(714)=1574
Table5of13(715)=3212:Table5of13(716)=1577:Table5of13(717)=4748:Table5of13(718)=1578:Table5of13(719)=2700
Table5of13(720)=1580:Table5of13(721)=1676:Table5of13(722)=1585:Table5of13(723)=4492:Table5of13(724)=1586
Table5of13(725)=2444:Table5of13(726)=1603:Table5of13(727)=6220:Table5of13(728)=1605:Table5of13(729)=5196
Table5of13(730)=1606:Table5of13(731)=3148:Table5of13(732)=1609:Table5of13(733)=4684:Table5of13(734)=1610
Table5of13(735)=2636:Table5of13(736)=1617:Table5of13(737)=4428:Table5of13(738)=1618:Table5of13(739)=2380
Table5of13(740)=1633:Table5of13(741)=4300:Table5of13(742)=1634:Table5of13(743)=2252:Table5of13(744)=1667
Table5of13(745)=6188:Table5of13(746)=1669:Table5of13(747)=5164:Table5of13(748)=1670:Table5of13(749)=3116
Table5of13(750)=1673:Table5of13(751)=4652:Table5of13(752)=1674:Table5of13(753)=2604:Table5of13(754)=1681
Table5of13(755)=4396:Table5of13(756)=1682:Table5of13(757)=2348:Table5of13(758)=1697:Table5of13(759)=4268
Table5of13(760)=1698:Table5of13(761)=2220:Table5of13(762)=1729:Table5of13(763)=4204:Table5of13(764)=1730
Table5of13(765)=2156:Table5of13(766)=1795:Table5of13(767)=6172:Table5of13(768)=1797:Table5of13(769)=5148
Table5of13(770)=1798:Table5of13(771)=3100:Table5of13(772)=1801:Table5of13(773)=4636:Table5of13(774)=1802
Table5of13(775)=2588:Table5of13(776)=1809:Table5of13(777)=4380:Table5of13(778)=1810:Table5of13(779)=2332
Table5of13(780)=1825:Table5of13(781)=4252:Table5of13(782)=1826:Table5of13(783)=2204:Table5of13(784)=1857
Table5of13(785)=4188:Table5of13(786)=1858:Table5of13(787)=2140:Table5of13(788)=1921:Table5of13(789)=4156
Table5of13(790)=1922:Table5of13(791)=2108:Table5of13(792)=2063:Table5of13(793)=7682:Table5of13(794)=2071
Table5of13(795)=7426:Table5of13(796)=2075:Table5of13(797)=6914:Table5of13(798)=2077:Table5of13(799)=5890
Table5of13(800)=2078:Table5of13(801)=3842:Table5of13(802)=2087:Table5of13(803)=7298:Table5of13(804)=2091
Table5of13(805)=6786:Table5of13(806)=2093:Table5of13(807)=5762:Table5of13(808)=2094:Table5of13(809)=3714
Table5of13(810)=2099:Table5of13(811)=6530:Table5of13(812)=2101:Table5of13(813)=5506:Table5of13(814)=2102
Table5of13(815)=3458:Table5of13(816)=2105:Table5of13(817)=4994:Table5of13(818)=2106:Table5of13(819)=2946
Table5of13(820)=2119:Table5of13(821)=7234:Table5of13(822)=2123:Table5of13(823)=6722:Table5of13(824)=2125
Table5of13(825)=5698:Table5of13(826)=2126:Table5of13(827)=3650:Table5of13(828)=2131:Table5of13(829)=6466
Table5of13(830)=2133:Table5of13(831)=5442:Table5of13(832)=2134:Table5of13(833)=3394:Table5of13(834)=2137
Table5of13(835)=4930:Table5of13(836)=2138:Table5of13(837)=2882:Table5of13(838)=2147:Table5of13(839)=6338
Table5of13(840)=2149:Table5of13(841)=5314:Table5of13(842)=2150:Table5of13(843)=3266:Table5of13(844)=2153
Table5of13(845)=4802:Table5of13(846)=2154:Table5of13(847)=2754:Table5of13(848)=2161:Table5of13(849)=4546
Table5of13(850)=2162:Table5of13(851)=2498:Table5of13(852)=2183:Table5of13(853)=7202:Table5of13(854)=2187
Table5of13(855)=6690:Table5of13(856)=2189:Table5of13(857)=5666:Table5of13(858)=2190:Table5of13(859)=3618
Table5of13(860)=2195:Table5of13(861)=6434:Table5of13(862)=2197:Table5of13(863)=5410:Table5of13(864)=2198
Table5of13(865)=3362:Table5of13(866)=2201:Table5of13(867)=4898:Table5of13(868)=2202:Table5of13(869)=2850
Table5of13(870)=2211:Table5of13(871)=6306:Table5of13(872)=2213:Table5of13(873)=5282:Table5of13(874)=2214
Table5of13(875)=3234:Table5of13(876)=2217:Table5of13(877)=4770:Table5of13(878)=2218:Table5of13(879)=2722
Table5of13(880)=2225:Table5of13(881)=4514:Table5of13(882)=2226:Table5of13(883)=2466:Table5of13(884)=2243
Table5of13(885)=6242:Table5of13(886)=2245:Table5of13(887)=5218:Table5of13(888)=2246:Table5of13(889)=3170
Table5of13(890)=2249:Table5of13(891)=4706:Table5of13(892)=2250:Table5of13(893)=2658:Table5of13(894)=2257
Table5of13(895)=4450:Table5of13(896)=2258:Table5of13(897)=2402:Table5of13(898)=2273:Table5of13(899)=4322
Table5of13(900)=2311:Table5of13(901)=7186:Table5of13(902)=2315:Table5of13(903)=6674:Table5of13(904)=2317
Table5of13(905)=5650:Table5of13(906)=2318:Table5of13(907)=3602:Table5of13(908)=2323:Table5of13(909)=6418
Table5of13(910)=2325:Table5of13(911)=5394:Table5of13(912)=2326:Table5of13(913)=3346:Table5of13(914)=2329
Table5of13(915)=4882:Table5of13(916)=2330:Table5of13(917)=2834:Table5of13(918)=2339:Table5of13(919)=6290
Table5of13(920)=2341:Table5of13(921)=5266:Table5of13(922)=2342:Table5of13(923)=3218:Table5of13(924)=2345
Table5of13(925)=4754:Table5of13(926)=2346:Table5of13(927)=2706:Table5of13(928)=2353:Table5of13(929)=4498
Table5of13(930)=2354:Table5of13(931)=2450:Table5of13(932)=2371:Table5of13(933)=6226:Table5of13(934)=2373
Table5of13(935)=5202:Table5of13(936)=2374:Table5of13(937)=3154:Table5of13(938)=2377:Table5of13(939)=4690
Table5of13(940)=2378:Table5of13(941)=2642:Table5of13(942)=2385:Table5of13(943)=4434:Table5of13(944)=2401
Table5of13(945)=4306:Table5of13(946)=2435:Table5of13(947)=6194:Table5of13(948)=2437:Table5of13(949)=5170
Table5of13(950)=2438:Table5of13(951)=3122:Table5of13(952)=2441:Table5of13(953)=4658:Table5of13(954)=2442
Table5of13(955)=2610:Table5of13(956)=2449:Table5of13(957)=4402:Table5of13(958)=2465:Table5of13(959)=4274
Table5of13(960)=2497:Table5of13(961)=4210:Table5of13(962)=2567:Table5of13(963)=7178:Table5of13(964)=2571
Table5of13(965)=6666:Table5of13(966)=2573:Table5of13(967)=5642:Table5of13(968)=2574:Table5of13(969)=3594
Table5of13(970)=2579:Table5of13(971)=6410:Table5of13(972)=2581:Table5of13(973)=5386:Table5of13(974)=2582
Table5of13(975)=3338:Table5of13(976)=2585:Table5of13(977)=4874:Table5of13(978)=2586:Table5of13(979)=2826
Table5of13(980)=2595:Table5of13(981)=6282:Table5of13(982)=2597:Table5of13(983)=5258:Table5of13(984)=2598
Table5of13(985)=3210:Table5of13(986)=2601:Table5of13(987)=4746:Table5of13(988)=2602:Table5of13(989)=2698
Table5of13(990)=2609:Table5of13(991)=4490:Table5of13(992)=2627:Table5of13(993)=6218:Table5of13(994)=2629
Table5of13(995)=5194:Table5of13(996)=2630:Table5of13(997)=3146:Table5of13(998)=2633:Table5of13(999)=4682
Table5of13(1000)=2641:Table5of13(1001)=4426:Table5of13(1002)=2657:Table5of13(1003)=4298:Table5of13(1004)=2691
Table5of13(1005)=6186:Table5of13(1006)=2693:Table5of13(1007)=5162:Table5of13(1008)=2694:Table5of13(1009)=3114
Table5of13(1010)=2697:Table5of13(1011)=4650:Table5of13(1012)=2705:Table5of13(1013)=4394:Table5of13(1014)=2721
Table5of13(1015)=4266:Table5of13(1016)=2753:Table5of13(1017)=4202:Table5of13(1018)=2819:Table5of13(1019)=6170
Table5of13(1020)=2821:Table5of13(1021)=5146:Table5of13(1022)=2822:Table5of13(1023)=3098:Table5of13(1024)=2825
Table5of13(1025)=4634:Table5of13(1026)=2833:Table5of13(1027)=4378:Table5of13(1028)=2849:Table5of13(1029)=4250
Table5of13(1030)=2881:Table5of13(1031)=4186:Table5of13(1032)=2945:Table5of13(1033)=4154:Table5of13(1034)=3079
Table5of13(1035)=7174:Table5of13(1036)=3083:Table5of13(1037)=6662:Table5of13(1038)=3085:Table5of13(1039)=5638
Table5of13(1040)=3086:Table5of13(1041)=3590:Table5of13(1042)=3091:Table5of13(1043)=6406:Table5of13(1044)=3093
Table5of13(1045)=5382:Table5of13(1046)=3094:Table5of13(1047)=3334:Table5of13(1048)=3097:Table5of13(1049)=4870
Table5of13(1050)=3107:Table5of13(1051)=6278:Table5of13(1052)=3109:Table5of13(1053)=5254:Table5of13(1054)=3110
Table5of13(1055)=3206:Table5of13(1056)=3113:Table5of13(1057)=4742:Table5of13(1058)=3121:Table5of13(1059)=4486
Table5of13(1060)=3139:Table5of13(1061)=6214:Table5of13(1062)=3141:Table5of13(1063)=5190:Table5of13(1064)=3145
Table5of13(1065)=4678:Table5of13(1066)=3153:Table5of13(1067)=4422:Table5of13(1068)=3169:Table5of13(1069)=4294
Table5of13(1070)=3203:Table5of13(1071)=6182:Table5of13(1072)=3205:Table5of13(1073)=5158:Table5of13(1074)=3209
Table5of13(1075)=4646:Table5of13(1076)=3217:Table5of13(1077)=4390:Table5of13(1078)=3233:Table5of13(1079)=4262
Table5of13(1080)=3265:Table5of13(1081)=4198:Table5of13(1082)=3331:Table5of13(1083)=6166:Table5of13(1084)=3333
Table5of13(1085)=5142:Table5of13(1086)=3337:Table5of13(1087)=4630:Table5of13(1088)=3345:Table5of13(1089)=4374
Table5of13(1090)=3361:Table5of13(1091)=4246:Table5of13(1092)=3393:Table5of13(1093)=4182:Table5of13(1094)=3457
Table5of13(1095)=4150:Table5of13(1096)=3587:Table5of13(1097)=6158:Table5of13(1098)=3589:Table5of13(1099)=5134
Table5of13(1100)=3593:Table5of13(1101)=4622:Table5of13(1102)=3601:Table5of13(1103)=4366:Table5of13(1104)=3617
Table5of13(1105)=4238:Table5of13(1106)=3649:Table5of13(1107)=4174:Table5of13(1108)=3713:Table5of13(1109)=4142
Table5of13(1110)=3841:Table5of13(1111)=4126:Table5of13(1112)=4111:Table5of13(1113)=7681:Table5of13(1114)=4119
Table5of13(1115)=7425:Table5of13(1116)=4123:Table5of13(1117)=6913:Table5of13(1118)=4125:Table5of13(1119)=5889
Table5of13(1120)=4135:Table5of13(1121)=7297:Table5of13(1122)=4139:Table5of13(1123)=6785:Table5of13(1124)=4141
Table5of13(1125)=5761:Table5of13(1126)=4147:Table5of13(1127)=6529:Table5of13(1128)=4149:Table5of13(1129)=5505
Table5of13(1130)=4153:Table5of13(1131)=4993:Table5of13(1132)=4167:Table5of13(1133)=7233:Table5of13(1134)=4171
Table5of13(1135)=6721:Table5of13(1136)=4173:Table5of13(1137)=5697:Table5of13(1138)=4179:Table5of13(1139)=6465
Table5of13(1140)=4181:Table5of13(1141)=5441:Table5of13(1142)=4185:Table5of13(1143)=4929:Table5of13(1144)=4195
Table5of13(1145)=6337:Table5of13(1146)=4197:Table5of13(1147)=5313:Table5of13(1148)=4201:Table5of13(1149)=4801
Table5of13(1150)=4209:Table5of13(1151)=4545:Table5of13(1152)=4231:Table5of13(1153)=7201:Table5of13(1154)=4235
Table5of13(1155)=6689:Table5of13(1156)=4237:Table5of13(1157)=5665:Table5of13(1158)=4243:Table5of13(1159)=6433
Table5of13(1160)=4245:Table5of13(1161)=5409:Table5of13(1162)=4249:Table5of13(1163)=4897:Table5of13(1164)=4259
Table5of13(1165)=6305:Table5of13(1166)=4261:Table5of13(1167)=5281:Table5of13(1168)=4265:Table5of13(1169)=4769
Table5of13(1170)=4273:Table5of13(1171)=4513:Table5of13(1172)=4291:Table5of13(1173)=6241:Table5of13(1174)=4293
Table5of13(1175)=5217:Table5of13(1176)=4297:Table5of13(1177)=4705:Table5of13(1178)=4305:Table5of13(1179)=4449
Table5of13(1180)=4359:Table5of13(1181)=7185:Table5of13(1182)=4363:Table5of13(1183)=6673:Table5of13(1184)=4365
Table5of13(1185)=5649:Table5of13(1186)=4371:Table5of13(1187)=6417:Table5of13(1188)=4373:Table5of13(1189)=5393
Table5of13(1190)=4377:Table5of13(1191)=4881:Table5of13(1192)=4387:Table5of13(1193)=6289:Table5of13(1194)=4389
Table5of13(1195)=5265:Table5of13(1196)=4393:Table5of13(1197)=4753:Table5of13(1198)=4401:Table5of13(1199)=4497
Table5of13(1200)=4419:Table5of13(1201)=6225:Table5of13(1202)=4421:Table5of13(1203)=5201:Table5of13(1204)=4425
Table5of13(1205)=4689:Table5of13(1206)=4483:Table5of13(1207)=6193:Table5of13(1208)=4485:Table5of13(1209)=5169
Table5of13(1210)=4489:Table5of13(1211)=4657:Table5of13(1212)=4615:Table5of13(1213)=7177:Table5of13(1214)=4619
Table5of13(1215)=6665:Table5of13(1216)=4621:Table5of13(1217)=5641:Table5of13(1218)=4627:Table5of13(1219)=6409
Table5of13(1220)=4629:Table5of13(1221)=5385:Table5of13(1222)=4633:Table5of13(1223)=4873:Table5of13(1224)=4643
Table5of13(1225)=6281:Table5of13(1226)=4645:Table5of13(1227)=5257:Table5of13(1228)=4649:Table5of13(1229)=4745
Table5of13(1230)=4675:Table5of13(1231)=6217:Table5of13(1232)=4677:Table5of13(1233)=5193:Table5of13(1234)=4739
Table5of13(1235)=6185:Table5of13(1236)=4741:Table5of13(1237)=5161:Table5of13(1238)=4867:Table5of13(1239)=6169
Table5of13(1240)=4869:Table5of13(1241)=5145:Table5of13(1242)=5127:Table5of13(1243)=7173:Table5of13(1244)=5131
Table5of13(1245)=6661:Table5of13(1246)=5133:Table5of13(1247)=5637:Table5of13(1248)=5139:Table5of13(1249)=6405
Table5of13(1250)=5141:Table5of13(1251)=5381:Table5of13(1252)=5155:Table5of13(1253)=6277:Table5of13(1254)=5157
Table5of13(1255)=5253:Table5of13(1256)=5187:Table5of13(1257)=6213:Table5of13(1258)=5251:Table5of13(1259)=6181
Table5of13(1260)=5379:Table5of13(1261)=6165:Table5of13(1262)=5635:Table5of13(1263)=6157:Table5of13(1264)=6151
Table5of13(1265)=7171:Table5of13(1266)=6155:Table5of13(1267)=6659:Table5of13(1268)=6163:Table5of13(1269)=6403
Table5of13(1270)=6179:Table5of13(1271)=6275:Table5of13(1272)=6211:Table5of13(1273)=5189:Table5of13(1274)=4681
Table5of13(1275)=4433:Table5of13(1276)=4321:Table5of13(1277)=3142:Table5of13(1278)=2634:Table5of13(1279)=2386
Table5of13(1280)=2274:Table5of13(1281)=1612:Table5of13(1282)=1364:Table5of13(1283)=1252:Table5of13(1284)=856
Table5of13(1285)=744:Table5of13(1286)=496

' Table 20: 2 of 13 Characters (78 entries)
Table2of13(0)=3:Table2of13(1)=6144:Table2of13(2)=5:Table2of13(3)=5120:Table2of13(4)=6
Table2of13(5)=3072:Table2of13(6)=9:Table2of13(7)=4608:Table2of13(8)=10:Table2of13(9)=2560
Table2of13(10)=12:Table2of13(11)=1536:Table2of13(12)=17:Table2of13(13)=4352:Table2of13(14)=18
Table2of13(15)=2304:Table2of13(16)=20:Table2of13(17)=1280:Table2of13(18)=24:Table2of13(19)=768
Table2of13(20)=33:Table2of13(21)=4224:Table2of13(22)=34:Table2of13(23)=2176:Table2of13(24)=36
Table2of13(25)=1152:Table2of13(26)=40:Table2of13(27)=640:Table2of13(28)=48:Table2of13(29)=384
Table2of13(30)=65:Table2of13(31)=4160:Table2of13(32)=66:Table2of13(33)=2112:Table2of13(34)=68
Table2of13(35)=1088:Table2of13(36)=72:Table2of13(37)=576:Table2of13(38)=80:Table2of13(39)=320
Table2of13(40)=96:Table2of13(41)=192:Table2of13(42)=129:Table2of13(43)=4128:Table2of13(44)=130
Table2of13(45)=2080:Table2of13(46)=132:Table2of13(47)=1056:Table2of13(48)=136:Table2of13(49)=544
Table2of13(50)=144:Table2of13(51)=288:Table2of13(52)=257:Table2of13(53)=4112:Table2of13(54)=258
Table2of13(55)=2064:Table2of13(56)=260:Table2of13(57)=1040:Table2of13(58)=264:Table2of13(59)=528
Table2of13(60)=513:Table2of13(61)=4104:Table2of13(62)=514:Table2of13(63)=2056:Table2of13(64)=516
Table2of13(65)=1032:Table2of13(66)=1025:Table2of13(67)=4100:Table2of13(68)=1026:Table2of13(69)=2052
Table2of13(70)=2049:Table2of13(71)=4098:Table2of13(72)=4097:Table2of13(73)=2050:Table2of13(74)=1028
Table2of13(75)=520:Table2of13(76)=272:Table2of13(77)=160
' Table 22: Bar to Character Mapping
BarCharMap(0,0)=7:BarCharMap(0,1)=2:BarCharMap(0,2)=4:BarCharMap(0,3)=3
BarCharMap(1,0)=1:BarCharMap(1,1)=10:BarCharMap(1,2)=0:BarCharMap(1,3)=0
BarCharMap(2,0)=9:BarCharMap(2,1)=12:BarCharMap(2,2)=2:BarCharMap(2,3)=8
BarCharMap(3,0)=5:BarCharMap(3,1)=5:BarCharMap(3,2)=6:BarCharMap(3,3)=11
BarCharMap(4,0)=8:BarCharMap(4,1)=9:BarCharMap(4,2)=3:BarCharMap(4,3)=1
BarCharMap(5,0)=0:BarCharMap(5,1)=1:BarCharMap(5,2)=5:BarCharMap(5,3)=12
BarCharMap(6,0)=2:BarCharMap(6,1)=5:BarCharMap(6,2)=1:BarCharMap(6,3)=8
BarCharMap(7,0)=4:BarCharMap(7,1)=4:BarCharMap(7,2)=9:BarCharMap(7,3)=11
BarCharMap(8,0)=6:BarCharMap(8,1)=3:BarCharMap(8,2)=8:BarCharMap(8,3)=10
BarCharMap(9,0)=3:BarCharMap(9,1)=9:BarCharMap(9,2)=7:BarCharMap(9,3)=6
BarCharMap(10,0)=5:BarCharMap(10,1)=11:BarCharMap(10,2)=1:BarCharMap(10,3)=4
BarCharMap(11,0)=8:BarCharMap(11,1)=5:BarCharMap(11,2)=2:BarCharMap(11,3)=12
BarCharMap(12,0)=9:BarCharMap(12,1)=10:BarCharMap(12,2)=0:BarCharMap(12,3)=2
BarCharMap(13,0)=7:BarCharMap(13,1)=1:BarCharMap(13,2)=6:BarCharMap(13,3)=7
BarCharMap(14,0)=3:BarCharMap(14,1)=6:BarCharMap(14,2)=4:BarCharMap(14,3)=9
BarCharMap(15,0)=0:BarCharMap(15,1)=3:BarCharMap(15,2)=8:BarCharMap(15,3)=6
BarCharMap(16,0)=6:BarCharMap(16,1)=4:BarCharMap(16,2)=2:BarCharMap(16,3)=7
BarCharMap(17,0)=1:BarCharMap(17,1)=1:BarCharMap(17,2)=9:BarCharMap(17,3)=9
BarCharMap(18,0)=7:BarCharMap(18,1)=10:BarCharMap(18,2)=5:BarCharMap(18,3)=2
BarCharMap(19,0)=4:BarCharMap(19,1)=0:BarCharMap(19,2)=3:BarCharMap(19,3)=8
BarCharMap(20,0)=6:BarCharMap(20,1)=2:BarCharMap(20,2)=0:BarCharMap(20,3)=4
BarCharMap(21,0)=8:BarCharMap(21,1)=11:BarCharMap(21,2)=1:BarCharMap(21,3)=0
BarCharMap(22,0)=9:BarCharMap(22,1)=8:BarCharMap(22,2)=3:BarCharMap(22,3)=12
BarCharMap(23,0)=2:BarCharMap(23,1)=6:BarCharMap(23,2)=7:BarCharMap(23,3)=7
BarCharMap(24,0)=5:BarCharMap(24,1)=1:BarCharMap(24,2)=4:BarCharMap(24,3)=10
BarCharMap(25,0)=1:BarCharMap(25,1)=12:BarCharMap(25,2)=6:BarCharMap(25,3)=9
BarCharMap(26,0)=7:BarCharMap(26,1)=3:BarCharMap(26,2)=8:BarCharMap(26,3)=0
BarCharMap(27,0)=5:BarCharMap(27,1)=8:BarCharMap(27,2)=9:BarCharMap(27,3)=7
BarCharMap(28,0)=4:BarCharMap(28,1)=6:BarCharMap(28,2)=2:BarCharMap(28,3)=10
BarCharMap(29,0)=3:BarCharMap(29,1)=4:BarCharMap(29,2)=0:BarCharMap(29,3)=5
BarCharMap(30,0)=8:BarCharMap(30,1)=4:BarCharMap(30,2)=5:BarCharMap(30,3)=7
BarCharMap(31,0)=7:BarCharMap(31,1)=11:BarCharMap(31,2)=1:BarCharMap(31,3)=9
BarCharMap(32,0)=6:BarCharMap(32,1)=0:BarCharMap(32,2)=9:BarCharMap(32,3)=6
BarCharMap(33,0)=0:BarCharMap(33,1)=6:BarCharMap(33,2)=4:BarCharMap(33,3)=8
BarCharMap(34,0)=2:BarCharMap(34,1)=1:BarCharMap(34,2)=3:BarCharMap(34,3)=2
BarCharMap(35,0)=5:BarCharMap(35,1)=9:BarCharMap(35,2)=8:BarCharMap(35,3)=12
BarCharMap(36,0)=4:BarCharMap(36,1)=11:BarCharMap(36,2)=6:BarCharMap(36,3)=1
BarCharMap(37,0)=9:BarCharMap(37,1)=5:BarCharMap(37,2)=7:BarCharMap(37,3)=4
BarCharMap(38,0)=3:BarCharMap(38,1)=3:BarCharMap(38,2)=1:BarCharMap(38,3)=2
BarCharMap(39,0)=0:BarCharMap(39,1)=7:BarCharMap(39,2)=2:BarCharMap(39,3)=0
BarCharMap(40,0)=1:BarCharMap(40,1)=3:BarCharMap(40,2)=4:BarCharMap(40,3)=1
BarCharMap(41,0)=6:BarCharMap(41,1)=10:BarCharMap(41,2)=3:BarCharMap(41,3)=5
BarCharMap(42,0)=8:BarCharMap(42,1)=7:BarCharMap(42,2)=9:BarCharMap(42,3)=4
BarCharMap(43,0)=2:BarCharMap(43,1)=11:BarCharMap(43,2)=5:BarCharMap(43,3)=6
BarCharMap(44,0)=0:BarCharMap(44,1)=8:BarCharMap(44,2)=7:BarCharMap(44,3)=12
BarCharMap(45,0)=4:BarCharMap(45,1)=2:BarCharMap(45,2)=8:BarCharMap(45,3)=1
BarCharMap(46,0)=5:BarCharMap(46,1)=10:BarCharMap(46,2)=3:BarCharMap(46,3)=0
BarCharMap(47,0)=9:BarCharMap(47,1)=3:BarCharMap(47,2)=0:BarCharMap(47,3)=9
BarCharMap(48,0)=6:BarCharMap(48,1)=5:BarCharMap(48,2)=2:BarCharMap(48,3)=4
BarCharMap(49,0)=7:BarCharMap(49,1)=8:BarCharMap(49,2)=1:BarCharMap(49,3)=7
BarCharMap(50,0)=5:BarCharMap(50,1)=0:BarCharMap(50,2)=4:BarCharMap(50,3)=5
BarCharMap(51,0)=2:BarCharMap(51,1)=3:BarCharMap(51,2)=0:BarCharMap(51,3)=10
BarCharMap(52,0)=6:BarCharMap(52,1)=12:BarCharMap(52,2)=9:BarCharMap(52,3)=2
BarCharMap(53,0)=3:BarCharMap(53,1)=11:BarCharMap(53,2)=1:BarCharMap(53,3)=6
BarCharMap(54,0)=8:BarCharMap(54,1)=8:BarCharMap(54,2)=7:BarCharMap(54,3)=9
BarCharMap(55,0)=5:BarCharMap(55,1)=4:BarCharMap(55,2)=0:BarCharMap(55,3)=11
BarCharMap(56,0)=1:BarCharMap(56,1)=5:BarCharMap(56,2)=2:BarCharMap(56,3)=2
BarCharMap(57,0)=9:BarCharMap(57,1)=1:BarCharMap(57,2)=4:BarCharMap(57,3)=12
BarCharMap(58,0)=8:BarCharMap(58,1)=3:BarCharMap(58,2)=6:BarCharMap(58,3)=6
BarCharMap(59,0)=7:BarCharMap(59,1)=0:BarCharMap(59,2)=3:BarCharMap(59,3)=7
BarCharMap(60,0)=4:BarCharMap(60,1)=7:BarCharMap(60,2)=7:BarCharMap(60,3)=5
BarCharMap(61,0)=0:BarCharMap(61,1)=12:BarCharMap(61,2)=1:BarCharMap(61,3)=11
BarCharMap(62,0)=2:BarCharMap(62,1)=9:BarCharMap(62,2)=9:BarCharMap(62,3)=0
BarCharMap(63,0)=6:BarCharMap(63,1)=8:BarCharMap(63,2)=5:BarCharMap(63,3)=3
BarCharMap(64,0)=3:BarCharMap(64,1)=10:BarCharMap(64,2)=8:BarCharMap(64,3)=2
' Build reverse lookup
CharToCodeword.RemoveAll
For i = 0 To 1286
CharToCodeword(CStr(Table5of13(i) And &H1FFF)) = CLng(i)
Next
For i = 0 To 77
CharToCodeword(CStr(Table2of13(i) And &H1FFF)) = CLng(1287 + i)
Next
IsInitialized = True
End Sub
End Class

'==============================================================================
' Singleton Instance Function
'==============================================================================
Dim g_IMBCodecInstance

Function GetIMBCodec()
If IsEmpty(g_IMBCodecInstance) Or IsNull(g_IMBCodecInstance) Then
Set g_IMBCodecInstance = New IMBCodec
End If
Set GetIMBCodec = g_IMBCodecInstance
End Function

%>

+ 2
- 1
MVC/lib.all.asp Переглянути файл

@@ -14,4 +14,5 @@
<!--#include file="lib.FormCache.asp"-->
<!--#include file="lib.json.asp"-->
<!--#include file="lib.Upload.asp"-->
<!--#include file="activeXdepedancies.asp"-->
<!--#include file="activeXdepedancies.asp"-->
<!--#include file="lib.IMBCodec.asp"-->

+ 6
- 25
docker-compose.yml Переглянути файл

@@ -1,29 +1,10 @@
services:
codex:
build:
context: .
dockerfile: Dockerfile
container_name: TrackingKits-codex
devcontainer:
build: .
container_name: tracking-dev
volumes:
- .:/workspace
working_dir: /workspace
tty: true
stdin_open: true
tty: true

# Mount your current folder into /workspace (run compose from your repo folder)
volumes:
- ./:/workspace

# Persist Codex auth + config (maps to CODEX_HOME)
- ./volumes/codex_home:/codex

# Optional (recommended if you want Codex to run docker commands):
# Gives the container access to your host Docker daemon.
# SECURITY NOTE: docker.sock is effectively root on the host.
- /var/run/docker.sock:/var/run/docker.sock

environment:
- CODEX_HOME=/codex
# Optional: if you prefer API-key auth instead of ChatGPT login
# - OPENAI_API_KEY=${OPENAI_API_KEY}

# Keep container running so you can exec into it anytime
command: ["bash", "-lc", "sleep infinity"]

+ 1524
- 0
uploads/BRM Permit Infor 1-30-26.txt
Різницю між файлами не показано, бо вона завелика
Переглянути файл


Завантаження…
Відмінити
Зберегти

Powered by TurnKey Linux.