Jaidyn Levesque authored on 2019-11-19 05:38:26
Showing 9 changed files
1 1
new file mode 100644
... ...
@@ -0,0 +1,674 @@
1
+                    GNU GENERAL PUBLIC LICENSE
2
+                       Version 3, 29 June 2007
3
+
4
+ Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
5
+ Everyone is permitted to copy and distribute verbatim copies
6
+ of this license document, but changing it is not allowed.
7
+
8
+                            Preamble
9
+
10
+  The GNU General Public License is a free, copyleft license for
11
+software and other kinds of works.
12
+
13
+  The licenses for most software and other practical works are designed
14
+to take away your freedom to share and change the works.  By contrast,
15
+the GNU General Public License is intended to guarantee your freedom to
16
+share and change all versions of a program--to make sure it remains free
17
+software for all its users.  We, the Free Software Foundation, use the
18
+GNU General Public License for most of our software; it applies also to
19
+any other work released this way by its authors.  You can apply it to
20
+your programs, too.
21
+
22
+  When we speak of free software, we are referring to freedom, not
23
+price.  Our General Public Licenses are designed to make sure that you
24
+have the freedom to distribute copies of free software (and charge for
25
+them if you wish), that you receive source code or can get it if you
26
+want it, that you can change the software or use pieces of it in new
27
+free programs, and that you know you can do these things.
28
+
29
+  To protect your rights, we need to prevent others from denying you
30
+these rights or asking you to surrender the rights.  Therefore, you have
31
+certain responsibilities if you distribute copies of the software, or if
32
+you modify it: responsibilities to respect the freedom of others.
33
+
34
+  For example, if you distribute copies of such a program, whether
35
+gratis or for a fee, you must pass on to the recipients the same
36
+freedoms that you received.  You must make sure that they, too, receive
37
+or can get the source code.  And you must show them these terms so they
38
+know their rights.
39
+
40
+  Developers that use the GNU GPL protect your rights with two steps:
41
+(1) assert copyright on the software, and (2) offer you this License
42
+giving you legal permission to copy, distribute and/or modify it.
43
+
44
+  For the developers' and authors' protection, the GPL clearly explains
45
+that there is no warranty for this free software.  For both users' and
46
+authors' sake, the GPL requires that modified versions be marked as
47
+changed, so that their problems will not be attributed erroneously to
48
+authors of previous versions.
49
+
50
+  Some devices are designed to deny users access to install or run
51
+modified versions of the software inside them, although the manufacturer
52
+can do so.  This is fundamentally incompatible with the aim of
53
+protecting users' freedom to change the software.  The systematic
54
+pattern of such abuse occurs in the area of products for individuals to
55
+use, which is precisely where it is most unacceptable.  Therefore, we
56
+have designed this version of the GPL to prohibit the practice for those
57
+products.  If such problems arise substantially in other domains, we
58
+stand ready to extend this provision to those domains in future versions
59
+of the GPL, as needed to protect the freedom of users.
60
+
61
+  Finally, every program is threatened constantly by software patents.
62
+States should not allow patents to restrict development and use of
63
+software on general-purpose computers, but in those that do, we wish to
64
+avoid the special danger that patents applied to a free program could
65
+make it effectively proprietary.  To prevent this, the GPL assures that
66
+patents cannot be used to render the program non-free.
67
+
68
+  The precise terms and conditions for copying, distribution and
69
+modification follow.
70
+
71
+                       TERMS AND CONDITIONS
72
+
73
+  0. Definitions.
74
+
75
+  "This License" refers to version 3 of the GNU General Public License.
76
+
77
+  "Copyright" also means copyright-like laws that apply to other kinds of
78
+works, such as semiconductor masks.
79
+
80
+  "The Program" refers to any copyrightable work licensed under this
81
+License.  Each licensee is addressed as "you".  "Licensees" and
82
+"recipients" may be individuals or organizations.
83
+
84
+  To "modify" a work means to copy from or adapt all or part of the work
85
+in a fashion requiring copyright permission, other than the making of an
86
+exact copy.  The resulting work is called a "modified version" of the
87
+earlier work or a work "based on" the earlier work.
88
+
89
+  A "covered work" means either the unmodified Program or a work based
90
+on the Program.
91
+
92
+  To "propagate" a work means to do anything with it that, without
93
+permission, would make you directly or secondarily liable for
94
+infringement under applicable copyright law, except executing it on a
95
+computer or modifying a private copy.  Propagation includes copying,
96
+distribution (with or without modification), making available to the
97
+public, and in some countries other activities as well.
98
+
99
+  To "convey" a work means any kind of propagation that enables other
100
+parties to make or receive copies.  Mere interaction with a user through
101
+a computer network, with no transfer of a copy, is not conveying.
102
+
103
+  An interactive user interface displays "Appropriate Legal Notices"
104
+to the extent that it includes a convenient and prominently visible
105
+feature that (1) displays an appropriate copyright notice, and (2)
106
+tells the user that there is no warranty for the work (except to the
107
+extent that warranties are provided), that licensees may convey the
108
+work under this License, and how to view a copy of this License.  If
109
+the interface presents a list of user commands or options, such as a
110
+menu, a prominent item in the list meets this criterion.
111
+
112
+  1. Source Code.
113
+
114
+  The "source code" for a work means the preferred form of the work
115
+for making modifications to it.  "Object code" means any non-source
116
+form of a work.
117
+
118
+  A "Standard Interface" means an interface that either is an official
119
+standard defined by a recognized standards body, or, in the case of
120
+interfaces specified for a particular programming language, one that
121
+is widely used among developers working in that language.
122
+
123
+  The "System Libraries" of an executable work include anything, other
124
+than the work as a whole, that (a) is included in the normal form of
125
+packaging a Major Component, but which is not part of that Major
126
+Component, and (b) serves only to enable use of the work with that
127
+Major Component, or to implement a Standard Interface for which an
128
+implementation is available to the public in source code form.  A
129
+"Major Component", in this context, means a major essential component
130
+(kernel, window system, and so on) of the specific operating system
131
+(if any) on which the executable work runs, or a compiler used to
132
+produce the work, or an object code interpreter used to run it.
133
+
134
+  The "Corresponding Source" for a work in object code form means all
135
+the source code needed to generate, install, and (for an executable
136
+work) run the object code and to modify the work, including scripts to
137
+control those activities.  However, it does not include the work's
138
+System Libraries, or general-purpose tools or generally available free
139
+programs which are used unmodified in performing those activities but
140
+which are not part of the work.  For example, Corresponding Source
141
+includes interface definition files associated with source files for
142
+the work, and the source code for shared libraries and dynamically
143
+linked subprograms that the work is specifically designed to require,
144
+such as by intimate data communication or control flow between those
145
+subprograms and other parts of the work.
146
+
147
+  The Corresponding Source need not include anything that users
148
+can regenerate automatically from other parts of the Corresponding
149
+Source.
150
+
151
+  The Corresponding Source for a work in source code form is that
152
+same work.
153
+
154
+  2. Basic Permissions.
155
+
156
+  All rights granted under this License are granted for the term of
157
+copyright on the Program, and are irrevocable provided the stated
158
+conditions are met.  This License explicitly affirms your unlimited
159
+permission to run the unmodified Program.  The output from running a
160
+covered work is covered by this License only if the output, given its
161
+content, constitutes a covered work.  This License acknowledges your
162
+rights of fair use or other equivalent, as provided by copyright law.
163
+
164
+  You may make, run and propagate covered works that you do not
165
+convey, without conditions so long as your license otherwise remains
166
+in force.  You may convey covered works to others for the sole purpose
167
+of having them make modifications exclusively for you, or provide you
168
+with facilities for running those works, provided that you comply with
169
+the terms of this License in conveying all material for which you do
170
+not control copyright.  Those thus making or running the covered works
171
+for you must do so exclusively on your behalf, under your direction
172
+and control, on terms that prohibit them from making any copies of
173
+your copyrighted material outside their relationship with you.
174
+
175
+  Conveying under any other circumstances is permitted solely under
176
+the conditions stated below.  Sublicensing is not allowed; section 10
177
+makes it unnecessary.
178
+
179
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
180
+
181
+  No covered work shall be deemed part of an effective technological
182
+measure under any applicable law fulfilling obligations under article
183
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
184
+similar laws prohibiting or restricting circumvention of such
185
+measures.
186
+
187
+  When you convey a covered work, you waive any legal power to forbid
188
+circumvention of technological measures to the extent such circumvention
189
+is effected by exercising rights under this License with respect to
190
+the covered work, and you disclaim any intention to limit operation or
191
+modification of the work as a means of enforcing, against the work's
192
+users, your or third parties' legal rights to forbid circumvention of
193
+technological measures.
194
+
195
+  4. Conveying Verbatim Copies.
196
+
197
+  You may convey verbatim copies of the Program's source code as you
198
+receive it, in any medium, provided that you conspicuously and
199
+appropriately publish on each copy an appropriate copyright notice;
200
+keep intact all notices stating that this License and any
201
+non-permissive terms added in accord with section 7 apply to the code;
202
+keep intact all notices of the absence of any warranty; and give all
203
+recipients a copy of this License along with the Program.
204
+
205
+  You may charge any price or no price for each copy that you convey,
206
+and you may offer support or warranty protection for a fee.
207
+
208
+  5. Conveying Modified Source Versions.
209
+
210
+  You may convey a work based on the Program, or the modifications to
211
+produce it from the Program, in the form of source code under the
212
+terms of section 4, provided that you also meet all of these conditions:
213
+
214
+    a) The work must carry prominent notices stating that you modified
215
+    it, and giving a relevant date.
216
+
217
+    b) The work must carry prominent notices stating that it is
218
+    released under this License and any conditions added under section
219
+    7.  This requirement modifies the requirement in section 4 to
220
+    "keep intact all notices".
221
+
222
+    c) You must license the entire work, as a whole, under this
223
+    License to anyone who comes into possession of a copy.  This
224
+    License will therefore apply, along with any applicable section 7
225
+    additional terms, to the whole of the work, and all its parts,
226
+    regardless of how they are packaged.  This License gives no
227
+    permission to license the work in any other way, but it does not
228
+    invalidate such permission if you have separately received it.
229
+
230
+    d) If the work has interactive user interfaces, each must display
231
+    Appropriate Legal Notices; however, if the Program has interactive
232
+    interfaces that do not display Appropriate Legal Notices, your
233
+    work need not make them do so.
234
+
235
+  A compilation of a covered work with other separate and independent
236
+works, which are not by their nature extensions of the covered work,
237
+and which are not combined with it such as to form a larger program,
238
+in or on a volume of a storage or distribution medium, is called an
239
+"aggregate" if the compilation and its resulting copyright are not
240
+used to limit the access or legal rights of the compilation's users
241
+beyond what the individual works permit.  Inclusion of a covered work
242
+in an aggregate does not cause this License to apply to the other
243
+parts of the aggregate.
244
+
245
+  6. Conveying Non-Source Forms.
246
+
247
+  You may convey a covered work in object code form under the terms
248
+of sections 4 and 5, provided that you also convey the
249
+machine-readable Corresponding Source under the terms of this License,
250
+in one of these ways:
251
+
252
+    a) Convey the object code in, or embodied in, a physical product
253
+    (including a physical distribution medium), accompanied by the
254
+    Corresponding Source fixed on a durable physical medium
255
+    customarily used for software interchange.
256
+
257
+    b) Convey the object code in, or embodied in, a physical product
258
+    (including a physical distribution medium), accompanied by a
259
+    written offer, valid for at least three years and valid for as
260
+    long as you offer spare parts or customer support for that product
261
+    model, to give anyone who possesses the object code either (1) a
262
+    copy of the Corresponding Source for all the software in the
263
+    product that is covered by this License, on a durable physical
264
+    medium customarily used for software interchange, for a price no
265
+    more than your reasonable cost of physically performing this
266
+    conveying of source, or (2) access to copy the
267
+    Corresponding Source from a network server at no charge.
268
+
269
+    c) Convey individual copies of the object code with a copy of the
270
+    written offer to provide the Corresponding Source.  This
271
+    alternative is allowed only occasionally and noncommercially, and
272
+    only if you received the object code with such an offer, in accord
273
+    with subsection 6b.
274
+
275
+    d) Convey the object code by offering access from a designated
276
+    place (gratis or for a charge), and offer equivalent access to the
277
+    Corresponding Source in the same way through the same place at no
278
+    further charge.  You need not require recipients to copy the
279
+    Corresponding Source along with the object code.  If the place to
280
+    copy the object code is a network server, the Corresponding Source
281
+    may be on a different server (operated by you or a third party)
282
+    that supports equivalent copying facilities, provided you maintain
283
+    clear directions next to the object code saying where to find the
284
+    Corresponding Source.  Regardless of what server hosts the
285
+    Corresponding Source, you remain obligated to ensure that it is
286
+    available for as long as needed to satisfy these requirements.
287
+
288
+    e) Convey the object code using peer-to-peer transmission, provided
289
+    you inform other peers where the object code and Corresponding
290
+    Source of the work are being offered to the general public at no
291
+    charge under subsection 6d.
292
+
293
+  A separable portion of the object code, whose source code is excluded
294
+from the Corresponding Source as a System Library, need not be
295
+included in conveying the object code work.
296
+
297
+  A "User Product" is either (1) a "consumer product", which means any
298
+tangible personal property which is normally used for personal, family,
299
+or household purposes, or (2) anything designed or sold for incorporation
300
+into a dwelling.  In determining whether a product is a consumer product,
301
+doubtful cases shall be resolved in favor of coverage.  For a particular
302
+product received by a particular user, "normally used" refers to a
303
+typical or common use of that class of product, regardless of the status
304
+of the particular user or of the way in which the particular user
305
+actually uses, or expects or is expected to use, the product.  A product
306
+is a consumer product regardless of whether the product has substantial
307
+commercial, industrial or non-consumer uses, unless such uses represent
308
+the only significant mode of use of the product.
309
+
310
+  "Installation Information" for a User Product means any methods,
311
+procedures, authorization keys, or other information required to install
312
+and execute modified versions of a covered work in that User Product from
313
+a modified version of its Corresponding Source.  The information must
314
+suffice to ensure that the continued functioning of the modified object
315
+code is in no case prevented or interfered with solely because
316
+modification has been made.
317
+
318
+  If you convey an object code work under this section in, or with, or
319
+specifically for use in, a User Product, and the conveying occurs as
320
+part of a transaction in which the right of possession and use of the
321
+User Product is transferred to the recipient in perpetuity or for a
322
+fixed term (regardless of how the transaction is characterized), the
323
+Corresponding Source conveyed under this section must be accompanied
324
+by the Installation Information.  But this requirement does not apply
325
+if neither you nor any third party retains the ability to install
326
+modified object code on the User Product (for example, the work has
327
+been installed in ROM).
328
+
329
+  The requirement to provide Installation Information does not include a
330
+requirement to continue to provide support service, warranty, or updates
331
+for a work that has been modified or installed by the recipient, or for
332
+the User Product in which it has been modified or installed.  Access to a
333
+network may be denied when the modification itself materially and
334
+adversely affects the operation of the network or violates the rules and
335
+protocols for communication across the network.
336
+
337
+  Corresponding Source conveyed, and Installation Information provided,
338
+in accord with this section must be in a format that is publicly
339
+documented (and with an implementation available to the public in
340
+source code form), and must require no special password or key for
341
+unpacking, reading or copying.
342
+
343
+  7. Additional Terms.
344
+
345
+  "Additional permissions" are terms that supplement the terms of this
346
+License by making exceptions from one or more of its conditions.
347
+Additional permissions that are applicable to the entire Program shall
348
+be treated as though they were included in this License, to the extent
349
+that they are valid under applicable law.  If additional permissions
350
+apply only to part of the Program, that part may be used separately
351
+under those permissions, but the entire Program remains governed by
352
+this License without regard to the additional permissions.
353
+
354
+  When you convey a copy of a covered work, you may at your option
355
+remove any additional permissions from that copy, or from any part of
356
+it.  (Additional permissions may be written to require their own
357
+removal in certain cases when you modify the work.)  You may place
358
+additional permissions on material, added by you to a covered work,
359
+for which you have or can give appropriate copyright permission.
360
+
361
+  Notwithstanding any other provision of this License, for material you
362
+add to a covered work, you may (if authorized by the copyright holders of
363
+that material) supplement the terms of this License with terms:
364
+
365
+    a) Disclaiming warranty or limiting liability differently from the
366
+    terms of sections 15 and 16 of this License; or
367
+
368
+    b) Requiring preservation of specified reasonable legal notices or
369
+    author attributions in that material or in the Appropriate Legal
370
+    Notices displayed by works containing it; or
371
+
372
+    c) Prohibiting misrepresentation of the origin of that material, or
373
+    requiring that modified versions of such material be marked in
374
+    reasonable ways as different from the original version; or
375
+
376
+    d) Limiting the use for publicity purposes of names of licensors or
377
+    authors of the material; or
378
+
379
+    e) Declining to grant rights under trademark law for use of some
380
+    trade names, trademarks, or service marks; or
381
+
382
+    f) Requiring indemnification of licensors and authors of that
383
+    material by anyone who conveys the material (or modified versions of
384
+    it) with contractual assumptions of liability to the recipient, for
385
+    any liability that these contractual assumptions directly impose on
386
+    those licensors and authors.
387
+
388
+  All other non-permissive additional terms are considered "further
389
+restrictions" within the meaning of section 10.  If the Program as you
390
+received it, or any part of it, contains a notice stating that it is
391
+governed by this License along with a term that is a further
392
+restriction, you may remove that term.  If a license document contains
393
+a further restriction but permits relicensing or conveying under this
394
+License, you may add to a covered work material governed by the terms
395
+of that license document, provided that the further restriction does
396
+not survive such relicensing or conveying.
397
+
398
+  If you add terms to a covered work in accord with this section, you
399
+must place, in the relevant source files, a statement of the
400
+additional terms that apply to those files, or a notice indicating
401
+where to find the applicable terms.
402
+
403
+  Additional terms, permissive or non-permissive, may be stated in the
404
+form of a separately written license, or stated as exceptions;
405
+the above requirements apply either way.
406
+
407
+  8. Termination.
408
+
409
+  You may not propagate or modify a covered work except as expressly
410
+provided under this License.  Any attempt otherwise to propagate or
411
+modify it is void, and will automatically terminate your rights under
412
+this License (including any patent licenses granted under the third
413
+paragraph of section 11).
414
+
415
+  However, if you cease all violation of this License, then your
416
+license from a particular copyright holder is reinstated (a)
417
+provisionally, unless and until the copyright holder explicitly and
418
+finally terminates your license, and (b) permanently, if the copyright
419
+holder fails to notify you of the violation by some reasonable means
420
+prior to 60 days after the cessation.
421
+
422
+  Moreover, your license from a particular copyright holder is
423
+reinstated permanently if the copyright holder notifies you of the
424
+violation by some reasonable means, this is the first time you have
425
+received notice of violation of this License (for any work) from that
426
+copyright holder, and you cure the violation prior to 30 days after
427
+your receipt of the notice.
428
+
429
+  Termination of your rights under this section does not terminate the
430
+licenses of parties who have received copies or rights from you under
431
+this License.  If your rights have been terminated and not permanently
432
+reinstated, you do not qualify to receive new licenses for the same
433
+material under section 10.
434
+
435
+  9. Acceptance Not Required for Having Copies.
436
+
437
+  You are not required to accept this License in order to receive or
438
+run a copy of the Program.  Ancillary propagation of a covered work
439
+occurring solely as a consequence of using peer-to-peer transmission
440
+to receive a copy likewise does not require acceptance.  However,
441
+nothing other than this License grants you permission to propagate or
442
+modify any covered work.  These actions infringe copyright if you do
443
+not accept this License.  Therefore, by modifying or propagating a
444
+covered work, you indicate your acceptance of this License to do so.
445
+
446
+  10. Automatic Licensing of Downstream Recipients.
447
+
448
+  Each time you convey a covered work, the recipient automatically
449
+receives a license from the original licensors, to run, modify and
450
+propagate that work, subject to this License.  You are not responsible
451
+for enforcing compliance by third parties with this License.
452
+
453
+  An "entity transaction" is a transaction transferring control of an
454
+organization, or substantially all assets of one, or subdividing an
455
+organization, or merging organizations.  If propagation of a covered
456
+work results from an entity transaction, each party to that
457
+transaction who receives a copy of the work also receives whatever
458
+licenses to the work the party's predecessor in interest had or could
459
+give under the previous paragraph, plus a right to possession of the
460
+Corresponding Source of the work from the predecessor in interest, if
461
+the predecessor has it or can get it with reasonable efforts.
462
+
463
+  You may not impose any further restrictions on the exercise of the
464
+rights granted or affirmed under this License.  For example, you may
465
+not impose a license fee, royalty, or other charge for exercise of
466
+rights granted under this License, and you may not initiate litigation
467
+(including a cross-claim or counterclaim in a lawsuit) alleging that
468
+any patent claim is infringed by making, using, selling, offering for
469
+sale, or importing the Program or any portion of it.
470
+
471
+  11. Patents.
472
+
473
+  A "contributor" is a copyright holder who authorizes use under this
474
+License of the Program or a work on which the Program is based.  The
475
+work thus licensed is called the contributor's "contributor version".
476
+
477
+  A contributor's "essential patent claims" are all patent claims
478
+owned or controlled by the contributor, whether already acquired or
479
+hereafter acquired, that would be infringed by some manner, permitted
480
+by this License, of making, using, or selling its contributor version,
481
+but do not include claims that would be infringed only as a
482
+consequence of further modification of the contributor version.  For
483
+purposes of this definition, "control" includes the right to grant
484
+patent sublicenses in a manner consistent with the requirements of
485
+this License.
486
+
487
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
488
+patent license under the contributor's essential patent claims, to
489
+make, use, sell, offer for sale, import and otherwise run, modify and
490
+propagate the contents of its contributor version.
491
+
492
+  In the following three paragraphs, a "patent license" is any express
493
+agreement or commitment, however denominated, not to enforce a patent
494
+(such as an express permission to practice a patent or covenant not to
495
+sue for patent infringement).  To "grant" such a patent license to a
496
+party means to make such an agreement or commitment not to enforce a
497
+patent against the party.
498
+
499
+  If you convey a covered work, knowingly relying on a patent license,
500
+and the Corresponding Source of the work is not available for anyone
501
+to copy, free of charge and under the terms of this License, through a
502
+publicly available network server or other readily accessible means,
503
+then you must either (1) cause the Corresponding Source to be so
504
+available, or (2) arrange to deprive yourself of the benefit of the
505
+patent license for this particular work, or (3) arrange, in a manner
506
+consistent with the requirements of this License, to extend the patent
507
+license to downstream recipients.  "Knowingly relying" means you have
508
+actual knowledge that, but for the patent license, your conveying the
509
+covered work in a country, or your recipient's use of the covered work
510
+in a country, would infringe one or more identifiable patents in that
511
+country that you have reason to believe are valid.
512
+
513
+  If, pursuant to or in connection with a single transaction or
514
+arrangement, you convey, or propagate by procuring conveyance of, a
515
+covered work, and grant a patent license to some of the parties
516
+receiving the covered work authorizing them to use, propagate, modify
517
+or convey a specific copy of the covered work, then the patent license
518
+you grant is automatically extended to all recipients of the covered
519
+work and works based on it.
520
+
521
+  A patent license is "discriminatory" if it does not include within
522
+the scope of its coverage, prohibits the exercise of, or is
523
+conditioned on the non-exercise of one or more of the rights that are
524
+specifically granted under this License.  You may not convey a covered
525
+work if you are a party to an arrangement with a third party that is
526
+in the business of distributing software, under which you make payment
527
+to the third party based on the extent of your activity of conveying
528
+the work, and under which the third party grants, to any of the
529
+parties who would receive the covered work from you, a discriminatory
530
+patent license (a) in connection with copies of the covered work
531
+conveyed by you (or copies made from those copies), or (b) primarily
532
+for and in connection with specific products or compilations that
533
+contain the covered work, unless you entered into that arrangement,
534
+or that patent license was granted, prior to 28 March 2007.
535
+
536
+  Nothing in this License shall be construed as excluding or limiting
537
+any implied license or other defenses to infringement that may
538
+otherwise be available to you under applicable patent law.
539
+
540
+  12. No Surrender of Others' Freedom.
541
+
542
+  If conditions are imposed on you (whether by court order, agreement or
543
+otherwise) that contradict the conditions of this License, they do not
544
+excuse you from the conditions of this License.  If you cannot convey a
545
+covered work so as to satisfy simultaneously your obligations under this
546
+License and any other pertinent obligations, then as a consequence you may
547
+not convey it at all.  For example, if you agree to terms that obligate you
548
+to collect a royalty for further conveying from those to whom you convey
549
+the Program, the only way you could satisfy both those terms and this
550
+License would be to refrain entirely from conveying the Program.
551
+
552
+  13. Use with the GNU Affero General Public License.
553
+
554
+  Notwithstanding any other provision of this License, you have
555
+permission to link or combine any covered work with a work licensed
556
+under version 3 of the GNU Affero General Public License into a single
557
+combined work, and to convey the resulting work.  The terms of this
558
+License will continue to apply to the part which is the covered work,
559
+but the special requirements of the GNU Affero General Public License,
560
+section 13, concerning interaction through a network will apply to the
561
+combination as such.
562
+
563
+  14. Revised Versions of this License.
564
+
565
+  The Free Software Foundation may publish revised and/or new versions of
566
+the GNU General Public License from time to time.  Such new versions will
567
+be similar in spirit to the present version, but may differ in detail to
568
+address new problems or concerns.
569
+
570
+  Each version is given a distinguishing version number.  If the
571
+Program specifies that a certain numbered version of the GNU General
572
+Public License "or any later version" applies to it, you have the
573
+option of following the terms and conditions either of that numbered
574
+version or of any later version published by the Free Software
575
+Foundation.  If the Program does not specify a version number of the
576
+GNU General Public License, you may choose any version ever published
577
+by the Free Software Foundation.
578
+
579
+  If the Program specifies that a proxy can decide which future
580
+versions of the GNU General Public License can be used, that proxy's
581
+public statement of acceptance of a version permanently authorizes you
582
+to choose that version for the Program.
583
+
584
+  Later license versions may give you additional or different
585
+permissions.  However, no additional obligations are imposed on any
586
+author or copyright holder as a result of your choosing to follow a
587
+later version.
588
+
589
+  15. Disclaimer of Warranty.
590
+
591
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
592
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
593
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
594
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
595
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
596
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
597
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
598
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
599
+
600
+  16. Limitation of Liability.
601
+
602
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
603
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
604
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
605
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
606
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
607
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
608
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
609
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
610
+SUCH DAMAGES.
611
+
612
+  17. Interpretation of Sections 15 and 16.
613
+
614
+  If the disclaimer of warranty and limitation of liability provided
615
+above cannot be given local legal effect according to their terms,
616
+reviewing courts shall apply local law that most closely approximates
617
+an absolute waiver of all civil liability in connection with the
618
+Program, unless a warranty or assumption of liability accompanies a
619
+copy of the Program in return for a fee.
620
+
621
+                     END OF TERMS AND CONDITIONS
622
+
623
+            How to Apply These Terms to Your New Programs
624
+
625
+  If you develop a new program, and you want it to be of the greatest
626
+possible use to the public, the best way to achieve this is to make it
627
+free software which everyone can redistribute and change under these terms.
628
+
629
+  To do so, attach the following notices to the program.  It is safest
630
+to attach them to the start of each source file to most effectively
631
+state the exclusion of warranty; and each file should have at least
632
+the "copyright" line and a pointer to where the full notice is found.
633
+
634
+    <one line to give the program's name and a brief idea of what it does.>
635
+    Copyright (C) <year>  <name of author>
636
+
637
+    This program is free software: you can redistribute it and/or modify
638
+    it under the terms of the GNU General Public License as published by
639
+    the Free Software Foundation, either version 3 of the License, or
640
+    (at your option) any later version.
641
+
642
+    This program is distributed in the hope that it will be useful,
643
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
644
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
645
+    GNU General Public License for more details.
646
+
647
+    You should have received a copy of the GNU General Public License
648
+    along with this program.  If not, see <https://www.gnu.org/licenses/>.
649
+
650
+Also add information on how to contact you by electronic and paper mail.
651
+
652
+  If the program does terminal interaction, make it output a short
653
+notice like this when it starts in an interactive mode:
654
+
655
+    <program>  Copyright (C) <year>  <name of author>
656
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
657
+    This is free software, and you are welcome to redistribute it
658
+    under certain conditions; type `show c' for details.
659
+
660
+The hypothetical commands `show w' and `show c' should show the appropriate
661
+parts of the General Public License.  Of course, your program's commands
662
+might be different; for a GUI interface, you would use an "about box".
663
+
664
+  You should also get your employer (if you work as a programmer) or school,
665
+if any, to sign a "copyright disclaimer" for the program, if necessary.
666
+For more information on this, and how to apply and follow the GNU GPL, see
667
+<https://www.gnu.org/licenses/>.
668
+
669
+  The GNU General Public License does not permit incorporating your program
670
+into proprietary programs.  If your program is a subroutine library, you
671
+may consider it more useful to permit linking proprietary applications with
672
+the library.  If this is what you want to do, use the GNU Lesser General
673
+Public License instead of this License.  But first, please read
674
+<https://www.gnu.org/licenses/why-not-lgpl.html>.
0 675
new file mode 100644
... ...
@@ -0,0 +1,79 @@
1
+===============================================================================
2
+EKSD - let's go ahead and XXD again
3
+===============================================================================
4
+
5
+xxd is a very good hexdump program that makes editing files on UNIX very easy.
6
+It also doesn't support text-tables. Which sucks.
7
+
8
+eksd is a clone of a good hexdump program (even matching several arguments
9
+exactly)… except it supports text-tables.
10
+
11
+
12
+————————————————————————————————————————
13
+USAGE
14
+————————————————————————————————————————
15
+To see a hexdump of a file, just run:
16
+	$ eksd $FILE > $HEXDUMP
17
+
18
+If you want to turn a hexdump (from eksd or xxd) back to a file:
19
+	$ eksd -r $HEXDUMP > $FILE
20
+
21
+And to make a hexdump with a custom text-table:
22
+	$ eksd -t $TABLEFILE $FILE > $HEXDUMP
23
+
24
+Text-tables are in a simple format— one hexcode per line, followed by it's
25
+character. See text-tables/* for examples.
26
+
27
+By default, eksd uses a built-in *fancy* text-table— it's basic ASCII,
28
+except it'll print nice pictographics for newline characters, etc. These
29
+require UTF, of course. If they don't work for you, use the "-a" arg to
30
+revert to simple, non-fancy ASCII.
31
+Note that specifying a text-table will override "-a", though.
32
+
33
+
34
+————————————————————
35
+EXAMPLES
36
+————————————————————
37
+Here's a part of Castlevania (EU) for the NES using it's text-table:
38
+
39
+	$ eksd -t castle-table.txt castlevania.nes  | grep -A4 "18e80"
40
+	00018e80: 5454 5454 866e 6854 6460 8486 5454 5454  ....THE.CAST....
41
+	00018e90: 5454 5454 5466 8260 6488 7660 5454 5454  .....DRACULA....
42
+	00018ea0: 5464 6e82 7084 867c 7e6e 6882 5462 6868  .CHRISTOPHER.BEE
43
+	00018eb0: 5454 5454 5454 6668 6086 6e54 5454 5454  ......DEATH.....
44
+	00018ec0: 5454 5462 6876 7c54 7688 6c7c 8470 5454  ...BELO.LUGOSI..
45
+
46
+And here's that same file in xxd (just because I feel like showing off):
47
+
48
+	$ xxd castlevania.nes | grep -A4 "18e80"
49
+	00018e80: 5454 5454 866e 6854 6460 8486 5454 5454  TTTT.nhTd`..TTTT
50
+	00018e90: 5454 5454 5466 8260 6488 7660 5454 5454  TTTTTf.`d.v`TTTT
51
+	00018ea0: 5464 6e82 7084 867c 7e6e 6882 5462 6868  Tdn.p..|~nh.Tbhh
52
+	00018eb0: 5454 5454 5454 6668 6086 6e54 5454 5454  TTTTTTfh`.nTTTTT
53
+	00018ec0: 5454 5462 6876 7c54 7688 6c7c 8470 5454  TTTbhv|Tv.l|.pTT
54
+
55
+
56
+————————————————————————————————————————
57
+INSTALLATION
58
+————————————————————————————————————————
59
+Prebuilt binaries can be found at  https://mirror.eunichx.us/eksd/
60
+for both Linux and OpenBSD.
61
+
62
+… but if they don't work for you, you can make your own binary.
63
+That requires a Lisp (I recommend SBCL) and Quicklisp (https://quicklisp.org).
64
+
65
+Put this into "quicklisp/local-projects/", then run, in your lisp interpreter:
66
+
67
+	# (ql:quickload '(eksd eksd-unix))
68
+	# (save-lisp-and-die "eksd" :toplevel #'eksd-unix:invoke :executable t)
69
+
70
+And bam, you've made a binary. Cool.
71
+
72
+
73
+————————————————————————————————————————
74
+BORING STUFF
75
+————————————————————————————————————————
76
+License is the GNU GPLv3:
77
+       check COPYING.txt (/ipfs/QmTBpqbvJLZaq3hTMUhxX5hyJaSCeWe6Q5FRctQbsD6EsE)
78
+Author is Jaidyn Ann <jadedctrl@teknik.io>
79
+Sauce is at https://git.eunichx.us/eksd.git
0 80
new file mode 100644
... ...
@@ -0,0 +1,278 @@
1
+;; This file is free software: you can redistribute it and/or modify
2
+;; it under the terms of version 3 of the GNU General Public License
3
+;; as published by the Free Software Foundation.
4
+;;
5
+;; This program is distributed in the hope that it will be useful,
6
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
7
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
8
+;; GNU General Public License for more details.
9
+
10
+(defpackage :eksd-unix
11
+  (:use :cl :eksd)
12
+  (:export :invoke
13
+           *text-table*))
14
+
15
+(in-package :eksd-unix)
16
+
17
+;; —————————————————————————————————————
18
+
19
+(opts:define-opts
20
+  (:name :help
21
+         :description "print this help text."
22
+         :short #\h  :long "help")
23
+  (:name :reverse
24
+         :description "reverse operation: convert hexdump into binary."
25
+         :short #\r  :long "reverse")
26
+  (:name :upcase
27
+         :description "print hexadecimal in uppercase."
28
+         :short #\u  :long "upcase")
29
+  (:name :width
30
+         :description "octets per line; 16 as default."
31
+         :short #\c  :long "cols"
32
+         :arg-parser #'parse-integer
33
+         :meta-var "COLS")
34
+  (:name :seek
35
+         :description "skip given amount of bytes in file."
36
+         :short #\s  :long "seek"
37
+         :arg-parser #'parse-integer
38
+         :meta-var "OFFSET")
39
+  (:name :group
40
+         :description "octets per group; 2 as default."
41
+         :short #\g  :long "groupsize"
42
+         :arg-parser #'parse-integer
43
+         :meta-var "OCTETS")
44
+  (:name :ascii
45
+         :description "use simple-ascii for previews; default is fun."
46
+         :short #\a  :long "ascii")
47
+  (:name :text-table
48
+         :description "specify a text-table; semi-ascii as default."
49
+         :short #\t  :long "table"
50
+         :arg-parser #'probe-file
51
+         :meta-var "TABLE"))
52
+
53
+
54
+;; —————————————————————————————————————
55
+;; MACROS
56
+
57
+;; LIST SYMBOL FORM
58
+(defmacro when-opt (opts option body)
59
+  `(when (getf ,opts ,option)
60
+     ,body))
61
+
62
+;; LIST SYMBOL FORM FORM
63
+(defmacro if-opt (opts option if-form &optional else-form)
64
+  `(if (getf ,opts ,option)
65
+     ,if-form ,else-form))
66
+
67
+
68
+;; —————————————————————————————————————
69
+;; MAIN - INVOCATION
70
+
71
+;; NIL → NIL
72
+(defun invoke ()
73
+  "Actual invocation of the program. This is what you should set as :toplevel."
74
+  (multiple-value-bind (opts free) (opts:get-opts)
75
+    (when-opt opts :help (help))
76
+    (choose-text-table opts)
77
+
78
+    (let* ((input-stream (choose-input-stream free opts)))
79
+      (when (not input-stream)
80
+        (format *error-output* "eksd: No file provided and nothing piped.~%")
81
+        (help 2))
82
+
83
+      (choose-stream-position opts input-stream)
84
+      (reverse-or-dump opts input-stream)
85
+
86
+      (close input-stream))))
87
+
88
+
89
+;; NUMBER STREAM → NIL
90
+(defun help (&optional (exit-code 0) (stream *standard-output*))
91
+  "Prints help message and dies."
92
+  (unix-opts:describe :prefix "usage: eksd [-hr] [-t table-file] file"
93
+                      :stream stream)
94
+  (unix-opts:exit exit-code))
95
+
96
+;; —————————————————
97
+
98
+;; LIST STREAM → NIL
99
+(defun reverse-or-dump (opts input-stream)
100
+  "Determine if a hexdump or reversal's necessary— and execute it."
101
+  (if-opt opts :reverse
102
+    (reverse-stream input-stream)
103
+    (apply #'print-stream (choose-pstream-args opts input-stream))))
104
+
105
+
106
+;; —————————————————————————————————————
107
+;; INPUT
108
+
109
+;; LIST → STREAM
110
+(defun choose-input-stream (free-args opts)
111
+  "Select an input stream, between a file passed in free-args or stdin."
112
+  (let* ((input-file   (car free-args))
113
+         (input-file-p (ignore-errors (probe-file input-file)))
114
+         (stdin-p      (listen *standard-input*)))
115
+    (cond ((and (getf opts :reverse) input-file-p)
116
+               (open input-file :direction :input :element-type 'character))
117
+          (input-file-p (open-byte input-file))
118
+          (stdin-p      *standard-input*))))
119
+
120
+;; LIST → NIL
121
+(defun choose-text-table (opts)
122
+  "Choose the appropriate text-table— user-given or otherwise."
123
+  (if-opt opts :text-table
124
+          (setq *text-table* (parse-table-file (getf opts :text-table)))
125
+          (if-opt opts :ascii
126
+            (setq *text-table* eksd:*ascii-text-table*)
127
+            (setq *text-table* eksd:*fancy-text-table*))))
128
+
129
+;; LIST STREAM → NIL
130
+(defun choose-stream-position (opts stream)
131
+  "Choose the correct stream position— if seek arg used, etc."
132
+  (when (not (eq stream *standard-input*))
133
+    (if-opt opts :seek (file-position stream (getf opts :seek)))))
134
+
135
+;; LIST STREAM → LIST
136
+(defun choose-pstream-args (opts input-stream)
137
+  "Take all options, and return the appropriate arguments to #'print-stream."
138
+  (let ((args (list input-stream)))
139
+    (when-opt opts :upcase (nconc args '(:upcase t)))
140
+    (when-opt opts :width  (nconc args `(:width ,(getf opts :width))))
141
+    (when-opt opts :group  (nconc args `(:group ,(getf opts :group))))
142
+    args))
143
+
144
+;; —————————————————
145
+
146
+;; STREAM NUMBER NUMBER → LIST NUMBER
147
+(defun get-line-hex (stream index width)
148
+  "Return a line's worth of octets; and a new octet-index."
149
+  (values
150
+    (loop :while (listen stream) :for i :from 1 :to width
151
+          :collect (eksd:read-hex stream) :do (incf index))
152
+    index))
153
+
154
+
155
+;; —————————————————————————————————————
156
+;; OUTPUT
157
+
158
+;; STREAM NUMBER NUMBER STREAM
159
+(defun print-stream (stream &key (width 16) (group 2) (upcase nil) (out 't))
160
+  "Print an entire stream in hex, xxd-style."
161
+  (let ((index 0))
162
+    (loop :while (listen stream)
163
+          :do (setq index (print-line stream :out out :index index 
164
+                                      :group group :width width
165
+                                      :upcase upcase)))))
166
+
167
+
168
+;; STREAM STREAM NUMBER NUMBER NUMBER → NUMBER
169
+(defun print-line (stream &key (out 't) (index 0) (width 16) (group 2)
170
+                               (upcase nil))
171
+  "Print a given line of xxd-style output— index, bytes, preview and all.
172
+  Returns the new index of the stream."
173
+  (multiple-value-bind (hexes new-index) (get-line-hex stream index width)
174
+    (print-index index out)
175
+    (print-bytes (list-pad hexes width "  ") group upcase out)
176
+    (print-preview hexes out)
177
+    (format t "~%")
178
+    new-index))
179
+
180
+;; NUMBER STREAM → NIL
181
+(defun print-index (index &optional (out 't))
182
+  "Print the current index, padded to 8 char-length and in hexadecimal."
183
+  (format out "~8,,,'0@A: " (string-downcase (eksd:integer-to-hex index))))
184
+
185
+;; LIST_OF_STRINGS NUMBER STREAM → NIL
186
+(defun print-bytes (hexes group-size upcase &optional (out 't))
187
+  "Print the given list of bytes on a line in specified-sized groupings."
188
+  (mapcar (lambda (group)
189
+            (format out (if upcase "~{~@:(~a~)~} " "~{~(~a~)~} ") group))
190
+          (pairs hexes group-size)))
191
+
192
+;; LIST_OF_STRINGS STREAM → NIL
193
+(defun print-preview (hexes &optional (out 't))
194
+  "Print a given list of bytes' preview, as per ASCII table."
195
+  (format out " ~{~A~}"
196
+          (mapcar (lambda (hex) (hex-to-char hex *text-table*)) hexes)))
197
+
198
+
199
+;; —————————————————————————————————————
200
+;; REVERSAL
201
+
202
+;; STREAM STREAM → NIL
203
+(defun reverse-stream (stream &optional (out *standard-output*))
204
+  "Take a stream of xxd-style/eksd-output hexcode and convert back into binary."
205
+  (loop :while (listen stream)
206
+        :do (mapcar (lambda (byte)
207
+                      (write-byte (eksd:hex-to-integer byte) out))
208
+                    (line-to-hexes (read-line stream)))))
209
+
210
+;; STRING → LIST
211
+(defun line-to-hexes (line)
212
+  "Convert an xxd-style/eksd-output hexcode line into a list of hexcodes."
213
+  (mapcar (lambda (pair) (format nil "~{~A~}" pair))
214
+    (string-pairs
215
+      (remove #\space (car (cl-strings:split
216
+                             (left-clip-string line ": ")"  "))))))
217
+
218
+
219
+;; —————————————————————————————————————
220
+;; TEXT-TABLES
221
+
222
+;; STRING → LIST
223
+(defun parse-table-line (string)
224
+  "Parse a text-table line into a pair of hex-code and preview character."
225
+  (let ((chars (char-list string)))
226
+    (list (format nil "~{~a~}" (list (car chars) (cadr chars)))
227
+          (tail chars))))
228
+
229
+;; PATHNAME → LIST
230
+(defun parse-table-file (pathname)
231
+  "Parse a text-table file (hexcode followed by preview character) into a list
232
+  of lists '(hexcode character)."
233
+  (with-open-file (istream pathname :direction :input :element-type 'character)
234
+    (loop :while (listen istream)
235
+          :collect (parse-table-line (read-line istream)))))
236
+
237
+
238
+;; —————————————————————————————————————
239
+;; MISC
240
+
241
+;; LIST NUMBER VARYING → LIST
242
+(defun list-pad (list target-length &optional (padding nil))
243
+  "Pad a list out to length, by appending padding as necessary."
244
+  (if (not (eq target-length (length list)))
245
+    (list-pad (append list (list padding)) target-length padding)
246
+    list))
247
+
248
+;; LIST NUMBER → LIST
249
+(defun pairs (list width &optional pairs)
250
+  "Split a list into pairs (sublist) of a given width."
251
+  (cond ((not list) pairs)
252
+        ((or (eq width (length (tail pairs))) (not pairs))
253
+         (pairs (cdr list) width (nconc pairs `((,(car list))))))
254
+        ((not (eq width (length (tail pairs))))
255
+         (pairs (cdr list) width
256
+           (nconc (de-tail pairs) `(,(nconc (tail pairs) `(,(car list)))))))))
257
+
258
+;; STRING CHARACTER → STRING
259
+(defun left-clip-string (string &optional (seperator #\space))
260
+  "Clip a string up to the first instance of the seperator."
261
+  (reduce (lambda (a b) (format nil "~A~A~A" a seperator b))
262
+          (cdr (cl-strings:split string seperator))))
263
+
264
+;; STRING NUMBER → LIST
265
+(defun string-pairs (string &optional (pair-length 2))
266
+  "Return a list of characters from a string in pairs of given length."
267
+  (pairs (char-list string) pair-length))
268
+
269
+;; PATHNAME → STREAM
270
+(defun open-byte (pathname)
271
+  "Open an input file as a byte-stream."
272
+  (open pathname :direction :input :element-type '(unsigned-byte 8)))
273
+
274
+;; —————————————————
275
+
276
+(defun char-list (string) (loop :for char :across string :collect char))
277
+(defun de-tail (list) (reverse (cdr (reverse list))))
278
+(defun tail  (list) (car (last list)))
0 279
new file mode 100755
... ...
@@ -0,0 +1,15 @@
1
+(defsystem "eksd"
2
+	   :version "0.1"
3
+           :license "GPLv3"
4
+	   :author "Jaidyn Ann <jadedctrl@teknik.io>"
5
+	   :description "For reading files into hex— `xxd`-like with text-tables."
6
+	   :depends-on ()
7
+	   :components ((:file "eksd")))
8
+
9
+(defsystem "eksd-unix"
10
+	   :version "0.1"
11
+           :license "GPLv3"
12
+	   :author "Jaidyn Ann <jadedctrl@teknik.io>"
13
+	   :description "UNIX terminal front-tend to eksd. `xxd` twin."
14
+	   :depends-on (:eksd :unix-opts :cl-strings)
15
+	   :components ((:file "eksd-unix")))
0 16
new file mode 100644
... ...
@@ -0,0 +1,143 @@
1
+;; This file is free software: you can redistribute it and/or modify
2
+;; it under the terms of version 3 of the GNU General Public License
3
+;; as published by the Free Software Foundation.
4
+;;
5
+;; This program is distributed in the hope that it will be useful,
6
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
7
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
8
+;; GNU General Public License for more details.
9
+
10
+(defpackage :eksd
11
+  (:use :cl)
12
+  (:export :stream-to-hex
13
+           :file-to-hex
14
+           :hex-to-char
15
+           :hex-to-file
16
+           :hex-to-integer
17
+           :integer-to-hex
18
+           :hex-to-stream
19
+           :read-hex
20
+           *ascii-text-table*
21
+           *fancy-text-table*))
22
+
23
+(in-package :eksd)
24
+
25
+;; —————————————————————————————————————
26
+
27
+(defparameter *ascii-text-table*
28
+  '(("20" #\space)("21" #\!)("22" #\")("23" #\#)("24" #\$) ("25" #\%)
29
+    ("26" #\&) ("27" #\') ("28" #\() ("29" #\)) ("2A" #\*) ("2B" #\+)
30
+    ("2C" #\,) ("2D" #\-) ("2E" #\.) ("2F" #\/) ("30" #\0) ("31" #\1)
31
+    ("32" #\2) ("33" #\3) ("34" #\4) ("35" #\5) ("36" #\6) ("37" #\7)
32
+    ("38" #\8) ("39" #\9) ("3A" #\:) ("3B" #\;) ("3C" #\<) ("3D" #\=)
33
+    ("3E" #\>) ("3F" #\?) ("40" #\@) ("41" #\A) ("42" #\B) ("43" #\C)
34
+    ("44" #\D) ("45" #\E) ("46" #\F) ("47" #\G) ("48" #\H) ("49" #\I)
35
+    ("4A" #\J) ("4B" #\K) ("4C" #\L) ("4D" #\M) ("4E" #\N) ("4F" #\O)
36
+    ("50" #\P) ("51" #\Q) ("52" #\R) ("53" #\S) ("54" #\T) ("55" #\U)
37
+    ("56" #\V) ("57" #\W) ("58" #\X) ("59" #\Y) ("5A" #\Z) ("5B" #\[)
38
+    ("5C" #\\) ("5D" #\]) ("5E" #\^) ("5F" #\_) ("60" #\`) ("61" #\a)
39
+    ("62" #\b) ("63" #\c) ("64" #\d) ("65" #\e) ("66" #\f) ("67" #\g)
40
+    ("68" #\h) ("69" #\i) ("6A" #\j) ("6B" #\k) ("6C" #\l) ("6D" #\m)
41
+    ("6E" #\n) ("6F" #\o) ("70" #\p) ("71" #\q) ("72" #\r) ("73" #\s)
42
+    ("74" #\t) ("75" #\u) ("76" #\v) ("77" #\w) ("78" #\x) ("79" #\y)
43
+    ("7A" #\z) ("7B" #\{) ("7C" #\|) ("7D" #\}) ("7E" #\~)))
44
+(defparameter *fancy-text-bits*
45
+  '(("00" #\×) ("07" #\🔔)("08" "⬅️") ("09" #\↣) ("0A" #\↵) ("0B" #\↧)
46
+    ("0C" #\⇲) ("0D" #\↲) ("0E" #\⇪) ("0F" #\⇫) ("1B" #\↯) ("7F" #\⇐)))
47
+(defparameter *fancy-text-table* (append *ascii-text-table* *fancy-text-bits*))
48
+
49
+
50
+;; —————————————————————————————————————
51
+;; X → HEX
52
+
53
+;; STREAM → LIST_OF_STRINGS
54
+(defun stream-to-hex (stream)
55
+  "Return a stream's data as a list of hexadecimal strings."
56
+  (loop :while   (listen stream)
57
+        :collect (read-hex stream)))
58
+
59
+;; PATHNAME → LIST_OF_STRINGS
60
+(defun file-to-hex (pathname)
61
+  "Return a list of  a file's octets represented in hexadecimal strings."
62
+  (with-open-file (fstream pathname
63
+                           :direction :input :element-type '(unsigned-byte 8))
64
+    (stream-to-hex fstream)))
65
+
66
+
67
+
68
+;; —————————————————————————————————————
69
+;; HEX → X
70
+
71
+;; LIST_OF_STRINGS STREAM → NIL
72
+(defun hex-to-stream (hexes stream)
73
+  "Write a list of bytes (in hex-string format) to a stream."
74
+  (loop :for hex :in hexes
75
+        :do (write-hex hex stream)))
76
+
77
+;; LIST_OF_STRINGS PATHNAME → NIL
78
+(defun hex-to-file (hexes pathname)
79
+  "Write a list of bytes (in hex-string format) to a file."
80
+  (with-open-file (fstream pathname
81
+                           :direction :output :element-type '(unsigned-byte 8))
82
+    (hex-to-stream hexes fstream)))
83
+
84
+
85
+
86
+;; —————————————————————————————————————
87
+;; TEXT-TABLE FUN
88
+
89
+(defgeneric hex-to-char (hex/es &optional text-table) 
90
+  (:documentation "Return a hexadecimal's respective character (as string)
91
+                  according to the given text-table."))
92
+
93
+;; STRING LIST → STRING
94
+(defmethod hex-to-char ((hex string) &optional (text-table *ascii-text-table*))
95
+  (or (cadr (assoc hex text-table :test #'equal)) #\.))
96
+
97
+;; LIST_OF_STRINGS LIST → LIST_OF_STRINGS
98
+(defmethod hex-to-char ((hexes list) &optional (text-table *ascii-text-table*))
99
+  (mapcar (lambda (hex) (hex-to-char hex text-table)) hexes))
100
+
101
+
102
+;; PATHNAME LIST → LIST_OF_STRINGS
103
+(defun file-to-char (pathname &optional (text-table *ascii-text-table*))
104
+  "Print character representation of a file, as per the given character table."
105
+  (hex-to-char (file-to-hex pathname) text-table))
106
+
107
+
108
+;; CHARACTER LIST → STRING
109
+(defun char-hex (char &optional text-table)
110
+  "Return a character's hex, given a text-table."
111
+  (if (not text-table) 
112
+    (integer-to-hex (char-code char))
113
+    (cadr (assoc char (mapcar #'reverse text-table)))))
114
+
115
+(defun string-hex (string &optional text-table)
116
+  (loop :for char :across string
117
+        :collect (char-hex char text-table)))
118
+
119
+
120
+
121
+;; —————————————————————————————————————
122
+;; MISC
123
+
124
+;; STREAM → STRING
125
+(defun read-hex (stream)
126
+  "Read a byte from a stream as a hexcode."
127
+  (integer-to-hex (read-byte stream)))
128
+
129
+;; STREAM → STRING
130
+(defun write-hex (hex stream)
131
+  "Read a byte from a stream as a hexcode."
132
+  (write-byte (hex-to-integer hex) stream))
133
+
134
+
135
+;; NUMBER → STRING
136
+(defun integer-to-hex (number)
137
+  "Return the base-16 of a number."
138
+  (format nil "~2,'0x" number))
139
+
140
+;; STRING → NUMBER
141
+(defun hex-to-integer (hex)
142
+  "Convert hex to a base-10 integer."
143
+  (parse-integer hex :radix 16))
0 144
new file mode 100644
... ...
@@ -0,0 +1,8193 @@
1
+00000000: 4e45 531a 0800 2100 0000 0000 0000 0000  NES...!.........
2
+00000010: 0001 0203 0405 0607 0004 a000 be00 07f0  ................
3
+00000020: 1ea5 ff29 181d 0780 8d00 20c8 ad02 20b9  ...)...... ... .
4
+00000030: 0007 8d06 20c8 b900 078d 0620 c8d0 12a9  .... ...... ....
5
+00000040: 008d 0007 8520 a5ff 8d00 2060 a9ff 8d07  ..... .... `....
6
+00000050: 20b9 0007 c8c9 ffd0 f5b9 0007 c903 b0ec   ...............
7
+00000060: 90ba a900 8505 a92e 8507 a578 1869 44c9  ...........x.iD.
8
+00000070: 4490 f985 7885 04a6 05e0 1cb0 3fbd 0003  D...x.......?...
9
+00000080: d036 bd38 0385 00bd 5403 8501 bd8c 0385  .6.8....T.......
10
+00000090: 02bd 5004 854b bd1c 030a b00e a8b9 be8f  ..P..K..........
11
+000000a0: 8508 b9bf 8f85 094c a580 a8b9 be90 8508  .......L........
12
+000000b0: b9bf 9085 0920 d680 e605 d0bb a604 a407  ..... ..........
13
+000000c0: a9f4 9d00 028a 1869 c4c9 4490 f9aa 8810  .......i..D.....
14
+000000d0: ef60 1865 019d 0002 b108 9d01 02a5 4e4c  .`.e..........NL
15
+000000e0: 1281 c818 9019 a000 b108 f058 c885 03a6  ...........X....
16
+000000f0: 04b1 0810 edc8 c980 f057 c981 f047 386a  .........W...G8j
17
+00000100: b0d0 6501 9d00 02b1 089d 0102 c8a5 4bd0  ..e...........K.
18
+00000110: 59a5 00d0 05b1 084c 1081 b108 29dc 0500  Y......L....)...
19
+00000120: 854e 9d02 02c8 a54b d054 b108 1865 029d  .N.....K.T...e..
20
+00000130: 0302 8a18 69c4 c944 90f9 aac6 07c8 c603  ....i..D........
21
+00000140: d0af 8604 60a5 0a85 08a5 0b85 09a4 06d0  ....`...........
22
+00000150: a0a5 0885 0aa5 0985 0bb1 0ac8 8508 b10a  ................
23
+00000160: c884 0685 09a0 004c e180 a500 d005 b108  .......L........
24
+00000170: 4c69 81b1 0829 dc05 0049 404c 1081 b108  Li...)...I@L....
25
+00000180: 1869 0849 ff18 6901 4c1c 81ea eaea eaea  .i.I..i.L.......
26
+00000190: eaea eaea 609f 8785 e5d0 0585 c285 d260  ....`..........`
27
+000001a0: c91a d004 a901 85ee 8a48 9848 a203 ad85  .........H.H....
28
+000001b0: 8185 e0ad 8681 85e1 a5e5 1865 e085 e0a9  ...........e....
29
+000001c0: 0065 e185 e1ca d0f0 a000 84e4 b1e0 2a2a  .e............**
30
+000001d0: 2a29 0385 e6a5 e5c9 04f0 08c5 c2f0 3ec5  *)............>.
31
+000001e0: d2f0 21a4 e4b1 e029 3f85 e8a5 e5c9 04d0  ..!....)?.......
32
+000001f0: 05a5 e84c 0f82 a5e8 c910 d023 a5c2 f01d  ...L.......#....
33
+00000200: a5d2 d008 a914 4c0f 824c 9882 c5c2 b007  ......L..L......
34
+00000210: c5e5 b0f5 4cf4 81a5 c2c5 e5b0 eca9 1085  ....L...........
35
+00000220: e74a 4aa8 beaf 82a5 e5f0 04d5 0290 79a9  .JJ...........y.
36
+00000230: 0095 02a4 e4c8 b1e0 9503 85be c8b1 e095  ................
37
+00000240: 0485 bfa0 0194 0088 9406 e080 d004 84a1  ................
38
+00000250: 84a7 e090 d004 84b5 84b8 e0a0 f006 9401  ................
39
+00000260: e0b0 f013 b1be d006 85e5 e0b0 f009 29f0  ..............).
40
+00000270: c920 f001 c894 08a4 e7c0 00d0 07a5 c2d0  . ..............
41
+00000280: 234c 7c82 c004 d004 a5d2 d018 9829 0fa8  #L|..........)..
42
+00000290: a900 c008 f002 a930 9900 4020 7b81 9901  .......0..@ {...
43
+000002a0: 4020 7b81 a5e5 9502 c6e6 300a a4e4 c8c8  @ {.......0.....
44
+000002b0: c884 e44c d381 a900 85e1 68a8 68aa 6080  ...L......h.h.`.
45
+000002c0: 90a0 b0c0 d0ea eaea eaea eaea eaea 608a  ..............`.
46
+000002d0: 48b5 0285 e894 02e0 c0d0 2fa5 82f0 5ca2  H........./...\.
47
+000002e0: 80a9 008d 0140 20b5 82a5 a78d 0240 20b5  .....@ ......@ .
48
+000002f0: 82b5 018d 0340 20b5 82a5 e8c9 54f0 3cb5  .....@ .....T.<.
49
+00000300: 078d 0040 20b5 824c 2883 e0d0 d02d a592  ...@ ..L(....-..
50
+00000310: f029 a290 8c05 4020 b582 a5b8 8d06 4020  .)....@ ......@ 
51
+00000320: b582 b501 8d07 4020 b582 a5e8 c954 f00b  ......@ .....T..
52
+00000330: b507 8d04 4020 b582 68aa 6068 aa98 e0a0  ....@ ..h.`h....
53
+00000340: f008 9401 a930 e0b0 f002 9408 206b 87b0  .....0...... k..
54
+00000350: 05a6 ac9d 0040 60c8 b1ba 9503 c8b1 ba95  .....@`.........
55
+00000360: 0460 b506 1869 01c8 d1ba f014 3003 38e9  .`...i......0.8.
56
+00000370: 0195 06c8 b1ba 9503 c8b1 ba95 044c 8383  .............L..
57
+00000380: a900 9506 c8c8 c898 1865 ba95 03a9 0065  .........e.....e
58
+00000390: bb95 04a9 0195 004c d383 a5e2 f021 c6e3  .......L.....!..
59
+000003a0: d01d a928 85e3 c685 a585 290f f008 c695  ...(......).....
60
+000003b0: a595 290f d009 a900 85e2 a560 2087 81a2  ..)........` ...
61
+000003c0: 80a0 0086 ab84 acb5 02f0 0320 d383 a5ab  ........... ....
62
+000003d0: 1869 10c9 e0d0 0160 aaa5 ac18 6904 290f  .i.....`....i.).
63
+000003e0: a890 e0a0 00b5 0385 bab5 0485 bbd6 00d0  ................
64
+000003f0: 034c 7d84 a522 f00b 85ef a954 d502 d025  .L}..".....T...%
65
+00000400: 4c62 85a9 1ac5 c2f0 07c5 d2f0 034c 6a84  Lb...........Lj.
66
+00000410: a5ee d011 e0b0 f00a e0c0 f006 e0d0 f002  ................
67
+00000420: f600 4c62 85f6 0098 9501 a954 c5d2 f01c  ..Lb.......T....
68
+00000430: b501 206b 87b0 0aa9 30a6 ac9d 0040 20b5  .. k....0....@ .
69
+00000440: 82a9 308d 0440 20b5 824c 5584 a930 8d00  ..0..@ ..LU..0..
70
+00000450: 4020 b582 b501 206b 87b0 0aa9 30a6 ac9d  @ .... k....0...
71
+00000460: 0040 20b5 82a9 008d 0840 20b5 82a9 308d  .@ ......@ ...0.
72
+00000470: 0c40 20b5 82a9 0085 ee60 a5ef f003 2078  .@ ......`.... x
73
+00000480: 84a9 0085 ef4c 6285 a900 8581 60b1 bac9  .....Lb.....`...
74
+00000490: fd90 42d0 1ba6 abb5 0809 0895 0820 4783  ..B.......... G.
75
+000004a0: c898 1865 ba95 0ea9 0065 bb95 0f4c 8383  ...e.....e...L..
76
+000004b0: c9fe d003 4c52 83e0 b0f0 06b5 0829 08d0  ....LR.......)..
77
+000004c0: 034c bf82 b508 29f7 9508 b50e 9503 b50f  .L....).........
78
+000004d0: 9504 4c83 83e0 b0f0 09b5 0829 01f0 034c  ..L........)...L
79
+000004e0: c285 b1ba 29f0 c920 d01c b1ba 290f 9509  ....).. ....)...
80
+000004f0: c8b1 ba20 6b87 b005 a6ac 9d00 40a6 abe0  ... k.......@...
81
+00000500: a0f0 0295 07c8 b509 9500 e0a0 f051 b1ba  .............Q..
82
+00000510: c911 d00a b508 0910 9508 c84c d284 c910  ...........L....
83
+00000520: d016 2055 87c8 206b 87b0 05a6 ac9d 0140  .. U.. k.......@
84
+00000530: a6ab b508 0980 9508 b507 2910 f021 b507  ..........)..!..
85
+00000540: 29f0 9507 b1ba c9f8 d003 c8b1 ba4a 4a4a  )............JJJ
86
+00000550: 4a15 0795 0720 6b87 b005 a6ac 9d00 40b1  J.... k.......@.
87
+00000560: ba29 0785 bcc8 b1ba 85bd a6ab 20e4 864c  .).......... ..L
88
+00000570: 4387 e0b0 f006 b508 2901 d001 60e0 a0d0  C.......)...`...
89
+00000580: 0160 a5ba d002 c6bb c6ba a000 b1ba 29f0  .`............).
90
+00000590: c9c0 d001 60b5 0729 10d0 0160 b50b 38e9  ....`..)...`..8.
91
+000005a0: 0195 0bd5 00d0 0838 f50d 9008 f006 6038  .......8......`8
92
+000005b0: e901 950b b507 290f 38e9 0110 0160 b507  ......).8....`..
93
+000005c0: e901 9507 206b 87b0 05a6 ac9d 0040 604c  .... k.......@`L
94
+000005d0: 7d84 a522 d00a a91a c5c2 f004 c5d2 d003  }.."............
95
+000005e0: 4ce4 83b1 ba29 f0c9 d0d0 33b1 ba29 0f95  L....)....3..)..
96
+000005f0: 09c8 a5e2 f010 b505 290f 85e8 b1ba 29f0  ........).....).
97
+00000600: 1865 e84c f885 b1ba 9505 c8e0 a0f0 2fb1  .e.L........../.
98
+00000610: ba4a 4a4a 4a95 0cb1 ba29 0f95 0dc8 e0a0  .JJJJ....)......
99
+00000620: f01c b1ba c9f0 d016 2055 8720 6b87 b005  ........ U. k...
100
+00000630: a6ac 9d01 40a6 abb5 0809 8095 08c8 b1ba  ....@...........
101
+00000640: c9e8 f029 c9e9 f019 c9ea f010 29f0 c9e0  ...)........)...
102
+00000650: d025 b1ba 290f 950a c84c 7d84 a901 4c56  .%..)....L}...LV
103
+00000660: 86a9 024c 5686 2087 81c8 4c2e 86b5 0809  ...LV. ...L.....
104
+00000670: 1095 08c8 4cc2 8520 4387 88b1 ba29 0f85  ....L.. C....)..
105
+00000680: bcf0 0bb5 0918 7509 c6bc d0fa f002 b509  ......u.........
106
+00000690: 9500 b1ba 29f0 c9c0 f029 e0a0 f007 b500  ....)....)......
107
+000006a0: 1875 0c95 0bb5 05e0 a0f0 0295 0720 6b87  .u........... k.
108
+000006b0: b005 a6ac 9d00 40a6 acb1 ba4a 4a4a 4ac9  ......@....JJJJ.
109
+000006c0: 0cd0 13a9 00e0 08f0 02a9 3020 6b87 b005  ..........0 k...
110
+000006d0: a6ac 9d00 4060 a6ab 0aa8 b98a 8785 bcc8  ....@`..........
111
+000006e0: b98a 8785 bdb4 0a98 c904 f008 46bc 66bd  ............F.f.
112
+000006f0: c84c d786 e0a0 b00c b508 2910 f006 e6bd  .L........).....
113
+00000700: d002 e6bc a5bc 0908 85bc e0a0 f018 d501  ................
114
+00000710: d012 e0b0 f01e b507 2910 f00a b508 2980  ........).....).
115
+00000720: d004 f010 9501 a5bc 206b 87b0 07a6 ac9d  ........ k......
116
+00000730: 0340 a6ab a5bd e080 f007 e090 f008 4c38  .@............L8
117
+00000740: 8785 a74c 3887 85b8 206b 87b0 05a6 ac9d  ...L8... k......
118
+00000750: 0240 60c8 9818 65ba a6ab 9503 9006 a5bb  .@`...e.........
119
+00000760: 6900 9504 60c8 b1ba e080 f007 e090 f008  i...`...........
120
+00000770: 4c6a 8785 a14c 6a87 85b5 60a6 abe0 80d0  Lj...Lj...`.....
121
+00000780: 07a6 c2f0 114c 8287 a6ab e090 d008 a6d2  .....L..........
122
+00000790: f004 a6ab 3860 a6ab 1860 06ae 064e 05f4  ....8`...`...N..
123
+000007a0: 059e 054e 0501 04b9 0476 0436 03f9 03c0  ...N.....v.6....
124
+000007b0: 038a 0cdc 880c d188 0839 8950 1d89 142b  .........9.P...+
125
+000007c0: 890c cfb1 0c7e 8a0c ef8b 0c60 890c 6089  .....~.....`..`.
126
+000007d0: 40b6 b004 e7b0 0c75 890c a38b 0cca 8b50  @......u.......P
127
+000007e0: 608b 0c71 8b0c 15b1 0c9a b00c b589 0c82  `..q............
128
+000007f0: 8910 178b 1028 8a10 828b 1089 8a10 ae8a  .....(..........
129
+00000800: 10c7 8a10 ef8a 104d 8a50 d889 0cf9 8950  .......M.P.....P
130
+00000810: 32b4 0c72 b411 e688 10fb 8810 328b 1094  2..r........2...
131
+00000820: 8b08 719c 8080 9b04 ce9b 08f1 9b80 839c  ..q.............
132
+00000830: 0418 9d08 b59d 80d0 8d04 3a8e 08a2 8e80  ..........:.....
133
+00000840: 0fa1 04c1 9f08 bea2 80be aa04 1dab 0882  ................
134
+00000850: ab80 92a7 0495 a808 6ca9 80ac a304 78a4  ........l.....x.
135
+00000860: 0805 a580 caac 0453 ad08 97ae 8035 8c04  .......S.....5..
136
+00000870: 3e8c 0886 8c80 52af 04ab af08 e8af 80db  >.....R.........
137
+00000880: b104 74b2 0812 b380 2f8d 044a 8d08 6b8d  ..t...../..J..k.
138
+00000890: 8046 b104 60b1 087a b180 028c 0414 8c08  .F..`..z........
139
+000008a0: 278c 80a1 8c04 c38c 08e5 8c10 b688 c0b8  '...............
140
+000008b0: 8804 b888 08b8 880c b888 80b8 8804 b888  ................
141
+000008c0: 08b8 8800 b888 2582 00d5 008e 00a9 22b0  ......%.......".
142
+000008d0: e06a d06a b06a a06a 906a 706a 506a 406a  .j.j.j.j.jpjPj@j
143
+000008e0: ff23 3060 06f8 2006 f810 01ff 2130 8003  .#0`.. .....!0..
144
+000008f0: 3001 f810 01ff 21b0 b037 d036 f036 f036  0.....!..7.6.6.6
145
+00000900: f036 4036 0000 fe04 e688 ff27 b010 8b94  .6@6.......'....
146
+00000910: 9053 90d4 4053 40f3 d042 d0f3 5062 5a2e  .S..@S@..B..PbZ.
147
+00000920: b010 8494 3364 3334 33f8 1433 ff25 b0f0  ....3d343..3.%..
148
+00000930: 3390 2050 2030 20f8 1020 ff26 b0f0 3290  3. P 0 .. .&..2.
149
+00000940: 1f50 1f30 1ff8 101f ff21 f000 7600 2300  .P.0.....!..v.#.
150
+00000950: 4700 2300 4700 2300 2800 7800 7000 6800  G.#.G.#.(.x.p.h.
151
+00000960: 6000 5800 5000 4800 4000 3300 2200 11ff  `.X.P.H.@.3."...
152
+00000970: 2130 4001 7003 b005 e007 2230 4008 f006  !0@.p....."0@...
153
+00000980: 3004 f002 ff22 30f0 0d21 3000 0022 30f0  0...."0..!0.."0.
154
+00000990: 0aff 2400 000a 2430 f308 2130 0000 2630  ..$...$0..!0..&0
155
+000009a0: a006 2130 0000 2530 8004 2130 0000 2430  ..!0..%0..!0..$0
156
+000009b0: 5003 2130 0000 2330 f810 0221 3000 0022  P.!0..#0...!0.."
157
+000009c0: 30f8 1001 ff25 2200 0d21 2f00 0e00 0d00  0....%"..!/.....
158
+000009d0: 0c00 0b00 0a00 0900 0800 0700 0600 0500  ................
159
+000009e0: 0400 0300 0200 01ff 23b0 1088 f015 f010  ........#.......
160
+000009f0: f02a f020 22b0 0000 23b0 e010 e00a e025  .*. "...#......%
161
+00000a00: e01a 0000 b015 b010 ff23 30f0 04f0 04f0  .........#0.....
162
+00000a10: 0400 00f0 04e0 0de0 0fe0 0ee0 0fe0 0db0  ................
163
+00000a20: 0fb0 0eb0 0ff0 0ef0 0ef0 0ff0 0ef0 0ff0  ................
164
+00000a30: 0df0 0ff0 0ef0 0dff 2430 108b f098 e043  ........$0.....C
165
+00000a40: d0ad c0ee b0bc a054 90b4 80a7 703f 6067  .......T....p?`g
166
+00000a50: 50aa 4099 306f f820 93f8 1077 ff21 7010  P.@.0o. ...w.!p.
167
+00000a60: 8af3 cca3 55d3 cc83 55b3 cc53 5523 b010  ....U...U..SU#..
168
+00000a70: 82d1 66c1 99b1 66a1 9991 6681 9971 6661  ..f...f...f..qfa
169
+00000a80: 9951 6641 9931 66f8 2199 f811 66ff 2230  .QfA.1f.!...f."0
170
+00000a90: 400f 800a d001 a00f ff25 5010 8c91 33e1  @........%P...3.
171
+00000aa0: 2be1 33f1 22b1 2b71 07a1 2b91 3381 0761  +.3.".+q..+.3..a
172
+00000ab0: 0751 0741 3331 07f8 2107 f810 07ff 21b0  .Q.A31..!.....!.
173
+00000ac0: 807f 2170 307f 21b0 607f 2fb0 0000 0000  ..!p0.!.`./.....
174
+00000ad0: 0000 fe03 ae8a ff23 b010 89f8 1066 4066  .......#.....f@f
175