Terms and Conditions of Use

IMPORTANT - PLEASE READ THESE TERMS AND CONDITIONS CAREFULLY WHEN YOU
(HEREAFTER, "YOU" OR "YOUR") ARE ORDERING OR ACCESSING THE LISTED
SERVICES AND/OR SOFTWARE FROM LOGMEIN, INC. ("LMI"). These terms
and conditions ("Terms") govern the use and licensing by LMI of the
following LogMeIn® service(s) and related software: (LogMeIn Backup®,
LogMeIn® Central™, LogMeIn Free®, LogMeIn® Ignition™, LogMeIn IT
Reach®, LogMeIn® Mac, LogMeIn Pro®, LogMeIn Pro2®, LogMeIn Rescue®,
LogMeIn® Rescue+Mobile™,  LogMeIn Hamachi®, LogMeIn Hamachi2® and
any other related software or services) (the "Service") and the Network
Console™ software (the "Software" and together with the Service, the
"Products"). BY COMPLETING THE ELECTRONIC ACCEPTANCE PROCESS, CLICKING
THE "SUBMIT" OR "ACCEPT" BUTTONS, SIGNING, USING ANY OF THE PRODUCTS OR
OTHERWISE INDICATING YOUR ACCEPTANCE OF THESE TERMS, YOU REPRESENT AND
WARRANT THAT YOU: (I) ARE AUTHORIZED TO SIGN FOR AND BIND YOURSELF AND
ANY OTHER PARTY ON WHOSE BEHALF YOU USE THE SERVICE AND/OR SOFTWARE (THE
"CONTRACTING PARTY") AND (II) AGREE FOR YOURSELF AND THE CONTRACTING PARTY
TO BE BOUND BY ALL OF THESE TERMS (INCLUDING THE DISCLAIMER OF WARRANTY
AND LIMITATION OF LIABILITY SECTIONS SET FORTH BELOW) TO THE EXCLUSION
OF ANY OTHER RIGHTS AND OBLIGATIONS, SUCH AS ANY RIGHTS, OBLIGATIONS OR
OTHER TERMS LISTED ON A PURCHASER ORDER OR THE LIKE YOU OR THE CONTRACTING
PARTY MAY PROVIDE LMI AND YOU AGREE THAT ANY SUCH RIGHTS, OBLIGATIONS OR
OTHER TERMS LISTED ON SUCH PURCHASE ORDER OR THE LIKE ARE HEREBY NULL
AND VOID. LMI reserves the right, exercised in its sole discretion, to
change, modify, add, or delete portions of these Terms at any time in
accordance with the procedures set forth below in the section labeled
"Modifications".

1. Registration

To use the Products, You and/or the Contracting Party may be required
to complete and submit a registration form ("Registration Form"). As
part of this registration process for, You and the Contracting Party
agree to: (i) provide certain limited information about Yourself and
the Contracting Party as prompted to do so by during the registration
process or thereafter by the Products (such information to be current,
complete and accurate) and (ii) maintain and update this information
as required to keep it current, complete and accurate. The information
requested at the time of the original signup shall be referred to
as registration data ("Registration Data"). You may not register for
any Service if You are under 18 years of age. By registering, You and
the Contracting Party represent to LMI that You are 18 years of age or
older. If LMI discovers that any of Your Registration Data is inaccurate,
incomplete or not current, or if LMI determines, in its sole discretion,
that You or the Contracting Party are not an appropriate subscriber or
user of the Products, LMI may terminate all rights to access, receive, use
and license the Products, Service and Software immediately upon notice.
Your and the Contracting Party's assent to these Terms constitutes your
express understanding and agreement that when personal data is provided
to LMI, such data will be processed in the United States. Any personal
data collected from or about users or licensees in connection with the
Service or Products, through the LMI website, or otherwise under these
Terms, will be maintained and processed in the United States by LMI or
a party acting on its behalf, as LMI's Services, Products and website
are provided via equipment and other resources located in the United
States. LMI's Privacy Policy describes how personally identifiable
information may be collected, used and disclosed.

2. Conduct

You and the Contracting Party are solely responsible for the content
of Your computer(s) and Your LMI account and any transmissions when
using the Products. LMI does, however, reserve the right to take
any action with respect to the same that LMI in its sole discretion
deems necessary or appropriate. The use of the Products by You and the
Contracting Party is subject to the end user license terms set forth
herein and all applicable laws, rules and regulations, including local,
state, national and international laws, rules and regulations (including
without limitation those governing account collection, export control,
consumer protection, unfair competition, anti-discrimination or false
advertising). You and the Contracting Party agree: (i) to comply with
all applicable laws, rules and regulations, including local, state,
national and international laws, rules and regulations (including
without limitation those governing account collection, export control,
consumer protection, unfair competition, anti-discrimination or false
advertising); (ii) not to post, distribute, or otherwise make available
or transmit any software or other computer files that contain a virus,
trojan horse, worm or other harmful or destructive component; (iii) not
to use the Products for any illegal purposes; (iv) not to delete from
the Products, Software, documentation or any web site used in connection
with the Products, any legal notices, disclaimers, or proprietary notices
such as copyright or trademark notices, or modify any logos that You or
the Contracting Party do not own or have express permission to modify;
(v) not to interfere or disrupt networks connected to the Service; (vi)
not to use the Products to infringe any third party's copyright, patent,
trademark, trade secret or other proprietary rights or rights of publicity
or privacy; and (vii) not to transmit any unlawful, harassing, libelous,
defamatory, racist, indecent, abusive, violent, threatening, intimidating,
harmful, vulgar, obscene, offensive or otherwise objectionable material
of any kind or nature. You and the Contracting Party will not attempt
to gain unauthorized access to other computer systems or interfere with
another user's use and enjoyment of the Products.  The Contracting Party
agrees it is responsible for all actions and inactions of its employees
and consultants and will use commercially reasonable efforts to monitor
its employees and consultants.

3. Modifications

LMI may amend these Terms at any time by (i) posting a revised Terms
document on or accessible through https://secure.logmein.com and/or (ii)
sending information regarding the Terms amendment to the email address
You may be required to provide to LMI. You and the Contracting Party are
responsible for regularly reviewing the https://secure.logmein.com site
to obtain timely notice of such amendments. You and the Contracting Party
manifest intent to accept these amended terms if You or the Contracting
Party continues to use any of the Products after such amended terms
have been posted or sent to You or the Contracting Party. If You or the
Contracting Party do not agree with any such amended terms You shall
notify LMI during the 30 day period after such amended terms have been
posted and at the end of such 30 day period these Terms shall be deemed
terminated unless LMI agrees to waive such amended terms to which You
object. Otherwise, these Terms may not be amended except in writing signed
by both parties. Further, LMI reserves the right to modify or discontinue
any Product for any reason or no reason with or without notice to You or
the Contracting Party. LMI shall not be liable to You or the Contracting
Party or any third party should LMI exercise its right to revise these
Terms or modify or discontinue a Product.

4. Passwords and Security

4.1 As part of the registration process described above for each Service
with the exception of LogMeIn Hamachi or LogMeIn Hamachi2 services,
You and the Contracting Party must use Your email address as Your
user name and choose a password for access to Your account and to Your
designated computers (You should choose a password for the Service that
is different from the username and password to Your computer). You
and the Contracting Party agree to carefully safeguard all of Your
passwords. You and the Contracting Party are solely responsible if
You or the Contracting Party do not maintain the confidentiality of
Your passwords and account information. Furthermore, You and the
Contracting Party are solely responsible for any and all activity
that occurs under Your account. You and the Contracting Party agree
immediately to notify LMI of any unauthorized use of Your account or
any other breach of security known to You or the Contracting Party,
including if You or the Contracting Party believe that Your password or
account information has been stolen or otherwise compromised. Access to,
and use of, password-protected and/or secure aspects of the Service is
restricted to authorized users only. Unauthorized individuals attempting
to use the Service may be subject to prosecution. 4.2 LMI is not liable
for any loss incurred by You or the Contracting Party, resulting from
another's use of Your password, account, or public / private key,
as may be applicable, either with or without Your knowledge. However,
You and the Contracting Party may be held liable for losses incurred by
LMI or another party due to another's use of Your password, account,
or public / private key, as may be applicable, either with or without
Your knowledge. You and the Contracting Party shall not access or use
someone else's account at any time, without the permission of the account
holder. 4.3 LMI does not send emails asking for a user's username and
password or its Windows username and password or any other username or
password. To keep the Products secure, You and the Contracting Party
should keep all usernames and passwords confidential.

5. End User License Agreement

These end user license terms grant a right and license allowing You and
the Contracting Party to use the Software and other software associated
with the Service (together, the "Licensed Programs") under certain
restrictions, terms and conditions (the "License Agreement"). You and the
Contracting Party are consenting to be bound by this License Agreement
by your use of the Products.

5.1 The Licensed Programs are made available for download solely
for use by You and the Contracting Party and only according to this
License Agreement. Any reproduction, resale or redistribution of
the Licensed Programs that is not in accordance with this License
Agreement is expressly prohibited, and may result in severe civil and
criminal penalties. Violators will be prosecuted to the maximum extent
possible. LMI is not transferring title to the Licensed Programs to You
or the Contracting Party. This license may not be transferred by You or
the Contracting Party to any third party and is non-exclusive.

5.2 You and the Contracting Party acknowledge that the Licensed Programs
are proprietary to LMI or its suppliers and are protected by copyrights,
trademarks, service marks, patents and/or other proprietary rights and
laws. Therefore, You and the Contracting Party agree that You and the
Contracting Party are only permitted to use the Licensed Programs as
expressly authorized by LMI and this License Agreement. You and the
Contracting Party may not remove any proprietary notices or labels
from the Licensed Programs. You may copy the Licensed Programs for
archival purposes only, provided any copy must contain all original
proprietary notices. You and the Contracting Party may not alter, modify,
redistribute, sell, auction, decompile, reverse engineer, disassemble or
otherwise reduce the Licensed Programs to a human-readable form. You and
the Contracting Party may not reproduce (except for archival purposes),
distribute or create derivative works based on the Licensed Programs
without expressly being authorized in writing to do so by LMI. Further,
You and the Contracting Party may not rent, lease, grant a security
interest in or otherwise transfer rights to the Licensed Programs. All
rights not expressly granted in this License Agreement are reserved to
LMI and its suppliers.

5.3 ALL CONTENT ON WEB SITES AND COMPUTER PROGRAMS ASSOCIATED WITH
THE SERVICE IS PROTECTED BY COPYRIGHT AND OTHER INTELLECTUAL PROPERTY
LAWS. EXCEPT AS SPECIFICALLY PERMITTED HEREIN, NO PORTION OF THE
INFORMATION OR CONTENT ON SUCH SITES MAY BE REPRODUCED IN ANY FORM,
OR BY ANY MEANS, WITHOUT PRIOR WRITTEN PERMISSION FROM LMI. YOU, THE
CONTRACTING PARTY AND ANY OTHER VISITOR OR USER ARE NOT PERMITTED TO
MODIFY, DISTRIBUTE, PUBLISH, TRANSMIT OR CREATE DERIVATIVE WORKS OF ANY
MATERIAL FOUND ON SUCH SITES FOR ANY PUBLIC OR COMMERCIAL PURPOSE.

6. Disclaimer of Warranties

6.1 Although LMI has attempted to provide accurate information with
regard to the Products, LMI assumes no responsibility for the accuracy
or inaccuracy of any information provided. LMI may change the Products
at any time without notice. Mention of non-LMI products or services is
for information purposes only and constitutes neither an endorsement nor
a recommendation. Use of the Products is at the Your and the Contracting
Party's risk.

6.2 ALL INFORMATION, DOCUMENTATION AND PRODUCTS PROVIDED BY LMI ARE
PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE OR
NON-INFRINGEMENT, OR ARISING FROM A COURSE OF DEALING, USAGE, OR TRADE
PRACTICE. TO THE MAXIMUM EXTENT PERMITTED BY LAW, LMI EXPRESSLY DISCLAIMS
ANY AND ALL WARRANTIES, CONDITIONS, REPRESENTATIONS, AND GUARANTEES WITH
RESPECT TO THE PRODUCTS, WHETHER EXPRESS OR IMPLIED, ARISING BY LAW,
CUSTOM, PRIOR ORAL OR WRITTEN STATEMENTS, OR OTHERWISE. LMI MAKES NO
WARRANTY THAT THE PRODUCTS WILL MEET YOUR OR THE CONTRACTING PARTY'S
REQUIREMENTS OR THAT THE PRODUCT WILL BE UNINTERRUPTED, TIMELY OR
ERROR FREE, NOR DOES LMI MAKE ANY WARRANTY AS TO THE RESULTS THAT MAY
BE OBTAINED FROM THE USE OF THE PRODUCTS OR THE ACCURACY OF ANY OTHER
INFORMATION OBTAINED THROUGH THE PRODUCTS. YOU AND THE CONTRACTING
PARTY UNDERSTAND AND AGREE THAT ANY MATERIAL AND/OR DATA DOWNLOADED OR
OTHERWISE OBTAINED THROUGH THE USE OF THE PRODUCTS IS DONE AT YOUR OWN
RISK AND THAT YOU AND THE CONTRACTING PARTY WILL BE SOLELY RESPONSIBLE
FOR ANY DAMAGE TO ANY COMPUTER SYSTEM OR LOSS OF DATA THAT RESULTS
FROM THE DOWNLOAD OF SUCH MATERIAL AND/OR DATA. NO REPRESENTATION OR
OTHER AFFIRMATION OF FACT, INCLUDING, WITHOUT LIMITATION, STATEMENTS
REGARDING CAPACITY, SUITABILITY FOR USE OR PERFORMANCE OF THE PRODUCTS,
WHETHER MADE BY EMPLOYEES OF LMI OR OTHERWISE, WHICH IS NOT CONTAINED IN
THIS AGREEMENT, SHALL BE DEEMED TO BE A WARRANTY BY LMI FOR ANY PURPOSE,
OR GIVE RISE TO ANY LIABILITY OF LMI WHATSOEVER.

7. Limitations of Damages and Liability

7.1 YOU AND THE CONTRACTING PARTY AGREE THAT THE CONSIDERATION WHICH LMI
IS RECEIVING HEREUNDER DOES NOT INCLUDE CONSIDERATION FOR ASSUMPTION
BY LMI OF THE RISK OF YOUR AND THE CONTRACTING PARTY'S INCIDENTAL,
CONSEQUENTIAL OR OTHER INDIRECT DAMAGES. LMI AND ITS SUPPLIERS SHALL NOT
BE LIABLE FOR ANY SPECIAL, CONSEQUENTIAL, INCIDENTAL OR OTHER INDIRECT
DAMAGES INCLUDING, WITHOUT LIMITATION, LOST PROFITS OR REVENUES, COSTS
OF REPLACEMENT PRODUCT OR SERVICE, LOSS OR DAMAGE TO INFORMATION OR
DATA ARISING OUT OF THE USE OR INABILITY TO USE THE PRODUCTS. UNDER NO
CIRCUMSTANCES, INCLUDING BUT NOT LIMITED TO NEGLIGENCE, SHALL LMI BE
LIABLE FOR DAMAGES RESULTING FROM USE OF THE PRODUCTS, OR RELIANCE ON THE
INFORMATION PRESENTED IN CONNECTION WITH THE PRODUCTS, EVEN IF LMI OR ITS
SUPPLIERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. YOU AND
THE CONTRACTING PARTY AGREE NOT TO ASSERT ANY SUCH CLAIM AGAINST LMI OR
ITS SUBSIDIARIES OR AFFILIATES OR THEIR RESPECTIVE OFFICERS, DIRECTORS,
OR EMPLOYEES.

7.2 YOU AND THE CONTRACTING PARTY EXPRESLY AGREE THAT YOUR USE OF THE
PRODUCTS IS AT YOUR OWN RISK. IN NO EVENT SHALL LMI'S TOTAL LIABILITY FROM
ALL DAMAGES, LOSSES, AND CAUSES OF ACTION (WHETHER, IN CONTRACT, TORT OR
OTHERWISE) EXCEED THE AMOUNT YOU PAID TO LMI, IF ANY, FOR THE PRODUCTS
DURING THE 12 MONTHS IMMEDIATELY BEFORE THE CLAIM AROSE. APPLICABLE
LAW MAY NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, OR THE ABOVE
LIMITATIONS OF LIABILITY, SO THE ABOVE EXCLUSIONS MAY NOT APPLY TO YOU.

7.3 ALL DISCLAIMERS, LIMITATIONS OF WARRANTIES AND DAMAGES, AND
CONFIDENTIAL COMMITMENTS SET FORTH IN THESE TERMS OR OTHERWISE EXISTING
AT LAW (1) ARE OF THE ESSENCE OF THE AGREEMENT OF THE PARTIES, AND (2)
SURVIVE ANY TERMINATION, EXPIRATION OR RESCISSION OF THESE TERMS.

8. Title

Title, ownership rights and intellectual property rights in the Products
shall remain with LMI or its suppliers, as applicable. The Products
are protected by copyright and other intellectual property laws and
by international treaties. Title and related rights in the content
accessed through the Products is the property of the applicable content
owner and is protected by applicable law. The licenses granted under
these Terms gives the You and the Contracting Party no rights to such
content. "LogMeIn," associated logos, and other names, logos, icons and
marks identifying LMI's products and services are trademarks or service
marks of LMI (collectively the "Trademarks") and may not be used without
the prior written permission of LMI. All other product names mentioned
are used for identification purposes only and may be trademarks or
service marks of their respective holders. Nothing should be construed
as granting, by implication, estoppel, or otherwise, any license or right
to use any Trademark without the written permission of LMI or such third
party that may own the trademarks. Use by You and the Contracting Party of
the Trademarks except as provided in these Terms is strictly prohibited.

9. Fees and Renewals

9.1 Month-to-Month Subscription by Credit Card Only. In the event that
Your subscription to the Service is on a monthly basis, payment of the
subscription fee will be by preauthorized credit card charge, PayPal
charge or direct debit, and Your subscription will automatically renew
each calendar month unless You or LMI give written (including email)
notice of non-renewal during the prior calendar month. Your credit card
will be charged the monthly fee for each month or partial month that
Your monthly subscription is in effect.

9.2 Annual Subscription by Credit Card. In the event that Your
subscription to the Service is for a year and the payment is by credit
card, PayPal charge or direct debit, Your subscription will automatically
renew at the beginning of each subsequent anniversary year unless You or
LMI give prior written (including email) notice of non-renewal at least
30 days prior to the expiration of Your current year subscription. Upon
any annual renewal, the payment arrangements in place for the prior
subscription year shall remain in place, unless You and LMI agree
otherwise.

9.3 Annual Subscription By Invoice. In the event that Your subscription
to the Service is for a year and the initial payment is by check or bank
draft against an invoice from LogMeIn, payment being due within thirty
(30) days' of the date of invoice. Additionally, Your subscription will
automatically renew at the beginning of each subsequent anniversary
year unless You or LMI give prior written (including email) notice
of non-renewal at least thirty (30) days prior to the expiration of
the current year subscription. Upon any annual renewal, the payment
arrangements in place for the prior subscription year shall remain
in place, unless You and LMI agree otherwise and LMI will invoice you
accordingly.

9.4 Free Subscriptions. Notwithstanding the foregoing provisions of these
Terms, Your subscription to LogMeIn Free and to LogMeIn Hamachi or LogMeIn
Hamachi2 that are free do not require the payment of a subscription fee.

9.5 No Cancellation. Notwithstanding any provision of these Terms or any
course of dealing between the parties, You and the Contracting Party
may not cancel, terminate or rescind a subscription. All payments by
You and the Contracting Party, or either of you, to LMI are final.

9.6 Credit Card Authorization. In the event that You or the Contracting
Party cancel the credit card provided to LMI or the card is otherwise
terminated, You or the Contracting Party must immediately provide LMI with
a new valid credit card number. You and the Contracting Party authorize
LMI, from time to time, to undertake steps to determine whether the
credit card number provided to LMI is a valid credit card number. In the
event that You or the Contracting Party do not provide LMI with a current
valid credit card number with sufficient credit upon request during the
effective period of these Terms, You and the Contracting Party will be
in violation of these Terms.  LMI reserves the right to automatically
update Your or the Contracting Party’s credit card information using
software designed for updating purposes and You and the Contracting
Party hereby authorize and approve any such updating.

9.7 Payment via PayPal®. LMI also accepts PayPal for payments from PayPal
account. In order to pay with PayPal, You or the Contracting Party need
to have an account with PayPal. When You or the Contracting Party select
PayPal to make payments the transaction is re-directed from LMI's site
to PayPal's payment site. Once directed to PayPal's site, PayPal is
charged with protecting Your and the Contracting Party's personal and
financial information. Your or the Contracting Party's PayPal account
and any activities related thereto are governed by PayPal's terms and
conditions, and the information provided to PayPal in relation thereto
will be governed by PayPal's privacy policy. When PayPal is used, Your
and the Contracting Party's financial information is not shared with
LMI. Once payment is complete via PayPal, PayPal will email a receipt
for this transaction. LMI reserves the right to request proof of identity
from any PayPal member.

9.8 SMS Messaging. If You or the Contracting Party are licensing
Rescue+Mobile pursuant to this agreement, You and the Contracting
Party are entitled to a combined maximum of one hundred (100) SMS text
messages per seat, per month of this agreement. If You or the Contracting
Party exceed this combined maximum amount per seat, per month, You
and the Contracting Party agree to negotiate in good faith with LMI a
commercially reasonable rate per text message over one hundred (100)
per seat, per month.

9.9 Payment Due. Unless specifically provided otherwise herein, payment
of all fees are due and payable to LMI without demand, invoicing or
notice before the commencement of the period to which those fees apply.

9.10 Taxes. You and the Contracting Party agree to be responsible for
and to pay any sales, personal property, use, VAT, excise, withholding,
or any other taxes that may be imposed, based on this license, use or
possession of a Product, or any other product or service provided under
this Agreement, excluding taxes based on net income payable by LMI.

9.11 Trial Offers, Coupons, Credits and Special Offers. LMI reserves
the right to discontinue or modify any coupons, credits and special
promotional offers at our discretion.

9.12  Information Purge.  If You or the Contracting Party fail to make
required payments regarding your account or in any other way breach these
Terms or these Terms are terminated or expire, LMI may, at its discretion,
purge Your or the Contracting Party’s data from its systems, including
but not limited to, account information, users, settings, and any data
(files, etc.) that may be stored by LMI.

9.13 LogMeIn Hamachi Subscription. LogMeIn Hamachi and LogMeIn
Hamachi2 are licensed using two distinct methods based on status as
a commercial or non-commercial user. Commercial users are defined
as for-profit businesses, government institutions (federal, state,
local), educational institutions (including universities and state or
local school systems), any individuals using the product on behalf
of such entities or institutions and any other individual or entity
not specifically defined as a "Non-commercial user". Non-commercial
users are defined as individuals using the product for personal use,
such as a gaming or family network, and non-profit institutions
(as defined by the IRS as a 501c corporation or similarly situated
international non-profits). Commercial users must pay LMI a monthly or
annual subscription fee in accordance with the terms hereof in order to
use LogMeIn Hamachi or LogMeIn Hamachi2. Non-commercial users may use
LogMeIn Hamachi or LogMeIn Hamachi2 free of charge and without the need
to pay any subscription fee. Prior to subscribing to LogMeIn Hamachi
or LogMeIn Hamachi2, You/the Contracting Party will be asked to verify
status as a commercial or non-commercial user. All final determinations
shall be made by LMI in its sole discretion. LMI reserves the right,
in accordance with its terms and conditions of use, to discontinue any
subscription to LogMeIn Hamachi or LogMeIn Hamachi2.

10. Termination

LMI may in its sole discretion immediately terminate these Terms and this
subscription, license and right to use any Product if (i) the Contracting
Party declares bankruptcy, is involved in any bankruptcy proceedings or
is otherwise insolvent, (ii) You or the Contracting Party breach these
Terms; (iii) LMI is unable to verify or authenticate any information You
provide to LMI; (iv) such information is or becomes inaccurate; or (v) LMI
decides, in its sole discretion, to discontinue offering the Product. LMI
shall not be liable to You, the Contracting Party or any third party for
termination of the Service or use of the Products. Upon expiration or
termination for any reason, You and the Contracting Party are no longer
authorized to use the Products. When these Terms are terminated and/or
the subscription is canceled, You and the Contracting Party will no longer
have access to data and other material You or the Contracting Party have
stored in connection with any Service and that material may be deleted
by LMI. All disclaimers, limitations of warranties and damages, and
confidential commitments set forth in these Terms or otherwise existing
at law survive any termination, expiration or rescission of these Terms.

11. Maintenance and Updates

You understand that LMI may update the Products at any time, but is under
no obligation to inform You or the Contracting Party of or furnish to
You or the Contracting Party any such updates. These Terms do not grant
You or the Contracting Party any right, license or interest in or to
any support, maintenance, improvements, modifications, enhancements
or updates to the Products or supporting documentation. To the extent
that LMI supplies any updates to You or the Contracting Party, such
updates will be deemed to be subject to the terms of these Terms unless
LMI indicates otherwise. LMI reserves the right to charge fees for any
future versions of, or updates to, the Products.

12. Export Law Assurances

The Products are subject to the United States Export Administration
Regulations. No Software or Service may be downloaded, used or exported
(i) into (or to a national or resident of) Cuba, Iran, North Korea, Sudan,
Syria, or any other country to which the United States has embargoed
goods; or (ii) any person or entity on the United States Treasury
Department's list of Specially Designated Nationals or the U.S. Commerce
Department's Denied Persons List or Entity List, or otherwise designated
as prohibited from receiving U.S. exports. By subscribing to the Service
or using any of the Software, You and the Contracting Party represent
and warrant that you and it are not- and are not controlled by - any
such person or entity and are not controlled by a national or resident
of any such country.

13. High Risk Activities

The Products are not fault-tolerant and are not designed, manufactured
or intended for use or resale as or with on-line control equipment in
hazardous environments requiring fail-safe performance, such as in the
operation of nuclear facilities, aircraft navigation or communication
systems, air traffic control, direct life support machines or weapon
systems in which the failure of the Products could lead directly to death,
personal injury or severe physical or environmental damage ("High Risk
Activities"). Accordingly, LMI and its suppliers specifically disclaim
any express or implied warranty of fitness for High Risk Activities.

14. Miscellaneous

14.1 These Terms represents the complete agreement concerning the subject
matter of the Terms and license granted hereunder and, except as set forth
herein, may be amended only by a writing executed by both parties. You and
the Contracting Party understand and agree that You and the Contracting
Party are solely responsible for periodically reviewing these Terms.

14.2 These Terms shall be governed by and construed in accordance with
the laws of the Commonwealth of Massachusetts and the laws of the
United States, without giving effect to any principles of conflict
of law. You and the Contracting Party agree that any action at law
or in equity arising out of or relating to these Terms shall be filed
only in the state or federal courts located in Boston, Massachusetts,
and You and the Contracting Party hereby consent and submit to the
personal jurisdiction of such courts for the purposes of litigating
any such action. The parties specifically disclaim applicability of (i)
the United Nations Convention on the Sale of Goods and (ii) any Incoterms.

14.3 If any of the provisions of these Terms shall be unlawful, void,
or for any reason unenforceable, then that provision shall be deemed
severable from these Terms and shall not affect the validity and
enforceability of any remaining provisions.

14.4 LMI shall have the right to publish the identification of You and
the Contracting Party as users of the Service. You and the Contracting
Party agree that LMI may use any logo and/or name associated with You
or the Contracting Party on LMI's web site and other marketing materials
in order to identify You and the Contracting Party as LMI's customers.

14.5 Notices by LMI to You or the Contracting Party may be sent to
the email address You provide on the Registration Form or otherwise by
any means that LMI determines in its sole discretion as likely to come
to Your attention. All notices by You or the Contracting Party sent to
LMI in connection with these Terms shall be in writing and sent by first
class mail or certified mail (receipt being deemed 72 hours after postage
and return receipt requested) or personally delivered at the address of
LMI set forth herein.

14.6 You and the Contracting Party agree not to bring or participate
in any class action lawsuit against LMI or any of its employees or
affiliates. You and the Contracting Party agree that you will not bring a
claim under these Terms more than two years after the expiration of these
Terms. The failure of LMI to partially or fully exercise any right shall
not prevent the subsequent exercise of such right. The waiver by LMI of
any breach shall not be deemed a waiver of any subsequent breach of the
same or any other term of these Terms. No remedy made available to LMI
by any of the provisions of these Terms is intended to be exclusive of
any other remedy, and each and every remedy shall be cumulative and in
addition to every other remedy available at law or in equity.

14.7 You and the Contracting Party acknowledge and agree that LMI is
in the business of providing remote access solutions and that LMI may
provide services to third parties, including competitors of You and the
Contracting Party, which are the same or similar to the services provided
to You and the Contracting Party hereunder.

15. Indemnification

You and the Contracting Party are responsible for maintaining the
confidentiality of Your account and password(s). You and the Contracting
Party are also responsible for all activities that occur under Your
account. You and the Contracting Party hereby agree to indemnify, defend
and hold LMI and its affiliates, employees, officers, directors, owners,
information providers, agents, licensees, licensors (the "Indemnified
Parties") harmless from and against any and all liabilities, claims,
costs, including reasonable attorneys' fees, incurred by the Indemnified
Parties in connection with any demand, claims, action, suit, or loss
arising as a result of (a) any breach by You or the Contracting Party of
these terms of use or claims arising from Your or the Contracting Party's
account; (b) any fraud or manipulation by You or the Contracting Party;
(c) a third-party claim, action or allegation of infringement based
on information, data, files or other content submitted by You or the
Contracting Party; or (d) any claims of credit card fraud based on
any information released by You or the Contracting Party. You and the
Contracting Party agree to use best efforts to cooperate with LMI in the
defense of any demand, claim, action or suit. LMI reserves the right to
assume the exclusive defense of any matter subject to indemnification
by You and the Contracting Party at LMI's own expense.

16. Confidentiality

You and the Contracting Party shall maintain the confidentiality of
information that has been, and will continue to be, provided to You by
LMI in connection with the use of the Products. You and the Contracting
Party specifically agree as follows:

16.1 Obligations. You and the Contracting Party shall (a) maintain
in confidence all such information, including but not limited to the
Software and Products, (b) not disclose any such information to anyone
except Your employees, agents, and consultants on a need-to-know basis
(and who have been informed of and acknowledge their obligation to be
bound by the terms of these confidentiality terms), and (c) not use LMI's
confidential information for any purpose other than that for which it is
disclosed. All confidential information shall remain the sole property
of LMI. You and the Contracting Party shall have no right, title, or
interest in or to the confidential information.

16.2 Confidential Information. Information considered confidential by
LMI includes, without limitation, information of LMI relating to (a)
matters of a technical nature such as trade secret processes or devices,
know-how, data, formulas, inventions (whether or not patentable or
copyrighted), specifications and characteristics of products or services
planned or being developed, and research subjects, methods and results,
(b) matters of a business nature such as information about costs,
profits, pricing, policies, markets, sales, suppliers, customers,
product plans, and business concepts, plans or strategies, (c) matters
of a human resources nature such as employment policies and practices,
personnel, compensation and employee benefits, (d) other information of
a similar nature not generally disclosed by LMI to the public or other
information You or the Contracting Party should reasonably believe the
be confidential given the circumstances, (e) information concerning Your
use of the Products, and (f) the Products.

16.3 Exclusions. The obligations imposed by these confidentiality terms
shall not apply to any information that (a) is proven by You to have
been rightfully received from a third party without accompanying use
or disclosure restrictions; or (b) is or becomes generally publicly
available through no wrongful act of You or the Contracting Party or
any other person or entity with a confidentiality obligation; or (c)
is already known to You prior to the date of disclosure as evidenced by
documentation bearing a date prior to the date of disclosure; or (d) is
approved for release in writing by an authorized representative of LMI; or
(e) is required to be disclosed pursuant to court order, duly authorized
subpoena, or governmental authority (but You or the Contracting Party
shall immediately give LMI written notice and an opportunity to contest
such required disclosure).

16.4 Remedies. The parties agree that the remedy at law for any breach of
any of the covenants and agreements set forth in these confidentiality
terms may be inadequate and that, in the event of any such breach or
threatened breach, LMI shall, in addition to all other remedies which may
be available to it at law, be entitled to equitable relief in the form of
preliminary and permanent injunctions without the necessity of proving
damages. You and the Contracting Party further agree that the terms of
these confidentiality terms shall in no way restrict or limit any other
remedies LMI may have against You and the Contracting Party. LMI shall
be entitled to recover the costs including reasonable attorney's fees,
to enforce its rights under these confidentiality terms.

16.5 Return of Confidential Information. Upon the written request of
LMI, You and the Contracting Party shall return, or certify that it
has destroyed, all information disclosed under these confidentiality
terms and any memorandum, diagrams, or any other documents containing
any information disclosed under these confidentiality terms.

16.6 Enforceability. In the event any one or more of the provisions of
these confidentiality terms shall be invalid, illegal or unenforceable in
any respect, the validity, legality and enforceability of the remaining
provisions contained herein shall not in any way be affected or impaired
thereby.

16.7 Application. This Confidentiality Agreement shall control in lieu of
and notwithstanding any proprietary or restrictive legends or statements
inconsistent with these confidentiality terms that may be associated
with any particular information disclosed hereunder.

16.8 Surviving Obligations. The confidentiality obligations under these
Terms shall survive any termination, expirations, or rescission of
these Terms, as well as continue beyond any time in which You or the
Contracting Party were using the Service.

17. Force Majeure

No party shall be liable for any performance failure, delay in
performance, or lost data under these Terms (other than for delay in
the payment of money due and payable hereunder) to the extent said
failures or delays are proximately caused by (i) failures of Software
or other computer programming, (ii) natural weather events, or (iii)
any other causes beyond that party's reasonable control and occurring
without its fault or negligence, including, without limitation, failure
of suppliers, subcontractors, and carriers, or party to substantially
meet its performance obligations under these Terms, provided that in
any such event, as a condition to the claim of non-liability, the party
experiencing the difficulty shall give the other prompt written notice,
with full details following the occurrence of the cause relied upon.
Copyright © 2003 – 2009 LogMeIn, Inc.  All rights reserved.
