Register - Login
Views: 99387178
Main - Memberlist - Active users - Calendar - Wiki - IRC Chat - Online users
Ranks - Rules/FAQ - Stats - Latest Posts - Color Chart - Smilies
04-24-22 05:55:13 AM
Jul - The Cutting Room Floor - Shovel Knight - devmenu New poll - New thread - New reply
Next newer thread | Next older thread
wisk
Random nobody
Level: 5


Posts: 1/4
EXP: 425
For next: 104

Since: 07-28-14


Since last post: 7.7 years
Last activity: 6.6 years

Posted on 07-28-14 07:24:35 PM Link | Quote
Hi guys,

I spent some times reversing the game Shove Knight and found a hidden menu:



And a text viewer:



To reach this menu: open ShovelKnight.exe (md5:4efb1caf0dd0b4ba0c71c77c33768605) with an hex editor, and simply modify the byte located at 0x15f4cb from 0x40 to 0x5d. (don't forget to copy/rename the executable first).

I think there's more to find, but most of "interesting" files seem to be missing in the retail version.
einstein95
Member
Level: 37


Posts: 134/318
EXP: 325763
For next: 12490

Since: 04-11-13


Since last post: 3.3 years
Last activity: 3.3 years

Posted on 08-01-14 06:17:30 AM Link | Quote
Instead of an offset, could you give the 5 hex bytes before and after? That way it might be able to be found in later versions.

____________________
The more I type, the less gooder it sounds does.
wisk
Random nobody
Level: 5


Posts: 2/4
EXP: 425
For next: 104

Since: 07-28-14


Since last post: 7.7 years
Last activity: 6.6 years

Posted on 08-01-14 07:02:56 PM (last edited by wisk at 08-01-14 07:05:10 PM) Link | Quote
Originally posted by einstein95
Instead of an offset, could you give the 5 hex bytes before and after? That way it might be able to be found in later versions.


Sure, it'll better with the asm code:




; function: 0055FED0
.text:005600A9 D9 EE fldz
.text:005600AB 89 47 08 mov [edi+8], eax
.text:005600AE D9 50 54 fst dword ptr [eax+54h]
.text:005600B1 D9 58 64 fstp dword ptr [eax+64h]
.text:005600B4 D9 80 A0 00 00 00 fld dword ptr [eax+0A0h]
.text:005600BA DC 25 08 FA 61 00 fsub ds:dbl_61FA08
.text:005600C0 D9 58 74 fstp dword ptr [eax+74h]
.text:005600C3 EB 02 jmp short loc_5600C7
.text:005600C5 ; ---------------------------------------------------------------------------
.text:005600C5
.text:005600C5 loc_5600C5: ; CODE XREF: sub_55FED0+187j
.text:005600C5 33 FF xor edi, edi
.text:005600C7
.text:005600C7 loc_5600C7: ; CODE XREF: sub_55FED0+1F3j
.text:005600C7 8B 75 F8 mov esi, [ebp+var_8]
.text:005600CA 6A 40 push 40h ; TitleScreenID
.text:005600CC E8 9F 33 04 00 call SK_SetId ; init the second id
.text:005600CC ; update id
.text:005600D1 8B 4D FC mov ecx, [ebp+var_4]
.text:005600D4
.text:005600D4 loc_5600D4: ; CODE XREF: sub_55FED0+C8j
.text:005600D4 ; sub_55FED0+D5j
.text:005600D4 8D 79 58 lea edi, [ecx+58h]
.text:005600D7 C7 45 F8 07 00 00 00 mov [ebp+var_8], 7
.text:005600DE 8B FF mov edi, edi




Basically, SK_SetId (005A3470) sets the given argument to a global variable. The patch modifies the argument (005600CA + 1) from 0x40 (TitleScreenID) to 0x5D (DevMenuId).




;function: 005A3470 (SK_SetId)
.text:005A34B5 8B 45 08 mov eax, [ebp+DataId]
.text:005A34B8 A3 10 6D 63 00 mov g_SK_NextId



This ID is then copied to another global variable:




; function: 005A3050
.text:005A3152 8B 15 10 6D 63 00 mov edx, g_SK_NextId
.text:005A3158 8B 0D 0C 6D 63 00 mov ecx, g_SK_CurId
.text:005A315E 89 35 10 6D 63 00 mov g_SK_NextId, esi
.text:005A3164 8B 35 2C 42 5F 00 mov esi, ds:SDL_GetTicks
.text:005A316A 89 0D 14 6D 63 00 mov dword_636D14, ecx
.text:005A3170 89 15 0C 6D 63 00 mov g_SK_CurId



Finally, this ID is used to fetch an entry from a global array of structure which contains every "scenes" of the game:




; function: 0048A4E0
.text:0048A4EC A1 0C 6D 63 00 mov eax, g_SK_CurId
.text:0048A4F1 56 push esi ; Args
.text:0048A4F2 8B 35 E4 40 5F 00 mov esi, ds:sprintf
.text:0048A4F8 8D 04 40 lea eax, [eax+eax*2]
.text:0048A4FB 8B 0C C5 08 80 62 00 mov ecx, dword ptr g_DataEntries.Name[eax*8]



In this case, we're looking for 0x5D because it contains the entry "Dev Init".




.data:00628008 dd offset aDevInit ; [5Dh].Name
.data:00628008 dd 0 ; [5Dh].PakPath
.data:00628008 dd offset byte_5FF6FE ; [5Dh].DataPath
.data:00628008 dd offset aDev ; [5Dh].Type
.data:00628008 dd 2 ; [5Dh].anonymous_4
.data:00628008 dd 0 ; [5Dh].anonymous_5



There's more way to access this devmenu, but I think this one is the cleaner.
Tell me if you need further info.

BTW, the PC version contains references to StreetPass:

einstein95
Member
Level: 37


Posts: 135/318
EXP: 325763
For next: 12490

Since: 04-11-13


Since last post: 3.3 years
Last activity: 3.3 years

Posted on 08-02-14 11:35:21 AM (last edited by einstein95 at 08-02-14 11:46:50 AM) Link | Quote
Whoa, didn't expect that! In the latest gog.com version, (MD5: f06634861076e2af96f4caf122b72b54) the byte is at offset 0x15EAEB.

In addition to Streetpass references, in the menu text (line 74) there's the option "MIIVERSE FUNCTIONS" in addition to 79 and 80 being "SPOTPASS" and "MIIVERSE" respectively. Line 130+ all start with (COMMUNITY_) (130 is [sic] "MIIVERSE FUNCTIONS ARE UNAVALIABLE"), and describe the "Digger's Diary" which is the Miiverse stuff.

Edit: Oh, turns out the 3DS version was released on the 26th June.

____________________
The more I type, the less gooder it sounds does.
jedivulcan
Member
Level: 18


Posts: 23/56
EXP: 26236
For next: 3661

Since: 07-31-11


Since last post: 2.5 years
Last activity: 99 days

Posted on 08-02-14 04:48:38 PM Link | Quote
Originally posted by einstein95
Whoa, didn't expect that! In the latest gog.com version, (MD5: f06634861076e2af96f4caf122b72b54) the byte is at offset 0x15EAEB.

In addition to Streetpass references, in the menu text (line 74) there's the option "MIIVERSE FUNCTIONS" in addition to 79 and 80 being "SPOTPASS" and "MIIVERSE" respectively. Line 130+ all start with (COMMUNITY_) (130 is [sic] "MIIVERSE FUNCTIONS ARE UNAVALIABLE"), and describe the "Digger's Diary" which is the Miiverse stuff.

Edit: Oh, turns out the 3DS version was released on the 26th June.


Neither the 3DS or Wii U versions have SpotPass functionality as far as I can tell. 3DS has the aforementioned StreetPass functionality. The games I've used on Wii U that have SpotPass are Pikmin 3, Pushmo World, and New Super Mario Bros. U.

Maybe SpotPass was either scrapped or part of an upcoming update for Nintendo platforms?

Ehm
Member
Level: 49


Posts: 448/533
EXP: 843360
For next: 40523

Since: 06-13-09

From: Canada

Since last post: 4.0 years
Last activity: 4.0 years

Posted on 08-02-14 04:56:15 PM Link | Quote
It could easily be an upcoming feature. The developers said they still have to add stretch goal content to all platform versions of the game.
einstein95
Member
Level: 37


Posts: 136/318
EXP: 325763
For next: 12490

Since: 04-11-13


Since last post: 3.3 years
Last activity: 3.3 years

Posted on 08-02-14 05:09:30 PM Link | Quote
One thing I was going to say before computer crashed: It appears that at least one debug utility (Treasure ID) requires the pak files to be extracted in the data folder, which can easily be done with this BMS script and quickbms:



# Распаковка *.pak для игры Shovel Knight
# for %i in (*.pak) do quickbms pak.bms %i
get ident long
if ident != 0
cleanexit
endif
get files long
if files == 0
cleanexit
endif
get adr_tab_data longlong
get adr_tab_name longlong
for i = 0 < files
goto adr_tab_name
get adr_name longlong
savepos adr_tab_name
goto adr_name
getct name_block string 0
goto adr_tab_data
get adr_data longlong
savepos adr_tab_data
goto adr_data
get size_block longlong
get dummy longlong
get dummy longlong
get dummy longlong
savepos offset
log name_block offset size_block
next i



The NSB files can be opened with this extractor, revealing all the sounds and music to be mp3s.

____________________
The more I type, the less gooder it sounds does.
wisk
Random nobody
Level: 5


Posts: 3/4
EXP: 425
For next: 104

Since: 07-28-14


Since last post: 7.7 years
Last activity: 6.6 years

Posted on 08-03-14 02:10:48 PM Link | Quote
Regarding the SpotPass/miiverse feature, I didn't find anything about it in the Steam version.
The only reference I found is the path "menus/miiverse.anb" which, of course, is missing.

About the PAK file format, too bad I suck at googling I did one myself in python (available here).
./pak_extract.py -out dump *.pak extracts all files contained in PAK to the folder dump.

Finally, I found what I was looking for: the hidden console!




And the collision viewer (cmd: drawattack 7):



To enable the console, I've made a really hackish patch:




; function: 00E1A660
.text:005BA6C3 66 89 1D 10 E2 62 00 mov word_62E210, bx
.text:005BA6CA D9 45 0C fld [ebp+arg_4]
.text:005BA6CD 89 1D 18 E7 62 00 mov dword_62E718, ebx
.text:005BA6D3 D9 1D 34 15 63 00 fstp flt_631534
.text:005BA6D9 89 1D F0 DF 62 00 mov dword_62DFF0, ebx
.text:005BA6DF D9 45 10 fld [ebp+arg_8]
.text:005BA6E2 88 1D 5A 0C 63 00 mov g_ShowConsole, bl
.text:005BA6E8 D9 1D 38 15 63 00 fstp flt_631538
.text:005BA6EE 88 1D 5B 0C 63 00 mov byte_630C5B, bl
.text:005BA6F4 D9 45 14 fld [ebp+arg_C]
.text:005BA6F7 88 1D 59 0C 63 00 mov byte_630C59, bl
.text:005BA6FD D9 1D 3C 15 63 00 fstp flt_63153C
.text:005BA703 C6 05 64 0C 63 00 01 mov byte_630C64, 1
.text:005BA70A D9 45 18 fld [ebp+arg_10]
.text:005BA70D 89 1D 68 0C 63 00 mov dword_630C68, e



You have to force the value g_ShowConsole to be different from 0. To do so, you can change the byte 005BA6E2 + 1 (MOV Ev, Eg Mod/RM) from 1D to 2D. This modification changes the source register from bl (which is zero) to ch (ECX[16:8]), which contains a pointer. The register ch *should* always be different from 0.

It would be better to bind a key (like ~) to the console.

Happy digging!
jedivulcan
Member
Level: 18


Posts: 24/56
EXP: 26236
For next: 3661

Since: 07-31-11


Since last post: 2.5 years
Last activity: 99 days

Posted on 08-03-14 05:17:28 PM Link | Quote
Originally posted by wisk
Regarding the SpotPass/miiverse feature, I didn't find anything about it in the Steam version.
The only reference I found is the path "menus/miiverse.anb" which, of course, is missing.

About the PAK file format, too bad I suck at googling I did one myself in python (available here).
./pak_extract.py -out dump *.pak extracts all files contained in PAK to the folder dump.

Finally, I found what I was looking for: the hidden console!




And the collision viewer (cmd: drawattack 7):



To enable the console, I've made a really hackish patch:




; function: 00E1A660
.text:005BA6C3 66 89 1D 10 E2 62 00 mov word_62E210, bx
.text:005BA6CA D9 45 0C fld [ebp+arg_4]
.text:005BA6CD 89 1D 18 E7 62 00 mov dword_62E718, ebx
.text:005BA6D3 D9 1D 34 15 63 00 fstp flt_631534
.text:005BA6D9 89 1D F0 DF 62 00 mov dword_62DFF0, ebx
.text:005BA6DF D9 45 10 fld [ebp+arg_8]
.text:005BA6E2 88 1D 5A 0C 63 00 mov g_ShowConsole, bl
.text:005BA6E8 D9 1D 38 15 63 00 fstp flt_631538
.text:005BA6EE 88 1D 5B 0C 63 00 mov byte_630C5B, bl
.text:005BA6F4 D9 45 14 fld [ebp+arg_C]
.text:005BA6F7 88 1D 59 0C 63 00 mov byte_630C59, bl
.text:005BA6FD D9 1D 3C 15 63 00 fstp flt_63153C
.text:005BA703 C6 05 64 0C 63 00 01 mov byte_630C64, 1
.text:005BA70A D9 45 18 fld [ebp+arg_10]
.text:005BA70D 89 1D 68 0C 63 00 mov dword_630C68, e



You have to force the value g_ShowConsole to be different from 0. To do so, you can change the byte 005BA6E2 + 1 (MOV Ev, Eg Mod/RM) from 1D to 2D. This modification changes the source register from bl (which is zero) to ch (ECX[16:8]), which contains a pointer. The register ch *should* always be different from 0.

It would be better to bind a key (like ~) to the console.

Happy digging!


I can't try this out myself because I don't have the Steam or GoG version of the game and this stuff is a bit over my head.

How do the cheats in the console correlate to cheats that can be entered when I begin a new game? For example, that screenshot you posted shows "butt" to enable butt mode in the console ... but it can be enabled from the name select by typing X&BUTT or WSWWAEAW. I wonder if the console can reveal the effects of codes that are still unknown if they aren't a placeholder for codes that will be utilized in future updates.
wisk
Random nobody
Level: 5


Posts: 4/4
EXP: 425
For next: 104

Since: 07-28-14


Since last post: 7.7 years
Last activity: 6.6 years

Posted on 08-03-14 06:52:27 PM (last edited by wisk at 08-03-14 07:01:04 PM) Link | Quote
Originally posted by jedivulcan
How do the cheats in the console correlate to cheats that can be entered when I begin a new game? For example, that screenshot you posted shows "butt" to enable butt mode in the console ... but it can be enabled from the name select by typing X&BUTT or WSWWAEAW. I wonder if the console can reveal the effects of codes that are still unknown if they aren't a placeholder for codes that will be utilized in future updates.



That's an interesting question.

All I can tell you is that there's a global variable, say g_ButtMode, which can be enable or disable.
If this variable is enabled, it replaces knight, shovel, health and magic with butt:

(addresses are rebased due to ASLR)



.text:00DC1AD6 mov cl, g_ButtMode
.text:00DC1ADC and cl, 1
.text:00DC1ADF jz butt_mode_is_disabled
.text:00DC1AE5 push offset aButt ; "butt"
.text:00DC1AEA push offset aKnight ; "knight"
.text:00DC1AEF lea esi, [esp+938h+Source]
.text:00DC1AF6 call TextReplace
.text:00DC1AFB push offset aButt_0 ; "Butt"
.text:00DC1B00 push offset aKnight_0 ; "Knight"
.text:00DC1B05 call TextReplace
.text:00DC1B0A push offset aButt_0 ; "Butt"
.text:00DC1B0F push offset aShovel_0 ; "Shovel"
.text:00DC1B14 call TextReplace
.text:00DC1B19 push offset aButt ; "butt"
.text:00DC1B1E push offset aShovel ; "shovel"
.text:00DC1B23 call TextReplace
.text:00DC1B28 push offset aButt_0 ; "Butt"
.text:00DC1B2D push offset aHealth ; "Health"
.text:00DC1B32 call TextReplace
.text:00DC1B37 push offset aButt ; "butt"
.text:00DC1B3C push offset aHealth_0 ; "health"
.text:00DC1B41 call TextReplace
.text:00DC1B46 push offset aButt_0 ; "Butt"
.text:00DC1B4B push offset aMagic ; "Magic"
.text:00DC1B50 call TextReplace
.text:00DC1B55 push offset aButt ; "butt"
.text:00DC1B5A push offset aMagic_0 ; "magic"
.text:00DC1B5F call TextReplace
.text:00DC1B64 add esp, 40h
.text:00DC1B67
.text:00DC1B67 butt_mode_is_disabled: ; CODE XREF: sub_DC14F0+5E0j
.text:00DC1B67 ; sub_DC14F0+5EFj
;...



I can find only one place where this variable is directly written:




.text:00DBB7E0 loc_DBB7E0: ; CODE XREF: ycConsole__Cmd_butt+1Cj
.text:00DBB7E0 A2 D4 45 E9 00 mov g_ButtMode, al
.text:00DBB7E5 84 C9 test cl, cl
.text:00DBB7E7 74 17 jz short loc_DBB800
.text:00DBB7E9 24 01 and al, 1
.text:00DBB7EB 74 13 jz short loc_DBB800
.text:00DBB7ED 68 50 00 E7 00 push offset aButtModeIsOn ; "Butt mode is ON!"
.text:00DBB7F2 E8 49 ED 05 00 call ycConsole__Printf_
.text:00DBB7F7 83 C4 04 add esp, 4
.text:00DBB7FA 8B E5 mov esp, ebp
.text:00DBB7FC 5D pop ebp
.text:00DBB7FD C2 04 00 retn 4



This is the handler of the command "butt".

But! And thank you for giving me these cheat codes, I managed to understand how cheat code are handled in game. Basically, the Shovel Knight uses a hash function (it takes a string in parameter and returns a 32-bit value).
This function is usually used to increase performance (see hash table).
In this case, it's used to hash the player name, which is compared to a list of hash value:




.text:00D46059 push eax
.text:00D4605A call __SK_Hash
.text:00D4605F add esp, 4
.text:00D46062 pop esi
.text:00D46063 test eax, eax
.text:00D46065 jz short loc_D46088
.text:00D46067 xor ecx, ecx
.text:00D46069 lea esp, [esp+0]
.text:00D46070
.text:00D46070 loc_D46070: ; CODE XREF: SK_IsNameCheatCode+46j
.text:00D46070 mov edx, HashedCheatCode[ecx*4]
.text:00D46077 test edx, edx
.text:00D46079 jz short loc_D4607F
.text:00D4607B cmp edx, eax
.text:00D4607D jz short loc_D4608C
.text:00D4607F
.text:00D4607F loc_D4607F: ; CODE XREF: SK_IsNameCheatCode+39j
.text:00D4607F inc ecx
.text:00D46080 cmp ecx, 141h
.text:00D46086 jl short loc_D46070



That's explain why one cheat can be unlocked using multiple names (see hash collision).

Using the index from HashedCheatCode array, a huge switch is used to apply hardcoded cheat (I can't paste the code but I could provide more info if you want to look by yourself).

I can't guarantee all cheat codes have been found, you have to bruteforce them to find them all.

BTW, by messing cheat codes values, I found a challenge mode. I already finished the game once (not game+), but I've never seen it before.
Is this mode hidden?
EDIT: this video answers this question. The challenge mode is unlocked using the cheatcode IM&SGC14.




This game is really awesome: the more you search, the more you find something new.

PS: Sorry for the long post.
Ehm
Member
Level: 49


Posts: 449/533
EXP: 843360
For next: 40523

Since: 06-13-09

From: Canada

Since last post: 4.0 years
Last activity: 4.0 years

Posted on 08-03-14 07:02:51 PM Link | Quote
According to the latest Kickstarter update, Challenge Mode has yet to be implemented.


What are we working on right now, you ask? Well, we’re in the middle of:

- Embarking upon stretch goal content: boss campaigns, challenge mode, gender swap, and battle mode!!



Might be cool to see if any of the other features are partially implemented. The four-player battle mode is only coming to PC/Wii U from what I understand.
Ehm
Member
Level: 49


Posts: 450/533
EXP: 843360
For next: 40523

Since: 06-13-09

From: Canada

Since last post: 4.0 years
Last activity: 4.0 years

Posted on 08-03-14 07:49:12 PM Link | Quote
Actually, it looks like that Challenge Mode is just a taste of what's to come (unless there's more than the one level).
The password references the Iron Man of Gaming event at the Screwattack Gaming Convention that just took place.
SMK
Random nobody
Level: 4


Posts: 1/2
EXP: 150
For next: 129

Since: 08-04-14


Since last post: 7.7 years
Last activity: 6.4 years

Posted on 08-04-14 01:18:52 AM Link | Quote
if you want to enable the console on the newest gog version (MD5: f06634861076e2af96f4caf122b72b54) the byte is at offset 0x1B8DD3
Hiccup
Member
Level: 57


Posts: 438/772
EXP: 1474064
For next: 11864

Since: 05-19-09


Since last post: 101 days
Last activity: 2 days

Posted on 10-12-14 11:55:52 AM Link | Quote
Does anybody know how to unpack the anb files (and is willing to share the information) ?

____________________
New Super Mario Bros Beta Replica
einstein95
Member
Level: 37


Posts: 152/318
EXP: 325763
For next: 12490

Since: 04-11-13


Since last post: 3.3 years
Last activity: 3.3 years

Posted on 10-12-14 05:13:53 PM Link | Quote
Originally posted by Hiccup
Does anybody know how to unpack the anb files (and is willing to share the information) ?

Google it

____________________
The more I type, the less gooder it sounds does.
GoldS
Member
Level: 41


Posts: 305/372
EXP: 477152
For next: 2993

Since: 03-15-10


Since last post: 2.1 years
Last activity: 13 days

Posted on 10-12-14 07:10:15 PM (last edited by GoldS at 10-12-14 07:10:53 PM) Link | Quote
Originally posted by Hiccup
Does anybody know how to unpack the anb files (and is willing to share the information) ?

For an actual answer to your question, apparently the program here will decompress the files: Here.

Exectuable located Here.

Don't ask me how the program works because I don't know.

____________________
Hiccup
Member
Level: 57


Posts: 439/772
EXP: 1474064
For next: 11864

Since: 05-19-09


Since last post: 101 days
Last activity: 2 days

Posted on 10-13-14 10:55:27 AM (last edited by Hiccup at 10-13-14 11:00:16 AM) Link | Quote
Thank you.

And, yes I could have googled 'DuckTales anb'.

____________________
New Super Mario Bros Beta Replica
KartMario
Member
Level: 14


Posts: 26/30
EXP: 10470
For next: 2601

Since: 03-13-11


Since last post: 1.6 years
Last activity: 4 days

Posted on 12-27-16 12:44:57 AM Link | Quote
A bit of a bump. but does anyone know the address for the most recent Steam version?
Next newer thread | Next older thread
Jul - The Cutting Room Floor - Shovel Knight - devmenu New poll - New thread - New reply


Rusted Logic

Acmlmboard - commit 47be4dc [2021-08-23]
©2000-2022 Acmlm, Xkeeper, Kaito Sinclaire, et al.

36 database queries, 10 query cache hits.
Query execution time:  0.362517 seconds
Script execution time:  0.033318 seconds
Total render time:  0.395835 seconds


TidyHTML vomit below
line 1 column 1 - Warning: missing <!DOCTYPE> declaration
line 2 column 271 - Warning: unescaped & or unknown entity "&page"
line 119 column 11 - Warning: <form> isn't allowed in <table> elements
line 118 column 10 - Info: <table> previously mentioned
line 120 column 11 - Warning: missing <tr>
line 120 column 119 - Warning: missing </font> before </td>
line 124 column 16 - Warning: plain text isn't allowed in <tr> elements
line 120 column 11 - Info: <tr> previously mentioned
line 125 column 68 - Warning: missing </nobr> before </td>
line 141 column 68 - Warning: missing </nobr> before <tr>
line 147 column 35 - Warning: missing <tr>
line 147 column 50 - Warning: missing </font> before </td>
line 148 column 37 - Warning: unescaped & or unknown entity "&id"
line 147 column 194 - Warning: missing </font> before </table>
line 149 column 35 - Warning: missing <tr>
line 149 column 50 - Warning: missing </font> before </td>
line 149 column 91 - Warning: missing </font> before </table>
line 156 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 158 column 9 - Warning: missing <tr>
line 176 column 13 - Warning: missing <tr>
line 177 column 102 - Warning: unescaped & or unknown entity "&postid"
line 194 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 196 column 9 - Warning: missing <tr>
line 214 column 13 - Warning: missing <tr>
line 215 column 102 - Warning: unescaped & or unknown entity "&postid"
line 220 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 222 column 9 - Warning: missing <tr>
line 240 column 13 - Warning: missing <tr>
line 241 column 102 - Warning: unescaped & or unknown entity "&postid"
line 327 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 329 column 9 - Warning: missing <tr>
line 347 column 13 - Warning: missing <tr>
line 348 column 102 - Warning: unescaped & or unknown entity "&postid"
line 357 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 359 column 9 - Warning: missing <tr>
line 377 column 13 - Warning: missing <tr>
line 378 column 102 - Warning: unescaped & or unknown entity "&postid"
line 393 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 395 column 9 - Warning: missing <tr>
line 413 column 13 - Warning: missing <tr>
line 414 column 102 - Warning: unescaped & or unknown entity "&postid"
line 419 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 421 column 9 - Warning: missing <tr>
line 439 column 13 - Warning: missing <tr>
line 440 column 102 - Warning: unescaped & or unknown entity "&postid"
line 478 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 480 column 9 - Warning: missing <tr>
line 498 column 13 - Warning: missing <tr>
line 499 column 102 - Warning: unescaped & or unknown entity "&postid"
line 544 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 546 column 9 - Warning: missing <tr>
line 564 column 13 - Warning: missing <tr>
line 565 column 102 - Warning: unescaped & or unknown entity "&postid"
line 611 column 3132 - Warning: unescaped & or unknown entity "&BUTT"
line 615 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 617 column 9 - Warning: missing <tr>
line 635 column 13 - Warning: missing <tr>
line 636 column 102 - Warning: unescaped & or unknown entity "&postid"
line 638 column 397 - Warning: unescaped & or unknown entity "&BUTT"
line 737 column 6355 - Warning: unescaped & or unknown entity "&SGC14."
line 747 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 749 column 9 - Warning: missing <tr>
line 767 column 13 - Warning: missing <tr>
line 768 column 102 - Warning: unescaped & or unknown entity "&postid"
line 780 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 782 column 9 - Warning: missing <tr>
line 800 column 13 - Warning: missing <tr>
line 801 column 102 - Warning: unescaped & or unknown entity "&postid"
line 807 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 809 column 9 - Warning: missing <tr>
line 827 column 13 - Warning: missing <tr>
line 828 column 102 - Warning: unescaped & or unknown entity "&postid"
line 833 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 835 column 9 - Warning: missing <tr>
line 853 column 13 - Warning: missing <tr>
line 854 column 102 - Warning: unescaped & or unknown entity "&postid"
line 860 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 862 column 9 - Warning: missing <tr>
line 880 column 13 - Warning: missing <tr>
line 881 column 102 - Warning: unescaped & or unknown entity "&postid"
line 887 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 889 column 9 - Warning: missing <tr>
line 907 column 13 - Warning: missing <tr>
line 908 column 102 - Warning: unescaped & or unknown entity "&postid"
line 918 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 920 column 9 - Warning: missing <tr>
line 938 column 13 - Warning: missing <tr>
line 939 column 102 - Warning: unescaped & or unknown entity "&postid"
line 947 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 949 column 9 - Warning: missing <tr>
line 967 column 13 - Warning: missing <tr>
line 968 column 102 - Warning: unescaped & or unknown entity "&postid"
line 973 column 17 - Warning: missing <tr>
line 973 column 17 - Warning: discarding unexpected <table>
line 976 column 35 - Warning: missing <tr>
line 976 column 50 - Warning: missing </font> before </td>
line 976 column 91 - Warning: missing </font> before </table>
line 978 column 35 - Warning: missing <tr>
line 978 column 50 - Warning: missing </font> before </td>
line 979 column 37 - Warning: unescaped & or unknown entity "&id"
line 978 column 194 - Warning: missing </font> before </table>
line 980 column 17 - Warning: discarding unexpected </textarea>
line 980 column 28 - Warning: discarding unexpected </form>
line 980 column 35 - Warning: discarding unexpected </embed>
line 980 column 43 - Warning: discarding unexpected </noembed>
line 980 column 53 - Warning: discarding unexpected </noscript>
line 980 column 64 - Warning: discarding unexpected </noembed>
line 980 column 74 - Warning: discarding unexpected </embed>
line 980 column 82 - Warning: discarding unexpected </table>
line 980 column 90 - Warning: discarding unexpected </table>
line 982 column 9 - Warning: missing </font> before <table>
line 994 column 25 - Warning: discarding unexpected </font>
line 1003 column 58 - Warning: discarding unexpected </font>
line 981 column 1 - Warning: missing </center>
line 120 column 63 - Warning: <img> lacks "alt" attribute
line 125 column 19 - Warning: <td> attribute "width" has invalid value "120px"
line 125 column 93 - Warning: <img> lacks "alt" attribute
line 141 column 19 - Warning: <td> attribute "width" has invalid value "120px"
line 141 column 98 - Warning: <img> lacks "alt" attribute
line 148 column 44 - Warning: <img> proprietary attribute value "absmiddle"
line 148 column 142 - Warning: <img> proprietary attribute value "absmiddle"
line 148 column 246 - Warning: <img> proprietary attribute value "absmiddle"
line 161 column 21 - Warning: <img> lacks "alt" attribute
line 161 column 62 - Warning: <img> lacks "alt" attribute
line 161 column 111 - Warning: <img> lacks "alt" attribute
line 161 column 161 - Warning: <img> lacks "alt" attribute
line 172 column 15 - Warning: <img> lacks "alt" attribute
line 183 column 173 - Warning: <img> lacks "alt" attribute
line 187 column 311 - Warning: <img> lacks "alt" attribute
line 191 column 757 - Warning: <img> proprietary attribute value "absmiddle"
line 191 column 757 - Warning: <img> lacks "alt" attribute
line 199 column 22 - Warning: <img> lacks "alt" attribute
line 199 column 63 - Warning: <img> lacks "alt" attribute
line 199 column 112 - Warning: <img> lacks "alt" attribute
line 199 column 162 - Warning: <img> lacks "alt" attribute
line 210 column 15 - Warning: <img> lacks "alt" attribute
line 225 column 21 - Warning: <img> lacks "alt" attribute
line 225 column 62 - Warning: <img> lacks "alt" attribute
line 225 column 111 - Warning: <img> lacks "alt" attribute
line 225 column 161 - Warning: <img> lacks "alt" attribute
line 236 column 15 - Warning: <img> lacks "alt" attribute
line 324 column 5184 - Warning: <img> lacks "alt" attribute
line 332 column 22 - Warning: <img> lacks "alt" attribute
line 332 column 63 - Warning: <img> lacks "alt" attribute
line 332 column 112 - Warning: <img> lacks "alt" attribute
line 332 column 162 - Warning: <img> lacks "alt" attribute
line 343 column 15 - Warning: <img> lacks "alt" attribute
line 362 column 22 - Warning: <img> lacks "alt" attribute
line 362 column 63 - Warning: <img> lacks "alt" attribute
line 362 column 112 - Warning: <img> lacks "alt" attribute
line 362 column 162 - Warning: <img> lacks "alt" attribute
line 373 column 15 - Warning: <img> lacks "alt" attribute
line 398 column 22 - Warning: <img> lacks "alt" attribute
line 398 column 63 - Warning: <img> lacks "alt" attribute
line 398 column 112 - Warning: <img> lacks "alt" attribute
line 398 column 162 - Warning: <img> lacks "alt" attribute
line 399 column 11 - Warning: <img> lacks "alt" attribute
line 409 column 15 - Warning: <img> lacks "alt" attribute
line 424 column 22 - Warning: <img> lacks "alt" attribute
line 424 column 63 - Warning: <img> lacks "alt" attribute
line 424 column 112 - Warning: <img> lacks "alt" attribute
line 424 column 162 - Warning: <img> lacks "alt" attribute
line 435 column 15 - Warning: <img> lacks "alt" attribute
line 483 column 21 - Warning: <img> lacks "alt" attribute
line 483 column 62 - Warning: <img> lacks "alt" attribute
line 483 column 111 - Warning: <img> lacks "alt" attribute
line 483 column 161 - Warning: <img> lacks "alt" attribute
line 494 column 15 - Warning: <img> lacks "alt" attribute
line 504 column 323 - Warning: <img> proprietary attribute value "absmiddle"
line 504 column 323 - Warning: <img> lacks "alt" attribute
line 509 column 681 - Warning: <img> lacks "alt" attribute
line 510 column 790 - Warning: <img> lacks "alt" attribute
line 514 column 956 - Warning: <img> lacks "alt" attribute
line 541 column 2608 - Warning: <img> proprietary attribute value "absmiddle"
line 541 column 2608 - Warning: <img> lacks "alt" attribute
line 549 column 22 - Warning: <img> lacks "alt" attribute
line 549 column 63 - Warning: <img> lacks "alt" attribute
line 549 column 112 - Warning: <img> lacks "alt" attribute
line 549 column 162 - Warning: <img> lacks "alt" attribute
line 560 column 15 - Warning: <img> lacks "alt" attribute
line 570 column 396 - Warning: <img> proprietary attribute value "absmiddle"
line 570 column 396 - Warning: <img> lacks "alt" attribute
line 575 column 754 - Warning: <img> lacks "alt" attribute
line 576 column 863 - Warning: <img> lacks "alt" attribute
line 580 column 1029 - Warning: <img> lacks "alt" attribute
line 607 column 2681 - Warning: <img> proprietary attribute value "absmiddle"
line 607 column 2681 - Warning: <img> lacks "alt" attribute
line 620 column 21 - Warning: <img> lacks "alt" attribute
line 620 column 62 - Warning: <img> lacks "alt" attribute
line 620 column 111 - Warning: <img> lacks "alt" attribute
line 620 column 161 - Warning: <img> lacks "alt" attribute
line 631 column 15 - Warning: <img> lacks "alt" attribute
line 739 column 6374 - Warning: <img> lacks "alt" attribute
line 740 column 6490 - Warning: <img> lacks "alt" attribute
line 742 column 6693 - Warning: <img> proprietary attribute value "absmiddle"
line 742 column 6693 - Warning: <img> lacks "alt" attribute
line 752 column 22 - Warning: <img> lacks "alt" attribute
line 752 column 63 - Warning: <img> lacks "alt" attribute
line 752 column 112 - Warning: <img> lacks "alt" attribute
line 752 column 162 - Warning: <img> lacks "alt" attribute
line 753 column 11 - Warning: <img> lacks "alt" attribute
line 763 column 15 - Warning: <img> lacks "alt" attribute
line 785 column 22 - Warning: <img> lacks "alt" attribute
line 785 column 63 - Warning: <img> lacks "alt" attribute
line 785 column 112 - Warning: <img> lacks "alt" attribute
line 785 column 162 - Warning: <img> lacks "alt" attribute
line 786 column 11 - Warning: <img> lacks "alt" attribute
line 796 column 15 - Warning: <img> lacks "alt" attribute
line 812 column 21 - Warning: <img> lacks "alt" attribute
line 812 column 62 - Warning: <img> lacks "alt" attribute
line 812 column 111 - Warning: <img> lacks "alt" attribute
line 812 column 161 - Warning: <img> lacks "alt" attribute
line 823 column 15 - Warning: <img> lacks "alt" attribute
line 838 column 22 - Warning: <img> lacks "alt" attribute
line 838 column 63 - Warning: <img> lacks "alt" attribute
line 838 column 112 - Warning: <img> lacks "alt" attribute
line 838 column 162 - Warning: <img> lacks "alt" attribute
line 849 column 15 - Warning: <img> lacks "alt" attribute
line 865 column 22 - Warning: <img> lacks "alt" attribute
line 865 column 63 - Warning: <img> lacks "alt" attribute
line 865 column 112 - Warning: <img> lacks "alt" attribute
line 865 column 162 - Warning: <img> lacks "alt" attribute
line 876 column 15 - Warning: <img> lacks "alt" attribute
line 892 column 22 - Warning: <img> lacks "alt" attribute
line 892 column 63 - Warning: <img> lacks "alt" attribute
line 892 column 112 - Warning: <img> lacks "alt" attribute
line 892 column 161 - Warning: <img> lacks "alt" attribute
line 893 column 11 - Warning: <img> lacks "alt" attribute
line 903 column 15 - Warning: <img> lacks "alt" attribute
line 915 column 600 - Warning: <img> lacks "alt" attribute
line 923 column 22 - Warning: <img> lacks "alt" attribute
line 923 column 63 - Warning: <img> lacks "alt" attribute
line 923 column 112 - Warning: <img> lacks "alt" attribute
line 923 column 162 - Warning: <img> lacks "alt" attribute
line 934 column 15 - Warning: <img> lacks "alt" attribute
line 952 column 22 - Warning: <img> lacks "alt" attribute
line 952 column 63 - Warning: <img> lacks "alt" attribute
line 952 column 111 - Warning: <img> lacks "alt" attribute
line 952 column 161 - Warning: <img> lacks "alt" attribute
line 963 column 15 - Warning: <img> lacks "alt" attribute
line 979 column 44 - Warning: <img> proprietary attribute value "absmiddle"
line 979 column 142 - Warning: <img> proprietary attribute value "absmiddle"
line 979 column 246 - Warning: <img> proprietary attribute value "absmiddle"
line 988 column 25 - Warning: <img> lacks "alt" attribute
line 993 column 267 - Warning: <img> lacks "alt" attribute
line 149 column 50 - Warning: trimming empty <font>
line 973 column 17 - Warning: trimming empty <tr>
line 976 column 50 - Warning: trimming empty <font>
line 125 column 68 - Warning: <nobr> is not approved by W3C
line 141 column 68 - Warning: <nobr> is not approved by W3C
line 177 column 27 - Warning: <nobr> is not approved by W3C
line 215 column 27 - Warning: <nobr> is not approved by W3C
line 241 column 27 - Warning: <nobr> is not approved by W3C
line 348 column 27 - Warning: <nobr> is not approved by W3C
line 378 column 27 - Warning: <nobr> is not approved by W3C
line 414 column 27 - Warning: <nobr> is not approved by W3C
line 440 column 27 - Warning: <nobr> is not approved by W3C
line 499 column 27 - Warning: <nobr> is not approved by W3C
line 565 column 27 - Warning: <nobr> is not approved by W3C
line 636 column 27 - Warning: <nobr> is not approved by W3C
line 768 column 27 - Warning: <nobr> is not approved by W3C
line 801 column 27 - Warning: <nobr> is not approved by W3C
line 828 column 27 - Warning: <nobr> is not approved by W3C
line 854 column 27 - Warning: <nobr> is not approved by W3C
line 881 column 27 - Warning: <nobr> is not approved by W3C
line 908 column 27 - Warning: <nobr> is not approved by W3C
line 939 column 27 - Warning: <nobr> is not approved by W3C
line 968 column 27 - Warning: <nobr> is not approved by W3C
Info: Document content looks like HTML5
Info: No system identifier in emitted doctype
Tidy found 266 warnings and 0 errors!


The alt attribute should be used to give a short description
of an image; longer descriptions should be given with the
longdesc attribute which takes a URL linked to the description.
These measures are needed for people using non-graphical browsers.

For further advice on how to make your pages accessible
see http://www.w3.org/WAI/GL.
You are recommended to use CSS to specify the font and
properties such as its size and color. This will reduce
the size of HTML files and make them easier to maintain
compared with using <FONT> elements.

You are recommended to use CSS to control line wrapping.
Use "white-space: nowrap" to inhibit wrapping in place
of inserting <NOBR>...</NOBR> into the markup.

About HTML Tidy: https://github.com/htacg/tidy-html5
Bug reports and comments: https://github.com/htacg/tidy-html5/issues
Official mailing list: https://lists.w3.org/Archives/Public/public-htacg/
Latest HTML specification: http://dev.w3.org/html5/spec-author-view/
Validate your HTML documents: http://validator.w3.org/nu/
Lobby your company to join the W3C: http://www.w3.org/Consortium

Do you speak a language other than English, or a different variant of
English? Consider helping us to localize HTML Tidy. For details please see
https://github.com/htacg/tidy-html5/blob/master/README/LOCALIZE.md