IMPORTANT - READ CAREFULLY: This Software License Agreement ("Agreement")
is a legal agreement between Licensee (either an individual or a single
entity), (“Licensee”) and Avago Technologies General IP (Singapore) Pte.
Ltd., ("Broadcom") for the Licensed Code, (hereinafter defined).

By installing, copying, or otherwise using the Licensed Code (hereinafter
defined), Licensee agrees to be bound by the terms of this Agreement. If
Licensee does not agree to the terms of this Agreement, Licensee may not
install, copy or use the Licensed Code. The Licensed Code is licensed, not
sold.

NOW THEREFORE, in consideration of the foregoing and the mutual promises
and covenants contained in this Agreement the parties hereby agree as
follows:

1. Definitions

1.1. "Authorized Use for Source Code" means use of the Source Code solely
     for the purpose of internally developing, modifying, integrating and
     testing Licensee's Products to interface with Broadcom Devices
     authorized for such integration, and for no other use or purpose.

1.2. "Authorized Use for Binary Code" means use of the Binary Code solely
     for the purpose of internal evaluation or developing, integrating,
     testing and use of Licensee's Products to interface with Broadcom
     Devices and for no other application, use or purpose.

1.3. "Authorized Use for Internal Code" means use of the Internal Use Code
     solely for the purpose of internally developing, modifying,
     integrating and testing Licensee's Products to interface with Broadcom
     Devices authorized for such integration, and for no other use or
     purpose.

1.4. "Documentation" means explanatory and informational materials or
     documentation concerning the Licensed Code, in printed or electronic
     format, including without limitation, manuals, descriptions, user and/
     or installation instructions, diagrams, printouts, listings,
     flowcharts, and training materials, contained on visual media such as
     paper or photographic film, or on other physical storage media in
     machine-readable form. Documentation does not include any code.

1.5. "Licensed Code" means collectively all the software programs which are
     owned or distributed by Broadcom and obtained by Licensee via download
     from the Broadcom support web-pages through acceptance of this
     Agreement. The Licensed Code is specifically referenced individually
     in this Agreement as Source Code, Binary Code, or Internal Use Code.

1.6. "Licensee Products" means the hardware and software (and related
     Licensee documentation) that will be developed or modified by or for
     Licensee utilizing the Licensed Code for the purpose of interfacing or
     being used with Broadcom Devices.

1.7. "Updates" means maintenance releases, bug fixes, errata or other
     corrections, and minor improvements or modifications to the Licensed
     Code which may be provided by Broadcom to Licensee from time to time
     at Broadcom's sole discretion. Broadcom is under no obligation to
     provide Updates or provide support and maintenance services to
     Licensee or Licensee Subsequent Users.

1.8. "New Version" means significant changes, modifications, enhancements,
     and/or functional improvements to the Licensed Code. New Versions are
     made and generally distributed solely at the discretion of Broadcom.
     Licensee must use the latest New Version of Licensed Code that is
     available. Broadcom is under no obligation to port any development
     work from one version to the latest New Version of Licensed Code.

1.9. "Broadcom Devices" means those Broadcom products intended for use with
     the Licensed Code and purchased from Broadcom or its agents.

1.10. "Derivative Works" means: (a) for copyrightable or copyrighted
      material, any translation (including translation into other computer
      languages), port, modification, correction, addition, extension,
      upgrade, improvement, compilation, abridgment or other form in which
      an existing work may be recast, transformed or adapted; (b) for
      patentable or patented material, any improvement thereon; and (c) for
      material which is protected by trade secret, any new material derived
      from such existing trade secret material, including new material
      which may be protected by copyright, patent and/or trade secret.

1.11. "Intellectual Property Rights" means (by whatever name or term known
      or designated) copyrights, trade secrets, patents, moral rights and
      any other intellectual and industrial property and proprietary rights
      (excluding trademarks) including registrations, applications,
      renewals and extensions of such rights anywhere in the world.

1.12. "Binary Code" means the software programs provided for distribution
      at the Broadcom support web-pages, in binary form, any other machine
      readable materials, including, but not limited to, libraries, source
      files, header files, and data files, any Updates and New Versions
      provided by Broadcom.

1.13. "Source Code" means the software programs provided for distribution
      at the Broadcom support web-pages, in source form including, but not
      limited to, libraries, source files, header files, and data files,
      and Updates and New Versions provided by Broadcom.

1.14. "Internal Use Code" means the software programs provided for
      distribution at the Broadcom support web-pages, in source code or
      object code format including, but not limited to, libraries, source
      files, header files, and data files, and Updates and New Versions
      provided by Broadcom that are only for Licensee's internal use.

1.15. "JRE Code" mean Oracle Corporation's JAVA SE Runtime Environment
      Code.

1.16. "Subsequent User" means any user subsequent to Licensee, including
      but not limited to, all Licensee customers, resellers, end users, and
      OEMs.

1.17 "Taxes" shall mean all taxes, levies, imposts, duties, fines or other
     charges of whatsoever nature however imposed by any country or any
     subdivision or authority thereof in any way connected with this
     Agreement or any instrument or agreement required hereunder, and all
     interest, penalties or similar liabilities with respect thereto,
     except such taxes as are imposed on or measured by a party's net
     income or property.


2. Grant of Rights

2.1 Binary Code. Subject to the terms of this Agreement, Broadcom grants to
    Licensee a non-exclusive, world-wide, revocable (for breach in
    accordance with Section 7), non-transferable limited license, without
    the right to sublicense except as expressly provided herein, solely to:

(a) Use the Binary Code and related Documentation solely for the Authorized
    Use for Binary Code and only with Broadcom Devices

(b) Make copies of the Binary Code and related Documentation to support the
    Authorized Use for Binary Code and for archival and backup purposes in
    support of the Authorized Use for Binary Code only with Broadcom
    Devices;

(c) Distribute the Binary Code as incorporated in Licensee's Products or
    for use with Broadcom Devices to its Subsequent Users;

(d) Distribute the Documentation related to Binary Code only for use with
    Broadcom Devices;

(e) Sublicense the rights provided in paragraphs (a) and (b) above in
    accordance with the terms provided in this Agreement to contract
    manufacturers ("CMs") and/or original design manufacturers ("ODMs"),
    in each case meeting the requirements of Section 3.1(d) below for the
    purpose of manufacturing Licensee's Products; and (f) Sublicense the
    rights provided in paragraphs (b) and (c) in accordance with the terms
    provided in this Agreement to Subsequent Users who are not end users
    for the purpose of distributing and supporting Licensee's Product.

2.2 Source Code. Subject to the terms of this Agreement, Broadcom grants to
    Licensee a non-exclusive, worldwide, revocable (for breach in
    accordance with Section 7), non-transferable limited license, without
    the right to sublicense except as expressly provided herein, solely to:

(a) Use the Source Code and related Documentation solely for the Authorized
    Use for Source Code and only with Broadcom Devices;

(b) Make copies of the Source Code and related Explanatory Material to
    support the Authorized Use for Source Code only and for archival and
    backup purposes in support of the Authorized use for Source Code only
    with Broadcom Devices;

(c) Modify and prepare Derivative Works of the Source Code for the
    Authorized Use for Source Code and only for use with Broadcom Devices;

(d) Distribute the binary form only of any authorized Derivative Work of
    the Source Code ("Licensee Binary Derivative") and necessary portions
    of the related Documentation only for use with Broadcom Devices; and

(e) Sublicense the rights granted in paragraph (d) above in accordance with
    the terms provided in this Agreement to Subsequent Users who are not
    end users for the purpose of distributing and supporting Licensee's
    Product.

2.3 Internal Use Code. Subject to the terms of this Agreement, Broadcom
    grants to Licensee a non-exclusive, worldwide, revocable (for breach in
    accordance with Section 7), non-transferable limited license, without
    the right to sublicense or distribute, solely to:

(a) Use the Internal Use Code and related Documentation solely for the
    Authorized Use for Internal Code and only with Broadcom Devices; and

(b) Make copies of the Internal Use Code and related Documentation to
    support the Authorized Use for Internal Code only and for archival and
    backup purposes in support of the Authorized use for Internal Code only
    with Broadcom Devices.

2.4 Without limiting Section 4, Licensee may exercise the foregoing rights
    directly and/or indirectly through its employees and contractors, who
    are bound by terms at least as restrictive as this Agreement.


3. License Restrictions

3.1. Binary Code. The Licenses granted in Section 2.1 for Binary Code and
     related Documentation are subject to the following restrictions:

(a) Licensee shall not use the Binary Code and related Documentation for
    any purpose other than as expressly provided in Article 2;

(b) Licensee shall reproduce all copyright notices and other proprietary
    markings or legends contained within or on the Binary Code and related
    Documentation on any copies it makes; and

(c) Licensee shall not distribute or disclose the Binary Code and related
    Documentation except pursuant to an agreement with terms at least as
    protective of the Binary Code as the terms of this Agreement. Licensee
    shall not, and shall not allow its Subsequent Users to, disassemble,
    de-compile, or reverse engineer the Binary Code.

(d) Licensee may grant the sublicense set forth in Section 2.1(e) to its
    CMs and ODMs, provided that each such CM and ODM agrees to abide by the
    terms and conditions of this Agreement and Licensee shall remain
    responsible for any failure by its CMs and ODM to comply with the terms
    and conditions of this Agreement.

3.2. Source Code. The Licenses granted in Section 2.2 for Source Code and
     related Documentation are subject to the following restrictions:

(a) Licensee shall not use the Source Code and related Documentation for
    any purpose other than as expressly provided in Article 2;

(b) Licensee shall reproduce all copyright notices and other proprietary
    markings or legends contained within or on the Source Code and related
    Documentation on any copies it makes;

(c) Licensee shall not distribute or disclose any Source Code and related
    Documentation to any Subsequent Users or third parties, without the
    express written consent of Broadcom;

(d) Licensee shall not knowingly infringe upon the intellectual property
    rights of any third party when making Derivative Works to the Source
    Code;

(e) Licensee shall not disassemble, reverse-engineer, or decompile the
    Source Code, except for making authorized Derivative Works; and

(f) Licensee shall not distribute or disclose the Licensee Binary
    Derivative except pursuant to an agreement with terms at least as
    protective as those in this Agreement protecting Binary Code. Licensee
    shall not, and shall not allow its Subsequent Users to, disassemble,
    de-compile, or reverse engineer the Licensee Binary Derivative.

3.3. Internal Use Code. The Licenses granted in Section 2.3 for Internal
     Use Code and related Documentation are subject to the following
     restrictions:

(a) Licensee shall not use the Internal Use Code and related Documentation
    for any purpose other than as expressly provided in Article 2;

(b) Licensee shall reproduce all copyright notices and other proprietary
    markings or legends contained within or on the Internal Use Code and
    related Documentation on any copies it makes;

(c) Licensee shall not distribute or disclose any Internal Use Code and
    related Documentation to any Subsequent Users or third parties, without
    the express written consent of Broadcom; and

(d) Licensee shall not disassemble, reverse-engineer, or decompile the
    Internal Use Code.

3.4. Derivative Works of Source Code Made by Licensee. Subject to
     Broadcom's rights in the underlying Source Code, Licensee shall own
     all right, title and interest in and to the Derivative Works (both
     binary and source format) it makes from Source Code, provided that
     such Derivative Works are not made in breach of this Agreement.
     Licensee shall not be required to disclose its Derivative Works of the
     Source Code to Broadcom. Broadcom shall have no obligations whatsoever
     to support, maintain, contribute to, or provide Updates, New Versions
     or any modifications to Licensee Derivative Works of the Source Code
     and shall have no liability whatsoever for such Derivative Works. In
     the event Licensee requests Broadcom's input regarding Licensee
     Derivative Works of Source Code and plans to disclose such Derivative
     Works to Broadcom, a separate written agreement shall first be
     executed by the parties.

3.5. Broadcom Derivative Works. Nothing contained herein shall prevent
     Broadcom from creating any Derivative Works of its Source Code at any
     time. Licensee further agrees that Broadcom may independently create a
     Derivative Work similar to or in competition with the Licensee
     Derivative Work of the Source Code and may use that Derivative Work
     for any purpose. Licensee grants Broadcom a Covenant Not to Sue for
     any independently developed Derivative Works created by Broadcom for
     its own Source Code that Licensee may believe or claim infringes on
     any of Licensee's Intellectual Property Rights relating to the
     Licensee Derivative Works of the Source Code.

3.6. U.S. Government Subsequent Users. All Licensed Code and Documentation
     qualify as "commercial items," as that term is defined at
     48 C.F.R. 2.101, consisting of "commercial computer software" and
     "commercial computer software documentation" as such terms are used in
     48 C.F.R. 12.212. Consistent with 48 CFR 52.227-19, 48 C.F.R.12.212
     and 48 C.F.R. 227.7202-1 through 227.7202-4, Licensee will provide to
     U.S. Government end users such Binary Code with only those rights set
     forth herein that apply to non-governmental end users. Use of such
     Binary Code constitutes agreement by the government entity that the
     computer software and computer software documentation is commercial
     and constitutes acceptance of the rights and restrictions herein.

3.7. No Implied Licenses. Except for the express and limited licenses
     granted herein for specific purposes, no rights or licenses are
     granted by Broadcom under this Agreement, by implication, inducement,
     estoppel or otherwise with respect to any proprietary information or
     to any patents, copyrights, trade secrets, trademarks, maskworks or
     other Intellectual Property Rights owned or controlled by Broadcom.
     Any further licenses must be express, in writing and signed by an
     authorized representative of Broadcom.

3.8. Injunctive Relief. In the event of a breach by Licensee of Section 2
     or 3, Broadcom shall be entitled to applicable injunctive relief and
     to all remedies available in equity and law to prevent Licensee from
     disassembling, de-compiling, reverse engineering, disclosing or using
     the Licensed Code in whole or in part.

3.9. Licensed Code Containing JRE. Certain Licensed Code may contain JRE.
     Use of the JRE is restricted by JRE licensing terms to General Purpose
     Desktop Computers and Servers, as defined below. Licensee may seek its
     own license for the JRE directly with the owner, if it deems
     necessary. "General Purposes Desktop Computers and Servers" under JRE
     licensing terms is defined as "computers, including desktop, laptop
     and tablet computers, or servers, used for general computing functions
     under end user control (such as but not specifically limited to email,
     general purpose Internet browsing and office suite productivity
     tools)". The full terms and conditions for use of the JRE are
     available at: http://www.oracle.com/technetwork/java/javase/terms/license/index.html.

3.10. Notwithstanding anything to the contrary in this Agreement, to the
      extent there is a conflict between this Agreement provisions and any
      applicable license to open source technology, the provisions of the
      open source license shall take precedence and be followed, but only
      to the minimum extent reasonably necessary to comply with the
      applicable open source license.


4. Confidentiality

4.1 Licensee agrees to limit access to the Licensed Code and Documentation
    to employees and contractors of Licensee (which may include, without
    limitation, contractors retained by Licensee to maintain or modify the
    Licensed Code and Documentation on behalf of Licensee) having a need to
    access or know the Licensed Code and Documentation and who have
    executed nondisclosure agreements with Licensee obligating them to
    maintain the confidentiality of the Licensed Code and Documentation.

4.2 Licensee shall hold in confidence the Licensed Code and Documentation
    as Broadcom's confidential information ("Confidential Information") and
    shall use the Broadcom Code and Documentation only as expressly
    provided in Section 2, and protect the confidentiality of such
    Confidential Information with the same degree of care as Licensee uses
    to protect its own confidential or proprietary information of great
    commercial value, but in no event less than reasonable care and for no
    less than three (3) years from the date of disclosure.

4.3 Licensee agrees to notify Broadcom immediately after Licensee becomes
    aware of any suspected misuse or unauthorized disclosure of any
    Confidential Information. The obligations of confidentiality imposed on
    Licensee under this Section 4 shall not apply or shall cease to apply
    to any of such Confidential Information that Licensee clearly
    establishes: (i) was already rightfully in the possession of Licensee
    at the time of disclosure as evidenced by records of Licensee; (ii) is
    or becomes publicly available through no act or omission of Licensee;
    (iii) is rightfully received by Licensee from a third party without an
    obligation of confidentiality; (iv) is independently developed by
    Licensee's employees or contractors without use of or access to the
    information; or (v) is approved for unrestricted disclosure in writing
    by an authorized representative of Broadcom. Broadcom makes no warranty
    as to the accuracy of any Confidential Information, which is furnished
    "AS IS" with all faults.


5. Ownership of Code by Broadcom, Fees, and Taxes

5.1 Broadcom (or its licensors) reserve all right, title, ownership and
    interest in and to the Licensed Code and Documentation existing prior
    to and after the Effective Date of this Agreement, or created or
    generated by Broadcom (or its licensors) at any time, subject to any
    licenses granted. Broadcom (or its licensors) reserves all right,
    title, ownership and interest in and to any Derivative Works it creates
    at any time to the Licensed Code and Documentation, subject to any
    licenses granted.

5.2 Fees and Taxes. No fees are due in connection with this Agreement
    unless separately specified by Broadcom. If any such fees are
    separately specified in writing, the following applies:

5.2.1 Payment is due by Licensee upon download, at time of purchase, or no
      later than within thirty (30) days of date of Broadcom invoice
      therefore, as designated by Broadcom All payments shall be made in
      U.S. currency unless otherwise agreed. If at any time, Licensee is
      delinquent in the payment of any invoice, or is otherwise in breach
      of this Agreement, Broadcom may, at its discretion, and without
      prejudice to its other rights, withhold delivery (including partial
      delivery) of any order or may, at its option, require Licensee to
      prepay for further deliveries. Any sum not paid by Licensee, when
      due, shall bear interest until paid at a rate of 1.5% per month
      (18% per annum) or the maximum rate permitted by law, whichever is
      less.

5.2.2 All payments or reimbursements due under this Agreement and any
      instrument or agreement required hereunder shall be made free and
      clear and without deduction for any and all present and future Taxes.
      Payments due to Broadcom under this Agreement and any instrument or
      agreement required hereunder shall be increased so that amounts
      received by Broadcom, after provisions for Taxes and all Taxes on
      such increase, will be equal to the amounts required under this
      Agreement and any instrument or agreement required hereunder if no
      Taxes were due on such payments.

5.2.3 The Licensee shall indemnify Broadcom for the full amount of Taxes
      attributable to the provision of products or services under this
      Agreement, and any liabilities (including penalties, interest and
      expenses) arising from such Taxes, within thirty (30) days from any
      written demand by Broadcom. The Licensee shall provide evidence that
      all applicable Taxes have been paid to the appropriate taxing
      authority by delivering to Broadcom receipts or notarized copies
      thereof within thirty (30) days after the due date for such tax
      payments.

5.2.4 Without prejudice to the survival of any other Agreement of Licensee
      hereunder, the obligations of Licensee contained in this section
      shall survive the payment in full of all payments hereunder.


6. Support

(a) Broadcom may provide the following support services for the Licensed
    Code to the extent Broadcom deems reasonable: Updates if and when
    released and errata in Broadcom's sole discretion. Broadcom shall not
    be responsible for any other support or maintenance of Licensed Code to
    Licensee or its Subsequent Users, unless otherwise agreed to in
    writing. Broadcom is under no obligation to provide support services
    and may discontinue support services at any time. Broadcom will not
    provide support for modified Licensed Code or Licensee's Derivative
    Works of the Source Code.

(b) Any Updates to the Licensed Code provided by Broadcom (which shall only
    be provided by Broadcom in its sole discretion) shall be governed by
    the terms of this Agreement.

(c) If Licensee finds what Licensee considers an error in the Licensed
    Code, Licensee will notify Broadcom so that Broadcom can, in its sole
    discretion, make corrections to the Licensed Code or to future
    revisions of the Licensed Code.


7. Term and Termination

7.1 Term. The term of this Agreement is five (5) years from the Effective
    Date, subject to renewal upon mutual agreement of the parties.

7.2 Termination for Breach. If Licensee breaches any material provision of
    this Agreement, Broadcom shall have the right to terminate this
    Agreement, including all licenses granted hereunder, in addition to any
    and all other remedies available at law or equity, unless Licensee
    cures such breach within sixty (60) days ("Cure Period") after
    receiving written notice of the breach by Broadcom. Licensee shall make
    best efforts to cure the material breach in the least amount of time
    possible within the Cure Period.

7.3 Insolvency. If either party: (a) becomes substantially insolvent;
    (b) makes an assignment for the benefit of creditors; (c) files or has
    filed against it a petition in bankruptcy or seeking reorganization;
    (d) has a receiver appointed; or (e) institutes any proceedings for
    liquidation or winding up or have such proceedings instituted against
    it; then the other party may, in addition to other rights and remedies
    it may have, terminate this Agreement immediately by written notice.

7.4 Consequences. Upon termination or expiration of this Agreement for any
    reason whatsoever, the licenses, rights, and covenants granted
    hereunder and any obligations imposed hereunder shall cease except as
    otherwise expressly set forth herein as surviving termination or
    expiration.

7.5 Return of Confidential Information. Upon expiration or termination of
    this Agreement for any reason or upon written request by Broadcom,
    Licensee agrees to promptly return to Broadcom or, at Broadcom's
    request, destroy and certify by an officer of Licensee in writing the
    destruction of, all Broadcom Confidential Information furnished to
    Licensee, including all Licensed Code and Documentation.

7.6 Survival of Licenses. Any Licensed Code and Documentation distributed
    by Licensee prior to the effective date of any termination, expiration,
    breach, or cancellation of this Agreement, shall remain licensed
    (including any Licensed Code in inventory, manufactured in, or work in
    progress with Licensee products) under the terms of this Agreement.
    Licensee may retain an archival copy of portions of the Broadcom
    Confidential Information, including Licensed Code and Documentation,
    necessary for Licensee to provide ongoing technical support to
    Subsequent Users using the Licensed Code ("Archival Materials") after
    termination, expiration or cancellation of this Agreement. Such
    Archival Materials may not be used for any other purpose without the
    written consent from Broadcom. Licensee shall keep such Archival
    Materials confidential for an additional five (5) years from the date
    of termination, expiration, or cancellation of this Agreement,
    regardless of when the Broadcom Confidential Information was disclosed.

7.7 Survival. In the event of expiration or termination of this Agreement
    for any reason, the following sections of this Agreement shall survive:
    1, 3, 4, 5, 7, 8, 9, and 10. Termination will not prejudice either
    party to require performance of any obligation due at the time of
    termination. All end user licenses in effect and in compliance with the
    Agreement prior to effective termination or expiration shall survive
    and continue in full force and effect in accordance with their terms
    and Licensee may continue to perform its obligations thereunder,
    including support obligations.


8. Disclaimer of All Warranties

8.1 THE PARTIES AGREE THAT BROADCOM FURNISHES THE LICENSED CODE AND
    DOCUMENTATION TO LICENSEE "AS IS", UNSUPPORTED, WITHOUT WARRANTY OF ANY
    KIND. BROADCOM DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING
    THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
    PURPOSE AND NON-INFRINGEMENT, INCLUDING ANY THAT MAY ARISE FROM A
    COURSE OF PERFORMANCE, A COURSE OF DEALING OR TRADE USAGE. BROADCOM
    SHALL NOT BE LIABLE FOR ANY ERROR, OMISSION, DEFECT, DEFICIENCY, OR
    NONCONFORMITY IN THE LICENSED CODE OR DOCUMENTATION. BROADCOM MAKES NO
    WARRANTY OR REPRESENTATION THAT THE LICENSED CODE OR DOCUMENTATION WILL
    MEET LICENSEE'S REQUIREMENTS OR WILL WORK IN COMBINATION WITH ANY
    HARDWARE OR SOFTWARE APPLICATION.

8.2 BROADCOM DISCLAIMS ANY AND ALL LIABILITY IN CONNECTION WITH LICENSEE'S
    USE OF THE LICENSED CODE IN ANY MEDICAL, NUCLEAR, AVIATION, NAVIGATION,
    MILITARY, OR OTHER HIGH RISK DEVICE OR APPLICATION. LICENSEE REPRESENTS
    AND WARRANTS THAT IT WILL NOT USE THE LICENSED CODE IN ANY MEDICAL,
    NUCLEAR, AVIATION, NAVIGATION, MILITARY, OR OTHER HIGH RISK DEVICE OR
    APPLICATION. LICENSEE SHALL INDEMNIFY, DEFEND, AND HOLD BROADCOM
    HARMLESS AGAINST ANY LOSS, LIABILITY, OR DAMAGE OF ANY KIND THAT
    BROADCOM INCURS IN CONNECTION WITH BREACH OF THE WARRANTY IN THIS
    SECTION 8.2.

8.3 BROADCOM DISCLAIMS ANY AND ALL LIABILITY IN CONNECTION WITH LICENSEE'S
    CREATION AND USE OF DERIVATIVE WORKS OF THE SOURCE CODE. LICENSEE SHALL
    INDEMNIFY, DEFEND, AND HOLD BROADCOM HARMLESS AGAINST ANY LOSS,
    LIABILITY, OR DAMAGE OF ANY KIND THAT BROADCOM INCURS IN CONNECTION
    WITH LICENSEE'S DERIVATIVE WORKS OF SOURCE CODE.


9. Limitation of Liability

IN NO EVENT SHALL BROADCOM, ITS EMPLOYEES, AFFILIATES OR SUPPLIERS BE
LIABLE FOR ANY LOST PROFITS, REVENUE, SALES OR DATA OR COSTS OF PROCUREMENT
OF SUBSTITUTE GOODS OR SERVICES, INTERRUPTION, LOSS OF BUSINESS INFORMATION
OR ANY SPECIAL, DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, ECONOMIC OR
PUNITIVE DAMAGES, HOWEVER CAUSED, AND WHETHER ARISING UNDER CONTRACT, TORT,
STRICT LIABILITY, NEGLIGENCE OR OTHER THEORY OF LIABILITY, ARISING OUT OF
THE USE OR INABILITY TO USE THE LICENSED CODE OR DOCUMENTATION, EVEN IF
BROADCOM OR ITS EMPLOYEES, SUPPLIERS OR AFFILIATES ARE ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES. IN THE EVENT THAT THE APPLICABLE JURISDICTION
DOES NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY, BUT DOES ALLOW
LIABILITY TO BE LIMITED, THE LIABILITY OF BROADCOM, ITS EMPLOYEES,
AFFILIATES, OR SUPPLIERS IN SUCH CASES, SHALL BE LIMITED TO
$100 US DOLLARS.


10. General

10.1 Assignment. Licensee shall not assign this Agreement or any of its
     rights or delegate any of its duties under this Agreement without the
     prior written consent of Broadcom. Subject to the foregoing, this
     Agreement will be binding upon, enforceable by, and inure to the
     benefit of the parties and their respective successors and assigns.
     Any attempted assignment in violation of this Section 10.1 shall be
     null and void.

10.2 Governing Law. This Agreement shall be construed and interpreted in
     accordance with the law of the State of California without reference
     to its conflicts of law principles.

10.3 Exclusive Jurisdiction. All disputes arising out of or related to this
     Agreement will be subject to the exclusive jurisdiction and venue of
     the California state courts of Santa Clara County, California in
     United States District Court for the Northern District of California,
     and the parties consent to the personal and exclusive jurisdiction of
     these courts.

10.4 Export Control. Licensee shall follow all export control laws and
     regulations relating to the Licensed Code and Documentation. Licensee
     hereby acknowledges responsibility for compliance with all applicable
     US and local laws and regulations related to import and export and
     acknowledges and agrees that the Licensed Code is subject to the U.S.
     Export Administration Regulations. Diversion contrary to U.S. law is
     prohibited. Licensee agrees that the Licensed Code is being or will be
     acquired for, shipped, transferred, or re-exported, directly or
     indirectly, to prohibited or embargoed countries, nor be used for any
     prohibited end-use, such as nuclear activities, chemical/biological
     weapons, or missile projects, unless expressly authorized by the U.S.
     Government. Prohibited countries are set forth in the Supplement 1 to
     Part 740 of the U.S. Export Administration Regulations. Countries
     currently subject to U.S. embargo include: Cuba, Iran, N. Korea, Sudan
     and Syria. This list is subject to change without further notice from
     Broadcom and Licensee understands that compliance with the list as it
     exists in fact, is required. Licensee assumes sole responsibility for
     obtaining any/all licenses required for export or re-export. All ECCN
     and CCATS numbers and License Exception information are subject to
     change without notice. Modification in any way nullifies the
     classification. It is therefore Licensee’s obligation as an exporter
     to verify such information and comply with the then currently
     applicable regulations. Any data provided by Broadcom is for
     informational purposes only. Broadcom makes no representation or
     warranty as to the accuracy or reliability of any classifications or
     numbers. Any use of such classifications or numbers by Licensee is
     without recourse to Broadcom and is at Licensee’s own risk. Broadcom
     is in no way responsible for any damages, whether direct, indirect,
     consequential, incidental or otherwise, suffered by Licensee as a
     result of using or relying upon such classifications or numbers for
     any purpose whatsoever. Licensee agrees to consult the EAR, the
     Bureau of Industry and Security's Export Counseling Division, and
     other appropriate sources before distributing, importing, or using
     Broadcom products. Licensee may request software classification
     information from Broadcom. If requested, Customer agrees to sign
     written assurances and other export-related documents as may be
     required by Broadcom.

10.5 Waiver. No failure or delay on the part of either party in the
     exercise of any right or privilege hereunder shall operate as a waiver
     thereof or of the exercise of any other right or privilege hereunder,
     nor shall any single or partial exercise of any such right or
     privilege preclude other or further exercise thereof or of any other
     right or privilege.

10.6 Notice. Any notice or claim provided for herein to Broadcom shall be
     in writing and addressed as set forth below, and shall be given (i) by
     personal delivery, effective upon delivery, or (ii) by first class
     mail, postage prepaid, addressed as set forth below, effective one (1)
     business day after proper deposit in the mail to Broadcom, 1320 Ridder
     Park Drive, San Jose, California 95131, USA; Attn. Legal Department -
     Important Legal Notice.

10.7 Severability. If any term, condition, or provision of this Agreement,
     or portion of this Agreement, is found to be invalid, unlawful or
     unenforceable to any extent, the parties will endeavor in good faith
     to agree to such amendments that will preserve, as far as possible,
     the intentions expressed in this Agreement. Such invalid term,
     condition or provision will be severed from the remaining terms,
     conditions and provisions, which will continue to be valid and
     enforceable to the fullest extent permitted by law.

10.8 Other Rights. Nothing contained in this Agreement shall be construed
     as conferring by implication, estoppel, or otherwise upon either party
     or any third party any license or other right except, solely as to the
     parties hereto, the rights expressly granted hereunder.

10.9 Integration; Modification. This Agreement embodies the final, complete
     and exclusive statement of the terms agreed upon by the parties with
     respect to the subject matter hereof and supersedes any prior or
     contemporaneous representations, descriptions, courses of dealing, or
     agreements in regard to such subject matter. No amendment or
     modification of this Agreement shall be valid or binding upon the
     parties unless stated in writing and signed by an authorized
     representative of each party.

10.10 Publicity. All publicity concerning this transaction referring to the
      other party shall require the other party's prior written approval
      which shall not be unreasonably withheld.

10.11 Relationship of the Parties. The relationship of the parties hereto
      is that of independent contractors. Neither party, nor its agents or
      employees, shall be deemed to be the agent, employee, joint venture
      partner, partner or fiduciary of the other party. Neither party shall
      have the right to bind the other party, transact any business on
      behalf of or in the name of the other party, or incur any liability
      for or on behalf of the other party.
