home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Shareware 1 2 the Maxx
/
sw_1.zip
/
sw_1
/
DISK_UTL
/
SM200.ZIP
/
SM.DOC
< prev
Wrap
Text File
|
1992-01-13
|
27KB
|
581 lines
Space Map
Disk Space Mapping Program
Version 2.0
Ben Smith
110 S. Gardenia
Celeste, TX 75423
SCENARIO 1: You're a network administrator. One morning, to your
horror, you discover that one of your users has eaten all but 500K of
the space on the system volume! Quick, which user is the culprit?
SCENARIO 2: You're installing that new Windows application that takes
only about fifteen meg of disk. You have six. Quick, which directory
can you zap and free up enough space?
SCENARIO 3: You're about to do a backup, and would like list of
EVERY file on your disk to compare to your backup copy should the
worst happen. Quick, how do you get it?
With SPACE MAP, it's easy! Space Map is the utility you need to
answer simple questions like:
How big is that application, with all its directories?
What can I clean off my disk to free up space?
Hey! Where'd all my disk go?!
BUT WHY? Because no utility I use could do this! I own Lotus
Magellan, PC Tools 7.1 and several other general purpose utility
packages...NONE of them could tell me how much space was in use in a
single directory and all of its child directories! Even the several
dozen shareware offerings couldn't do this simple chore (although I'd
be happy to hear from anyone who knows of a product that does this).
DISTRIBUTION: Space Map is being distributed as freeware. You are
free to use Space Map on as many computers as you like, for as long as
you like. You may give copies away to friends, customers, business
associates, or anyone else. If you are a shareware distributor, you
may include Space Map in your collection, so long as your disks sell
for less than $5.00 each, and you make it clear to your customers
that they are buying the physical diskette, and that the program
itself is free.
You may not, however, sell the Space Map program itself. The program,
this document file, and any other files which may be distributed in
the Space Map archive file are copyrighted material (c) 1991 Ben
Smith. Permission to copy is granted so long as the above conditions
are met.
DISCLAIMER: While I have taken every reasonable precaution to ensure
that Space Map is safe and effective when used as directed, because of
the diversity of software and hardware in common use I cannot be
responsible for any actual or consequential damages caused by this
program to your computer or the data stored in it. You use this
program strictly at your own risk. By running the program, you
indicate your assent to this limitation of liability.
DIFFERENCES - Version 1.0 to Version 2.0
* The visual display has been cleaned up significantly. The display
now shows information in columns with an attractive double line
border.
* Added sorting - Sort each directory level by file/directory name,
size, or time and date.
* You can now include file/directory size, date, time, number of
files/directories, and attribute information in the display.
* If you have ANSI.SYS loaded, you can have the display presented in a
"green bar" format.
* You can have the program pause after each screenfull.
WHAT'S IN THE ARCHIVE?
The archive (or disk, if you obtained the program from a shareware
distributor) contains the following files:
SM.COM The Space Map program
SM.DOC The documentation file you're reading now
READ.ME Last minute notes, release updates
HOW TO USE IT: Copy the SM.COM file to some directory on your PATH
(if you're not sure what a PATH is, ask someone). On my computer, I
have a UTIL directory that includes all of my one-program utilities
(like LIST and PKZIP). The syntax of the command to invoke Space Map
is:
SM [pathname] [options]
All parameters to the SM command are optional. When the program is
invoked, it will always descend through EVERY subdirectory under
[pathname]. As it goes, it will add up the sizes of all of the files
it finds. As it backs out of each directory, it can display the total
of the sizes of all files in the directories it's found along the way.
These parameters are used to tell Space Map how to display the
results:
* /Dnn - Display nn levels of directory depth
Use this option to limit the amount of information displayed by
Space Map. SM can generate a tremendous amount of information, most
of it inconsequential. By using this option only those directories
(and files, if specified) no more than nn levels above the base
directory path specified will be displayed (although all directories
will still be scanned). /D1 means that only those files and
directories immediately below the specified path will be displayed;
/D0 means to print only one summary line and no detail lines.
* /I[s|l|a|t|d|f|n] - Include information
Use the /I option to tell Space Map what information you want
displayed about each file or directory which is displayed. The
parameter characters have the following meaning:
s - Display the DOS size of the file, or of the total files in each
directory.
l - Display the amount of storage allocated to the file, or to all
of the files in a directory.
a - Show the attributes (hidden, system, read-only, and archive)
associated with a file or a directory.
t - Display the last modification time of the file or directory.
d - Display the last modification date of the file or directory.
f - Display the number of files contained in the directory.
n - Display the number of subdirectories contained in the directory.
* /X[s|l|a|t|d|f|n] - Exclude information
This is the opposite side of the /I option. It causes Space Map to
exclude the specified information column from the display.
* /F - Display files as well as subdirectories.
Space map normally just summarizes the totals in each subdirectory
it encounters. /F causes Space Map to display every file it
encounters.
* /S[+|-] [s|a|d|n] - Sort display
Sorts the display in ascending or descending order on the specified
key. Note that each subdirectory level is seperately sorted; no
sort option can override the basic order imposed by the tree
structure imposed by DOS. You can sort on any of the following
keys:
s - DOS File size, or the total DOS size of all files in all
subdirectories.
a - Allocated file size, or the total allocated space given to all
files in all subdirectories.
d - Creation/last modification time and date.
n - File or subdirectory name
You can control the sort order by specifying '+' to sort in
ascending order (the default), or '-' to sort in descending order.
* /C[+|-] - Control ANSI color display
Normally, Space Map displays its information in a monochrome format,
suitable for redirection to a disk file or printer. Enabling this
switch (using /C+) causes Space Map to change the background color
of each group of three lines, causing a "green bar paper" effect on
the screen. ANSI.SYS must be loaded for this function to operate
properly, and if the output is redirected, the ANSI escape functions
will be sent to the redirected device.
The same information can be obtained by typing SM/H or SM/?. You will
then see the following summary screen:
╔══════════════════════════════════════════════════════════════╗
║ Space Map Version 2.0 ║
║ Copyright (c) 1991,1992 Ben Smith ║
║ ║
║ Usage: SM [directory-spec] [options] ║
║ Valid options: ║
║ /F - display (F)iles in each directory ║
║ /I[s|l|a|t|d|f|n] - (I)nclude file information: ║
║ s - file (S)ize ║
║ l - a(L)located size ║
║ a - (A)ttributes ║
║ t - creation/modification (T)ime ║
║ d - creation/modification (D)ate ║
║ f - count of (F)iles ║
║ n - cou(N)t of directories ║
║ /X[s|l|a|t|d|f|n] - e(X)clude file information ║
║ /Ss|a|d|n[+|-] - Sort report: ║
║ s - sort on accumulated file (S)ize ║
║ a - sort on accumulated (A)llocation ║
║ d - sort on creation/modification (D)ate/time ║
║ n - sort on file (N)ame ║
║ + - Perform ascending sort ║
║ - - Perform descending sort ║
║ /C[+|-] - Enable/disable ANSI color display ║
║ /Dnn - Display only nn levels of directory depth ║
║ /P - Pause for key after each display page ║
║ /? or /H - Display this help text ║
╚══════════════════════════════════════════════════════════════╝
USING THE OPTIONS: SM, run without options, will provide a display
which resembles this:
Space Map 2.0 Copyright (c) 1991,1992 Ben Smith
╔══════════════════════╤═══════════╤═══════════╗
║ Tree │ Size │ Alloc ║
╟──────────────────────┼───────────┼───────────╢
║ C:\TEMP │ 380,939 │ 454,656 ║
║ ├─OVERVIEW │ 767,171 │ 774,144 ║
║ │ ├─EMPTY │ 0 │ 0 ║
║ │ ├─NONEMPTY │ 63,275 │ 65,536 ║
║ ├─OVERVIEW │ 830,446 │ 839,680 ║
║ ├─EMPTY │ 0 │ 0 ║
║ │ ├─NOTRLY │ 0 │ 0 ║
║ ├─EMPTY │ 0 │ 0 ║
║ ├─ARCHIVE │ 26,599 │ 28,672 ║
║ ├─NEW │ 1,353 │ 4,096 ║
║ C:\TEMP │ 1,239,337 │ 1,327,104 ║
╚══════════════════════╧═══════════╧═══════════╝
The top line of the tree display gives the complete pathname of the
subdirectory being mapped. The columns "Size" and "Alloc" show the
actual DOS-reported size and the space which DOS allocates to the files,
respectively. For information on the difference between DOS-reported
size and allocated size, see Technical Information, below.
The next row (pertaining to the OVERVIEW subdirectory) shows the storage
belonging to the files immediately within the OVERVIEW directory. Note
that after the next two directories (the EMPTY and the NONEMPTY
directories), OVERVIEW appears again -- this time, reporting the
cumulative total of the sizes of ALL files in all child directories.
INCLUDING/EXCLUDING INFORMATION:
You can, if you wish, include additional information about the
directories you display. For instance, you could include directory
creation time and date in the above display by typing SM/IDT:
Space Map 2.0 Copyright (c) 1991,1992 Ben Smith
╔══════════════════════╤═══════════╤═══════════╤══════════╤══════════╗
║ Tree │ Size │ Alloc │ Date │ Time ║
╟──────────────────────┼───────────┼───────────┼──────────┼──────────╢
║ C:\TEMP │ 381,740 │ 458,752 │ 91/12/16 │ 16:02:06 ║
║ ├─OVERVIEW │ 767,171 │ 774,144 │ 91/12/18 │ 13:58:42 ║
║ │ ├─EMPTY │ 0 │ 0 │ 91/12/18 │ 17:43:50 ║
║ │ ├─NONEMPTY │ 63,275 │ 65,536 │ 91/12/19 │ 13:10:00 ║
║ ├─OVERVIEW │ 830,446 │ 839,680 │ 91/12/18 │ 13:58:42 ║
║ ├─EMPTY │ 0 │ 0 │ 91/12/18 │ 17:43:28 ║
║ │ ├─NOTRLY │ 0 │ 0 │ 91/12/19 │ 15:45:52 ║
║ ├─EMPTY │ 0 │ 0 │ 91/12/18 │ 17:43:28 ║
║ ├─ARCHIVE │ 26,599 │ 28,672 │ 91/12/27 │ 10:05:00 ║
║ ├─NEW │ 1,353 │ 4,096 │ 92/01/09 │ 15:12:38 ║
║ C:\TEMP │ 1,240,138 │ 1,331,200 │ 91/12/16 │ 16:02:06 ║
╚══════════════════════╧═══════════╧═══════════╧══════════╧══════════╝
On the other hand, if you don't need the allocated size portion of the
display, you can type SM/XL (meaning Space Map/eXclude aLlocated):
Space Map 2.0 Copyright (c) 1991,1992 Ben Smith
╔══════════════════════╤═══════════╗
║ Tree │ Size ║
╟──────────────────────┼───────────╢
║ C:\TEMP │ 385,262 ║
║ ├─OVERVIEW │ 767,171 ║
║ │ ├─EMPTY │ 0 ║
║ │ ├─NONEMPTY │ 63,275 ║
║ ├─OVERVIEW │ 830,446 ║
║ ├─EMPTY │ 0 ║
║ │ ├─NOTRLY │ 0 ║
║ ├─EMPTY │ 0 ║
║ ├─ARCHIVE │ 26,599 ║
║ ├─NEW │ 1,353 ║
║ C:\TEMP │ 1,243,660 ║
╚══════════════════════╧═══════════╝
The /I and /X options can be included in the SMAP environment variable,
if you wish. Options specified on the command line override options set
in the environment variable. See below, The Environment, for more
information.
You can display information on individual files by including the /F
option. For example, to see information on the files in the OVERVIEW
directory, you'd type SM OVERVIEW /F, and see the following display:
Space Map 2.0 Copyright (c) 1991,1992 Ben Smith
╔════════════════════╤═════════╤═════════╗
║ Tree │ Size │ Alloc ║
╟────────────────────┼─────────┼─────────╢
║ C:\TEMP\OVERVIEW │ 767,171 │ 774,144 ║
║ ├─buzz.bat │ 248 │ 4,096 ║
║ ├─overiew.exe │ 63,275 │ 65,536 ║
║ ├─testbed.exe │ 703,648 │ 704,512 ║
║ ├─EMPTY │ 0 │ 0 ║
║ ├─NONEMPTY │ 63,275 │ 65,536 ║
║ │ ├─testbed.exe │ 63,275 │ 65,536 ║
║ ├─NONEMPTY │ 63,275 │ 65,536 ║
║ C:\TEMP\OVERVIEW │ 830,446 │ 839,680 ║
╚════════════════════╧═════════╧═════════╝
Notice that file names are displayed in lower case, while directories
are displayed in upper case.
Finally, you can restrict the depth to which Space Map will "dig" into
directories. Of course, SM will always keep track of every file and
subdirectory, but you may not want to actually see all that information.
You can restrict the depth that SM will display by using the /D option.
For instance, typing SM /D1 in this directory will display:
Space Map 2.0 Copyright (c) 1991,1992 Ben Smith
╔══════════════════════╤═══════════╤═══════════╗
║ Tree │ Size │ Alloc ║
╟──────────────────────┼───────────┼───────────╢
║ C:\TEMP │ 390,573 │ 479,232 ║
║ ├─OVERVIEW │ 830,446 │ 839,680 ║
║ ├─EMPTY │ 0 │ 0 ║
║ ├─ARCHIVE │ 26,599 │ 28,672 ║
║ ├─NEW │ 1,353 │ 4,096 ║
║ C:\TEMP │ 1,248,971 │ 1,351,680 ║
╚══════════════════════╧═══════════╧═══════════╝
SORTING:
Space Map version 2.0 now provides sorting options. Normally the
unsorted display will show directories in the order DOS presents them.
If you are viewing files, all files will be displayed before any
subdirectory. When you sort, all directories OF A GIVEN LEVEL are
sorted exactly in the given order.
As an example, here is our test directory again:
Space Map 2.0 Copyright (c) 1991,1992 Ben Smith
╔══════════════════════╤═══════════╤═══════════╗
║ Tree │ Size │ Alloc ║
╟──────────────────────┼───────────┼───────────╢
║ C:\TEMP │ 380,939 │ 454,656 ║
║ ├─OVERVIEW │ 767,171 │ 774,144 ║
║ │ ├─EMPTY │ 0 │ 0 ║
║ │ ├─NONEMPTY │ 63,275 │ 65,536 ║
║ ├─OVERVIEW │ 830,446 │ 839,680 ║
║ ├─EMPTY │ 0 │ 0 ║
║ │ ├─NOTRLY │ 0 │ 0 ║
║ ├─EMPTY │ 0 │ 0 ║
║ ├─ARCHIVE │ 26,599 │ 28,672 ║
║ ├─NEW │ 1,353 │ 4,096 ║
║ C:\TEMP │ 1,239,337 │ 1,327,104 ║
╚══════════════════════╧═══════════╧═══════════╝
Now, we'll sort it by size by typing SM /SS:
Space Map 2.0 Copyright (c) 1991,1992 Ben Smith
╔══════════════════════╤═══════════╤═══════════╗
║ Tree │ Size │ Alloc ║
╟──────────────────────┼───────────┼───────────╢
║ C:\TEMP │ 391,124 │ 483,328 ║
║ ├─EMPTY │ 0 │ 0 ║
║ │ ├─NOTRLY │ 0 │ 0 ║
║ ├─EMPTY │ 0 │ 0 ║
║ ├─NEW │ 1,353 │ 4,096 ║
║ ├─ARCHIVE │ 26,599 │ 28,672 ║
║ ├─OVERVIEW │ 767,171 │ 774,144 ║
║ │ ├─EMPTY │ 0 │ 0 ║
║ │ ├─NONEMPTY │ 63,275 │ 65,536 ║
║ ├─OVERVIEW │ 830,446 │ 839,680 ║
║ C:\TEMP │ 1,249,522 │ 1,355,776 ║
╚══════════════════════╧═══════════╧═══════════╝
Of the subdirectories of TEMP, EMPTY is the smallest with zero bytes.
NEW comes next, then ARCHIVE, and finally, OVERVIEW is the largest, with
over 800K. To invert the sort order, just include a minus sign in the
sort specification: SM /SS-:
Space Map 2.0 Copyright (c) 1991,1992 Ben Smith
╔══════════════════════╤═══════════╤═══════════╗
║ Tree │ Size │ Alloc ║
╟──────────────────────┼───────────┼───────────╢
║ C:\TEMP │ 398,650 │ 499,712 ║
║ ├─OVERVIEW │ 767,171 │ 774,144 ║
║ │ ├─NONEMPTY │ 63,275 │ 65,536 ║
║ │ ├─EMPTY │ 0 │ 0 ║
║ ├─OVERVIEW │ 830,446 │ 839,680 ║
║ ├─ARCHIVE │ 26,599 │ 28,672 ║
║ ├─NEW │ 1,353 │ 4,096 ║
║ ├─EMPTY │ 0 │ 0 ║
║ │ ├─NOTRLY │ 0 │ 0 ║
║ ├─EMPTY │ 0 │ 0 ║
║ C:\TEMP │ 1,257,048 │ 1,372,160 ║
╚══════════════════════╧═══════════╧═══════════╝
You can sort on size (S), allocated size (A), time and date (D), or file
name (N). Only one sort option can be used at a time.
COLOR DISPLAY:
Normally, Space Map presents its information in glorious black and
white. This is so that the information can be redirected to a printer
or file with ease. However, if you have ANSI.SYS (or one of the
shareware/freeware/commercial replacements) installed, you can display
the information in a not-very-impressive color display. The color
display simulates green-bar paper by printing three lines in
black-on-white, and the next three lines in black-on-cyan. This
improves the readability considerably, to my eye.
To turn on the color display, add the /C+ option to the command line.
If you have color on as a default in the environment, you may turn it
off (for redirection, for example) by typing /C- on the command line.
Finally, note that SM does NOT check to see if ANSI is installed. You
can send an ANSI-embedded report to a file or to a printer, although I
can't imagine why you'd want to do such a thing!
PAUSING BETWEEN DISPLAY PAGES:
You can instruct Space Map to pause between display pages without
resorting to the DOS MORE command. Just include /P anywhere on the
command line. SM will try to determine the number of rows on the screen
and correctly interprets special EGA and VGA modes, as well as the
special modes provided by Personics' ULTRAVISION program.
THE ENVIRONMENT:
You'll find, if you use Space Map extensively, that you're constantly
using the same options: You may turn on the color display through /C+,
or you may decide to list the number of files through the /If option.
To turn these on semi-permanently, you can set the SMAP environment
variable to the options you wish to enable. To turn on the two options
given above, you could enter:
SET SMAP=/C+/IF
Then, Space Map as a default would display in color and display a count
of files along with the size and allocated size in the display.
Note that options given on the command line override options given in
the environment. Also note that three options (/P - Pause, /F - include
Files, and the file path) cannot be overridden, and should therefore
be included in the environment variable with care.
TECHNICAL INFORMATION:
DOS REPORTED SIZE vs. ALLOCATED SIZE: When DOS reports the size of a
file, it reports ONLY those bytes which are actually in use. But when a
program asks for a block of storage, DOS may actually give the program
MORE storage than it asked for! Here's why...
A disk generally consists of one or more platters, which are round
aluminum disks on which ferric oxide has been coated. Each platter is
served by (generally) two heads, one on the top and one on the bottom.
Each surface is divided into circular tracks, and each track is
divided into arc-shaped sectors which contain (generally) 512 bytes
each. The tracks have to be divided into sectors because the write
signal to the head can't actually turn on and off instantly, and if you
tried to change, say, byte 2,345 on a track, you'd probably wipe out a
few hundred bytes on each side of the one you were trying to change. To
prevent this, the disk manufacturers make you read an entire sector,
make the change to the sector in memory, and the write the entire sector
back. Each sector is surrounded by an "inter-record gap" which is a
safe place to turn on and off the current to the write head. The space
taken up by these gaps is not inconsequential; in fact, it may consume
ten to fifteen percent of the disk. Consequently, it's good to make the
sectors as large as possible (that way, less good disk surface is taken
up by the inter-record gaps).
The problem is that the sector becomes the smallest unit of storage
that you can address! A typical disk has 512 bytes per sector, and
this means that if you have a one-byte file, it is stored on a 512
byte sector, with the other 511 bytes unused! Worse, DOS usually
treats eight physical disk sectors as the smallest allocatable unit of
storage (called a cluster), which means that that one-byte file
actually wastes 4,095 bytes! And some disk compression programs
encourage even larger clusters!!
Well, the "Allocated" number tells you how much DOS has allocated for
your files. The difference between that number and the "Size" tells
you how much disk space the file system is "wasting" because of the
granularity of the file system itself. Unfortunately, there's not much
you can do about this...it's a problem built into the file system. But
if you want to see the problem in all its glory, look at a directory
full of Windows icons...each 766 byte icon gets allocated 4,096 bytes!
The third line tells you the space used in the first subdirectory of
C:\TEMP; that is, the OVERVIEW directory (C:\TEMP\OVERVIEW) in the
same format used in the previous line. The fourth line tells you that
the first subdirectory of OVERVIEW (C:\TEMP\OVERVIEW\EMPTY) has no
files (and so is appropriately named). The fifth line gives the space
used by the second subdirectory under OVERVIEW
(C:\TEMP\OVERVIEW\NONEMPTY).
Now, the sixth line is the interesting one. It gives the space used
by the OVERVIEW subdirectory AND ALL DIRECTORIES BENEATH IT. Add it
up yourself, and see.
REDIRECTION: This program uses only DOS calls to send information to
the screen. Consequently, the output of the program can be redirected
to any DOS device, including a file, a printer, or a serial device.
In fact, sending the information to a printer is a good way to keep
permanent record of what's on your disk. To direct the output of this
program to a printer, just type:
SM >prn
UNDOCUMENTED CALLS: This program uses Interrupt 21H Function 60H,
"Expand Path Name String," to determine the drive and directory that is
being requested. This is an undocumented DOS call which was introduced
in DOS Version 3.0 and has been present in every DOS version since then.
It appears to work with the OS/2 compatibility box, and is emulated in
DR-DOS, according to reports (I haven't tested this). I'd love to hear
from anyone with firsthand information on this.
This program uses an EGA BIOS call (INT 10H Function 1130H) to determine
the number of rows in the display. On CGA and monochrome displays the
program should default to 25 lines. Again, if you experience problems,
contact me.
MEMORY LIMITATIONS: Version 1 of this program used no storage beyond
the program segment. This version may use as much of the base DOS ram
as is made available to it by the .COM loader. The memory is used to
load a representation of the tree structure for sorting. Each file and
directory to be displayed requires 48 bytes of internal storage;
consequently, a machine with 600K free memory could display over 12,000
entries before running out of memory. If the program fills memory, the
program will alert you to the out of memory condition. When this
happens, you should re-run Space Map specifying fewer files (for
instance, deleting the /F option, or using /Dx to limit the search
depth.)
PERFORMANCE: The program traverses the entire 80MB disk on an 286/8
in about fifteen seconds. It scans a 200MB drive on a 386/33 in about
twelve seconds.
NETWORK USE: Space Map works very nicely on a network, although it
may behave in a way you don't expect. First, if you're using a Novell
network and have drives MAP ROOTed to a server subdirectory, Space Map
will see through that. For example, if you have a file server named
SERVER1, a volume mounted on that server named SYS, and a subdirectory
on SYS named \USER\BOB mapped to drive G:, and you ask Space Map to
display drive G's contents, the top line will report that you are
viewing "\\SERVER1\SYS\USER\BOB". This is because Space Map uses
DOS's True Name function, and this is the true name to DOS of the
network drive. Space Map has been tested extensively only on Novell
networks, but should work on any network supported by DOS.
OTHER INFORMATION: If you need to communicate with the author, he is:
Ben Smith
110 S. Gardenia
Celeste, TX 75423
My CompuServe ID is 70143,2023, but I only check mail about twice a
week.
DEVELOPMENT INFORMATION: Version 1 of this program was developed using
Microsoft's Macro Assembler version 6.0 over a couple of days in
December, 1991. Version 2 took a little longer -- a couple of weeks in
January, 1992. It is coded in 100% assembly language. The program was
tested extensively on two different computers: A Northgate 386/33 with
a 200MB hard drive connected to a Novell NetWare 2.15C server via SMC
10baseT media; and an AMT-286 8MHz AT clone. Both machines run MS-DOS
version 5.
ENHANCEMENTS: I've thought of several things I could do to this
program to improve it, but none that could be done quickly or easily.
If you think of something I've left out of a program of this scope,
drop me a line. I can't promise I'll implement any suggestion (the
program IS free, after all) but I'll consider it and respond.
SOURCE CODE AVAILABILITY: Source code can be made available on a paid
license basis. Contact me by mail or CompuServe for other details.
The price of a source code license would depend greatly on the use to
which the code is to be put, but I'm very reasonable!