FLAC - news
Author: Josh Coalson
Description: A free, open source codec for lossless audio compression and decompression
Keywords: free,lossless,audio,codec,encoder,decoder,compression,compressor,archival,archive,archiving,backup,music

english | russian
news
17-Sep-2007:

- FLAC 1.2.1 released New in this release is support for all RIFF/AIFF metadata, including Broadcast Wave Format (BWF). There are many other small improvements and bug fixes; see the changelog entry for complete details.

16-Aug-2007:

- Sound Forge 9.0b supports FLAC, for both reading and writing.

03-Aug-2007:

- Czech Radio has released complete recordings of Bach's Brandenburg concertos in FLAC format, free to download.

23-Jul-2007:

- FLAC 1.2.0 released New in this release are small speed improvements, and some new options and bug fixes. Also the decoder has been updated to pave the way for some format improvements, so if your software supports FLAC be sure to check it out. See the changelog entry for complete details.

13-Feb-2007:

- FLAC 1.1.4 released Increased compression and dramatic speedups for both encoding and decoding are the big improvements in FLAC 1.1.4. There are also several new options and bugfixes. See the changelog entry for complete details.

27-Nov-2006:

- FLAC 1.1.3 released Almost 2 years in the making, FLAC 1.1.3 is a major release with improved compression, improved cover art and multichannel support, better recovery for corrupted files, many new features and options in the command-line tools, and several bug fixes. For developers, the decoder and encoder APIs have also been simplified and there is a new porting guide. See the changelog entry for complete details.

25-Oct-2006:

- Winamp 5.31 ships with FLAC support
  Winamp 5.31 now includes Nullsoft FLAC plugins for encoding and decoding. The decoder is based on our reference decoder plugin. However the current encoder plugin is based on a pre-release of flake and we recommend to not use it for archival yet.

20-Dec-2005:

- Volvo's Digital Jukebox plays FLAC
  Want some FLAC with your Volvo? Volvo's Digital Jukebox, developed with PhatNoise, is fully integrated with the car's audio system and available for the S60, V70, XC70, and S80. PhatNoise's PhatBox in 2002 was the first device to support FLAC natively and has gained a loyal following. The Digital Jukebox and PhatBox also support Ogg Vorbis.

21-Sep-2005:

- Live2496 now records directly to FLAC
  Live2496, a program that can record 24-bit audio up to 96kHz on a Pocket PC (using Core Sound's PDAudio interface) now supports recording directly to FLAC.

10-Aug-2005:

- Olive's new Symphony component supports FLAC
  The new Symphony wireless digital music center by Olive supports FLAC.

11-May-2005:

- YME supports FLAC and Vorbis
  Yahoo! Music Engine supports FLAC and Ogg Vorbis, for playback and ripping/encoding.

10-May-2005:

- PONTIS' MS330 supports FLAC and Vorbis
  The new MS330 Media Server from PONTIS supports FLAC and Ogg Vorbis. In addition to playing from the internal hard disk, CD drive, and 6-in-1 flash card slot, it can also be connected to a network, and even a TV for graphical navigation, cover art, photo viewing, etc.

02-May-2005:

- Sonos now supports FLAC and Vorbis
  The Sonos Digital Music System now supports FLAC and Ogg Vorbis.

23-Apr-2005:

- iAUDIO X5 portable supports FLAC and Vorbis
  The new portable iAUDIO X5 from COWON supports FLAC and Ogg Vorbis.

09-Mar-2005:

- Squeezebox2 supports FLAC on the box
  Slim Devices' new Squeezebox2 supports FLAC decoding on the box, reducing the amount of precious wireless bandwidth required for FLAC playback.

05-Feb-2005:

- FLAC 1.1.2 released New in this release are small decoding speedups for all platforms, small encoding speedups in fast (non-LPC) mode, streaming support in the XMMS plugin, and several bug fixes. For developers there are also a few additions and changes to the metadata API to make working with tags easier. See the changelog entry for complete details. This release actually wasn't supposed to happen so soon, but needed to be made to fix library naming and build problems in FLAC 1.1.1 that caused trouble for package maintainers, so unless you are having trouble with one of the particular bugs that got fixed in 1.1.2 then there is not much of a need to upgrade.

17-Jan-2005:

- Several new devices support FLAC
  Another handful of devices that support FLAC are out or announced: the Zensonic Z500 Networked DVD Media Player, Escient's new FireBall E2-40, E2-160, and DVDM-300, the M300A Digital Music Player from Digital Techniques (see manual), Meda Systems' Bravo servers (more info), and the MS300 Music Server by McIntosh Laboratory.

12-Nov-2004:

- Escient's new FireBall E2-300 supports FLAC
  Escient has a new home stereo component that supports FLAC, the FireBall E2-300.

02-Nov-2004:

- New Mindawn music store offers FLAC and Vorbis
  Mindawn, a new online music service offering FLAC and Ogg Vorbis, is now open. They also have a multi-platform (Windows, Linux, Mac OS X) CD ripper/encoder and are finishing up a multi-platform player.

01-Oct-2004:

- FLAC 1.1.1 released There is a new changelog with a complete list of changes/fixes/improvements, but here is a summary of some of the main ones:
  - Better Ogg FLAC support including seeking and an official Ogg FLAC mapping.
  - Significant decoding speedup (almost 2x) on PowerPC (includes Macs with G4/G5).
  - Speedups in the plugins.
  - Several new options to flac and metaflac by popular demand.
  - Several API additions requested by developers.
  - Many bugfixes.

27-Jul-2004:

- The Furthur Network now supports FLAC
  The Furthur Network, a legal-live music sharing P2P network, now supports FLAC.

21-Jun-2004:

- Bonnaroo soundboard recordings available in FLAC
  Several sets from the Bonnaroo Music Festival are available in FLAC, including Dave Matthews & Friends and String Cheese Incident, with more to follow as the soundboard recordings are approved by the bands.

03-Mar-2004:

- Metallica offers live shows in FLAC
  Metallica is offering soundboard recordings of live shows in FLAC format.

03-Feb-2004:

- Charlie Hunter makes select albums available in FLAC
  Charlie Hunter is making select albums available for download in FLAC and MP3 formats.

19-Nov-2003:

- PhatNoise's new Home Digital Media Player supports FLAC
  PhatNoise (makers of the PhatBox, which also plays FLAC) just released their Home Digital Media Player. It includes a DMS cartridge slot so you can pop out your FLAC tunes and pop 'em in your car.

18-Nov-2003:

- Slim's new 'Squeezebox' supports FLAC
  Slim Devices' new Squeezebox, the wireless follow-on to the SliMP3 networked audio player, is available and supports FLAC and Ogg Vorbis.

11-Nov-2003:

- Primus offers live shows in FLAC
  Primus is offering soundboard recordings from 2003 Tour de Fromage in FLAC and MP3 on primuslive.com. More info here and here.

13-Oct-2003:

- Magnatune catalog available in FLAC
  Independent record label Magnatune is now offering their catalog in FLAC and Vorbis in addition to MP3.

11-Aug-2003:

- New Rio Karma supports FLAC
  Rio has announced a new portable, the Rio Karma, which supports FLAC and Ogg Vorbis.

23-Jun-2003:

- livephish.com offers FLAC shows
  livephish.com is now offering soundboard recordings of live shows in FLAC format in addition to MP3.

09-Feb-2003:

- ReQuest adds FLAC support
  ReQuest Multimedia's AudioReQuest music servers now support FLAC.

29-Jan-2003:

- FLAC has joined the Xiph project See here for the press release.
  Xiph.org is behind other free codecs such as Vorbis, Theora, and Speex. Our merger with Xiph will bring FLAC into the ranks and lead to better integration with the Ogg multimedia framework.
  Note that the FLAC format is not changing, native FLAC will continue to exist, and the command-line tools and plugins will continue to work as before. The codec libraries will now be available under Xiph's BSD-like license.
  Over the next few days we will be transitioning normal operations off SourceForge and over to Xiph.org; first will be CVS and the web pages, followed by the mailing lists, bug tracker, and file release area. We will keep a mirror here until the transition is complete. It's OK to send patches to the flac-dev list but they won't be able to be integrated until CVS is fully moved over.

26-Jan-2003:

- FLAC 1.1.0 released I didn't get everything in that I wanted, but it's high time for a release.
  Note that the minor version has incremented, meaning forward compatibility was broken (forward compatibility means an earlier decoder can play all streams made by a later decoder). This is only because of a bug in 1.0.4 and prior where the decoder could not properly skip unknown metadata. The stream format itself has not changed and FLAC is still fully backward-compatible. All it means is that a FLAC file containing cue sheet metadata will not decode in older decoders. This bug is fixed in 1.1.0.
  Here's what's new:
  General:
  - All code is now Valgrind-clean!
  - New CUESHEET metadata block for storing CD TOC and index point information. Now a CD can be completely backed up to a single FLAC file for archival.
  - ReplayGain support.
  - Better compression of 24-bit files.
  - More complete AIFF support.
  - 3DNow! optimizations enabled by default.
  - Complete MSVC build system with .dsp projects for everything, which can build both static libs and DLLs, and in debug or release mode, all in the same source tree.
  flac:
  - Can now decode FLAC to AIFF; new --force-aiff-format option.
  - New --cuesheet option for reading and storing a cuesheet when encoding a whole CD. Automatically creates seek points for track and index points unless --no-cued-seekpoints is used.
  - New --replay-gain option for calculating ReplayGain values and storing them as tags.
  - New --until option complements --skip to stop decoding at a specified point in the stream.
  - --skip and --until now also accept mm:ss.ss format.
  - New -S #s flavor to specify seekpoints every '#' number of seconds.
  - flac now defaults to -S 10s instead of -S 100x for the seek table.
  - flac now adds a 4k PADDING block by default (turn off with --no-padding).
  - Fixed a bug with --skip and AIFF-to-FLAC encoding.
  - Fixed a bug where decoding a FLAC file whose total_samples==0 in the STREAMINFO would corrupt the WAVE header.
  metaflac:
  - New --import-cuesheet-from option for reading and storing a cuesheet to a FLAC-encoded CD. Automatically creates seek points for track and index points unless --no-cued-seekpoints is used.
  - New --export-cuesheet-to option for writing a cuesheet from a FLAC file for use with CD authoring software.
  - New --add-replay-gain option for calculating ReplayGain values and storing them as tags.
  - New --add-seekpoint option to add seekpoints to an existing FLAC file. Includes new --add-seekpoint=#s flavor to add seekpoints every '#' number of seconds.
  XMMS plugin:
  - Configurable sample resolution conversion with dither.
  - ReplayGain support with customizable noise shaping, pre-amp, and optional hard limiter.
  - New Vorbis comment editor.
  - File info now works.
  - Bitrate now shows the smoothed instantaneous bitrate.
  - Uses the ARTIST tag if there is no PERFORMER tag.
  Winamp2 plugin:
  - Configurable sample resolution conversion with dither.
  - ReplayGain support with customizable noise shaping, pre-amp, and optional hard limiter.
  - File info now works.
  - Uses the ARTIST tag if there is no PERFORMER tag.
  Libraries (developers take note!):
  - All code and tests are instrumented for Valgrind. All tests run Valgrind-clean, meaning no memory leaks or buffer over/under-runs.
  - Separate 64-bit datapath through the filter in libFLAC for better compression of >16 bps files.
  - FLAC__metadata_object_new(FLAC__METADATA_TYPE_VORBIS_COMMENT) now sets the vendor string.
  - The documentation on the usage of FLAC::Iterator::get_block() in libFLAC++ has an important correction. If you use this class make sure to read this.

24-Sep-2002:

- FLAC 1.0.4 released There are a lot of improvements since 1.0.3; let's get right to it:
  Plugins:
  - Support for Vorbis comments, ID3 v1 and v2 tags.
  - Configurable title formatting and charset conversion in XMMS plugin.
  - Support for 8- and 24-bit FLAC files. There is a compile-time option for raw 24-bit output or 24bps-to-16bps linear dithering (the default).
  flac:
  - Improved option parser (now uses getopt).
  - AIFF input support (thanks to Brady Patterson).
  - Small decoder speedup.
  - --sector-align now supported for raw input files.
  - New -T, --tag options for adding Vorbis comments while encoding.
  - New --serial-number option for use with --ogg.
  - Automatically writes vendor string in Vorbis comments.
  - Drastically reduced memory requirements.
  - Fixed bug where extra fmt/data chunks that were supposed to be skipped were not getting skipped.
  - Fixed bug in granulepos setting for Ogg FLAC streams.
  - Fixed memory leak when encoding multiple files with -V.
  metaflac:
  - UTF-8 support in Vorbis comments.
  - New --import-vc-from and --export-vc-to commands for importing/exporting Vorbis comments from/to a file. For example, the following can be used to copy tags back and forth:
    metaflac --export-vc-to=- --no-utf8-convert file.flac | vorbiscomment --raw -w file.ogg
    vorbiscomment --raw -l file.ogg | metaflac --import-vc-from=- --no-utf8-convert file.flac
  - Fixed bug #606796 where metaflac was failing on read-only files.
  Libraries:
  - All APIs now meticulously documented via Doxygen. See here.
  - New libOggFLAC and libOggFLAC++ libraries. These wrap around libFLAC to provide encoding and decoding of Ogg FLAC streams, providing interfaces similar to the ones of the native FLAC libraries. These are also documented via Doxygen.
  - New FLAC__SeekableStreamEncoder and FLAC__FileEncoder in libFLAC simplify common encoding tasks.
  - New verify mode in all encoders.
  - FLAC__stream_encoder_finish() now resets the defaults just like the stream decoders.
  - Drastically reduced memory requirements of encoders and decoders.
  - Encoder now automatically writes vendor string in VORBIS_COMMENT block.
  - Encoding speedup of fixed predictors and MD5 speedup for 16bps mono/stereo signals on x86 (thanks to Miroslav Lichvar).
  - Fixed bug in metadata interface where a bps in STREAMINFO > 16 was incorrectly parsed.
  - Fixed bug where aborting stream decoder could cause infinite loop.
  - Behavior change: simplified decoder *_process() commands.
  - Behavior change: calling FLAC__stream_encoder_init() calls write callback once for "fLaC" signature and once for each metadata block.
  - Behavior change: deprecated do_escape_coding and rice_parameter_search_distance in encoder.

22-Aug-2002:

- Rio Receiver FLAC support has been added to the Rio Receiver and Dell Digital Audio Receiver via David Flowerday's RioPlay client. See here for the announcement.

03-Jul-2002:

- FLAC 1.0.3 released Although by version number only a 0.0.1 increment, this release is significant. Remember, micro-revisions mean the FLAC format remains both forward and backward compatible, however, the libFLAC API has changed for the better.
  New features:
  - 24-bit input support restored in flac.
  - Decoder speedup in libFLAC, which is directly passed on to the command-line decoder and plugins.
  - New -F option to flac to continue decoding in spite of errors.
  - Correctly set granulepos in Ogg packets so seeking Ogg FLAC streams will be easier.
  - New VORBIS_COMMENT metadata block for tagging with Vorbis-style comments.
  - Vastly improved metaflac, now with many editing and tagging options.
  - Partial id3v1 support in Winamp plugins.
  - Updated Winamp 3 plugin.
  - Note: new semantics for -P option in flac.
  - Note: removed -R option in flac.
  New library features:
  - Previously mentioned decoder speedup in libFLAC.
  - New metadata interface to libFLAC for manipulating metadata in FLAC files.
  - New libFLAC++ API, an object wrapper around libFLAC.
  - New VORBIS_COMMENT metadata block for tagging with Vorbis-style comments.
  - Customizable metadata filtering by type in decoders.
  - Stream encoder can take an arbitrary list of metadata blocks, instead of just one SEEKTABLE and/or PADDING block.
  Bugs fixed:
  - Fixed bug with using pipes under Windows.
  - Fixed several bugs in the plugins and made them more robust in general.
  - Fixed bug in flac where decoding to WAVE of a FLAC file with 0 for total_samples in the STREAMINFO block yielded a WAVE chunk of 0 size.
  - Fixed bug in Ogg packet numbering.

13-Feb-2002:

- FLAC goes hardware! PhatNoise has become the first commercial hardware platform to support FLAC. Firmware is now available for the Phatbox player to play FLAC files. See here for details.

03-Dec-2001:

- FLAC 1.0.2 released This release is only to fix a bug that was causing some of the plugins to crash sporadically. It can also affect libFLAC users that reuse one file decoder instance for multiple files; see here for more.

14-Nov-2001:

- FLAC 1.0.1 released The core codec is unchanged but there have been some features added and some bugs fixed:
  New features for users:
  - Support for Ogg-FLAC, i.e. flac can now read and write FLAC streams using Ogg as the transport layer.
  - New Winamp 3 plugin based on the Wasabi Beta 1 SDK.
  - New utilities for adding FLAC support to the Monkey's Audio GUI (see how).
  - Mac OS X support. The download area now contains an OS X binary release.
  - Mingw32 support.
  - Better handling of MS-specific 'fmt' chunks in WAVE files.
  New features for developers:
  - Added a SeekableStreamDecoder layer between StreamDecoder and FileDecoder. This makes it easier to use libFLAC in situations where files have been abstracted away. See the latest documentation for more. The interface for the StreamDecoder and FileDecoder remain the same and are still binary-compatible with libFLAC 1.0.
  - Drastically reduced the stack requirements of the encoder.
  Bug fixes:
  - Fixed a serious bug with flac and raw input where the encoder was trying to rewind when it shouldn't, which would add 12 junk samples to the encoded file. This was not present in WAVE encoding.
  - Fixed a minor bug in libFLAC with setting the file name to stdin on a file decoder.
  - Fixed a minor bug in libFLAC where multiple calls to setting the file name on a file decoder caused leaked memory.
  - Fixed a minor bug in metaflac, now correctly skips an id3v2 tag if present.
  - Fixed a minor bug in metaflac, now correctly skips long metadata blocks.

20-Jul-2001:

- FLAC 1.0 is out! It's finally here. There are a few new features but mostly it is minor bug fixes since 0.10:
  - New '--sector-align' option to flac which aligns a group of encoded files on CD audio sector boundaries.
  - New '--output-prefix' option to flac to allow the user to prepend a prefix to all output filenames (useful, for example, for encoding/decoding to a different directory).
  - Better WAVE autodetection (doesn't rely on ungetc() anymore).
  - Cleaner one-line encoding/decoding stats.
  - Changes to the libFLAC interface and type names to make binary compatibility easier to maintain in the future.
  - New '--sse-os' option to 'configure' to enable faster SSE-based routines.
  - Another (hopefully last) fix to the Winamp 2 plugin.
  - Slightly improved Rice parameter estimation.
  - Bug fixes for some very rare corner cases when encoding.

07-Jun-2001:

- FLAC 0.10 released. This is probably the final beta. There have been many improvements in the last two months:
  - Both the encoder and decoder have been significantly sped up. Aside from C improvements, the code base now has an assembly infrastructure that allows assembly routines for different architectures to be easily integrated. Many key routines have now have faster IA-32 implementations (thanks to Miroslav).
  - A new metadata block SEEKTABLE has been defined to hold an arbitrary number of seek points, which speeds up seeking within a stream.
  - flac now has a command-line usage similar to 'gzip'; make sure to see the latest documentation for the new usage. It also attempts to preserve the input file's timestamp and permissions.
  - The -# options in flac have been tweaked to yield the best compression-to-encode-time ratios. The new default is -5.
  - flac can now usually autodetect WAVE files when encoding so that -fw is usually not needed when encoding from stdin.
  - The WAVE reader in flac now just ignores (with a warning) unsupported sub-chunks instead of aborting with an error.
  - Added an option '--delete-input-file' to flac which automatically deletes the input after a successful encode/decode.
  - Added an option '-o' to flac to force the output file name (the old usage of "flac - outputfilename" is no longer supported).
  - Changed the XMMS plugin to send smaller chunks of samples (now 512) so that visualization is not slow.
  - Fixed a bug in the stream decoder where the decoded samples counter got corrupted after a seek.
  It should be a short hop to 1.0.

31-Mar-2001:

- FLAC 0.9 released. There were some format changes that broke backwards compatibility but these should be the last (see below). Also, there have been several bug fixes and some new features:
  - FLAC's sync code has been lengthened to 14 bits from 9 bits. This should enable a faster and more robust synchronization mechanism.
  - Two reserved bits were added to the frame header.
  - A CRC-16 was added to the FLAC frame footer, and the decoder now does frame integrity checking based on the CRC.
  - The format now includes a new subframe field to indicate when a subblock has one or more 0 LSBs for all samples. This increases compression on some kinds of data.
  - Added two options to the analysis mode, one for including the residual signal in the analysis file, and one for generating gnuplot files of each subframe's residual distribution with some statistics. See the latest documentation.
  - XMMS plugin now supports 8-bit files.
  - Fixed a bug in the Winamp2 plugin where the audio sounded garbled.
  - Fixed a bug in the Winamp2 plugin where Winamp would hang sporadically at the end of a track (c.f. bug #231197).
  FLAC is on track for an official 1.0 release soon.

05-Mar-2001:

- FLAC 0.8 released. This release is a result of extensive testing and fixes several bugs encountered when pushing the encoder to the limit. I'm pretty confident in the stability of the encoder/decoder now for all kinds of input. There have also been several features added. Here is a complete list of the changes since 0.7:
  - Created a new utility called metaflac. It is a metadata editor for .flac files. Right now it just lists the contents of the metadata blocks but eventually it will allow update/insertion/deletion.
  - Added two new metadata blocks: PADDING which has an obvious function, and APPLICATION, which is meant to be open to third party applications. See the latest format docs for more info, or the new id registration page.
  - Added a -P option to flac to reserve a PADDING block when encoding.
  - Added support for 24-bit files to flac (the FLAC format always supported it).
  - Started the Winamp3 plugin.
  - Greatly expanded the test suite, adding more streams (24-bit streams, noise streams, non-audio streams, more patterns) and more option combinations to the encoder. The test suite runs about 30 streams and over 5000 encodings now.
  - Fixed a bug in libFLAC that happened when using an exhaustive LPC coefficient quantization search with 8 bps input.
  - Fixed a bug in libFLAC where the error estimation in the fixed predictor could overflow.
  - Fixed a bug in libFLAC where LPC was attempted even when the autocorrelation coefficients implied it wouldn't help.
  - Reworked the LPC coefficient quantizer, which also fixed another bug that might occur in rare cases.
  - Really fixed the '-V overflow' bug (c.f. bug #231976).
  - Fixed a bug in flac related to the decode buffer sizing.
  FLAC is very close to being ready for an official release. The only known problems left are with the Winamp plugins, which should be fixed soon, and pipes with MSVC.

12-Feb-2001:

- FLAC 0.7 released. This is mainly a bug fix release, specifically:
  - Fixed a bug that happened when both -fr and --seek were used at the same time.
  - Fixed a bug with -p (c.f. bug #230992).
  - Fixed a bug that happened when using large (>32K) blocksizes and -V (c.f. bug #231976).
  - Fixed a bug where encoder was double-closing a file.
  - Expanded the test suite.
  - Added more optimization flags for gcc, which should speed up flac.

28-Jan-2001:

- FLAC 0.6 released. The encoder is now much faster. The -m option has been sped up by 4x and -r improved, meaning that in the default compression mode (-6), encoding should be at least 3 times faster. Other changes:
  - Some bugs related to flac and pipes were fixed (see here for the discussion).
  - A "loose mid-side" (-M) option to the encoder has been added, which adaptively switches between independent and mid-side coding, instead of the exhaustive search that -m does.
  - An analyze mode (-a) has been added to flac. This is useful mainly for developers; currently it will dump info about each frame and subframe to a file. It's a text file in a format that can be easily processed by scripts; a separate analysis program is in the works.
  - The source now has an autoconf/libtool-based build system. This should allow the source to build "out-of-the-box" on many more platforms.

15-Jan-2001:

- FLAC 0.5 released. This is the first beta version of FLAC. Being beta, there will be no changes to the format that will break older streams, unless a serious bug involving the format is found. What this means is that, barring such a bug, streams created with 0.5 will be decodable by future versions. This version also includes some new features:
  - An MD5 signature of the unencoded audio is computed during encoding, and stored in the Encoding metadata block in the stream header. When decoding, flac will now compute the MD5 signature of the decoded data and compare it against the signature in the stream header.
  - A test mode (-t) has been added to flac. It works like decode mode but doesn't write an output file.

23-Dec-2000:

- FLAC 0.4 released. This version fixes a bug in the constant subframe detection. More importantly, a verify option (-V) has been added to flac that verifies the encoding process. With this option turned on, flac will create a parallel decoder while encoding to make sure that the encoded output decodes to exactly match the original input. In this way, any unknown bug in the encoder will be caught and flac will abort with an error message.

10-Dec-2000:

- FLAC debuts on SourceForge. The FLAC project is now being hosted on SourceForge. Visit the FLAC project page to join the mailing list or sign up as a developer.

Copyright (c) 2000,2001,2002,2003,2004,2005,2006,2007 Josh Coalson |  |  |