I. Included Third-Party Software

This product includes software developed at
The Apache Software Foundation (http://www.apache.org/).
Licensed under the Apache License 2.0.

This product includes software developed at
The OSGi Alliance (http://www.osgi.org/).
Copyright (c) OSGi Alliance (2000, 2012).
Licensed under the Apache License 2.0.

This product includes software from http://www.jquery.com
Copyright (c) 2009 John Resig, http://jquery.com/
Licensed under the MIT License

This product includes software from http://www.jqueryui.com
Copyright (c) 2009 AUTHORS.txt, http://jqueryui.com/
Licensed under the MIT License

This product includes software from http://tablesorter.com
Copyright (c) 2007 Christian Bach
Licensed under the MIT License

This product includes software from http://www.fyneworks.com
Copyright (c) 2008 Fyneworks.com
Licensed under the MIT License

This product includes icons from the Silk Icon set
(http://www.famfamfam.com/lab/icons/silk/)
Copyright (c) 2006 Mark James
Licensed under the Creative Commons Attribution 2.5 License

This product includes software from http://code.google.com/p/cookies/
Copyright (c) 2005 - 2009, James Auldridge
Licensed under the MIT License

This product includes software from http://developer.yahoo.net/yui/
Copyright (c) 2009, Yahoo! Inc. All rights reserved.
Licensed under the BSD License

This product includes software from the Mozilla Foundation
Licensed under the MIT License

This product includes software from http://seyfertdesign.com/jquery/
Copyright (c) 2009, http://seyfertdesign.com/
Licensed under the MIT License


II. Used Third-Party Software

This product uses software developed at
The OSGi Alliance (http://www.osgi.org/).
Copyright (c) OSGi Alliance (2000, 2009).
Licensed under the Apache License 2.0.


III. License Summary

- Apache License 2.0
- JSON License
- MIT License
- Creative Commons Attribution 2.5 License
- Tanner Hildebrand's License