Kaynağa Gözat

+ PAX support for libtar
+ tests

florian 2 hafta önce
ebeveyn
işleme
5f08b16beb

+ 220 - 24
packages/libtar/src/libtar.pp

@@ -1,4 +1,3 @@
-
 (**
 (**
  Copyright (c) 2000-2010 by Stefan Heymann
  Copyright (c) 2000-2010 by Stefan Heymann
 
 
@@ -177,6 +176,11 @@ TYPE
                   FStream     : TStream;   // Internal Stream
                   FStream     : TStream;   // Internal Stream
                   FOwnsStream : BOOLEAN;   // True if FStream is owned by the TTarArchive instance
                   FOwnsStream : BOOLEAN;   // True if FStream is owned by the TTarArchive instance
                   FBytesToGo  : INT64;     // Bytes until the next Header Record
                   FBytesToGo  : INT64;     // Bytes until the next Header Record
+                  // --- PAX extended header support
+                  FPaxPath     : AnsiString;   // Pending PAX path override
+                  FPaxLinkPath : AnsiString;   // Pending PAX linkpath override
+                  FPaxSize     : INT64;        // Pending PAX size override (-1 = not set)
+                  PROCEDURE ParsePaxData (DataSize : INT64);
                 PUBLIC
                 PUBLIC
                   CONSTRUCTOR Create (Stream   : TStream);                                OVERLOAD;
                   CONSTRUCTOR Create (Stream   : TStream);                                OVERLOAD;
                   CONSTRUCTOR Create (const Filename : AnsiString;
                   CONSTRUCTOR Create (const Filename : AnsiString;
@@ -208,6 +212,8 @@ TYPE
                  FMode        : TTarModes;         // Mode
                  FMode        : TTarModes;         // Mode
                  FMagic       : AnsiString;            // Contents of the "Magic" field
                  FMagic       : AnsiString;            // Contents of the "Magic" field
                  CONSTRUCTOR CreateEmpty;
                  CONSTRUCTOR CreateEmpty;
+                 PROCEDURE WritePaxHeader (CONST DirRec : TTarDirRec;
+                                           CONST FullName, FullLinkName : AnsiString);
                PUBLIC
                PUBLIC
                  CONSTRUCTOR Create (TargetStream   : TStream);                            OVERLOAD;
                  CONSTRUCTOR Create (TargetStream   : TStream);                            OVERLOAD;
                  CONSTRUCTOR Create (const TargetFilename : AnsiString; Mode : INTEGER = fmCreate);  OVERLOAD;
                  CONSTRUCTOR Create (const TargetFilename : AnsiString; Mode : INTEGER = fmCreate);  OVERLOAD;
@@ -369,6 +375,9 @@ CONST
   TUNMLEN    =  32;
   TUNMLEN    =  32;
   TGNMLEN    =  32;
   TGNMLEN    =  32;
   CHKBLANKS  = #32#32#32#32#32#32#32#32;
   CHKBLANKS  = #32#32#32#32#32#32#32#32;
+  // --- PAX extended header type flags
+  PAX_XHEADER : AnsiChar = 'x';   // Extended header for next file only
+  PAX_GLOBAL  : AnsiChar = 'g';   // Global extended header
 
 
 TYPE
 TYPE
   TTarHeader = PACKED RECORD
   TTarHeader = PACKED RECORD
@@ -504,7 +513,8 @@ BEGIN
 END;
 END;
 
 
 
 
-PROCEDURE WriteTarHeader (Dest : TStream; DirRec : TTarDirRec);
+PROCEDURE WriteTarHeader (Dest : TStream; DirRec : TTarDirRec; TypeFlag : AnsiChar = #0);
+         // TypeFlag: if #0, derive from DirRec.FileType; otherwise use specified flag
 VAR
 VAR
   Rec      : ARRAY [0..RECORDSIZE-1] OF AnsiChar;
   Rec      : ARRAY [0..RECORDSIZE-1] OF AnsiChar;
   TH       : TTarHeader ABSOLUTE Rec;
   TH       : TTarHeader ABSOLUTE Rec;
@@ -543,19 +553,22 @@ BEGIN
   IF DirRec.DateTime >= NullDate
   IF DirRec.DateTime >= NullDate
     THEN Octal (Trunc ((DirRec.DateTime - NullDate) * 86400.0), @TH.MTime, 12)
     THEN Octal (Trunc ((DirRec.DateTime - NullDate) * 86400.0), @TH.MTime, 12)
     ELSE Octal (Trunc (                   NullDate  * 86400.0), @TH.MTime, 12);
     ELSE Octal (Trunc (                   NullDate  * 86400.0), @TH.MTime, 12);
-  CASE DirRec.FileType OF
-    ftNormal       : TH.LinkFlag := '0';
-    ftLink         : TH.LinkFlag := '1';
-    ftSymbolicLink : TH.LinkFlag := '2';
-    ftCharacter    : TH.LinkFlag := '3';
-    ftBlock        : TH.LinkFlag := '4';
-    ftDirectory    : TH.LinkFlag := '5';
-    ftFifo         : TH.LinkFlag := '6';
-    ftContiguous   : TH.LinkFlag := '7';
-    ftDumpDir      : TH.LinkFlag := 'D';
-    ftMultiVolume  : TH.LinkFlag := 'M';
-    ftVolumeHeader : TH.LinkFlag := 'V';
-    END;
+  IF TypeFlag <> #0 THEN
+    TH.LinkFlag := TypeFlag
+  ELSE
+    CASE DirRec.FileType OF
+      ftNormal       : TH.LinkFlag := '0';
+      ftLink         : TH.LinkFlag := '1';
+      ftSymbolicLink : TH.LinkFlag := '2';
+      ftCharacter    : TH.LinkFlag := '3';
+      ftBlock        : TH.LinkFlag := '4';
+      ftDirectory    : TH.LinkFlag := '5';
+      ftFifo         : TH.LinkFlag := '6';
+      ftContiguous   : TH.LinkFlag := '7';
+      ftDumpDir      : TH.LinkFlag := 'D';
+      ftMultiVolume  : TH.LinkFlag := 'M';
+      ftVolumeHeader : TH.LinkFlag := 'V';
+      END;
   StrLCopy (TH.LinkName, PAnsiChar (DirRec.LinkName), NAMSIZ);
   StrLCopy (TH.LinkName, PAnsiChar (DirRec.LinkName), NAMSIZ);
   StrLCopy (TH.Magic, PAnsiChar (DirRec.Magic + #32#32#32#32#32#32#32#32), 7);
   StrLCopy (TH.Magic, PAnsiChar (DirRec.Magic + #32#32#32#32#32#32#32#32), 7);
   StrLCopy (TH.UName, PAnsiChar (DirRec.UserName), TUNMLEN);
   StrLCopy (TH.UName, PAnsiChar (DirRec.UserName), TUNMLEN);
@@ -573,6 +586,26 @@ BEGIN
 END;
 END;
 
 
 
 
+FUNCTION BuildPaxRecord (CONST Key, Value : AnsiString) : AnsiString;
+         // Builds a single PAX extended attribute record
+         // Format: "<length> <key>=<value>\n"
+         // The tricky part: length includes itself
+VAR
+  Content : AnsiString;
+  Len, TestLen : INT64;
+  LenStr : AnsiString;
+BEGIN
+  Content := ' ' + Key + '=' + Value + #10;
+  Len := Length (Content) + 1;   // +1 for at least one digit
+  REPEAT
+    LenStr := IntToStr (Len);
+    TestLen := Length (LenStr) + Length (Content);
+    IF TestLen = Len THEN BREAK;
+    Len := TestLen;
+  UNTIL Len > 99999;
+  Result := LenStr + Content;
+END;
+
 
 
 (*
 (*
 ===============================================================================================
 ===============================================================================================
@@ -611,6 +644,73 @@ PROCEDURE TTarArchive.Reset;
 BEGIN
 BEGIN
   FStream.Position := 0;
   FStream.Position := 0;
   FBytesToGo       := 0;
   FBytesToGo       := 0;
+  FPaxPath         := '';
+  FPaxLinkPath     := '';
+  FPaxSize         := -1;
+END;
+
+
+PROCEDURE TTarArchive.ParsePaxData (DataSize : INT64);
+          // Parses PAX extended header data and stores values in FPax* fields
+VAR
+  Data     : AnsiString;
+  P        : INT64;
+  SpacePos : INT64;
+  EqPos    : INT64;
+  RecLen   : INT64;
+  Key      : AnsiString;
+  Value    : AnsiString;
+  RecLenStr: AnsiString;
+BEGIN
+  FPaxPath     := '';
+  FPaxLinkPath := '';
+  FPaxSize     := -1;
+
+  IF DataSize <= 0 THEN EXIT;
+  IF DataSize > 1024 * 1024 THEN EXIT;   // Safety limit: 1MB
+
+  SetLength (Data, DataSize);
+  FStream.Read (Data[1], DataSize);
+
+  // Skip padding to record boundary
+  IF DataSize MOD RECORDSIZE <> 0 THEN
+    FStream.Seek (RECORDSIZE - (DataSize MOD RECORDSIZE), soFromCurrent);
+
+  P := 1;
+  WHILE P <= Length (Data) DO BEGIN
+    // Find space after length
+    SpacePos := P;
+    WHILE (SpacePos <= Length (Data)) AND (Data[SpacePos] <> ' ') DO
+      INC (SpacePos);
+
+    IF SpacePos > Length (Data) THEN BREAK;
+
+    // Parse length
+    RecLenStr := Copy (Data, P, SpacePos - P);
+    RecLen := StrToIntDef (RecLenStr, 0);
+    IF RecLen <= 0 THEN BREAK;
+    IF P + RecLen - 1 > Length (Data) THEN BREAK;
+
+    // Find equals sign
+    EqPos := SpacePos + 1;
+    WHILE (EqPos < P + RecLen) AND (Data[EqPos] <> '=') DO
+      INC (EqPos);
+
+    IF EqPos < P + RecLen THEN BEGIN
+      Key := Copy (Data, SpacePos + 1, EqPos - SpacePos - 1);
+      // Value ends before newline (RecLen includes the newline)
+      Value := Copy (Data, EqPos + 1, P + RecLen - EqPos - 2);
+
+      IF Key = 'path' THEN
+        FPaxPath := Value
+      ELSE IF Key = 'linkpath' THEN
+        FPaxLinkPath := Value
+      ELSE IF Key = 'size' THEN
+        FPaxSize := StrToInt64Def (Value, -1);
+      END;
+
+    INC (P, RecLen);
+    END;
 END;
 END;
 
 
 
 
@@ -629,15 +729,32 @@ BEGIN
   IF FBytesToGo > 0 THEN
   IF FBytesToGo > 0 THEN
     FStream.Seek (Records (FBytesToGo) * RECORDSIZE, soFromCurrent);
     FStream.Seek (Records (FBytesToGo) * RECORDSIZE, soFromCurrent);
 
 
-  // --- EOF reached?
-  Result := FALSE;
-  CurFilePos := FStream.Position;
-  TRY
-    FStream.ReadBuffer (Rec, RECORDSIZE);
-    if Rec [0] = #0 THEN EXIT;   // EOF reached
-  EXCEPT
-    EXIT;   // EOF reached, too
-    END;
+  // --- Handle PAX extended headers
+  REPEAT
+    // --- EOF reached?
+    Result := FALSE;
+    CurFilePos := FStream.Position;
+    TRY
+      FStream.ReadBuffer (Rec, RECORDSIZE);
+      if Rec [0] = #0 THEN EXIT;   // EOF reached
+    EXCEPT
+      EXIT;   // EOF reached, too
+      END;
+
+    // --- Check for PAX extended header
+    IF Header.LinkFlag = PAX_XHEADER THEN BEGIN
+      ParsePaxData (ExtractNumber64 (@Header.Size, 12));
+      CONTINUE;   // Read next header
+      END
+    ELSE IF Header.LinkFlag = PAX_GLOBAL THEN BEGIN
+      // Skip global PAX headers
+      FStream.Seek (Records (ExtractNumber64 (@Header.Size, 12)) * RECORDSIZE, soFromCurrent);
+      CONTINUE;
+      END;
+
+    BREAK;   // Normal header, exit loop
+  UNTIL FALSE;
+
   Result := TRUE;
   Result := TRUE;
 
 
   ClearDirRec (DirRec);
   ClearDirRec (DirRec);
@@ -688,6 +805,20 @@ BEGIN
     INC (CheckSum, INTEGER (ORD (Rec [I])));
     INC (CheckSum, INTEGER (ORD (Rec [I])));
   DirRec.CheckSumOK := WORD (CheckSum) = WORD (HeaderChkSum);
   DirRec.CheckSumOK := WORD (CheckSum) = WORD (HeaderChkSum);
 
 
+  // --- Apply PAX overrides if present
+  IF FPaxPath <> '' THEN BEGIN
+    DirRec.Name := FPaxPath;
+    FPaxPath := '';
+    END;
+  IF FPaxLinkPath <> '' THEN BEGIN
+    DirRec.LinkName := FPaxLinkPath;
+    FPaxLinkPath := '';
+    END;
+  IF FPaxSize >= 0 THEN BEGIN
+    DirRec.Size := FPaxSize;
+    FPaxSize := -1;
+    END;
+
   IF DirRec.FileType in [ftLink, ftSymbolicLink, ftDirectory, ftFifo, ftVolumeHeader]
   IF DirRec.FileType in [ftLink, ftSymbolicLink, ftDirectory, ftFifo, ftVolumeHeader]
     THEN FBytesToGo := 0
     THEN FBytesToGo := 0
     ELSE FBytesToGo := DirRec.Size;
     ELSE FBytesToGo := DirRec.Size;
@@ -821,6 +952,55 @@ BEGIN
 END;
 END;
 
 
 
 
+PROCEDURE TTarWriter.WritePaxHeader (CONST DirRec : TTarDirRec;
+                                      CONST FullName, FullLinkName : AnsiString);
+          // Writes a PAX extended header if name or linkname exceeds NAMSIZ
+VAR
+  PaxData   : AnsiString;
+  PaxDirRec : TTarDirRec;
+  Rec       : ARRAY [0..RECORDSIZE-1] OF AnsiChar;
+  PadBytes  : INTEGER;
+BEGIN
+  PaxData := '';
+
+  // Add path if name is too long
+  IF Length (FullName) > NAMSIZ THEN
+    PaxData := PaxData + BuildPaxRecord ('path', FullName);
+
+  // Add linkpath if linkname is too long
+  IF Length (FullLinkName) > NAMSIZ THEN
+    PaxData := PaxData + BuildPaxRecord ('linkpath', FullLinkName);
+
+  IF PaxData = '' THEN EXIT;
+
+  // Create PAX header entry
+  ClearDirRec (PaxDirRec);
+  PaxDirRec.Name        := './PaxHeaders/' + Copy (FullName, 1, 80);
+  PaxDirRec.Size        := Length (PaxData);
+  PaxDirRec.DateTime    := DirRec.DateTime;
+  PaxDirRec.Permissions := FPermissions;
+  PaxDirRec.FileType    := ftNormal;
+  PaxDirRec.UID         := FUID;
+  PaxDirRec.GID         := FGID;
+  PaxDirRec.UserName    := FUserName;
+  PaxDirRec.GroupName   := FGroupName;
+  PaxDirRec.Magic       := FMagic;
+
+  // Write PAX header with 'x' type flag
+  WriteTarHeader (FStream, PaxDirRec, PAX_XHEADER);
+
+  // Write PAX data
+  FStream.Write (PaxData[1], Length (PaxData));
+
+  // Pad to record boundary
+  PadBytes := RECORDSIZE - (Length (PaxData) MOD RECORDSIZE);
+  IF (PadBytes > 0) AND (PadBytes < RECORDSIZE) THEN BEGIN
+    FillChar (Rec, PadBytes, 0);
+    FStream.Write (Rec, PadBytes);
+    END;
+END;
+
+
 PROCEDURE TTarWriter.AddFile   (const Filename : AnsiString;  TarFilename : AnsiString = '');
 PROCEDURE TTarWriter.AddFile   (const Filename : AnsiString;  TarFilename : AnsiString = '');
 VAR
 VAR
   S    : TFileStream;
   S    : TFileStream;
@@ -863,6 +1043,10 @@ BEGIN
   DirRec.MajorDevNo  := 0;
   DirRec.MajorDevNo  := 0;
   DirRec.MinorDevNo  := 0;
   DirRec.MinorDevNo  := 0;
 
 
+  // Write PAX header if name is too long
+  IF Length (TarFilename) > NAMSIZ THEN
+    WritePaxHeader (DirRec, TarFilename, '');
+
   WriteTarHeader (FStream, DirRec);
   WriteTarHeader (FStream, DirRec);
   BytesToRead := DirRec.Size;
   BytesToRead := DirRec.Size;
   WHILE BytesToRead > 0 DO BEGIN
   WHILE BytesToRead > 0 DO BEGIN
@@ -910,6 +1094,10 @@ BEGIN
   DirRec.MajorDevNo  := 0;
   DirRec.MajorDevNo  := 0;
   DirRec.MinorDevNo  := 0;
   DirRec.MinorDevNo  := 0;
 
 
+  // Write PAX header if name is too long
+  IF Length (Dirname) > NAMSIZ THEN
+    WritePaxHeader (DirRec, Dirname, '');
+
   WriteTarHeader (FStream, DirRec);
   WriteTarHeader (FStream, DirRec);
 END;
 END;
 
 
@@ -935,6 +1123,10 @@ BEGIN
   DirRec.MajorDevNo  := 0;
   DirRec.MajorDevNo  := 0;
   DirRec.MinorDevNo  := 0;
   DirRec.MinorDevNo  := 0;
 
 
+  // Write PAX header if name or linkname is too long
+  IF (Length (Filename) > NAMSIZ) OR (Length (Linkname) > NAMSIZ) THEN
+    WritePaxHeader (DirRec, Filename, Linkname);
+
   WriteTarHeader (FStream, DirRec);
   WriteTarHeader (FStream, DirRec);
 END;
 END;
 
 
@@ -960,6 +1152,10 @@ BEGIN
   DirRec.MajorDevNo  := 0;
   DirRec.MajorDevNo  := 0;
   DirRec.MinorDevNo  := 0;
   DirRec.MinorDevNo  := 0;
 
 
+  // Write PAX header if name or linkname is too long
+  IF (Length (Filename) > NAMSIZ) OR (Length (Linkname) > NAMSIZ) THEN
+    WritePaxHeader (DirRec, Filename, Linkname);
+
   WriteTarHeader (FStream, DirRec);
   WriteTarHeader (FStream, DirRec);
 END;
 END;
 
 

+ 184 - 0
packages/libtar/tests/tlibtar3.pp

@@ -0,0 +1,184 @@
+{ Simple libtar test - creates a (PAX) tar archive with a few entries }
+program libtar_simple_test;
+
+{$mode objfpc}{$H+}
+
+uses
+  SysUtils, libtar;
+
+const
+  TAR_FILENAME = 'tlibtar3.tar';
+  CONTENT_1 = 'Hello, World!';
+  CONTENT_2 = 'Some data in a subdirectory';
+  CONTENT_3 = 'hello.txt';
+  CONTENT_4 = 'hello.txt';
+  CONTENT_5 = 'Content of file with long path';
+
+  TotalEntries = 5;
+
+var
+  TW: TTarWriter;
+  TA: TTarArchive;
+  DirRec: TTarDirRec;
+  Content: RawByteString;
+  EntryCount: Integer;
+  Errors: Integer;
+  LongName: AnsiString;
+begin
+  Errors := 0;
+
+  { Create long filename for testing }
+  LongName := 'very/deep/directory/structure/with/many/levels/' +
+              StringOfChar('x', 100) + '/file.txt';
+
+  WriteLn('Creating tar archive: ', TAR_FILENAME);
+
+  try
+    TW := TTarWriter.Create(TAR_FILENAME);
+    try
+        { Set default permissions }
+        TW.Permissions := [tpReadByOwner, tpWriteByOwner, tpReadByGroup, tpReadByOther];
+
+        { Add a simple text file }
+        WriteLn('  Adding: hello.txt');
+        TW.AddString(CONTENT_1, 'hello.txt', Now);
+
+        { Add a file in a subdirectory }
+        WriteLn('  Adding: subdir/data.txt');
+        TW.AddString(CONTENT_2, 'subdir/data.txt', Now);
+
+        { Add a directory entry }
+        WriteLn('  Adding: emptydir/');
+        TW.AddDir(CONTENT_4, Now);
+
+        { Add a symbolic link }
+        WriteLn('  Adding: link.txt -> hello.txt');
+        TW.AddSymbolicLink('link.txt', CONTENT_3, Now);
+
+        { Add a file in a subdirectory with long name }
+        WriteLn('  Adding long name (', Length(LongName), ' chars)');
+        TW.AddString(CONTENT_5, LongName, Now);
+
+        TW.Finalize;
+    finally
+        TW.Free;
+    end;
+
+    WriteLn('Done. Archive created successfully.');
+    WriteLn;
+
+    WriteLn('=== Reading and verifying archive ===');
+    WriteLn;
+
+    TA := TTarArchive.Create(TAR_FILENAME);
+    try
+        EntryCount := 0;
+
+        while TA.FindNext(DirRec) do
+        begin
+        Inc(EntryCount);
+        WriteLn('Entry ', EntryCount, ':');
+        WriteLn('  Name: ', DirRec.Name);
+        WriteLn('  Size: ', DirRec.Size);
+        WriteLn('  Type: ', FILETYPE_NAME[DirRec.FileType]);
+
+        if DirRec.FileType = ftSymbolicLink then
+            begin
+            if DirRec.LinkName <> CONTENT_3 then
+                begin
+                Inc(Errors);
+                writeln('  Wrong link value');
+                end;
+            WriteLn('  Link: -> ', DirRec.LinkName);
+            end;
+
+        if DirRec.FileType = ftDirectory then
+            begin
+            if DirRec.Name <> CONTENT_4 then
+                begin
+                Inc(Errors);
+                writeln('  Wrong directory Name');
+                end;
+            end;
+
+        if DirRec.ChecksumOK then
+            WriteLn('  Checksum: OK')
+        else
+        begin
+            WriteLn('  Checksum: FAILED');
+            Inc(Errors);
+        end;
+
+        { Verify content for regular files }
+        if DirRec.FileType = ftNormal then
+        begin
+            Content := TA.ReadFile;
+
+            if DirRec.Name = 'hello.txt' then
+              begin
+              if Content = CONTENT_1 then
+                  WriteLn('  Content: verified OK')
+              else
+                begin
+                    WriteLn('  Content: MISMATCH');
+                    Inc(Errors);
+                end;
+              end
+            else if DirRec.Name = 'subdir/data.txt' then
+              begin
+              if Content = CONTENT_2 then
+                  WriteLn('  Content: verified OK')
+              else
+                begin
+                    WriteLn('  Content: MISMATCH');
+                    Inc(Errors);
+                end;
+              end
+            else if DirRec.Name = LongName then
+              begin
+                if Content = CONTENT_5 then
+                  WriteLn('  Content: verified OK')
+                else
+                begin
+                  WriteLn('  Content: MISMATCH');
+                  Inc(Errors);
+                end;
+              end
+            else
+              begin
+                WriteLn('  Unexpected entry');
+                Inc(Errors);
+              end;
+        end;
+
+        WriteLn;
+        end;
+    finally
+        TA.Free;
+    end;
+
+    { === PART 3: Summary === }
+    WriteLn('=== Summary ===');
+    WriteLn;
+    WriteLn('Total entries: ', EntryCount);
+
+    if EntryCount <> TotalEntries then
+    begin
+        WriteLn('ERROR: Expected ',TotalEntries,' entries!');
+        Inc(Errors);
+    end;
+
+    if Errors = 0 then
+        WriteLn('All tests PASSED.')
+    else
+        WriteLn('FAILED with ', Errors, ' error(s).');
+
+    WriteLn;
+
+  finally
+    { Cleanup }
+    DeleteFile(TAR_FILENAME);
+  end;
+
+  Halt(Errors);
+end.

+ 565 - 0
packages/libtar/tests/tlibtar4.pp

@@ -0,0 +1,565 @@
+{ Simple libtar test - reads a tar archive with a few entries }
+program libtar_simple_test;
+
+{$mode objfpc}{$H+}
+
+uses
+  SysUtils, libtar;
+
+const
+  libtar4_tar : array[0..6143] of byte=(
+    $68,$65,$6C,$6C,$6F,$2E,$74,$78,$74,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$31,$30,$30,$36,$34,
+    $34,$20,$00,$20,$20,$20,$20,$20,$30,$20,$00,$20,$20,$20,$20,
+    $20,$30,$20,$00,$20,$20,$20,$20,$20,$20,$20,$20,$20,$31,$35,
+    $20,$31,$35,$31,$32,$36,$37,$31,$31,$37,$31,$33,$20,$20,$31,
+    $30,$31,$31,$31,$20,$00,$30,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$75,$73,$74,$61,$72,$20,$20,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$20,
+    $20,$20,$20,$20,$30,$20,$00,$20,$20,$20,$20,$20,$30,$20,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$48,$65,$6C,$6C,$6F,$2C,$20,$57,$6F,$72,$6C,$64,$21,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$73,$75,$62,$64,$69,$72,$2F,$64,$61,$74,$61,
+    $2E,$74,$78,$74,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$31,
+    $30,$30,$36,$34,$34,$20,$00,$20,$20,$20,$20,$20,$30,$20,$00,
+    $20,$20,$20,$20,$20,$30,$20,$00,$20,$20,$20,$20,$20,$20,$20,
+    $20,$20,$33,$33,$20,$31,$35,$31,$32,$36,$37,$31,$31,$37,$31,
+    $33,$20,$20,$31,$31,$32,$30,$37,$20,$00,$30,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$75,$73,$74,$61,$72,$20,$20,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$20,$20,$20,$20,$20,$30,$20,$00,$20,$20,$20,$20,
+    $20,$30,$20,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$53,$6F,$6D,$65,$20,$64,$61,$74,$61,
+    $20,$69,$6E,$20,$61,$20,$73,$75,$62,$64,$69,$72,$65,$63,$74,
+    $6F,$72,$79,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$68,$65,$6C,$6C,$6F,$2E,$74,
+    $78,$74,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$20,$34,$30,$36,$34,$34,$20,$00,$20,$20,$20,$20,
+    $20,$30,$20,$00,$20,$20,$20,$20,$20,$30,$20,$00,$20,$20,$20,
+    $20,$20,$20,$20,$20,$20,$20,$30,$20,$31,$35,$31,$32,$36,$37,
+    $31,$31,$37,$31,$33,$20,$20,$31,$30,$30,$35,$33,$20,$00,$35,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$75,$73,$74,$61,$72,
+    $20,$20,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$20,$20,$20,$20,$20,$30,$20,$00,
+    $20,$20,$20,$20,$20,$30,$20,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$6C,$69,$6E,$6B,$2E,
+    $74,$78,$74,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$31,$32,$30,$36,$34,$34,$20,$00,$20,$20,
+    $20,$20,$20,$30,$20,$00,$20,$20,$20,$20,$20,$30,$20,$00,$20,
+    $20,$20,$20,$20,$20,$20,$20,$20,$20,$30,$20,$31,$35,$31,$32,
+    $36,$37,$31,$31,$37,$31,$33,$20,$20,$31,$31,$35,$36,$33,$20,
+    $00,$32,$68,$65,$6C,$6C,$6F,$2E,$74,$78,$74,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$75,$73,$74,
+    $61,$72,$20,$20,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$20,$20,$20,$20,$20,$30,
+    $20,$00,$20,$20,$20,$20,$20,$30,$20,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$2E,$2F,$50,
+    $61,$78,$48,$65,$61,$64,$65,$72,$73,$2F,$76,$65,$72,$79,$2F,
+    $64,$65,$65,$70,$2F,$64,$69,$72,$65,$63,$74,$6F,$72,$79,$2F,
+    $73,$74,$72,$75,$63,$74,$75,$72,$65,$2F,$77,$69,$74,$68,$2F,
+    $6D,$61,$6E,$79,$2F,$6C,$65,$76,$65,$6C,$73,$2F,$78,$78,$78,
+    $78,$78,$78,$78,$78,$78,$78,$78,$78,$78,$78,$78,$78,$78,$78,
+    $78,$78,$78,$78,$78,$78,$78,$78,$78,$78,$78,$78,$78,$78,$78,
+    $00,$00,$00,$00,$00,$00,$00,$31,$30,$30,$36,$34,$34,$20,$00,
+    $20,$20,$20,$20,$20,$30,$20,$00,$20,$20,$20,$20,$20,$30,$20,
+    $00,$20,$20,$20,$20,$20,$20,$20,$20,$32,$34,$36,$20,$31,$35,
+    $31,$32,$36,$37,$31,$31,$37,$31,$33,$20,$20,$33,$31,$35,$33,
+    $35,$20,$00,$78,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$75,
+    $73,$74,$61,$72,$20,$20,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$20,$20,$20,$20,
+    $20,$30,$20,$00,$20,$20,$20,$20,$20,$30,$20,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$31,
+    $36,$36,$20,$70,$61,$74,$68,$3D,$76,$65,$72,$79,$2F,$64,$65,
+    $65,$70,$2F,$64,$69,$72,$65,$63,$74,$6F,$72,$79,$2F,$73,$74,
+    $72,$75,$63,$74,$75,$72,$65,$2F,$77,$69,$74,$68,$2F,$6D,$61,
+    $6E,$79,$2F,$6C,$65,$76,$65,$6C,$73,$2F,$78,$78,$78,$78,$78,
+    $78,$78,$78,$78,$78,$78,$78,$78,$78,$78,$78,$78,$78,$78,$78,
+    $78,$78,$78,$78,$78,$78,$78,$78,$78,$78,$78,$78,$78,$78,$78,
+    $78,$78,$78,$78,$78,$78,$78,$78,$78,$78,$78,$78,$78,$78,$78,
+    $78,$78,$78,$78,$78,$78,$78,$78,$78,$78,$78,$78,$78,$78,$78,
+    $78,$78,$78,$78,$78,$78,$78,$78,$78,$78,$78,$78,$78,$78,$78,
+    $78,$78,$78,$78,$78,$78,$78,$78,$78,$78,$78,$78,$78,$78,$78,
+    $78,$78,$78,$78,$78,$2F,$66,$69,$6C,$65,$2E,$74,$78,$74,$0A,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$76,$65,$72,$79,$2F,$64,$65,$65,$70,$2F,$64,$69,$72,$65,
+    $63,$74,$6F,$72,$79,$2F,$73,$74,$72,$75,$63,$74,$75,$72,$65,
+    $2F,$77,$69,$74,$68,$2F,$6D,$61,$6E,$79,$2F,$6C,$65,$76,$65,
+    $6C,$73,$2F,$78,$78,$78,$78,$78,$78,$78,$78,$78,$78,$78,$78,
+    $78,$78,$78,$78,$78,$78,$78,$78,$78,$78,$78,$78,$78,$78,$78,
+    $78,$78,$78,$78,$78,$78,$78,$78,$78,$78,$78,$78,$78,$78,$78,
+    $78,$78,$78,$78,$78,$78,$78,$78,$78,$78,$78,$31,$30,$30,$36,
+    $34,$34,$20,$00,$20,$20,$20,$20,$20,$30,$20,$00,$20,$20,$20,
+    $20,$20,$30,$20,$00,$20,$20,$20,$20,$20,$20,$20,$20,$20,$33,
+    $36,$20,$31,$35,$31,$32,$36,$37,$31,$31,$37,$31,$33,$20,$20,
+    $33,$33,$37,$36,$31,$20,$00,$30,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$75,$73,$74,$61,$72,$20,$20,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $20,$20,$20,$20,$20,$30,$20,$00,$20,$20,$20,$20,$20,$30,$20,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$43,$6F,$6E,$74,$65,$6E,$74,$20,$6F,$66,$20,$66,
+    $69,$6C,$65,$20,$77,$69,$74,$68,$20,$6C,$6F,$6E,$67,$20,$70,
+    $61,$74,$68,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00);
+
+  TAR_FILENAME = 'tlibtar4.tar';
+  CONTENT_1 = 'Hello, World!';
+  CONTENT_2 = 'Some data in a subdirectory';
+  CONTENT_3 = 'hello.txt';
+  CONTENT_4 = 'hello.txt';
+  CONTENT_5 = 'Content of file with long path';
+
+  TotalEntries = 5;
+
+var
+  TW: TTarWriter;
+  TA: TTarArchive;
+  DirRec: TTarDirRec;
+  Content: RawByteString;
+  EntryCount: Integer;
+  Errors: Integer;
+  f: File;
+  LongName: AnsiString;
+begin
+  Errors := 0;
+
+  { Create long filename for testing }
+  LongName := 'very/deep/directory/structure/with/many/levels/' +
+              StringOfChar('x', 100) + '/file.txt';
+
+  WriteLn('Creating tar archive: ', TAR_FILENAME);
+  Assign(f, TAR_FILENAME);
+  Rewrite(f, 1);
+  BlockWrite(f, libtar4_tar, SizeOf(libtar4_tar));
+  Close(f);
+
+  WriteLn('Reading tar archive: ', TAR_FILENAME);
+
+  try
+    TA := TTarArchive.Create(TAR_FILENAME);
+    try
+        EntryCount := 0;
+
+        while TA.FindNext(DirRec) do
+        begin
+        Inc(EntryCount);
+        WriteLn('Entry ', EntryCount, ':');
+        WriteLn('  Name: ', DirRec.Name);
+        WriteLn('  Size: ', DirRec.Size);
+        WriteLn('  Type: ', FILETYPE_NAME[DirRec.FileType]);
+
+        if DirRec.FileType = ftSymbolicLink then
+            begin
+            if DirRec.LinkName <> CONTENT_3 then
+                begin
+                Inc(Errors);
+                writeln('  Wrong link value');
+                end;
+            WriteLn('  Link: -> ', DirRec.LinkName);
+            end;
+
+        if DirRec.FileType = ftDirectory then
+            begin
+            if DirRec.Name <> CONTENT_4 then
+                begin
+                Inc(Errors);
+                writeln('  Wrong directory Name');
+                end;
+            end;
+
+        if DirRec.ChecksumOK then
+            WriteLn('  Checksum: OK')
+        else
+        begin
+            WriteLn('  Checksum: FAILED');
+            Inc(Errors);
+        end;
+
+        { Verify content for regular files }
+        if DirRec.FileType = ftNormal then
+        begin
+            Content := TA.ReadFile;
+
+            if DirRec.Name = 'hello.txt' then
+              begin
+                if Content = CONTENT_1 then
+                    WriteLn('  Content: verified OK')
+                else
+                begin
+                    WriteLn('  Content: MISMATCH');
+                    Inc(Errors);
+                end;
+              end
+            else if DirRec.Name = 'subdir/data.txt' then
+              begin
+              if Content = CONTENT_2 then
+                  WriteLn('  Content: verified OK')
+              else
+                begin
+                    WriteLn('  Content: MISMATCH');
+                    Inc(Errors);
+                end;
+              end
+            else if DirRec.Name = LongName then
+              begin
+                if Content = CONTENT_5 then
+                  WriteLn('  Content: verified OK')
+                else
+                begin
+                  WriteLn('  Content: MISMATCH');
+                  Inc(Errors);
+                end;
+              end
+            else
+              begin
+                WriteLn('  Unexpected entry');
+                Inc(Errors);
+              end;
+        end;
+
+        WriteLn;
+        end;
+    finally
+        TA.Free;
+    end;
+
+    { === PART 3: Summary === }
+    WriteLn('=== Summary ===');
+    WriteLn;
+    WriteLn('Total entries: ', EntryCount);
+
+    if EntryCount <> TotalEntries then
+    begin
+        WriteLn('ERROR: Expected ',TotalEntries,' entries!');
+        Inc(Errors);
+    end;
+
+    if Errors = 0 then
+        WriteLn('All tests PASSED.')
+    else
+        WriteLn('FAILED with ', Errors, ' error(s).');
+  finally
+    DeleteFile(TAR_FILENAME);
+  end;
+
+  WriteLn;
+
+  Halt(Errors);
+end.

+ 812 - 0
packages/libtar/tests/tlibtar5.pp

@@ -0,0 +1,812 @@
+{ Simple libtar test - reads a tar archive with a few entries }
+program libtar_simple_test;
+
+{$mode objfpc}{$H+}
+
+uses
+  SysUtils, libtar;
+
+const
+  libtar5_tar : array[0..10239] of byte=(
+    $2F,$74,$6D,$70,$2F,$47,$6C,$6F,$62,$61,$6C,$48,$65,$61,$64,
+    $2E,$31,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$30,$30,$30,$30,$36,
+    $34,$34,$00,$30,$30,$30,$30,$30,$30,$30,$00,$30,$30,$30,$30,
+    $30,$30,$30,$00,$30,$30,$30,$30,$30,$30,$30,$30,$31,$35,$33,
+    $00,$31,$35,$31,$32,$36,$36,$37,$36,$32,$35,$37,$00,$30,$31,
+    $31,$30,$33,$36,$00,$20,$67,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$75,$73,$74,$61,$72,$00,$30,$30,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$33,$33,$20,$56,$45,$4E,$44,$4F,$52,$2E,$63,$75,$73,
+    $74,$6F,$6D,$3D,$6D,$79,$5F,$63,$75,$73,$74,$6F,$6D,$5F,$76,
+    $61,$6C,$75,$65,$0A,$33,$34,$20,$63,$6F,$6D,$6D,$65,$6E,$74,
+    $3D,$54,$68,$69,$73,$20,$69,$73,$20,$61,$20,$64,$65,$6D,$6F,
+    $20,$61,$72,$63,$68,$69,$76,$65,$0A,$32,$30,$20,$6D,$74,$69,
+    $6D,$65,$3D,$31,$37,$30,$34,$30,$36,$37,$32,$30,$30,$0A,$32,
+    $30,$20,$61,$74,$69,$6D,$65,$3D,$31,$37,$30,$34,$30,$36,$37,
+    $32,$30,$30,$0A,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$2E,$2F,$50,$61,$78,$48,$65,$61,$64,$65,$72,
+    $73,$2F,$70,$61,$78,$5F,$64,$65,$6D,$6F,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$30,
+    $30,$30,$30,$36,$34,$34,$00,$30,$30,$30,$30,$30,$30,$30,$00,
+    $30,$30,$30,$30,$30,$30,$30,$00,$30,$30,$30,$30,$30,$30,$30,
+    $30,$31,$30,$36,$00,$31,$35,$31,$32,$36,$36,$37,$36,$32,$35,
+    $37,$00,$30,$31,$32,$30,$33,$32,$00,$20,$78,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$75,$73,$74,$61,$72,$00,$30,$30,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$33,$30,$20,$63,$74,$69,$6D,$65,$3D,
+    $31,$37,$36,$37,$36,$30,$33,$33,$37,$35,$2E,$35,$39,$35,$36,
+    $32,$30,$30,$32,$32,$0A,$32,$30,$20,$6D,$74,$69,$6D,$65,$3D,
+    $31,$37,$30,$34,$30,$36,$37,$32,$30,$30,$0A,$32,$30,$20,$61,
+    $74,$69,$6D,$65,$3D,$31,$37,$30,$34,$30,$36,$37,$32,$30,$30,
+    $0A,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$70,$61,$78,$5F,$64,$65,$6D,
+    $6F,$2F,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$30,$30,$30,$30,$37,$37,$35,$00,$30,$30,$30,$31,
+    $37,$35,$30,$00,$30,$30,$30,$31,$37,$35,$30,$00,$30,$30,$30,
+    $30,$30,$30,$30,$30,$30,$30,$30,$00,$31,$35,$31,$32,$36,$36,
+    $37,$36,$32,$35,$37,$00,$30,$31,$32,$36,$30,$33,$00,$20,$35,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$75,$73,$74,$61,$72,
+    $00,$30,$30,$66,$6C,$6F,$72,$69,$61,$6E,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$66,$6C,$6F,$72,$69,$61,$6E,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$70,$61,$78,$5F,$64,
+    $65,$6D,$6F,$2F,$50,$61,$78,$48,$65,$61,$64,$65,$72,$73,$2F,
+    $73,$61,$6D,$70,$6C,$65,$2E,$74,$78,$74,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$30,$30,$30,$30,$36,$34,$34,$00,$30,$30,
+    $30,$30,$30,$30,$30,$00,$30,$30,$30,$30,$30,$30,$30,$00,$30,
+    $30,$30,$30,$30,$30,$30,$30,$31,$30,$36,$00,$31,$35,$31,$32,
+    $36,$36,$37,$36,$32,$35,$37,$00,$30,$31,$33,$37,$37,$34,$00,
+    $20,$78,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$75,$73,$74,
+    $61,$72,$00,$30,$30,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$33,$30,$20,
+    $63,$74,$69,$6D,$65,$3D,$31,$37,$36,$37,$36,$30,$33,$33,$37,
+    $35,$2E,$35,$39,$35,$36,$32,$30,$30,$32,$32,$0A,$32,$30,$20,
+    $6D,$74,$69,$6D,$65,$3D,$31,$37,$30,$34,$30,$36,$37,$32,$30,
+    $30,$0A,$32,$30,$20,$61,$74,$69,$6D,$65,$3D,$31,$37,$30,$34,
+    $30,$36,$37,$32,$30,$30,$0A,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$70,
+    $61,$78,$5F,$64,$65,$6D,$6F,$2F,$73,$61,$6D,$70,$6C,$65,$2E,
+    $74,$78,$74,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$30,$30,$30,$30,$36,$36,
+    $34,$00,$30,$30,$30,$31,$37,$35,$30,$00,$30,$30,$30,$31,$37,
+    $35,$30,$00,$30,$30,$30,$30,$30,$30,$30,$30,$30,$32,$34,$00,
+    $31,$35,$31,$32,$36,$36,$37,$36,$32,$35,$37,$00,$30,$31,$34,
+    $36,$32,$31,$00,$20,$30,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$75,$73,$74,$61,$72,$00,$30,$30,$66,$6C,$6F,$72,$69,$61,
+    $6E,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$66,$6C,$6F,$72,
+    $69,$61,$6E,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$48,$65,$6C,$6C,$6F,$2C,$20,$50,$41,$58,$20,$68,$65,$61,
+    $64,$65,$72,$73,$21,$0A,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$70,$61,$78,$5F,$64,$65,$6D,$6F,$2F,$50,$61,$78,
+    $48,$65,$61,$64,$65,$72,$73,$2F,$74,$68,$69,$73,$5F,$69,$73,
+    $5F,$61,$5F,$76,$65,$72,$79,$5F,$6C,$6F,$6E,$67,$5F,$66,$69,
+    $6C,$65,$6E,$61,$6D,$65,$5F,$74,$68,$61,$74,$5F,$64,$65,$6D,
+    $6F,$6E,$73,$74,$72,$61,$74,$65,$73,$5F,$68,$6F,$77,$5F,$70,
+    $61,$78,$5F,$66,$6F,$72,$6D,$61,$74,$5F,$68,$61,$6E,$64,$6C,
+    $65,$73,$5F,$6E,$61,$6D,$65,$73,$5F,$65,$78,$63,$65,$30,$30,
+    $30,$30,$36,$34,$34,$00,$30,$30,$30,$30,$30,$30,$30,$00,$30,
+    $30,$30,$30,$30,$30,$30,$00,$30,$30,$30,$30,$30,$30,$30,$30,
+    $33,$37,$34,$00,$31,$35,$31,$32,$36,$36,$37,$36,$32,$35,$37,
+    $00,$30,$33,$32,$33,$36,$34,$00,$20,$78,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$75,$73,$74,$61,$72,$00,$30,$30,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$31,$38,$32,$20,$70,$61,$74,$68,$3D,$70,
+    $61,$78,$5F,$64,$65,$6D,$6F,$2F,$74,$68,$69,$73,$5F,$69,$73,
+    $5F,$61,$5F,$76,$65,$72,$79,$5F,$6C,$6F,$6E,$67,$5F,$66,$69,
+    $6C,$65,$6E,$61,$6D,$65,$5F,$74,$68,$61,$74,$5F,$64,$65,$6D,
+    $6F,$6E,$73,$74,$72,$61,$74,$65,$73,$5F,$68,$6F,$77,$5F,$70,
+    $61,$78,$5F,$66,$6F,$72,$6D,$61,$74,$5F,$68,$61,$6E,$64,$6C,
+    $65,$73,$5F,$6E,$61,$6D,$65,$73,$5F,$65,$78,$63,$65,$65,$64,
+    $69,$6E,$67,$5F,$74,$68,$65,$5F,$74,$72,$61,$64,$69,$74,$69,
+    $6F,$6E,$61,$6C,$5F,$31,$30,$30,$5F,$63,$68,$61,$72,$61,$63,
+    $74,$65,$72,$5F,$6C,$69,$6D,$69,$74,$5F,$69,$6E,$5F,$75,$73,
+    $74,$61,$72,$5F,$66,$6F,$72,$6D,$61,$74,$5F,$77,$68,$69,$63,
+    $68,$5F,$69,$73,$5F,$71,$75,$69,$74,$65,$5F,$75,$73,$65,$66,
+    $75,$6C,$2E,$74,$78,$74,$0A,$33,$30,$20,$63,$74,$69,$6D,$65,
+    $3D,$31,$37,$36,$37,$36,$30,$33,$33,$37,$35,$2E,$35,$39,$35,
+    $36,$32,$30,$30,$32,$32,$0A,$32,$30,$20,$6D,$74,$69,$6D,$65,
+    $3D,$31,$37,$30,$34,$30,$36,$37,$32,$30,$30,$0A,$32,$30,$20,
+    $61,$74,$69,$6D,$65,$3D,$31,$37,$30,$34,$30,$36,$37,$32,$30,
+    $30,$0A,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$70,$61,$78,$5F,$64,$65,$6D,$6F,
+    $2F,$74,$68,$69,$73,$5F,$69,$73,$5F,$61,$5F,$76,$65,$72,$79,
+    $5F,$6C,$6F,$6E,$67,$5F,$66,$69,$6C,$65,$6E,$61,$6D,$65,$5F,
+    $74,$68,$61,$74,$5F,$64,$65,$6D,$6F,$6E,$73,$74,$72,$61,$74,
+    $65,$73,$5F,$68,$6F,$77,$5F,$70,$61,$78,$5F,$66,$6F,$72,$6D,
+    $61,$74,$5F,$68,$61,$6E,$64,$6C,$65,$73,$5F,$6E,$61,$6D,$65,
+    $73,$5F,$65,$78,$63,$65,$65,$64,$69,$6E,$67,$5F,$74,$68,$65,
+    $5F,$74,$30,$30,$30,$30,$36,$36,$34,$00,$30,$30,$30,$31,$37,
+    $35,$30,$00,$30,$30,$30,$31,$37,$35,$30,$00,$30,$30,$30,$30,
+    $30,$30,$30,$30,$30,$34,$30,$00,$31,$35,$31,$32,$36,$36,$37,
+    $36,$32,$35,$37,$00,$30,$33,$35,$33,$37,$32,$00,$20,$30,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$75,$73,$74,$61,$72,$00,
+    $30,$30,$66,$6C,$6F,$72,$69,$61,$6E,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$66,$6C,$6F,$72,$69,$61,$6E,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$54,$68,$69,$73,$20,$66,
+    $69,$6C,$65,$20,$68,$61,$73,$20,$61,$20,$76,$65,$72,$79,$20,
+    $6C,$6F,$6E,$67,$20,$6E,$61,$6D,$65,$21,$0A,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
+    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00);
+
+
+  TAR_FILENAME = 'tlibtar5.tar';
+  CONTENT_1 = 'pax_demo/';
+  CONTENT_2 = 'Hello, PAX headers!'#10;
+  CONTENT_3 = 'This file has a very long name!'#10;
+
+  TotalEntries = 3;
+
+var
+  TW: TTarWriter;
+  TA: TTarArchive;
+  DirRec: TTarDirRec;
+  Content: RawByteString;
+  EntryCount: Integer;
+  Errors: Integer;
+  f: File;
+begin
+  Errors := 0;
+
+  WriteLn('Creating tar archive: ', TAR_FILENAME);
+  Assign(f, TAR_FILENAME);
+  Rewrite(f, 1);
+  BlockWrite(f, libtar5_tar, SizeOf(libtar5_tar));
+  Close(f);
+
+  WriteLn('Reading tar archive: ', TAR_FILENAME);
+
+  try
+    TA := TTarArchive.Create(TAR_FILENAME);
+    try
+        EntryCount := 0;
+
+        while TA.FindNext(DirRec) do
+        begin
+        Inc(EntryCount);
+        WriteLn('Entry ', EntryCount, ':');
+        WriteLn('  Name: ', DirRec.Name);
+        WriteLn('  Size: ', DirRec.Size);
+        WriteLn('  Type: ', FILETYPE_NAME[DirRec.FileType]);
+
+        if DirRec.FileType = ftDirectory then
+            begin
+            if DirRec.Name <> CONTENT_1 then
+                begin
+                Inc(Errors);
+                writeln('  Wrong directory Name');
+                end;
+            end;
+
+        if DirRec.ChecksumOK then
+            WriteLn('  Checksum: OK')
+        else
+        begin
+            WriteLn('  Checksum: FAILED');
+            Inc(Errors);
+        end;
+
+        { Verify content for regular files }
+        if DirRec.FileType = ftNormal then
+        begin
+            Content := TA.ReadFile;
+
+            if DirRec.Name = 'pax_demo/sample.txt' then
+              begin
+                if Content = CONTENT_2 then
+                    WriteLn('  Content: verified OK')
+                else
+                begin
+                    WriteLn('  Content: MISMATCH, got ''',Content,'''');
+                    Inc(Errors);
+                end;
+              end
+            else if DirRec.Name = 'pax_demo/this_is_a_very_long_filename_that_demonstrates_how_pax_format_handles_names_exceeding_the_traditional_100_character_limit_in_ustar_format_which_is_quite_useful.txt' then
+              begin
+              if Content = CONTENT_3 then
+                  WriteLn('  Content: verified OK')
+              else
+                begin
+                    WriteLn('  Content: MISMATCH, got ''',Content,'''');
+                    Inc(Errors);
+                end;
+              end
+            else
+              begin
+                WriteLn('  Unexpected entry');
+                Inc(Errors);
+              end;
+        end;
+
+        WriteLn;
+        end;
+    finally
+        TA.Free;
+    end;
+
+    { === PART 3: Summary === }
+    WriteLn('=== Summary ===');
+    WriteLn;
+    WriteLn('Total entries: ', EntryCount);
+
+    if EntryCount <> TotalEntries then
+    begin
+        WriteLn('ERROR: Expected ',TotalEntries,' entries!');
+        Inc(Errors);
+    end;
+
+    if Errors = 0 then
+        WriteLn('All tests PASSED.')
+    else
+        WriteLn('FAILED with ', Errors, ' error(s).');
+  finally
+    DeleteFile(TAR_FILENAME);
+  end;
+
+  WriteLn;
+
+  Halt(Errors);
+end.