isohybrid.pl 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361
  1. #!/usr/bin/perl
  2. ## -----------------------------------------------------------------------
  3. ##
  4. ## Copyright 2002-2008 H. Peter Anvin - All Rights Reserved
  5. ## Copyright 2009 Intel Corporation; author: H. Peter Anvin
  6. ##
  7. ## This program is free software; you can redistribute it and/or modify
  8. ## it under the terms of the GNU General Public License as published by
  9. ## the Free Software Foundation, Inc., 53 Temple Place Ste 330,
  10. ## Boston MA 02111-1307, USA; either version 2 of the License, or
  11. ## (at your option) any later version; incorporated herein by reference.
  12. ##
  13. ## -----------------------------------------------------------------------
  14. #
  15. # Post-process an ISO 9660 image generated with mkisofs/genisoimage
  16. # to allow "hybrid booting" as a CD-ROM or as a hard disk.
  17. #
  18. use bytes;
  19. use Fcntl;
  20. # User-specifyable options
  21. %opt = (
  22. # Fake geometry (zipdrive-style...)
  23. 'h' => 64,
  24. 's' => 32,
  25. # Partition number
  26. 'entry' => 1,
  27. # Partition offset
  28. 'offset' => 0,
  29. # Partition type
  30. 'type' => 0x17, # "Windows hidden IFS"
  31. # MBR ID
  32. 'id' => undef,
  33. );
  34. %valid_range = (
  35. 'h' => [1, 256],
  36. 's' => [1, 63],
  37. 'entry' => [1, 4],
  38. 'offset' => [0, 64],
  39. 'type' => [0, 255],
  40. 'id' => [0, 0xffffffff],
  41. 'hd0' => [0, 2],
  42. 'partok' => [0, 1],
  43. );
  44. # Boolean options just set other options
  45. %bool_opt = (
  46. 'nohd0' => ['hd0', 0],
  47. 'forcehd0' => ['hd0', 1],
  48. 'ctrlhd0' => ['hd0', 2],
  49. 'nopartok' => ['partok', 0],
  50. 'partok' => ['partok', 1],
  51. );
  52. sub usage() {
  53. print STDERR "Usage: $0 [options] filename.iso\n",
  54. "Options:\n",
  55. " -h Number of default geometry heads\n",
  56. " -s Number of default geometry sectors\n",
  57. " -entry Specify partition entry number (1-4)\n",
  58. " -offset Specify partition offset (default 0)\n",
  59. " -type Specify partition type (default 0x17)\n",
  60. " -id Specify MBR ID (default random)\n",
  61. " -forcehd0 Always assume we are loaded as disk ID 0\n",
  62. " -ctrlhd0 Assume disk ID 0 if the Ctrl key is pressed\n",
  63. " -partok Allow booting from within a partition\n";
  64. exit 1;
  65. }
  66. # Parse a C-style integer (decimal/octal/hex)
  67. sub doh($) {
  68. my($n) = @_;
  69. return ($n =~ /^0/) ? oct $n : $n+0;
  70. }
  71. sub get_random() {
  72. # Get a 32-bit random number
  73. my $rfd, $rnd;
  74. my $rid;
  75. if (open($rfd, "< /dev/urandom\0") && read($rfd, $rnd, 4) == 4) {
  76. $rid = unpack("V", $rnd);
  77. }
  78. close($rfd) if (defined($rfd));
  79. return $rid if (defined($rid));
  80. # This sucks but is better than nothing...
  81. return ($$+time()) & 0xffffffff;
  82. }
  83. sub get_hex_data() {
  84. my $mbr = '';
  85. my $line, $byte;
  86. while ( $line = <DATA> ) {
  87. chomp $line;
  88. last if ($line eq '*');
  89. foreach $byte ( split(/\s+/, $line) ) {
  90. $mbr .= chr(hex($byte));
  91. }
  92. }
  93. return $mbr;
  94. }
  95. while ($ARGV[0] =~ /^\-(.*)$/) {
  96. $o = $1;
  97. shift @ARGV;
  98. if (defined($bool_opt{$o})) {
  99. ($o, $v) = @{$bool_opt{$o}};
  100. $opt{$o} = $v;
  101. } elsif (exists($opt{$o})) {
  102. $opt{$o} = doh(shift @ARGV);
  103. if (defined($valid_range{$o})) {
  104. ($l, $h) = @{$valid_range{$o}};
  105. if ($opt{$o} < $l || $opt{$o} > $h) {
  106. die "$0: valid values for the -$o parameter are $l to $h\n";
  107. }
  108. }
  109. } else {
  110. usage();
  111. }
  112. }
  113. ($file) = @ARGV;
  114. if (!defined($file)) {
  115. usage();
  116. }
  117. open(FILE, "+< $file\0") or die "$0: cannot open $file: $!\n";
  118. binmode FILE;
  119. #
  120. # First, actually figure out where mkisofs hid isolinux.bin
  121. #
  122. seek(FILE, 17*2048, SEEK_SET) or die "$0: $file: $!\n";
  123. read(FILE, $boot_record, 2048) == 2048 or die "$0: $file: read error\n";
  124. ($br_sign, $br_cat_offset) = unpack("a71V", $boot_record);
  125. if ($br_sign ne ("\0CD001\1EL TORITO SPECIFICATION" . ("\0" x 41))) {
  126. die "$0: $file: no boot record found\n";
  127. }
  128. seek(FILE, $br_cat_offset*2048, SEEK_SET) or die "$0: $file: $!\n";
  129. read(FILE, $boot_cat, 2048) == 2048 or die "$0: $file: read error\n";
  130. # We must have a Validation Entry followed by a Default Entry...
  131. # no fanciness allowed for the Hybrid mode [XXX: might relax this later]
  132. @ve = unpack("v16", $boot_cat);
  133. $cs = 0;
  134. for ($i = 0; $i < 16; $i++) {
  135. $cs += $ve[$i];
  136. }
  137. if ($ve[0] != 0x0001 || $ve[15] != 0xaa55 || $cs & 0xffff) {
  138. die "$0: $file: invalid boot catalog\n";
  139. }
  140. ($de_boot, $de_media, $de_seg, $de_sys, $de_mbz1, $de_count,
  141. $de_lba, $de_mbz2) = unpack("CCvCCvVv", substr($boot_cat, 32, 32));
  142. if ($de_boot != 0x88 || $de_media != 0 ||
  143. ($de_segment != 0 && $de_segment != 0x7c0) || $de_count != 4) {
  144. die "$0: $file: unexpected boot catalog parameters\n";
  145. }
  146. # Now $de_lba should contain the CD sector number for isolinux.bin
  147. seek(FILE, $de_lba*2048+0x40, SEEK_SET) or die "$0: $file: $!\n";
  148. read(FILE, $ibsig, 4);
  149. if ($ibsig ne "\xfb\xc0\x78\x70") {
  150. die "$0: $file: bootloader does not have a isolinux.bin hybrid signature.".
  151. "Note that isolinux-debug.bin does not support hybrid booting.\n";
  152. }
  153. # Get the total size of the image
  154. (@imgstat = stat(FILE)) or die "$0: $file: $!\n";
  155. $imgsize = $imgstat[7];
  156. if (!$imgsize) {
  157. die "$0: $file: cannot determine length of file\n";
  158. }
  159. # Target image size: round up to a multiple of $h*$s*512
  160. $h = $opt{'h'};
  161. $s = $opt{'s'};
  162. $cylsize = $h*$s*512;
  163. $frac = $imgsize % $cylsize;
  164. $padding = ($frac > 0) ? $cylsize - $frac : 0;
  165. $imgsize += $padding;
  166. $c = int($imgsize/$cylsize);
  167. if ($c > 1024) {
  168. print STDERR "Warning: more than 1024 cylinders ($c).\n";
  169. print STDERR "Not all BIOSes will be able to boot this device.\n";
  170. $cc = 1024;
  171. } else {
  172. $cc = $c;
  173. }
  174. # Preserve id when run again
  175. if (defined($opt{'id'})) {
  176. $id = pack("V", doh($opt{'id'}));
  177. } else {
  178. seek(FILE, 440, SEEK_SET) or die "$0: $file: $!\n";
  179. read(FILE, $id, 4);
  180. if ($id eq "\x00\x00\x00\x00") {
  181. $id = pack("V", get_random());
  182. }
  183. }
  184. # Print the MBR and partition table
  185. seek(FILE, 0, SEEK_SET) or die "$0: $file: $!\n";
  186. for ($i = 0; $i <= $opt{'hd0'}+3*$opt{'partok'}; $i++) {
  187. $mbr = get_hex_data();
  188. }
  189. if ( length($mbr) > 432 ) {
  190. die "$0: Bad MBR code\n";
  191. }
  192. $mbr .= "\0" x (432 - length($mbr));
  193. $mbr .= pack("VV", $de_lba*4, 0); # Offset 432: LBA of isolinux.bin
  194. $mbr .= $id; # Offset 440: MBR ID
  195. $mbr .= "\0\0"; # Offset 446: actual partition table
  196. # Print partition table
  197. $offset = $opt{'offset'};
  198. $psize = $c*$h*$s - $offset;
  199. $bhead = int($offset/$s) % $h;
  200. $bsect = ($offset % $s) + 1;
  201. $bcyl = int($offset/($h*$s));
  202. $bsect += ($bcyl & 0x300) >> 2;
  203. $bcyl &= 0xff;
  204. $ehead = $h-1;
  205. $esect = $s + ((($cc-1) & 0x300) >> 2);
  206. $ecyl = ($cc-1) & 0xff;
  207. $fstype = $opt{'type'}; # Partition type
  208. $pentry = $opt{'entry'}; # Partition slot
  209. for ( $i = 1 ; $i <= 4 ; $i++ ) {
  210. if ( $i == $pentry ) {
  211. $mbr .= pack("CCCCCCCCVV", 0x80, $bhead, $bsect, $bcyl, $fstype,
  212. $ehead, $esect, $ecyl, $offset, $psize);
  213. } else {
  214. $mbr .= "\0" x 16;
  215. }
  216. }
  217. $mbr .= "\x55\xaa";
  218. print FILE $mbr;
  219. # Pad the image to a fake cylinder boundary
  220. seek(FILE, $imgstat[7], SEEK_SET) or die "$0: $file: $!\n";
  221. if ($padding) {
  222. print FILE "\0" x $padding;
  223. }
  224. # Done...
  225. close(FILE);
  226. exit 0;
  227. __END__
  228. 33 ed 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
  229. 90 90 90 90 90 90 90 33 ed fa 8e d5 bc 0 7c fb fc 66 31 db 66 31 c9 66 53
  230. 66 51 6 57 8e dd 8e c5 52 be 0 7c bf 0 6 b9 0 1 f3 a5 ea 4b 6 0 0 52 b4 41
  231. bb aa 55 31 c9 30 f6 f9 cd 13 72 16 81 fb 55 aa 75 10 83 e1 1 74 b 66 c7 6
  232. f1 6 b4 42 eb 15 eb 0 5a 51 b4 8 cd 13 83 e1 3f 5b 51 f b6 c6 40 50 f7 e1
  233. 53 52 50 bb 0 7c b9 4 0 66 a1 b0 7 e8 44 0 f 82 80 0 66 40 80 c7 2 e2 f2 66
  234. 81 3e 40 7c fb c0 78 70 75 9 fa bc ec 7b ea 44 7c 0 0 e8 83 0 69 73 6f 6c
  235. 69 6e 75 78 2e 62 69 6e 20 6d 69 73 73 69 6e 67 20 6f 72 20 63 6f 72 72 75
  236. 70 74 2e d a 66 60 66 31 d2 66 3 6 f8 7b 66 13 16 fc 7b 66 52 66 50 6 53 6a
  237. 1 6a 10 89 e6 66 f7 36 e8 7b c0 e4 6 88 e1 88 c5 92 f6 36 ee 7b 88 c6 8 e1
  238. 41 b8 1 2 8a 16 f2 7b cd 13 8d 64 10 66 61 c3 e8 1e 0 4f 70 65 72 61 74 69
  239. 6e 67 20 73 79 73 74 65 6d 20 6c 6f 61 64 20 65 72 72 6f 72 2e d a 5e ac b4
  240. e 8a 3e 62 4 b3 7 cd 10 3c a 75 f1 cd 18 f4 eb fd 0 0 0 0 0 0 0 0 0 0 0 0
  241. 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  242. 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  243. 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  244. *
  245. 33 ed 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
  246. 90 90 90 90 90 90 90 33 ed fa 8e d5 bc 0 7c fb fc 66 31 db 66 31 c9 66 53
  247. 66 51 6 57 8e dd 8e c5 b2 80 52 be 0 7c bf 0 6 b9 0 1 f3 a5 ea 4d 6 0 0 52
  248. b4 41 bb aa 55 31 c9 30 f6 f9 cd 13 72 16 81 fb 55 aa 75 10 83 e1 1 74 b 66
  249. c7 6 f3 6 b4 42 eb 15 eb 0 5a 51 b4 8 cd 13 83 e1 3f 5b 51 f b6 c6 40 50 f7
  250. e1 53 52 50 bb 0 7c b9 4 0 66 a1 b0 7 e8 44 0 f 82 80 0 66 40 80 c7 2 e2 f2
  251. 66 81 3e 40 7c fb c0 78 70 75 9 fa bc ec 7b ea 44 7c 0 0 e8 83 0 69 73 6f
  252. 6c 69 6e 75 78 2e 62 69 6e 20 6d 69 73 73 69 6e 67 20 6f 72 20 63 6f 72 72
  253. 75 70 74 2e d a 66 60 66 31 d2 66 3 6 f8 7b 66 13 16 fc 7b 66 52 66 50 6 53
  254. 6a 1 6a 10 89 e6 66 f7 36 e8 7b c0 e4 6 88 e1 88 c5 92 f6 36 ee 7b 88 c6 8
  255. e1 41 b8 1 2 8a 16 f2 7b cd 13 8d 64 10 66 61 c3 e8 1e 0 4f 70 65 72 61 74
  256. 69 6e 67 20 73 79 73 74 65 6d 20 6c 6f 61 64 20 65 72 72 6f 72 2e d a 5e ac
  257. b4 e 8a 3e 62 4 b3 7 cd 10 3c a 75 f1 cd 18 f4 eb fd 0 0 0 0 0 0 0 0 0 0 0
  258. 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  259. 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  260. 0 0 0 0 0 0 0 0 0 0 0 0 0
  261. *
  262. 33 ed 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
  263. 90 90 90 90 90 90 90 33 ed fa 8e d5 bc 0 7c fb fc 66 31 db 66 31 c9 66 53
  264. 66 51 6 57 8e dd 8e c5 60 b4 2 cd 16 a8 4 61 74 2 b2 80 52 be 0 7c bf 0 6
  265. b9 0 1 f3 a5 ea 57 6 0 0 52 b4 41 bb aa 55 31 c9 30 f6 f9 cd 13 72 16 81 fb
  266. 55 aa 75 10 83 e1 1 74 b 66 c7 6 fd 6 b4 42 eb 15 eb 0 5a 51 b4 8 cd 13 83
  267. e1 3f 5b 51 f b6 c6 40 50 f7 e1 53 52 50 bb 0 7c b9 4 0 66 a1 b0 7 e8 44 0
  268. f 82 80 0 66 40 80 c7 2 e2 f2 66 81 3e 40 7c fb c0 78 70 75 9 fa bc ec 7b
  269. ea 44 7c 0 0 e8 83 0 69 73 6f 6c 69 6e 75 78 2e 62 69 6e 20 6d 69 73 73 69
  270. 6e 67 20 6f 72 20 63 6f 72 72 75 70 74 2e d a 66 60 66 31 d2 66 3 6 f8 7b
  271. 66 13 16 fc 7b 66 52 66 50 6 53 6a 1 6a 10 89 e6 66 f7 36 e8 7b c0 e4 6 88
  272. e1 88 c5 92 f6 36 ee 7b 88 c6 8 e1 41 b8 1 2 8a 16 f2 7b cd 13 8d 64 10 66
  273. 61 c3 e8 1e 0 4f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 6c 6f 61
  274. 64 20 65 72 72 6f 72 2e d a 5e ac b4 e 8a 3e 62 4 b3 7 cd 10 3c a 75 f1 cd
  275. 18 f4 eb fd 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  276. 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  277. 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  278. *
  279. 33 ed 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
  280. 90 90 90 90 90 90 90 33 ed fa 8e d5 bc 0 7c fb fc 66 31 db 66 31 c9 21 f6
  281. 74 26 f6 4 7f 75 21 38 4c 4 74 1c 66 3d 21 47 50 58 75 10 80 7c 4 ed 75 a
  282. 66 8b 4c 34 66 8b 5c 38 eb 4 66 8b 4c 8 66 53 66 51 6 57 8e dd 8e c5 52 be
  283. 0 7c bf 0 6 b9 0 1 f3 a5 ea 75 6 0 0 52 b4 41 bb aa 55 31 c9 30 f6 f9 cd 13
  284. 72 16 81 fb 55 aa 75 10 83 e1 1 74 b 66 c7 6 1b 7 b4 42 eb 15 eb 0 5a 51 b4
  285. 8 cd 13 83 e1 3f 5b 51 f b6 c6 40 50 f7 e1 53 52 50 bb 0 7c b9 4 0 66 a1 b0
  286. 7 e8 44 0 f 82 80 0 66 40 80 c7 2 e2 f2 66 81 3e 40 7c fb c0 78 70 75 9 fa
  287. bc ec 7b ea 44 7c 0 0 e8 83 0 69 73 6f 6c 69 6e 75 78 2e 62 69 6e 20 6d 69
  288. 73 73 69 6e 67 20 6f 72 20 63 6f 72 72 75 70 74 2e d a 66 60 66 31 d2 66 3
  289. 6 f8 7b 66 13 16 fc 7b 66 52 66 50 6 53 6a 1 6a 10 89 e6 66 f7 36 e8 7b c0
  290. e4 6 88 e1 88 c5 92 f6 36 ee 7b 88 c6 8 e1 41 b8 1 2 8a 16 f2 7b cd 13 8d
  291. 64 10 66 61 c3 e8 1e 0 4f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20
  292. 6c 6f 61 64 20 65 72 72 6f 72 2e d a 5e ac b4 e 8a 3e 62 4 b3 7 cd 10 3c a
  293. 75 f1 cd 18 f4 eb fd 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  294. 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  295. *
  296. 33 ed 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
  297. 90 90 90 90 90 90 90 33 ed fa 8e d5 bc 0 7c fb fc 66 31 db 66 31 c9 21 f6
  298. 74 26 f6 4 7f 75 21 38 4c 4 74 1c 66 3d 21 47 50 58 75 10 80 7c 4 ed 75 a
  299. 66 8b 4c 34 66 8b 5c 38 eb 4 66 8b 4c 8 66 53 66 51 6 57 8e dd 8e c5 b2 80
  300. 52 be 0 7c bf 0 6 b9 0 1 f3 a5 ea 77 6 0 0 52 b4 41 bb aa 55 31 c9 30 f6 f9
  301. cd 13 72 16 81 fb 55 aa 75 10 83 e1 1 74 b 66 c7 6 1d 7 b4 42 eb 15 eb 0 5a
  302. 51 b4 8 cd 13 83 e1 3f 5b 51 f b6 c6 40 50 f7 e1 53 52 50 bb 0 7c b9 4 0 66
  303. a1 b0 7 e8 44 0 f 82 80 0 66 40 80 c7 2 e2 f2 66 81 3e 40 7c fb c0 78 70 75
  304. 9 fa bc ec 7b ea 44 7c 0 0 e8 83 0 69 73 6f 6c 69 6e 75 78 2e 62 69 6e 20
  305. 6d 69 73 73 69 6e 67 20 6f 72 20 63 6f 72 72 75 70 74 2e d a 66 60 66 31 d2
  306. 66 3 6 f8 7b 66 13 16 fc 7b 66 52 66 50 6 53 6a 1 6a 10 89 e6 66 f7 36 e8
  307. 7b c0 e4 6 88 e1 88 c5 92 f6 36 ee 7b 88 c6 8 e1 41 b8 1 2 8a 16 f2 7b cd
  308. 13 8d 64 10 66 61 c3 e8 1e 0 4f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65
  309. 6d 20 6c 6f 61 64 20 65 72 72 6f 72 2e d a 5e ac b4 e 8a 3e 62 4 b3 7 cd 10
  310. 3c a 75 f1 cd 18 f4 eb fd 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  311. 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  312. *
  313. 33 ed 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
  314. 90 90 90 90 90 90 90 33 ed fa 8e d5 bc 0 7c fb fc 66 31 db 66 31 c9 21 f6
  315. 74 26 f6 4 7f 75 21 38 4c 4 74 1c 66 3d 21 47 50 58 75 10 80 7c 4 ed 75 a
  316. 66 8b 4c 34 66 8b 5c 38 eb 4 66 8b 4c 8 66 53 66 51 6 57 8e dd 8e c5 60 b4
  317. 2 cd 16 a8 4 61 74 2 b2 80 52 be 0 7c bf 0 6 b9 0 1 f3 a5 ea 81 6 0 0 52 b4
  318. 41 bb aa 55 31 c9 30 f6 f9 cd 13 72 16 81 fb 55 aa 75 10 83 e1 1 74 b 66 c7
  319. 6 27 7 b4 42 eb 15 eb 0 5a 51 b4 8 cd 13 83 e1 3f 5b 51 f b6 c6 40 50 f7 e1
  320. 53 52 50 bb 0 7c b9 4 0 66 a1 b0 7 e8 44 0 f 82 80 0 66 40 80 c7 2 e2 f2 66
  321. 81 3e 40 7c fb c0 78 70 75 9 fa bc ec 7b ea 44 7c 0 0 e8 83 0 69 73 6f 6c
  322. 69 6e 75 78 2e 62 69 6e 20 6d 69 73 73 69 6e 67 20 6f 72 20 63 6f 72 72 75
  323. 70 74 2e d a 66 60 66 31 d2 66 3 6 f8 7b 66 13 16 fc 7b 66 52 66 50 6 53 6a
  324. 1 6a 10 89 e6 66 f7 36 e8 7b c0 e4 6 88 e1 88 c5 92 f6 36 ee 7b 88 c6 8 e1
  325. 41 b8 1 2 8a 16 f2 7b cd 13 8d 64 10 66 61 c3 e8 1e 0 4f 70 65 72 61 74 69
  326. 6e 67 20 73 79 73 74 65 6d 20 6c 6f 61 64 20 65 72 72 6f 72 2e d a 5e ac b4
  327. e 8a 3e 62 4 b3 7 cd 10 3c a 75 f1 cd 18 f4 eb fd 0 0 0 0 0 0 0 0 0 0 0 0
  328. 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  329. *