This doc demonstrates a real live example of how to make a backup of a DVD movie that will play in a DVD player, and true to the notion of archival storage for backup, this method removes the CSS encryption of the DVD, so that an md5sum of the entire disc may be performed, and individual md5sums of the files are also performed, and placed in the VIDEO_TS directory so that, should a restoration of the backup be needed, you can know with certainty your restored DVD is every bit as perfect as the original.
If you don't already have the software, here are some places you can get it.
Open Source DVD Decryption libraries:
An Open Source Player for testing the Decryption libraries:
|ogle-0.9.1-fr3.src.rpm|| http://www.dtek.chalmers.se/groups/dvd/ |
Open Source DVD files copying tool: http://vobcopy.org/download/vobcopy-0.5.14.shtml
Open Source ISO9660 filesystem imaging tool: (mkisofs) ftp://ftp.berlios.de/pub/cdrecord/cdrtools.tar.gz
Open Source DVD Burner:
Once the software has been installed, not covered here, the installation is beyond the scope of this document; the procedure to backup a DVD movie is as follows:
Insert DVD run... mount /media/cdrom0 run... vobcopy -v -m -i /media/cdrom0 run... umount /media/cdrom0 Remove DVD run... cd (Movie title directory) dryrun... mkisofs -v -dvd-video -print-size -o movie.iso . Check the size it must be less than Four Billion Seven hundred Million bytes. If larger, get a "double layer" disc, and the additional software. run... mkisofs -v -dvd-video -o ../movie.iso . Insert blank DVD run... growisofs -speed=1 -dvd-compat -Z /dev/scd0=../movie.iso Remove recorded DVD blank, and insert it in player.
That is the gist of what this document talks about doing. There are a million caveats, work arounds, and got'yas, you need to know about, and I credit you as to having most of it down pat, as you are assumed to be a competent Linux user. What I do here is show the whole procedure in excruciatingly fine detail.
A few things of note:
For an unpriv user to Mirror the files of a DVD in a reasonable period of time you need read/write privs of the drive, and DMA needs to be turned on, see "using_dma = 1 (on)" below, without this, it can take five times as long to read the data. Also, only root can change either of these settings, and if during the Mirror process, you get a hard error, DMA will turn itself off.
PWD = /video/DVD/VobMirror/Blade_runner [larry@theater]$ ls -al /dev/hdc brw-rw-rw- 1 root cdrom 22, 0 Feb 25 2005 /dev/hdc PWD = /video/DVD/VobMirror/Blade_runner [larry@theater]$ /sbin/hdparm -v /dev/hdc /dev/hdc: IO_support = 0 (default 16-bit) unmaskirq = 0 (off) using_dma = 1 (on) keepsettings = 0 (off) readonly = 1 (on) readahead = 8 (on) HDIO_GETGEO failed: Invalid argument
There is an inherent limit to the amount of data that can be stored on any disc, CD-r discs hold 681,984,000 bytes. Oh you can put more than that on one, by burning into the leadout area, but such a disc does not conform to the ISO9660 standard for a CD-rom. To burn a DVD, and still adhere to the standard, as far as I have been able to determine, you should not burn more than 4,700,000,000 bytes. I've read that the number was chosen by someone to be a nice even number. It makes a nice story, but it's not very scientific, I would expect some multiple of a power of two, or something like that. That said, having no other value to work with, I used it. If you use it to compute the maximum number of extents you get 2294921, similarly if you use it to compute the maximum allowable number of 1K byte blocks you get 4589842. Therefore if you mount a DVD, and run the diskfree utility df you can quickly determine if VobCopy's Mirror data will fit on a single layer disc.
PWD = /video/DVD/VobMirror/Blade_runner [larry@theater]$ mount /media/cdrom0 PWD = /video/DVD/VobMirror/Blade_runner [larry@theater]$ df Filesystem 1K-blocks Used Available Use% Mounted on /dev/hda2 5763648 2093680 3377184 39% / tmpfs 258180 0 258180 0% /dev/shm /dev/hda1 23863 0 23863 0% /c /dev/hda4 186015092 171074380 5491684 97% /home /dev/hdd1 199104448 171394460 25718572 87% /video /dev/hdc 4310474 4310474 0 100% /media/cdrom0
From the above exercise, since 4310474 is less than 4589842 this DVD will fit on a single layer DVD+R. The VobCopy Mirror command will create a subdirectory at the PWD,(Present Working Directory) whose name is chosen from information on the DVD movie being examined. Under that directory, is a VIDEO_TS directory, at the conclusion of the run are about 4.3GiB of files that make up the movie. For the Mirror process to work the DVD must be mounted in the filesystem hierarchy. This is not the case in simple vob file extraction (read the manual). The meaning of the switches are as follows:
vobcopy -v -m -i /media/cdrom0 ^-----^------------------------- The VobCopy command ^^---------------------- Be verbose, tell what is happening ^^------------------- Make a Mirror archive ^^---------------- Give the path to the mounted DVD ^-----------^-- Debian puts it here /media/cdrom0 if you were using RedHat try /mnt/cdrom
For convenience I preface the run with the time command, a kind of software stopwatch, so I can become acquainted with how long these usually take. Ditto for the three echos of the "bell" character code, which makes three beeps to alert me when it's done.
Now the actual run:
PWD = /video/DVD/VobMirror/Blade_runner [larry@theater]$ time vobcopy -v -m -i /media/cdrom0 ; echo -n -e "\007" ; sleep 1 ; echo -n -e "\007" ; sleep 1 ; echo -n -e "\007" ; sleep 1 libdvdread: Attempting to retrieve all CSS keys libdvdread: This can take a _long_ time, please be patient libdvdread: Get key for /VIDEO_TS/VIDEO_TS.VOB at 0x00000120 libdvdread: Elapsed time 0 libdvdread: Get key for /VIDEO_TS/VTS_01_0.VOB at 0x000033de libdvdread: Elapsed time 0 libdvdread: Get key for /VIDEO_TS/VTS_01_1.VOB at 0x000039e8 libdvdread: Elapsed time 1 libdvdread: Found 1 VTS's libdvdread: Elapsed time 1 25MB of 25MB written ( 99.9 % ) writing to /video/DVD/VobMirror/Blade_runner/BLADE_RUNNER_16X9/VIDEO_TS/VTS_01_0.BUP 80kB of 80kB written writing to /video/DVD/VobMirror/Blade_runner/BLADE_RUNNER_16X9/VIDEO_TS/VTS_01_0.IFO 80kB of 80kB written writing to /video/DVD/VobMirror/Blade_runner/BLADE_RUNNER_16X9/VIDEO_TS/VTS_01_0.VOB 3MB of 3MB written ( 98.0 % ) writing to /video/DVD/VobMirror/Blade_runner/BLADE_RUNNER_16X9/VIDEO_TS/VTS_01_1.VOB 44MB of 1024MB written ( 4.3 % )
------------------------ many more files get copied -------------------------
1024MB of 1024MB written ( 100.0 % ) writing to /video/DVD/VobMirror/Blade_runner/BLADE_RUNNER_16X9/VIDEO_TS/VTS_01_4.VOB 1024MB of 1024MB written ( 100.0 % ) writing to /video/DVD/VobMirror/Blade_runner/BLADE_RUNNER_16X9/VIDEO_TS/VTS_01_5.VOB 84MB of 84MB written ( 99.8 % ) real 15m53.939s user 0m24.370s sys 0m16.090s
At this point the speaker beeps three times, at regular one second intervals, to let you know the reading process has completed. Also note the above three lines, beginning real, user, and sys. These are the report from the time command, this will teach you how long you should expect to wait for the process to complete on some future DVD backup, for your particular hardware.
Note: Blade Runner is a frequently viewed DVD, as such it was badly scratched, but none were circular scratches radiused from the center of the hole in the DVD and it copied just fine. At this point, we're done with the original DVD, so the next command un-mounts, it so we can remove it, followed by a recursive directory list, ls -alR to show you what the files will look like.
PWD = /video/DVD/VobMirror/Blade_runner [larry@theater]$ umount /media/cdrom0 PWD = /video/DVD/VobMirror/Blade_runner [larry@theater]$ ls -alR .: total 12 drwxr-xr-x 3 larry larry 4096 Nov 14 14:34 . drwxr-xr-x 8 larry larry 4096 Nov 14 11:24 .. drwxr-xr-x 3 larry larry 4096 Nov 14 11:50 BLADE_RUNNER_16X9 ./BLADE_RUNNER_16X9: total 12 drwxr-xr-x 3 larry larry 4096 Nov 14 11:50 . drwxr-xr-x 3 larry larry 4096 Nov 14 14:34 .. drwxr-xr-x 2 larry larry 4096 Nov 14 12:06 VIDEO_TS ./BLADE_RUNNER_16X9/VIDEO_TS: total 4314172 drwxr-xr-x 2 larry larry 4096 Nov 14 12:06 . drwxr-xr-x 3 larry larry 4096 Nov 14 11:50 .. -rw-r--r-- 1 larry larry 12288 Nov 14 11:50 VIDEO_TS.BUP -rw-r--r-- 1 larry larry 12288 Nov 14 11:50 VIDEO_TS.IFO -rw-r--r-- 1 larry larry 26509312 Nov 14 11:50 VIDEO_TS.VOB -rw-r--r-- 1 larry larry 81920 Nov 14 11:50 VTS_01_0.BUP -rw-r--r-- 1 larry larry 81920 Nov 14 11:50 VTS_01_0.IFO -rw-r--r-- 1 larry larry 3166208 Nov 14 11:50 VTS_01_0.VOB -rw-r--r-- 1 larry larry 1073739776 Nov 14 11:56 VTS_01_1.VOB -rw-r--r-- 1 larry larry 1073739776 Nov 14 12:00 VTS_01_2.VOB -rw-r--r-- 1 larry larry 1073739776 Nov 14 12:03 VTS_01_3.VOB -rw-r--r-- 1 larry larry 1073739776 Nov 14 12:06 VTS_01_4.VOB -rw-r--r-- 1 larry larry 88522752 Nov 14 12:06 VTS_01_5.VOB PWD = /video/DVD/VobMirror/Blade_runner [larry@theater]$
Next, although not a requirement of a DVD backup, it is generally good practice to run an md5sum of all the files in the VIDEO_TS and deposit the file containing those sums in the same directory, making sure you follow uppercase only, eight dot three file name convention. Eight dot three refers to the type of filename that would be valid in DOS, or CP/M. Care must be taken in choosing the file name for the MD5SUM file, so that it won't look anything like the other files in the VIDEO_TS directory.
PWD = /video/DVD/VobMirror/Blade_runner [larry@theater]$ pushd BLADE_RUNNER_16X9/VIDEO_TS/ /video/DVD/VobMirror/Blade_runner/BLADE_RUNNER_16X9/VIDEO_TS /video/DVD/VobMirror/Blade_runner ~ PWD = /video/DVD/VobMirror/Blade_runner/BLADE_RUNNER_16X9/VIDEO_TS [larry@theater]$ md5sum * > BLADERNR.MD5 PWD = /video/DVD/VobMirror/Blade_runner/BLADE_RUNNER_16X9/VIDEO_TS [larry@theater]$ md5sum -c -v BLADERNR.MD5 VIDEO_TS.BUP OK VIDEO_TS.IFO OK VIDEO_TS.VOB OK VTS_01_0.BUP OK VTS_01_0.IFO OK VTS_01_0.VOB OK VTS_01_1.VOB OK VTS_01_2.VOB OK VTS_01_3.VOB OK VTS_01_4.VOB OK VTS_01_5.VOB OK
In the next major phase we undertake, the making of an ISO9660 UDF image file suitable for a DVD player, all input file names are expected to be uppercase, eight dot three file name convention, however, coming out of this process, they switch to lowercase. To make the contents of the md5sum file directly usable, in the resulting DVD Disc, you need to open the file in an editor, and change the case from upper, to lower case, inside the file data ONLY. DO NOT UNDER ANY CIRCUMSTANCES ALTER THE NAMES OF THE FILES IN THE DIRECTORY THEMSELVES, or the resulting DVD will not be sorted correctly!
PWD = /video/DVD/VobMirror/Blade_runner/BLADE_RUNNER_16X9/VIDEO_TS [larry@theater]$ emacs BLADERNR.MD5 PWD = /video/DVD/VobMirror/Blade_runner/BLADE_RUNNER_16X9/VIDEO_TS [larry@theater]$ rm -i BLADERNR.MD5~ PWD = /video/DVD/VobMirror/Blade_runner/BLADE_RUNNER_16X9/VIDEO_TS [larry@theater]$ popd /video/DVD/VobMirror/Blade_runner ~ PWD = /video/DVD/VobMirror/Blade_runner [larry@theater]$
Next we make the ISO9660 UDF image file, in two parts. The first we do a dry-run to ascertain whither the ISO image will fit on a single layer DVD disc. If that is OK, we can do it for real. The echo ExtentMax = 2294921 is a convenience item, to remind us at the of the run how large a single layer DVD disc really is. The meaning of the switches are as follows:
mkisofs -v -dvd-video -print-size -o BladeRnr.iso BLADE_RUNNER_16X9 ^-----^----------------------------------------------- The Make ISO FS command ^^-------------------------------------------- Be verbose, tell what is happening in detail ^--------^--------------------------------- This is perhaps the most important switch of them all. This switch sorts uppercase file names, and inserts pad spacing at certain points in their data, and changes to lower case the resulting names while maintaining UDF filesystem compatibility ^---------^--------------------- This switch blocks all file output, making this a dry-run, that quickly determines what the resulting ISO file size will be in advance. ^^------------------ This switch designates what the output filename will be, when data is written. ^----------^----- Here we give that name ^->- Here we designate the input subdirectory that VobCopy's Mirror feature has assigned us.
PWD = /video/DVD/VobMirror/Blade_runner [larry@theater]$ mkisofs -v -dvd-video -print-size -o BladeRnr.iso BLADE_RUNNER_16X9 ; echo ExtentMax = 2294921 mkisofs 2.01-unofficial-iconv (i686-pc-linux-gnu) Scanning BLADE_RUNNER_16X9 Scanning BLADE_RUNNER_16X9/VIDEO_TS Total extents scheduled to be written = 2155387 2155387 ExtentMax = 2294921
PWD = /video/DVD/VobMirror/Blade_runner [larry@theater]$ mkisofs -v -dvd-video -o BladeRnr.iso BLADE_RUNNER_16X9 ; echo ExtentMax = 2294921
------------- only the last of the output is shown for brevity -------------
99.52% done, estimate finish Mon Nov 14 14:54:19 2005 99.75% done, estimate finish Mon Nov 14 14:54:19 2005 99.98% done, estimate finish Mon Nov 14 14:54:19 2005 Total translation table size: 0 Total rockridge attributes bytes: 0 Total directory bytes: 2048 Path table size(bytes): 26 Done with: The File(s) Block(s) 2154955 Writing: UDF Anchor end volume Start Block 2155236 Done with: UDF Anchor end volume Block(s) 1 Writing: UDF Pad end Start Block 2155237 Done with: UDF Pad end Block(s) 150 Max brk space used 21264 2155387 extents written (4209 MB) ExtentMax = 2294921 PWD = /video/DVD/VobMirror/Blade_runner [larry@theater]$ ls -al total 4315012 drwxr-xr-x 3 larry larry 4096 Nov 14 14:51 . drwxr-xr-x 8 larry larry 4096 Nov 14 11:24 .. drwxr-xr-x 3 larry larry 4096 Nov 14 11:50 BLADE_RUNNER_16X9 -rw-r--r-- 1 larry larry 4414232576 Nov 14 14:54 BladeRnr.iso PWD = /video/DVD/VobMirror/Blade_runner [larry@theater]$
At this point we've done all we can do as an unprivileged user, the rest is a job for SuperUser. You've probably used the su command before, but if you do it the way I show here, the root account's path, and system variables, are not set if you simply key in su<enter> the long form I show below, can make a difference in whither some installations of software have all the right execution paths.
Then for simplicity here, I log you into a PWD where the ISO image file we just created is located, using the pushd command so that the burning phase has a simpler command line, you can use absolute paths if you like. To burn the DVD also requires SCSI emulation of the IDE-ATAPI cable, I wrote a script to handle this, I show in my example burn_prep program two drives being set to SCSI, and or back to simple IDE. It is doubtful my example has any chance of working on your setup, you will very likely have to rewrite it to match your hardware. Then in the last step, you actually burn the DVD disc. No special switch is needed for Plus-R or Minus-R, the command I show makes no such distinction. The meaning of the switches are as follows:
growisofs -speed=1 -dvd-compat -Z /dev/scd0=BladeRnr.iso ^-------^------------------------------------------------ DVD burner command ^------^--------------------------------------- My version's documentation states flatly to set this to 1 ^---------^--------------------------- This switch says the ISO image file has already been prepared ^^------------------------ Burn an initial session to the DVD ^-------^-------------- to device /dev/scd0 ^------------- using data from this ^----------^- named file BladeRnr.iso
OK here we go, to do it for real:
PWD = /video/DVD/VobMirror/Blade_runner [larry@theater]$ su - root Password: theater:~# pushd /video/DVD/VobMirror/Blade_runner/ /video/DVD/VobMirror/Blade_runner ~ theater:/video/DVD/VobMirror/Blade_runner# theater:/video/DVD/VobMirror/Blade_runner# /root/scripts/burn_prep Enter the letter I for IDE, or the letter S for SCSI emulation. s rmmod: module ide-scsi is not loaded scsi_mod: Device or resource busy cdrom: Device or resource busy Cdrecord-Clone 2.01.01a01 (i686-pc-linux-gnu) Copyright (C) 1995-2004 Jörg Schilling NOTE: this version of cdrecord is an inofficial (modified) release of cdrecord and thus may have bugs that are not present in the original version. Please send bug reports and support requests to <email@example.com>. The original author should not be bothered with problems of this version. Linux sg driver version: 3.1.25 Using libscg version 'schily-0.8'. scsibus0: 0,0,0 0) 'TOSHIBA ' 'CD/DVDW SD-R5372' 'TU53' Removable CD-ROM 0,1,0 1) * 0,2,0 2) * 0,3,0 3) * 0,4,0 4) * 0,5,0 5) * 0,6,0 6) * 0,7,0 7) * Example dry run cdrecord -dummy -pad -v speed=16 dev=0,1,0 /home/forbin/RH73_x86_3.img theater:/video/DVD/VobMirror/Blade_runner# theater:/video/DVD/VobMirror/Blade_runner# time growisofs -speed=1 -dvd-compat -Z /dev/scd0=BladeRnr.iso ; echo -n -e "\007" ; sleep 1 ; echo -n -e "\007" ; sleep 1 ; echo -n -e "\007" Executing 'builtin_dd if=BladeRnr.iso of=/dev/scd0 obs=32k seek=0' /dev/scd0: "Current Write Speed" is 2.5x1385KBps. 1245184/4414232576 ( 0.0%) @0.3x, remaining 295:20 7962624/4414232576 ( 0.2%) @1.4x, remaining 73:46 19562496/4414232576 ( 0.4%) @2.4x, remaining 41:11 27983872/4414232576 ( 0.6%) @1.8x, remaining 39:11 38797312/4414232576 ( 0.9%) @2.3x, remaining 33:49 50397184/4414232576 ( 1.1%) @2.4x, remaining 30:18
----------- only the begin/end of the output is shown for brevity -----------
4376395776/4414232576 (99.1%) @2.4x, remaining 0:11 4387995648/4414232576 (99.4%) @2.4x, remaining 0:07 4399628288/4414232576 (99.7%) @2.4x, remaining 0:04 4411228160/4414232576 (99.9%) @2.4x, remaining 0:00 builtin_dd: 2155392*2KB out @ average 2.4x1385KBps /dev/scd0: flushing cache /dev/scd0: closing track /dev/scd0: closing disc /dev/scd0: reloading tray real 22m10.848s user 0m0.220s sys 0m8.010s theater:/video/DVD/VobMirror/Blade_runner#
Much later, after another run of the burn_prep script, this time to set it back to a standard IDE CD-rom interface, and from an unpriv user account you mount the DVD backup disc, and change to the /media/cdrom0/video_ts directory, to run md5sum in the confirmation mode...
PWD = /media/cdrom0/video_ts [larry@theater]$ md5sum -c -v bladernr.md5 video_ts.bup OK video_ts.ifo OK video_ts.vob OK vts_01_0.bup OK vts_01_0.ifo OK vts_01_0.vob OK vts_01_1.vob OK vts_01_2.vob OK vts_01_3.vob OK vts_01_4.vob OK vts_01_5.vob OK
This script is very helpful, if you treat it right, but as I said before you'll likely have to edit it for it to work on your machine. Also, one should remain aware of things that will confuse this script, as it does little testing of interfaces before changing drivers. For instance no CD-Rom drives should be mounted during a burn_prep switch, the USB subsystem will auto-recognize devices, and install drivers, often using the same /dev/scd0 needed by the DVD writer in SCSI Emulation, even after they're no longer plugged in, and haven't been for weeks. If you know this is the case, and you know why the interface is in use, you can, as superuser, rmmod the usb_storage module, as well as others if they become necessary, and then re-run burn_prep once each way, to shake things out, but think first, know that what you're doing makes sense.
Generally speaking programs that address the CD-Rom drive as /dev/scd0 or 1 etcetera are expecting that drive to be emulated as a SCSI interface, doing this adds a wealth of additional multimedia extensions. CD writing software, ripping software, programs that need to read the ID number of the disc, often need these extra multimedia extensions, on the other hand, SCSI emulation has a completely different way of doing DMA, so when programs need to find a standard IDE interface, that supports DMA, you need to switch back to the old established, "normal" CD-Rom, an IDE interface. This is just about everything else, not covered by multimedia extensions. Also, SCSI emulation tends to latch onto a drive like a bulldog in the event of a read error, whereas the old simple IDE interface, retries a few times, and gives up. Application programs that will go either way, IDE, or SCSI emulation, are better off running with IDE, particularly if the disc to be read is rather scratched, and likely to cause read errors, it's better to have it give up, than to be locked in a dual to the death. In my experience, these often eventually crash the system kernel. Finally, if a program doesn't like the interface, it will tell you about it, usually "Can't find /dev/scd0" is about what it says when it doesn't do pure IDE. Oh and don't forget, one hard read error in pure IDE, and DMA is disabled, it can be re-enabled as shown earlier in this document. Doing something simple, such as checking all the MD5 sums on a CD, can take five times as long, if DMA is disabled, or cause Ogle to play, and stall, play, and stall, play, and stall, while playing a DVD, due to the fact that MPEG video empties the data buffer, faster than it can be filled absent the DMA advantage.
-------------------------- Begin burn_prep script -------------------------- #! /bin/bash echo Enter the letter I for IDE, or the letter S for SCSI emulation. read -r KEYLINEDATA if [ "$KEYLINEDATA" == "s" ] || [ "$KEYLINEDATA" == "S" ] then /sbin/rmmod ide-scsi /sbin/rmmod scsi_mod /sbin/rmmod ide-cd /sbin/rmmod cdrom # lsmod /sbin/modprobe ide-scsi cdrecord -scanbus # man cdrecord # cdrecord -checkdrive dev=0,0,0 # cdrecord -checkdrive dev=0,1,0 rm -f /dev/cdrom ln -s /dev/scd0 /dev/cdrom rm -f /dev/cdrom1 ln -s /dev/scd1 /dev/cdrom1 echo Example dry run echo "cdrecord -dummy -pad -v speed=16 dev=0,1,0 /home/forbin/RH73_x86_3.img" exit 0 fi if [ "$KEYLINEDATA" == "i" ] || [ "$KEYLINEDATA" == "I" ] then /sbin/rmmod sr_mod /sbin/rmmod cdrom /sbin/rmmod sg /sbin/rmmod ide-scsi /sbin/rmmod scsi_mod /sbin/modprobe ide-cd rm -f /dev/cdrom rm -f /dev/cdrom1 ln -s /dev/hdc /dev/cdrom ln -s /dev/hdd /dev/cdrom1 /sbin/lsmod exit 0 fi -------------------------- End burn_prep script --------------------------
One final thing:
If you come from the Winders world, and want a simple mouse click solution I wouldn't look for brand names. Businesses won't ever do DVD backup, it's like the "Third Rail" of software, worse even than Napster of the olden days. Recently Sony was caught deliberately sabotaging their customers' machines with a rootkit Trojan in the name of anti-piracy! So big biz software ain't your friend. The following Google search key dvd movie backup windows turned up tons of shareware for backing up DVD movies under Windows.
You don't adopt Linux for "that one killer app" you adopt Linux to permanently break free from having other people control your computer, as if you were not supposed to have any say in the matter. Living life with them prying into the details of your life, has a chilling effect on what personal information you are willing to place at risk of them stealing it. Think about it, would you put nudes of you and your s.o. on the machine? What's the matter, can't you trust your own machine? If not I think it's high time to get a new OS, but that's just me, I may have a slightly lower threshold than you.
Copyright 2005 floobydust.com