home *** CD-ROM | disk | FTP | other *** search
/ Media Share 9 / MEDIASHARE_09.ISO / utility / dint_sw1.zip / DINT.DOC next >
Text File  |  1993-07-13  |  32KB  |  564 lines

  1.  
  2.          ╔═══════════════════════════════════════╗
  3.          ║       DOS INterrupt Toolkit           ║
  4.          ║       (c) 1992, 1993  Zen Works       ║
  5.          ╚═══════════════════════════════════════╝
  6.  
  7.  
  8. A long while ago, I realized that my aging brain could not possibly
  9. retain all the DOS Interrupt 21h sub-function information that I
  10. needed from time to time.
  11.  
  12. While I have a reasonably decent programmer's library, at least as
  13. far as assembly language is concerned (never mind the wisecracks -
  14. everything around here is done Quick-and-Dirty and I happen to LOVE
  15. pasta, particularly spaghetti!), but the needed data is spread over 
  16. a variety of printed volumes as well as binary files such as Ralf 
  17. Brown's excellent Interrupt List, various virus disassemblies, and 
  18. the collected Virus-L Digests.
  19.  
  20. I needed one single reference that would provide the necessary
  21. information to use and/or translate all of the Interrupt 21h
  22. sub-functions, particularly those that are rarely used in the course
  23. of my normal programming and virus disassembly.
  24.  
  25. About a year ago, I put everything on hold and went through every
  26. bit of source material at my disposal, accumulating a collection of
  27. the essential reference material on the INT 21h sub-functions.
  28.  
  29. Since there are definite limits to the amount of time available for
  30. such a project, all INT 21h sub-functions utilized by Novell, and
  31. any other network, were omitted.  Sorry, folks, maybe one of these
  32. days, if there happens to be enough demand, but not now.
  33.  
  34. The result of my data collecting was DINT - a [D]os [IN]terrupt 21h
  35. [T]oolkit, although I'm not certain whether the name `DINT' was
  36. originally inspired by "what does that [D]amn [INT]errupt do?" or
  37. by the "[DINT]y Moore" brand of Irish stew, given that DINT is also
  38. a collection of odd ingredients from strange sources... <grin>
  39.  
  40. DINT exists in two parts, and is simple to use (remember, I wrote
  41. it for my own use...  ,-> )  Type "dint" and press <Enter>.  Barring 
  42. a power failure or a lightning strike, you'll be presented with a 
  43. screen (Surprise!  You were expecting pizza, maybe?):-
  44.   
  45.                                                                      
  46. ╔══════════════════════════════════════════════════════════════════════════╗ 
  47.  
  48.                                                                      
  49.               ╔═══════════════════════════════════════════════════╗  
  50.               ║       DOS INterrupt Toolkit  -  v.n.nn            ║  
  51.               ║       (c) 1992, 1993  Zen Works                   ║  
  52.               ╚═══════════════════════════════════════════════════╝  
  53.                                                                      
  54.                  Quick reference for INT 21h sub-function calls.     
  55.                                                                      
  56.                  [If registered copy, your name appears here]        
  57.                                                                      
  58.                                                                      
  59.                                                                      
  60.                                                                      
  61.                                                                      
  62. Display an INT 21h sub-function   [D]                                
  63. Scroll Virus Installation Checks  [V]                                
  64. Test an INT 21h function          [T]                                
  65. Quit program                      [Q]                                
  66.  
  67. ╚══════════════════════════════════════════════════════════════════════════╝
  68.  
  69. where v.n.nn is the current version number.
  70.  
  71. Selecting the `D' option (yeah, you press `d' or `D' - DINT is dumb and
  72. DINT don't care...) clears the screen and presents a single line:-
  73.  
  74. ╔══════════════════════════════════════════════════════════════════════════╗ 
  75.                                                                      
  76.                                                                      
  77.                                                                      
  78.                                                                      
  79. Enter sub-function in 4-digit hex mode:                              
  80.                                                                      
  81.                                                                      
  82.                                                                      
  83.                                                                      
  84.                                                                      
  85. ╚══════════════════════════════════════════════════════════════════════════╝
  86.                                                                      
  87.                                                                      
  88. which means just what it says.  If hexadecimal is a stranger to you,
  89. what are you doing here?
  90.  
  91. For instance, if you want to see what the program termination function,
  92. 4C00h needs for calling parameters, enter `4C00'.  And here, a small
  93. note of apology is in order.
  94.  
  95. I set DINT up to accept a 4-character hex input with the idea that one
  96. of these days I might enhance the program to allow the user to input
  97. sub-function requests down to the AL level, for example, 5801 - Set
  98. memory allocation strategy.  You will discover, if you try it, that I
  99. never did hone DINT down that fine, and it will default to AL being
  100. equal to 00.  Put up with it.  Suffering builds character.
  101.  
  102. So assume we enter 7400:- 
  103. ╔══════════════════════════════════════════════════════════════════════════╗ 
  104.                                                                      
  105.                                                                      
  106. Enter sub-function in 4-digit hex mode:  7400                        
  107.                                                                      
  108.  
  109. ╚══════════════════════════════════════════════════════════════════════════╝
  110.                                                                      
  111.                                                                      
  112. DINT will display the available information on that sub-function call:- 
  113.                                                                      
  114. ╔══════════════════════════════════════════════════════════════════════════╗ 
  115.                                                                      
  116.                                                                      
  117. INT 21h Function 74h - Undocumented                                  
  118.                                                                      
  119.                                                                      
  120.                                                                      
  121.                                                                      
  122.                                                                      
  123.                                                                      
  124.                                                                      
  125.                                                                      
  126.                                                                      
  127.                                                                      
  128.                                                                      
  129. Display an INT 21h sub-function   [D]                                
  130. Scroll Virus Installation Checks  [V]                                
  131. Test an INT 21h function          [T]                                
  132. Quit program                      [Q]                                
  133.                                                                      
  134. ╚══════════════════════════════════════════════════════════════════════════╝
  135.                                                                      
  136.                                                                      
  137. Surprise!  In spite of the work of Ralf Brown and others, there are 
  138. still many functions whose purpose is unknown.  Microsoft may know
  139. what some of these do, but Microsoft wasn't a major contributor to
  140. this product.
  141.  
  142. And of course, DINT, being well behaved, returns the menu for your
  143. further selection.
  144.  
  145. Repeating the `D' option, and this time choosing sub-function
  146. 4B00h produces a bit more information:-
  147.  
  148. ╔══════════════════════════════════════════════════════════════════════════╗ 
  149.                                                                      
  150. INT 21h Function 4Bh - "EXEC" - LOAD AND/OR EXECUTE PROGRAM          
  151.     Call with AL = 00h "Load and Execute Program"                    
  152.                    03h "Load Overlay:"                               
  153.               ES:BX = seg:offset of parameter block                  
  154.               DS:DX = seg:offset of program specifications           
  155.     Returns:  AX = error code if CF set                              
  156.                                                                      
  157. INT 21h Function 4B04h  VIRUS - "MG", "699"/"Thirteen Minutes"       
  158.                               - INSTALLATION CHECK                   
  159.     Returns:  CF clear if MG resident                                
  160.               AX = 044Bh if 699/Thirteen Minutes resident            
  161.                                                                      
  162. INT 21h Function 4B05h - DOS 5.0 - SET EXECUTION STATE               
  163.     Call with DS:DX -> execution state structure                     
  164.     Returns:  AX = 0000h                                             
  165.               AX = error code if CF set                              
  166.                                                                      
  167.                                                                      
  168. Function has more screens.  Display them? [Y/N]                      
  169.  
  170. ╚══════════════════════════════════════════════════════════════════════════╝
  171.                                                                      
  172. Pressing a `Y' or `y' will hopefully produce Yet Another Screen of
  173. invaluable data for your perusal:-                                   
  174.                                                                      
  175. ╔══════════════════════════════════════════════════════════════════════════╗ 
  176.                                                                      
  177.                                                                      
  178. INT 21h Function 4B25h  VIRUS - "1063"/"Mono" - INSTALLATION CHECK   
  179.     Returns:  DI = 1234h if resident                                 
  180.                                                                      
  181. INT 21h Function 4B40h  VIRUS - "Plastique"/"AntiCad"                
  182.                               - INSTALLATION CHECK                   
  183.     Returns:  AX = 5678h if resident                                 
  184.                                                                      
  185. INT 21h Function 4B41h  VIRUS - "Plastique"/"AntiCad" - UNKNOWN      
  186.     Call with AL = 41h                                               
  187.     Returns:  ???                                                    
  188.                                                                      
  189. INT 21h Function 4B4Ah  VIRUS - "Jabberwocky" - INSTALLATION CHECK   
  190.     Returns:  AL = 57h if resident                                   
  191.                                                                      
  192. INT 21h Function 4B4Bh  VIRUS - "Horse-2" - INSTALLATION CHECK       
  193.     Call with AL = 4Bh                                               
  194.     Returns:  CF clear if resident                                   
  195.                                                                      
  196. Function has more screens.  Display them? [Y/N]                      
  197.  
  198. ╚══════════════════════════════════════════════════════════════════════════╝
  199.  
  200.  
  201. Any function that has more than a single screen of information
  202. available will display the "Function has more screens" line,
  203. leaving it up to you whether they are to be displayed or not.
  204.  
  205. Time for one other little quirk.  At the risk of sounding like
  206. an echo in the Alps, DINT insists on a 4-character input.  So,
  207. if you want to see the accumulated wisdom concerning sub-function
  208. 0F, `Open File', you must enter 0F00.
  209.  
  210. On the other hand, particularly for programmer types who know that
  211. hexadecimal numbers must be input in odd ways, FORGET IT.  Here,
  212. for example, if you want to explore sub-function FF, you merely
  213. enter `FF00'.  FOUR characters only;  got it?
  214.  
  215.                                                                              
  216. DINT includes references to INT 21h sub-functions used by assorted
  217. DOS viruses.  Staale Fagerland suggested that it would be quite
  218. convenient if one were able to scroll through those selected
  219. sub-functions.  Since I've wished for the same feature many times
  220. since DINT was originally written, I'm more than happy to comply
  221. with his request.
  222.  
  223. Staale, this is for you:-
  224.  
  225. Select [V] from the menu, and you get:-
  226.  
  227. ╔══════════════════════════════════════════════════════════════════════════╗ 
  228.  
  229. INT 21h Function 0B56h  VIRUS - "Perfume" - Installation Check       
  230.     Returns:  AX = 4952h if resident                                 
  231.                                                                      
  232. INT 21h Function 0D20h  VIRUS - "Crazy Imp" - Installation Check             
  233.     Returns:  AX = 1971h if resident                                         
  234.                                                                              
  235. INT 21h Function 30h  VIRUS - "Possessed" - Installation Check               
  236.     Call with DX = ABCDh                                                     
  237.     Returns:  DX = DCBAh if installed                                        
  238.                                                                              
  239. INT 21h Function 30F1h  VIRUS - "Dutch-555"/"Quit 1992" - Installation Check 
  240.     Returns:  AL = 00h if resident                                           
  241.                                                                              
  242.                                                                              
  243.                                                                              
  244. Function has more screens.  Display them? [Y/N]                              
  245.  
  246. ╚══════════════════════════════════════════════════════════════════════════╝
  247.  
  248. so you can at least scroll forward through the collected information
  249. pertaining to DOS computer viruses.  Backward scrolling is NOT
  250. available.  Don't ask.  Forget it.  Unless I get absolutely overwhelmed
  251. with registrations and multiple requests for a backward scroll feature,
  252. both of which are highly unlikely.
  253.  
  254.  
  255. The [T] option, wherein the user can `test' an INT 21h sub-function is
  256. only available in the registered version, and I'm not at all certain
  257. it's a good idea, even then.
  258.  
  259.  
  260.  
  261.       WARNING!!!     WARNING!!!     WARNING!!!     WARNING!!!
  262.       ~~~~~~~~~~     ~~~~~~~~~~     ~~~~~~~~~~     ~~~~~~~~~~
  263.     
  264. Use it entirely at your own risk.  Neither I nor Zen Works will accept
  265. ANY responsibility for anything you manage to do to yourself, your
  266. computer, some one else's computer, your neighbour's lawn, pet dog,
  267. pet iguana, pet wife, antique auto, house plants, or innocent
  268. bystanders.  If you choose to use this feature, you are absolutely on
  269. your own.  We refuse to even send flowers.
  270.                                                                              
  271. After all that, if you do select the [T] option, you'll be presented
  272. with a further warning screen:
  273.  
  274. ╔══════════════════════════════════════════════════════════════════════════╗ 
  275.                                                                              
  276.                                                                              
  277.                   WARNING!!  Selected functions are executed!                
  278.                                                                              
  279.                                                                              
  280.                This is NOT a simulation.  Use at your own risk!              
  281.                                                                              
  282.                                                                              
  283.                                                                              
  284.                                                                              
  285.                                                                              
  286.                                                                              
  287.                                                                              
  288. [C]ontinue or [A]bort:                                                       
  289.  
  290.                                                                              
  291. ╚══════════════════════════════════════════════════════════════════════════╝
  292.  
  293. Means just what it says.  The sub-function you plug in here WILL be
  294. executed on your machine.  You can create or delete a directory, a
  295. file, or do anything of which the various sub-functions of DOS 
  296. Interrupt 21h are capable. 
  297.  
  298. Entering an `A' (yes, evan an `a') will get you back to the menu.
  299. Press `C' and there's no turning back.  Well, there are a couple of
  300. ways.... which is why God gave us the Reset button and the 3-finger
  301. salute....
  302.  
  303. The next screen to appear:-
  304.                                                                              
  305. ╔══════════════════════════════════════════════════════════════════════════╗ 
  306.                                                                              
  307.                                                                              
  308.                                                                              
  309.                                                                              
  310.     Enter Function number (hex) in AX                                        
  311.     Preloading other registers is optional - default values                  
  312.     are 0000h with Carry Flag clear                                          
  313.                                                                              
  314. Enter Function (4-digit hex mode) :                                          
  315.                                                                              
  316.                                                                              
  317.                                                                              
  318.                                                                              
  319.  
  320. ╚══════════════════════════════════════════════════════════════════════════╝
  321.                                                                              
  322. Again, the program wants input in four hexadecimal characters,
  323. but here you can make use of the AL register by entering values
  324. other than 0 as the last two hex characters.
  325.  
  326. At this point, there is one more way to get out.  Enter 4C00, the
  327. DOS Interrupt 21h "Terminate" function, and you're back to the
  328. DOS prompt.
  329.                                                                              
  330. Let us assume you want to see what, if anything, the undocumented
  331. sub-function 9A00h actually does return:-
  332.  
  333.                                                                              
  334. Enter Function (4-digit hex mode) : 9a00                                     
  335.                                                                              
  336.                                                                              
  337. DINT will then give you the option of preloading any value you like
  338. in the other registers (all but CS, of course!).
  339.  
  340. ╔══════════════════════════════════════════════════════════════════════════╗ 
  341.                                                                              
  342.     Enter Function number (hex) in AX                                        
  343.     Preloading other registers is optional - default values                  
  344.     are 0000h with Carry Flag clear                                          
  345.                                                                              
  346. Enter Function (4-digit hex mode) : 9a00                                     
  347.                                                                              
  348. Preload any other registers? [Y/N]:                                          
  349.                                                                              
  350.  
  351.  
  352.  
  353. ╚══════════════════════════════════════════════════════════════════════════╝
  354.  
  355. Press `N' at this point and DINT will execute an INT 21h, sub-function
  356. 9Ah, with the AX, BX, CX, and DX registers set to zero and the Carry
  357. Flag clear.
  358.  
  359.                                                                              
  360. Press `Y' and DINT will cycle through the registers, giving you the
  361. opportunity to load any hex value you like into each of them:-
  362.  
  363. ╔══════════════════════════════════════════════════════════════════════════╗ 
  364.                                                                              
  365.                                                                              
  366.     Enter Function number (hex) in AX                                        
  367.     Preloading other registers is optional - default values                  
  368.     are 0000h with Carry Flag clear                                          
  369.                                                                              
  370. Enter Function (4-digit hex mode) : 9a00                                     
  371.                                                                              
  372. Preload any other registers? [Y/N]:y                                         
  373.                                                                              
  374. Preload BX register?  [Y/N] :                                                
  375.                                                                              
  376.  
  377. ╚══════════════════════════════════════════════════════════════════════════╝
  378.                                                                              
  379. If you choose to load a value in a particular register, press `Y'
  380. and you will then be prompted for the value:-
  381.                                                                              
  382. ╔══════════════════════════════════════════════════════════════════════════╗ 
  383.                                                                              
  384.     Enter Function number (hex) in AX                                        
  385.     Preloading other registers is optional - default values                  
  386.     are 0000h with Carry Flag clear                                          
  387.                                                                              
  388. Enter Function (4-digit hex mode) : 9a00                                     
  389.                                                                              
  390. Preload any other registers? [Y/N]:y                                         
  391.                                                                              
  392. Preload BX register?  [Y/N] : y   Enter hex value:                           
  393.  
  394.  
  395.                                                                              
  396. ╚══════════════════════════════════════════════════════════════════════════╝
  397.                                                                              
  398.                                                                              
  399. If you attempt to preload the CS register, you will get a short
  400. message telling you that sins of that magnitude are not allowed
  401. in polite society.  ;-)
  402.                                                                              
  403.                                                                              
  404. ╔══════════════════════════════════════════════════════════════════════════╗ 
  405.  
  406.                                                                              
  407.     Enter Function number (hex) in AX                                        
  408.     Preloading other registers is optional - default values                  
  409.     are 0000h with Carry Flag clear                                          
  410.                                                                              
  411. Enter Function (4-digit hex mode) : 9a00                                     
  412.                                                                              
  413. Preload any other registers? [Y/N]:y                                         
  414.                                                                              
  415. Preload CS register?  [Y/N] : y   Enter hex value: 0010                      
  416. Set Carry Flag?       [Y/N] :                                                
  417. Sorry, CS manipulation will hang your system!                                
  418.                                                                              
  419.  
  420.                                                                              
  421. ╚══════════════════════════════════════════════════════════════════════════╝
  422.  
  423. Note that subsequent Preload queries all utilize the same line,
  424. overwriting the previously displayed line.  Pay attention!
  425.                                                                              
  426. And finally, you can choose whether to set the Carry flag or not.
  427.  
  428. Immediately that your choice of the carry flag setting is entered,
  429. DINT will execute the requested INT 21h sub-function.  If your
  430. selection wasn't entirely bizarre, and your system didn't hang as
  431. a result, you should get a response screen:-
  432.                                                                              
  433.                                                                              
  434. ╔══════════════════════════════════════════════════════════════════════════╗ 
  435.                                                                              
  436.                                                                              
  437.     Enter Function number (hex) in AX                                        
  438.     Preloading other registers is optional - default values                  
  439.     are 0000h with Carry Flag clear                                          
  440.                                                                              
  441. Enter Function (4-digit hex mode) : 9a00                                     
  442.                                                                              
  443. Preload any other registers? [Y/N]:y                                         
  444.                                                                              
  445. Preload CS register?  [Y/N] : y   Enter hex value: 0010                      
  446. Set Carry Flag?       [Y/N] : n                                              
  447.                                                                              
  448.     AX is now 9A00 hex                  BP is now   0000 hex                 
  449.     BX is now 0010 hex                  CS is still 3D14 hex                 
  450.     CX is now 0000 hex                  DS is now   3D14 hex                 
  451.     DX is now 0000 hex                  ES is now   27C4 hex                 
  452.     SI is now 0000 hex                  SS is now   27D4 hex                 
  453.     DI is now 0000 hex                                                       
  454.                                                                              
  455.     Carry Flag is clear.                                                     
  456.                                                                              
  457.     Test again?  [Y/N]                                                       
  458.                                                                              
  459. ╚══════════════════════════════════════════════════════════════════════════╝
  460.  
  461.  
  462. There, wasn't that totally enlightening?  The value preloaded in
  463. BX didn't change, the carry flag is still clear, and the values
  464. of the CS, DS, ES and SS registers are simply the values that
  465. DINT happens to be currently using.
  466.  
  467. A real Zen experience, huh?
  468.  
  469. Since the distribution copy of DINT is a compilation, amalgamation,
  470. and accumulation of information from a wide variety of sources, some
  471. copyrighted and some not, I can't ask for money.  Use it as you will,
  472. distribute it as you wish.  Call my BBS and bitch, gripe, moan in
  473. ecstasy, writhe, grovel, or leave comments.  Love to hear them.
  474.  
  475. If you're overburdened with the world's riches, donations are always
  476. welcome.  How welcome?  Well, I wrote DINT on an XT-class machine, 
  477. and the BBS runs on a 12MHz 80286, if that gives you the picture...
  478.  
  479. However, the Test feature is only available in a registered version,
  480. and for that I expect to be paid.  $20.00 gets you a 3.5" diskette
  481. sent via ordinary mail anywhere.  Of that fee, $2.00 cover the code
  482. and the balance is a meagre payment for writing the doc file.  The
  483. family philosophy (yes, there's more of us!) is that it's enough for
  484. a programmer to write and debug the code;  users shouldn't expect
  485. documentation.  But they do.  $25.00 buys the same diskette via
  486. registered mail.  The additional $5.00 also covers the aggravation
  487. of my having to be awake in the daytime to go to the post office.
  488.  
  489. If you're bordering on the suicidal and have a compelling desire to
  490. spend your hard earned money just to be able to do arcane and absurd
  491. things to your system, make cheques (Yes, I'll accept personal
  492. cheques - I've been stiffed for greater sums than twenty bucks and
  493. managed to survive), money orders, cashier's cheques, or bank
  494. drafts payable to R. W. Hale (that being the way I sign my name,
  495. simply because it's shorter and quicker), and mail it, along with
  496. your name spelled the way you want it to appear on the opening
  497. screen, and your complete mailing address.
  498.  
  499. Mail to me at:-
  500.  
  501.         R. Wallace Hale
  502.         P. O. Box 528
  503.         Houlton, Maine
  504.         04730-0528
  505.         U.S.A.
  506.         
  507. Messages to me on Driftnet (my BBS) telling me "the cheque is in
  508. the mail" will be ignored.  At least until the mail is delivered.
  509.  
  510.  
  511. If any Canadian has read this far, and still has money left after
  512. taxes, the price is the same in Canadian dollars.  But if you do
  513. send Canadian money, you'd better have a Canadian mailing address!
  514. <grin>
  515.  
  516. To answer a few questions that some one, somewhere, may be asking:-
  517.  
  518. NO!  I don not plan to create a TSR version.
  519.  
  520. No, I'm not aware of any conflicts between DINT and any TSRs, but
  521. I don't use many TSRs, so I don't speak from any position of great
  522. authority.
  523.  
  524. Upgrades?  Possibly, depends on my life span and what new data 
  525. becomes available.  
  526.  
  527. Will upgrades be free to registered users?  I doubt it.  If enough
  528. additional data becomes available to justify updating DINT, and if
  529. more than two people have registered the program, I probably won't
  530. be able to afford the distribution costs.  However, I will keep
  531. the cost of updates to the absolute minimum.
  532.  
  533. Bug fixes?  Serious ones will be fixed on my nickel, but you may
  534. have to call Driftnet to get the patched version.  Minor ones?
  535. Depends on my workload.
  536.  
  537. Windows compatability?  I sincerely hope not!
  538.  
  539. An OS/2 version?  Why would you want it?
  540.  
  541. Network compatibility?  Perhaps by accident, but not by design.
  542.  
  543.  
  544. - R. Wallace Hale
  545.  
  546.   13 July 1993
  547.  
  548.   
  549.   
  550.   
  551. ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  552. █ ╔═══════════════════╦═════════════════════════════════════════════════╗ █
  553. █ ║   Driftnet  BBS   ║   Free access at all levels.                    ║ █
  554. █ ║ Woodstock,  N. B. ║   Download on first call, no ratios.            ║ █
  555. █ ║  (506) 325-9002   ║   Extensive collection of the latest virus      ║ █
  556. █ ║  Intel 14.4 v32   ║   information and anti-viral tools.             ║ █
  557. █ ║     24 hours      ║   The virus research section is absolutely      ║ █
  558. █ ║   Wallace Hale    ║   restricted to recognized members of the       ║ █
  559. █ ║      Sysop        ║   AV community.                                 ║ █
  560. █ ╠═══════════════════╩═════════════════════════════════════════════════╣ █
  561. █ ║                           -= Zen Works =-                           ║ █
  562. █ ╚═════════════════════════════════════════════════════════════════════╝ █
  563. ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
  564.