ubuntu-sso-client-13.10/0000755000202700020270000000000012225013301015325 5ustar dobeydobey00000000000000ubuntu-sso-client-13.10/run-mac-tests0000775000202700020270000000406412151461656020005 0ustar dobeydobey00000000000000#! /bin/bash # # Copyright 2010-2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. WINDOWS_TESTS=test_windows.py set -e if [ $# -ne 0 ]; then # run specific module given by the caller MODULE="$@" else # run all tests, useful for tarmac and reviews MODULE="ubuntu_sso" fi style_check() { USE_PYFLAKES=1 u1lint --ignore ubuntu_sso/qt/ui if [ -x `which pep8` ]; then pep8 --exclude '.bzr,.pc,build' --ignore=E126,E127,E128 --repeat . bin/* else echo "Please install the 'pep8' package." fi } echo "*** Running QT test suite for ""$MODULE"" ***" python ./setup.py build u1trial --reactor=qt4 --gui -i "test_linux.py, test_qt.py, test_windows.py, test_glib.py, test_txsecrets.py" "$MODULE" python ./setup.py clean rm -rf _trial_temp rm -rf build style_check ubuntu-sso-client-13.10/LICENSE.OpenSSL0000664000202700020270000001547312151461656017652 0ustar dobeydobey00000000000000Certain source files in this program permit linking with the OpenSSL library (http://www.openssl.org), which otherwise wouldn't be allowed under the (A)GPL. For purposes of identifying OpenSSL, most source files giving this permission limit it to versions of OpenSSL having a license identical to that listed in this file (LICENSE.OpenSSL). It is not necessary for the copyright years to match between this file and the OpenSSL version in question. However, note that because this file is an extension of the license statements of these source files, this file may not be changed except with permission from all copyright holders of source files in this program which reference this file. LICENSE ISSUES ============== The OpenSSL toolkit stays under a dual license, i.e. both the conditions of the OpenSSL License and the original SSLeay license apply to the toolkit. See below for the actual license texts. Actually both licenses are BSD-style Open Source licenses. In case of any license issues related to OpenSSL please contact openssl-core@openssl.org. OpenSSL License --------------- /* ==================================================================== * Copyright (c) 1998-2004 The OpenSSL Project. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. All advertising materials mentioning features or use of this * software must display the following acknowledgment: * "This product includes software developed by the OpenSSL Project * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" * * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to * endorse or promote products derived from this software without * prior written permission. For written permission, please contact * openssl-core@openssl.org. * * 5. Products derived from this software may not be called "OpenSSL" * nor may "OpenSSL" appear in their names without prior written * permission of the OpenSSL Project. * * 6. Redistributions of any form whatsoever must retain the following * acknowledgment: * "This product includes software developed by the OpenSSL Project * for use in the OpenSSL Toolkit (http://www.openssl.org/)" * * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * ==================================================================== * * This product includes cryptographic software written by Eric Young * (eay@cryptsoft.com). This product includes software written by Tim * Hudson (tjh@cryptsoft.com). * */ Original SSLeay License ----------------------- /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * * This package is an SSL implementation written * by Eric Young (eay@cryptsoft.com). * The implementation was written so as to conform with Netscapes SSL. * * This library is free for commercial and non-commercial use as long as * the following conditions are aheared to. The following conditions * apply to all code found in this distribution, be it the RC4, RSA, * lhash, DES, etc., code; not just the SSL code. The SSL documentation * included with this distribution is covered by the same copyright terms * except that the holder is Tim Hudson (tjh@cryptsoft.com). * * Copyright remains Eric Young's, and as such any Copyright notices in * the code are not to be removed. * If this package is used in a product, Eric Young should be given attribution * as the author of the parts of the library used. * This can be in the form of a textual message at program startup or * in documentation (online or textual) provided with the package. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * "This product includes cryptographic software written by * Eric Young (eay@cryptsoft.com)" * The word 'cryptographic' can be left out if the rouines from the library * being used are not cryptographic related :-). * 4. If you include any Windows specific code (or a derivative thereof) from * the apps directory (application code) you must include an acknowledgement: * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" * * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * The licence and distribution terms for any publically available version or * derivative of this code cannot be changed. i.e. this code cannot simply be * copied and put under another distribution licence * [including the GNU Public Licence.] */ ubuntu-sso-client-13.10/data/0000755000202700020270000000000012225013301016236 5ustar dobeydobey00000000000000ubuntu-sso-client-13.10/data/password_hint_ok.png0000664000202700020270000000055712151461656022354 0ustar dobeydobey00000000000000‰PNG  IHDR rëä|tEXtSoftwareAdobe ImageReadyqÉe<IDATxÚb´ØâÅ€t¸ˆ-XˆŸñq nâË0ELPš ˆ«ø ‡@50@é¨8Hž$È•ìâÜdh Kq.È&|Tù”v¹®„qAêl@š2ñi˜jÞÎðüûKdáL&{‡•›ÁHXÎiг­ÈšìA~…ñ@Š@¦¯¼¿Lƒ4VœmA·IdÓkdâ—ß_ÂýÁ6zyŒÑÀk¦ƒ0ÈÄ­OöÀe'^›Í«Aš¦#‹¬z° l[ÎÉJtgÁÀtFhŠ˜ Äi „Á, N‡¥ˆ\ Ñ_ŠÿBås‘“Ñ/ ®b ^Ä/ â/ |¨ SuccessPage 0 0 94 58 TextLabel TextLabel ubuntu-sso-client-13.10/data/qt/setup_account.ui0000664000202700020270000004423012151461656022124 0ustar dobeydobey00000000000000 SetUpAccountPage 0 0 532 438 0 0 16777215 16777215 0 0 QLayout::SetDefaultConstraint 6 Qt::Vertical 20 10 Qt::Vertical 20 10 Qt::Vertical 20 10 3 75 true name_label 0 0 300 0 300 16777215 false 3 75 true email_label 0 0 300 0 300 16777215 false 0 0 0 0 220 0 220 16777215 email_assistance Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft true 3 75 true confirm_email_label 0 0 300 0 300 16777215 false 0 0 0 0 220 0 220 16777215 confirm_email_assistance Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft true 0 6 0 0 0 0 0 220 0 220 16777215 name_assistance Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft true 3 75 true password_label 0 0 300 0 300 16777215 Your password must be at least 8 characters long and contain at least one number and one uppercase letter. QLineEdit::Password false 0 0 0 220 80 220 16777215 password_assistance true 17 3 75 true confirm_password_label 0 0 300 0 300 16777215 QLineEdit::Password false 3 0 0 300 57 300 57 background-color: white QFrame::Box 0 0 300 0 300 16777215 false Qt::Vertical 20 10 0 220 0 220 16777215 If you can't read this then refresh this page true 0 Log-in with my existing account. ubuntu-sso-client-13.10/data/qt/stylesheet.qss0000664000202700020270000000406412151461656021633 0ustar dobeydobey00000000000000QWidget { color: #333333; background-color: white; } QFrame#ubuntussoframe { background-color: white; padding-left: 30px; padding-right: 30px; } QWizard, QDialog { background-color: white; } QLabel#password_assistance { border-image: url(":/balloon_shape.png"); } QLineEdit { border: 1px solid #aea79f; } QPushButton { border-radius: 5px; border-style: solid; padding: 6px; padding-left: 20px; padding-right: 20px; border-width: 1px; } QPushButton:default:enabled { background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #fe9e84,stop: 1.0 #dd4814); color: white; border-color: #999999; } QPushButton:hover:default:enabled { background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #ffb19c,stop: 1.0 #dd4814); color: white; border-color: #999999; } QPushButton:pressed:default:enabled { background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #b93f14,stop: 1.0 #dd4814); color: white; border-color: #999999; } QPushButton:enabled { background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #ffffff,stop: 1.0 #e6e6e6); color: #333333; border-color: #999999; } QPushButton:hover:enabled { background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #ffffff,stop: 1.0 #ededed); color: #333333; border-color: #999999; } QPushButton:pressed:enabled { background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #d9d9d9,stop: 1.0 #fefefe); color: #333333; border-color: #999999; } QPushButton:disabled { background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #eaeaea, stop: 1.0 #cacaca); color: #595959; border-color: #939389; } QFrame#frm_box { border-radius: 5px; border-style: solid; border-color: #939389; border-width: 1px; color: white; min-height: 100px; } LoadingOverlay { background: transparent; } WizardHeader { padding-top: 1px; padding-bottom: 1px; } QLabel#form_errors { padding-bottom: 1px; } ubuntu-sso-client-13.10/data/qt/resources.qrc0000664000202700020270000000055012151461656021427 0ustar dobeydobey00000000000000 ../password_hint_ok.png ../password_hint_warning.png ../Ubuntu-R.ttf ../Ubuntu-B.ttf ../balloon_shape.png stylesheet.qss darwin.qss windows.qss linux.qss ubuntu-sso-client-13.10/data/qt/windows.qss0000664000202700020270000000012612151461656021127 0ustar dobeydobey00000000000000/* Styles specific to the windows platform */ QWidget { font-family: "Ubuntu"; } ubuntu-sso-client-13.10/data/qt/proxy_credentials_dialog.ui0000664000202700020270000002320512151461656024324 0ustar dobeydobey00000000000000 ProxyCredsDialog Qt::NonModal 0 0 550 373 0 0 550 0 false QLayout::SetFixedSize 24 12 0 QLayout::SetDefaultConstraint 0 0 48 48 48 48 TextLabel Qt::Vertical QSizePolicy::Expanding 0 20 24 24 0 0 true You are connection through a proxy. true Please provide the login details below, or check your system settings true QFrame::NoFrame QFrame::Plain 12 0 0 Connecting to: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Proxy username: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Proxy password: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter QLineEdit::Password Qt::Vertical QSizePolicy::Fixed 24 12 TextLabel false Qt::Vertical QSizePolicy::Fixed 24 12 Get Help With Proxies Qt::Horizontal 40 20 Cancel and Close Save true username_entry password_entry save_button cancel_button help_button ubuntu-sso-client-13.10/data/qt/error_message.ui0000664000202700020270000000120412151461656022077 0ustar dobeydobey00000000000000 ErrorPage 0 0 400 300 TextLabel Qt::AlignCenter ubuntu-sso-client-13.10/data/qt/email_verification.ui0000664000202700020270000000461612151461656023105 0ustar dobeydobey00000000000000 EmailVerificationPage 0 0 300 148 300 0 15 0 3 Verification code Qt::Horizontal 40 20 Next Qt::Vertical 20 40 verification_code_edit returnPressed() next_button click() 199 15 299 49 ubuntu-sso-client-13.10/data/qt/forgotten_password.ui0000664000202700020270000000512512151461656023201 0ustar dobeydobey00000000000000 ForgottenPasswordPage 0 0 148 148 15 0 3 0 0 300 0 Qt::Horizontal 40 20 false Qt::Vertical 20 40 email_line_edit returnPressed() send_button click() 222 92 362 136 ubuntu-sso-client-13.10/data/qt/current_user_sign_in.ui0000664000202700020270000001026212151461656023474 0ustar dobeydobey00000000000000 CurrentUserSignInPage 0 0 302 295 15 0 Register with {app_name}. 3 &Email email_edit 300 0 3 &Password password_edit 300 0 QLineEdit::Password 0 0 Forgot password? Qt::Horizontal 40 20 false Sign In true Qt::Vertical 20 40 verticalSpacer forgot_password_label create_account_label password_edit returnPressed() sign_in_button click() 199 160 288 217 ubuntu-sso-client-13.10/data/qt/ssl_dialog.ui0000664000202700020270000001331512151461656021370 0ustar dobeydobey00000000000000 SSLDialog 0 0 550 402 0 0 550 0 Dialog 24 QLayout::SetFixedSize 12 0 QLayout::SetDefaultConstraint 0 0 48 48 48 48 TextLabel Qt::Vertical QSizePolicy::Expanding 0 20 24 Do you want to connect to this server <style type="text/css" media="all"> ul {margin-left: -10px;} li {padding-top: 2px;} </style> <p>You are trying to connect to a proxy server on 192.168.1.111. This server uses a secure connection, but the SSL certificate is not valid because:</p> <ul> <li>The certificate has not been verified.</li> <li>The name on the certificate isn't valid or doesn't match the name of the site.</li> <li>The certificate has expired.</li> </ul> true -1 <p>If you are not sure about this server, do not use it to connect to Ubuntu One. <a href='#'>Review your proxy settings.</a> true Remember my settings for this certificate. false Get Help With SSL Qt::Horizontal 40 20 Cancel and Close Connect true connect_button cancel_button help_button remember_checkbox ubuntu-sso-client-13.10/data/qt/loadingoverlay.ui0000664000202700020270000000454012151461656022267 0ustar dobeydobey00000000000000 Form 0 0 433 169 30 Qt::Horizontal 40 20 0 102 0 30 0 0 Getting information, please wait... Qt::Horizontal 40 20 Qt::Vertical 20 20 ubuntu-sso-client-13.10/data/qt/darwin.qss0000664000202700020270000000012612151461656020721 0ustar dobeydobey00000000000000/* Styles specific to the windows platform */ QWidget { font-family: "Ubuntu"; } ubuntu-sso-client-13.10/data/qt/linux.qss0000664000202700020270000000005512151461656020575 0ustar dobeydobey00000000000000/* Styles specific to the linux platform */ ubuntu-sso-client-13.10/data/qt/reset_password.ui0000664000202700020270000001733712151461656022324 0ustar dobeydobey00000000000000 ResetPasswordPage 0 0 505 260 15 0 3 0 0 310 0 16777215 16777215 true reset_code 0 0 300 0 300 16777215 3 0 0 310 0 16777215 16777215 true password_label 0 0 300 0 300 16777215 QLineEdit::Password 3 0 0 310 0 true confirm_password_label 0 0 300 0 300 16777215 QLineEdit::Password 0 0 185 95 300 16777215 password_assistance true 20 0 Qt::Horizontal QSizePolicy::Expanding 40 20 false Qt::Vertical 20 40 ubuntu-sso-client-13.10/data/qt/network_detection.ui0000664000202700020270000000671012151461656023000 0ustar dobeydobey00000000000000 Form 0 0 512 334 Qt::Horizontal 40 20 0 0 400 150 Qt::PlainText Qt::AlignCenter true Qt::Horizontal 40 20 Qt::AlignCenter Qt::Horizontal 40 20 Are you online? We can't detect an internet connection - you will need to be connected to set up Ubuntu One Qt::PlainText true Qt::Horizontal 40 20 Qt::Vertical 20 76 ubuntu-sso-client-13.10/data/balloon_shape.png0000664000202700020270000000155612151461656021605 0ustar dobeydobey00000000000000‰PNG  IHDR¼bê}¹ôtEXtSoftwareAdobe ImageReadyqÉe<IDATxÚìÝAK#gÀáw¶Q cPé¡ DM\(ô´°PhÙSK¡ÒoRhoù-ÅcaÁ¯Ð9Vö*¬ôTX=¬zQxñŒx±QûŽX°°-;ÐCf|x™‘9üù1¼ Â$½^/䕦é³xèÄõQ\-ý¸^ǵÑív_Ü¿ä >†^‡Ÿëõzgii)LOO‡ÉÉIãe¤ ‡Ã0 Âááa899Ùˆ§žÇð²k•œ÷úqyy¹ÓjµL•‘511æççoWŒ¾³³³“þ6ûñ(ÇÓý›ødÿ®Ùlš(…Ñh4ÂÂÂBg}}½“+ølÏž=Ù“$1E eqq1Ü}æÌ|³Z­š…“u[©Tšñ)ÿ~žà«ccc¦G!g‡éGFÁC"x‚ÁƒàAð x<‚Áƒà<‚ÁƒàAð x<‚Gð x<‚ÁƒàAð xø?ƒOÓôs£¢ *ïz§V«=[YY1-Ê| ý«»Ð?ÉBÏ^á ¥ >†Þ¾ ýiöŠùÙÙY¢|Áß}mm-Ôëu“¡œÁÇØŸÌÌÌüÚjµ„NéeßÒ¼—$‰Ið0‚o·Û¯úýþ×[[[¯â ñwS¡´’^¯÷Ö­öò”Éææf¸¸¸øðÁ¿-üÕÕÕ077gb”7ø{áyþ§¾§ Áÿç¿Äýýoq}vzzúÅöö¶©Qü­ïòG1úFŃ ‚ÁƒàAð x<‚Gð x<‚ÁƒàAð x<ÁƒàAð x<‚ÁƒàAð x<‚ÿWç———&F! ‡ÃìÐÏüï^KOŸŸ‡«««7Ýn÷Ï<Áoìíí…ëëk¤Pnû͵¥i·Û/ÏÎÎ~ÙÝÝ=…pssö÷÷ÃñññF|ºß_Ésƒýiš†¸µù¾Ñh„Z­¦¦¦L–‘Û ƒptt”ŸÇS?ý}-éõz¹o£¸>Žë±3bÞÄõ:ÛÆÄ'û÷/ü%À¿ŸÓ{cf*IEND®B`‚ubuntu-sso-client-13.10/data/UbuntuOne-Go_Daddy_CA.pem0000664000202700020270000000332512151461736022726 0ustar dobeydobey00000000000000-----BEGIN CERTIFICATE----- MIIE3jCCA8agAwIBAgICAwEwDQYJKoZIhvcNAQEFBQAwYzELMAkGA1UEBhMCVVMx ITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMTYw MTU0MzdaFw0yNjExMTYwMTU0MzdaMIHKMQswCQYDVQQGEwJVUzEQMA4GA1UECBMH QXJpem9uYTETMBEGA1UEBxMKU2NvdHRzZGFsZTEaMBgGA1UEChMRR29EYWRkeS5j b20sIEluYy4xMzAxBgNVBAsTKmh0dHA6Ly9jZXJ0aWZpY2F0ZXMuZ29kYWRkeS5j b20vcmVwb3NpdG9yeTEwMC4GA1UEAxMnR28gRGFkZHkgU2VjdXJlIENlcnRpZmlj YXRpb24gQXV0aG9yaXR5MREwDwYDVQQFEwgwNzk2OTI4NzCCASIwDQYJKoZIhvcN AQEBBQADggEPADCCAQoCggEBAMQt1RWMnCZM7DI161+4WQFapmGBWTtwY6vj3D3H KrjJM9N55DrtPDAjhI6zMBS2sofDPZVUBJ7fmd0LJR4h3mUpfjWoqVTr9vcyOdQm VZWt7/v+WIbXnvQAjYwqDL1CBM6nPwT27oDyqu9SoWlm2r4arV3aLGbqGmu75RpR SgAvSMeYddi5Kcju+GZtCpyz8/x4fKL4o/K1w/O5epHBp+YlLpyo7RJlbmr2EkRT cDCVw5wrWCs9CHRK8r5RsL+H0EwnWGu1NcWdrxcx+AuP7q2BNgWJCJjPOq8lh8BJ 6qf9Z/dFjpfMFDniNoW1fho3/Rb2cRGadDAW/hOUoz+EDU8CAwEAAaOCATIwggEu MB0GA1UdDgQWBBT9rGEyk2xF1uLuhV+auud2mWjM5zAfBgNVHSMEGDAWgBTSxLDS kdRMEXGzYcs9of7dqGrU4zASBgNVHRMBAf8ECDAGAQH/AgEAMDMGCCsGAQUFBwEB BCcwJTAjBggrBgEFBQcwAYYXaHR0cDovL29jc3AuZ29kYWRkeS5jb20wRgYDVR0f BD8wPTA7oDmgN4Y1aHR0cDovL2NlcnRpZmljYXRlcy5nb2RhZGR5LmNvbS9yZXBv c2l0b3J5L2dkcm9vdC5jcmwwSwYDVR0gBEQwQjBABgRVHSAAMDgwNgYIKwYBBQUH AgEWKmh0dHA6Ly9jZXJ0aWZpY2F0ZXMuZ29kYWRkeS5jb20vcmVwb3NpdG9yeTAO BgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBANKGwOy9+aG2Z+5mC6IG OgRQjhVyrEp0lVPLN8tESe8HkGsz2ZbwlFalEzAFPIUyIXvJxwqoJKSQ3kbTJSMU A2fCENZvD117esyfxVgqwcSeIaha86ykRvOe5GPLL5CkKSkB2XIsKd83ASe8T+5o 0yGPwLPk9Qnt0hCqU7S+8MxZC9Y7lhyVJEnfzuz9p0iRFEUOOjZv2kWzRaJBydTX RE4+uXR21aITVSzGh6O1mawGhId/dQb8vxRMDsxuxN89txJx9OjxUUAiKEngHUuH qDTMBqLdElrRhjZkAzVvb3du6/KFUJheqwNTrZEjYx8WnM25sgVjOuH0aBsXBTWV U+4= -----END CERTIFICATE----- ubuntu-sso-client-13.10/data/UbuntuOne-Go_Daddy_Class_2_CA.pem0000664000202700020270000000265112151461736024275 0ustar dobeydobey00000000000000-----BEGIN CERTIFICATE----- MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJV UzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQL EyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4X DTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMx ITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMo R28gRGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAw DQYJKoZIhvcNAQEBBQADggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d /+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9 S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32qRe3H3I2 TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVl OARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFA pMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44 dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLEsNKR1EwRcbNh yz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2oatTj oWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdy b3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEF BQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYX MP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheab IZ0KbIIOqPjCDPoQHmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzr Tia2cyvk0/ZM/iZx4mERdEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBD pqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/bvZ8= -----END CERTIFICATE----- ubuntu-sso-client-13.10/data/Ubuntu-B.ttf0000664000202700020270000122657012151461656020457 0ustar dobeydobey00000000000000PDSIGÕOx 4DGPOSרVͧè5œGSUBmCëvÝ„6°LTSHÑ~ðòOS/2ŠZüáØ`VDMXæÔîÚäÖcmap`¯ûÏIJcvt D æ¨bfpgmv½DÄßx#gasp §Øglyf¹p+ñìßhdmx Påð1¼žhead÷òsÃ\6hhea c )”$hmtx`¤´‚8¸kernÕÑžRloca„ þè Þmaxp ’¸ nameÊìe©oT ßpostÍ µ2{4,¢prepO‘ãåœ -úaÛ—_<õèÉŠ¶XÉšgsÿVÿ#J ¤ÿC¢ÿVÿUJîîpi/Y ùƒ¼¼ŠŒ¼ŠÝxú àÿP [DAMA ûÿG8¤½ ŸVµ ô2ðð2Ñ2»78#–#Á#÷2dFdö(81öTöµÿç8"8F8#888&8%8+8'8öö828181ÇÎ2Ñ  Pˆ2áP^P>P¾2ÞP<P ¬P3P<ôP2„P2›PF%fÃFÒ ´£ •b#sZµÿçs 8ô)#\Fô-\-H-¦FR-MF!7!ÿ¸CF<F^FMF_-\F\-¦Få'¼AMA&  * #ô#s#BZs 88.ó¦ÿ¸Æè<î#î#Ž*(#F%Gå2ó(óÆ(Æl&ôèuVå'G©-•ð28-888ÿû.PO2U82T2xk81kkRFÆ(öF-k&É!UnnnÇÑ Ñ Ñ Ñ Ñ Ñ â ˆ2^P^P^P^P<#<2<<ÿäì ôP222228>2ÃFÃFÃFÃF•„P“F)#)#)#)#)#)#j#ô-H-H-H-H-!!)!ÿö!ÿÐY-MF_-_-_-_-_-81_-MAMAMAMA#\F#Ñ )#Ñ )#Ñ )#ˆ2ô-ˆ2ô-ˆ2ô-ˆ2ô-áP­-ì ^-^PH-^PH-^PH-^PH-^PH-¾2R-¾2R-¾2R-¾2R-ÞPMDô W<ÿç!ÿÙ<ÿÿ!ÿñ<!ÿð< !<N!F!7IP@7 !ÿ¸¬PCFCPFF3J<23P<03PrF3PFRlÿöôPMFôPMFôPMFzkÿíôPMF2_-2_-2_-›P¦F›P¦›P¦FF%å'F%å'F%å'f¼Af¼Af¼AÃFMAÃFMAÃFMAÃFMAÃFMAÃFMA´ •#b#ô#b#ô#b#ô#IFF%å'f¼A!ÿ¸@„-xš+ö,D,83²'´ ´ ´ •#˜ÿVkkkkkkkkk&kkkkkkkk¨Cnnnnnnnnnnnnnnnnnnnnnnnnd%µ ÚP(81˜ÿVöZ|‘8818181N/IFÄFÄFàFàFgFƒFN-Ï2#$>) ;)8(; kk&kkkkkkkkkk&kkkkkkkkÐ(ÙÙÒdFdTµÿçÎ2sZµÿçs s#s Gl&ôèG2UUÇ\+ŠP\F\ÿñƒÿûˆÐ2$-ì lŠ-\-Q*^#Ú2g->ÿÐÙ2Ñ qF³Pj·PCFX # ÖFôÿÐfF22_-22e-\F›PF(å(S¡ÿؼA޼AfëFrA#ÔFË_b#ô#ff7( 5,  é'LFBZ1Z:2P¿PG-BPPP[FPPnFÑ )#<!ÿö2_-ÃFMAÃFMAÃFMAÃFMAÃFMAH-Ñ )#Ñ )#â j#Ø2Z-¾2R-¬PCF2_-2_-f!ÿ¸P¿PG-¾2R-%PŸPôPMFÑ )#â j#2_-Ñ )#Ñ )#^PH-^PH-<ÿº!ÿ­<ÿþ!ÿð2_-2_-›P¦›P¦FÃFM4ÃFMA8Ý ÞPMFÀP-È2V(b#ô#Ñ )#^PH-2_-2_-2_-2_-•#ýÿûFýÿû—-—-ç •2-> `å(ô#û  í Ò ^PU-& +ÿº,2\-¦ ¬ © 3 †!ÂDxx9Ê#Ê#Ê#_K(p1p1ÊÊÊ^P^P.QP®2F%<P<ÿä j3P¬PôPŒÚPÑ ŠP PQP6^P× bôPôP¬P<ÞP2ÚP„Pˆ2fŒf.£ P¨(üP8PŸP“P©(9P±()#Y-VFÅF¦H-Q ïkFkFJFs ù<QF_-QF\Fô- #-* xF8-\FƒF8F4F hFHH-H-WÅF #å'!7!ÿÐ!ÿ¸† dFWJFkF#QF_-ë| 2_- U ;Pv2” 6 ŽPfF=PÏFz< 2¤P9Fþ i bïáP^FPªFÄ ^‘'P{FEPFUPiF 2y-ˆ2ô-fù •% •% Ì K «¹ Ô2M¨22¼PMFp Ä p Ä <P× Q ¿P>F> £ ÞPXFPsF¨(8-¸<2!FÑ )#Ñ )#â j#^PH-Ú2H-Ú2H-× Q bïfôPkFôPkF2_-2_-2_-©( Œ#Œ#Œ#¨(8-QPÅFŸP8FaPè88 88‹ Ñ  PQPµ ^Pb#ÞP2<P¬PÒ <ôP.#2ÚP„PSf•f.£ MA(j-}F-_-%ô<MFg05DFF# RF& ,1_-QFdFô-w-ã QA-* .AJ0ÑëÿýkÿýÉÿý<ÿäyÿý]ÿý•gÿýj-%MF5D5ÿÚ5ÿ½_-QAQAQAJ0À}igGj-j-j-j-j-j-j-j-îî Êÿþ¬ÿÿzÿù˜ 2ÿø2ÿø%%%%%%ÿëãļÎMFMFMFMFMFMFMFMFncD<Nãÿøáÿø575D5ÿ¿5ÿË5ÿá5ÿØ5ÿù5ÿùÙÛÁ¢š¬Aÿø?ÿø_-_-_-_-_-_-ƒ¡‡i FnQAQAQAQAQAQAQAQA4ÿ÷üÿÿ.ÿÿÒÿîJ0J0J0J0J0J0J0J0|¦Šj 1D ìÿøìÿøj-j-%%MFMF5 5_-_-QAQAJ0J0j-j-j-j-j-j-j-j- $ ÿþâÿÿ°ÿùÎ jÿøjÿøMFMFMFMFMFMFMFMFµ´¥† †©ÿøÿøJ0J0J0J0J0J0J0J0²ãÀ£ iž"ÿø"ÿøj-j-j-j-j-j-j-Ñ Ñ & b]5Kb]„]MFMFMFMFMF&- ¦­ Pvk9\~!5ÿû5ÿü5ÿ¤5ÿ½5ÿó5ÿê<ÿþ<ÿÿ-Cbfl‡!QAQAQ:QAdFdFQAQA••q” -GgG J0J0J0J0J0îÉðÁG(bZ  ÞÿþÀÿÿ¢ÿù­ 2ÿø2ÿø}mO Prãÿøáÿø|®ž€ m£ìÿøìÿøÑ ÞP(8-Ç ¢ÑIî®(Å «Ç’Æ ÆÆ E   0 6 …EL …   ¨¨ ¥r+upYE& ÿšÿÌÕ½eeCÌ̽½€  …®”1’ò«Æm EEEEEE  …  ¨¨¨¨+++++]+EEE          0¨¨¨¨¨¨/ ¨  ¥¥† + + +uuu…p…p…p LE…   —…p¨ LELELE…H ¬Æ2|ŒŒ¥¥qq   ’ ÿÿ€ ® .  ,  p…ÿ* îy + +   p…‹…  …Q / š˜®E¨ + EE2  ++ ¨ |'E+EE ¨¨ + +uu02(" E + + + +…ÂyÂUUBQ  E ¦  eŽ  0 ,, L…E ,  60  …Ly ]X 1 & !Œ i ~,+, ³~&ph™Œ P ! ¨¨¨~€ z+sš +?S * >U  -‹ &  …¦…­‘­ 3Œ †ši!&04>¨EE   i   + + + LLL,!1™ ‹’E ,H 0 E6  ……y –¬˜Y+  ¡ ZY +, Î,~&~{E… ¡¡¡+,,,{ '¡¡¡¡¡¡¡¡(++++++*,,,,,,,,{{{{{{{{' ¡¡++,,{{{{{{{{{{0EE2(2 ¡¡¡¡¡¡$,,,,,,……{{{{{ E0¬Z$® 8 ÂLÁÈ ÿý ÿý ÿý ÿý ÿý ÿýÿýÿüÿüÿüÿüÿûÿûÿûÿûÿúÿúÿúÿúÿúÿúÿùÿùÿù ÿø!!ÿø"#ÿø##ÿø$$ÿø%%ÿø&&ÿø')ÿ÷(*ÿö)*ÿö*+ÿö+,ÿõ,,ÿõ--ÿõ./ÿõ/1ÿõ01ÿõ12ÿõ23ÿô33ÿô44ÿô56ÿó66ÿó78ÿó89ÿó9:ÿó::ÿó;<ÿó<>ÿò=>ÿò>?ÿñ?@ÿñ@@ÿñAAÿñBCÿñCCÿñDDÿñEEÿðFFÿðGGÿðHHÿðIJÿïJKÿïKLÿïLMÿïMMÿïNNÿîOMÿîPOÿîQOÿîRPÿîSQÿîTQÿíURÿìVTÿìWVÿìXVÿìYWÿìZXÿì[Xÿì\Zÿì][ÿë^\ÿë_]ÿê`]ÿéa^ÿéb`ÿéc_ÿédaÿéebÿéfcÿégdÿèheÿèifÿèjgÿèkgÿçliÿçmkÿçnlÿæolÿæpmÿæqnÿærnÿæspÿætqÿåurÿåvsÿäwtÿäxtÿäyvÿäzwÿä{xÿä|yÿä}zÿã~zÿã|ÿã€}ÿã}ÿã‚~ÿãƒÿâ„€ÿâ…ÿↂÿ⇃ÿ∄ÿቅÿኅÿወÿገÿá‰ÿàŽŠÿà‹ÿà‹ÿß‘Œÿß’ÿß“ÿß”ÿß•ÿß–’ÿÞ—“ÿÞ˜“ÿÝ™”ÿÝš•ÿÝ›–ÿÝœ˜ÿÝ™ÿÝžšÿÝŸ›ÿÝ ›ÿÜ¡œÿÜ¢ÿÛ£žÿÛ¤ŸÿÛ¥ ÿÛ¦¡ÿÚ§¡ÿÚ¨£ÿÚ©¤ÿÚª¤ÿÚ«¦ÿÚ¬§ÿÙ­¨ÿÙ®©ÿÙ¯©ÿذªÿر«ÿز¬ÿس­ÿØ´¯ÿص¯ÿ×¶°ÿ×·±ÿ׸²ÿ×¹²ÿ׺´ÿÖ»¶ÿÖ¼·ÿÖ½·ÿÖ¾·ÿÕ¿¸ÿÕÀºÿÕÁºÿÕ¼ÿÕýÿÔľÿÔžÿÔÆÀÿÓÇÁÿÓÈÁÿÓÁÈÿþ ÿý ÿý ÿý ÿý ÿýÿýÿüÿüÿüÿüÿûÿûÿûÿûÿúÿúÿúÿúÿúÿúÿùÿùÿù ÿø!!ÿø"#ÿø##ÿø$$ÿø%%ÿø&&ÿø')ÿ÷(*ÿö)*ÿö*+ÿö+,ÿõ,,ÿõ--ÿõ./ÿõ/1ÿõ01ÿõ12ÿõ23ÿô33ÿô44ÿô56ÿó66ÿó78ÿó89ÿó9:ÿó::ÿó;<ÿó<>ÿò=>ÿò>?ÿñ?@ÿñ@@ÿñAAÿñBCÿñCCÿñDDÿñEEÿðFFÿðGGÿðHHÿðIJÿïJKÿïKLÿïLMÿïMMÿïNNÿîOMÿîPOÿîQOÿîRPÿîSQÿîTQÿíURÿìVTÿìWVÿìXVÿìYWÿìZXÿì[Xÿì\Zÿì][ÿë^\ÿë_]ÿê`]ÿéa^ÿéb`ÿéc_ÿédaÿéebÿéfcÿégdÿèheÿèifÿèjgÿèkgÿçliÿçmkÿçnlÿæolÿæpmÿæqnÿærnÿæspÿætqÿåurÿåvsÿäwtÿäxtÿäyvÿäzwÿä{xÿä|yÿä}zÿã~zÿã|ÿã€}ÿã}ÿã‚~ÿãƒÿâ„€ÿâ…ÿↂÿ⇃ÿ∄ÿቅÿኅÿወÿገÿá‰ÿàŽŠÿà‹ÿà‹ÿß‘Œÿß’ÿß“ÿß”ÿß•ÿß–’ÿÞ—“ÿÞ˜“ÿÝ™”ÿÝš•ÿÝ›–ÿÝœ˜ÿÝ™ÿÝžšÿÝŸ›ÿÝ ›ÿÜ¡œÿÜ¢ÿÛ£žÿÛ¤ŸÿÛ¥ ÿÛ¦¡ÿÚ§¡ÿÚ¨£ÿÚ©¤ÿÚª¤ÿÚ«¦ÿÚ¬§ÿÙ­¨ÿÙ®©ÿÙ¯©ÿذªÿر«ÿز¬ÿس­ÿØ´¯ÿص¯ÿ×¶°ÿ×·±ÿ׸²ÿ×¹²ÿ׺´ÿÖ»¶ÿÖ¼·ÿÖ½·ÿÖ¾·ÿÕ¿¸ÿÕÀºÿÕÁºÿÕ¼ÿÕýÿÔľÿÔžÿÔÆÀÿÓÇÁÿÓÈÁÿÓÁÈ ÿ÷ ÿý ÿý ÿý ÿý ÿýÿýÿüÿüÿüÿüÿûÿûÿûÿûÿúÿúÿúÿúÿúÿúÿùÿùÿù ÿø!!ÿø"#ÿø##ÿø$$ÿø%%ÿø&&ÿø')ÿ÷(*ÿö)*ÿö*+ÿö+,ÿõ,-ÿõ--ÿõ./ÿõ/1ÿõ01ÿõ12ÿõ23ÿô33ÿô44ÿô56ÿó66ÿó78ÿó89ÿó9:ÿó::ÿó;<ÿó<>ÿò=>ÿò>?ÿñ?@ÿñ@@ÿñAAÿñBCÿñCCÿñDDÿñEEÿðFFÿðGGÿðHHÿðIJÿïJKÿïKLÿïLMÿïMMÿïNNÿîOMÿîPOÿîQOÿîRPÿîSQÿîTQÿíURÿìVTÿìWVÿìXVÿìYWÿìZXÿì[Xÿì\Zÿì][ÿë^\ÿë_]ÿê`]ÿéa^ÿéb`ÿéc_ÿédaÿéebÿéfcÿégdÿèheÿèifÿèjgÿèkgÿçliÿçmkÿçnlÿæolÿæpmÿæqnÿærnÿæspÿætqÿåurÿåvsÿäwtÿäxtÿäyvÿäzwÿä{xÿä|yÿä}zÿã~zÿã|ÿã€}ÿã}ÿã‚~ÿãƒÿâ„€ÿâ…ÿↂÿ⇃ÿ∄ÿቅÿኅÿወÿገÿá‰ÿàŽŠÿà‹ÿà‹ÿß‘Œÿß’ÿß“ÿß”ÿß•ÿß–’ÿÞ—“ÿÞ˜“ÿÝ™”ÿÝš•ÿÝ›–ÿÝœ˜ÿÝ™ÿÝžšÿÝŸ›ÿÝ ›ÿÜ¡œÿÜ¢ÿÛ£žÿÛ¤ŸÿÛ¥ ÿÛ¦¡ÿÚ§¡ÿÚ¨£ÿÚ©¤ÿÚª¤ÿÚ«¦ÿÚ¬§ÿÙ­¨ÿÙ®©ÿÙ¯©ÿذªÿر«ÿز¬ÿس­ÿØ´¯ÿص¯ÿ×¶°ÿ×·±ÿ׸²ÿ×¹²ÿ׺´ÿÖ»¶ÿÖ¼·ÿÖ½·ÿÖ¾·ÿÕ¿¸ÿÕÀºÿÕÁºÿÕ¼ÿÕýÿÔľÿÔžÿÔÆÀÿÓÇÁÿÓÈÁÿÓÁÈ!ÿø &ÿø +ÿö /ÿõ 3ÿô 6ÿó:ÿó@ÿñCÿñGÿðLÿïMÿîQÿîVÿìZÿì]ÿéaÿéeÿèiÿçnÿærÿåvÿäzÿã}ÿã ÿâ!…ÿá"Šÿà#ÿß$’ÿÞ%•ÿÝ&šÿÝ'žÿÛ(¡ÿÚ)¦ÿÚ*©ÿØ+­ÿØ,±ÿ×-·ÿÖ.ºÿÕ/¾ÿÔ0ÁÿÓ1ÆÿÓ2ÉÿÑ3ÏÿÐ4ÒÿÐ5ÖÿÎ6ÙÿÎ7ÞÿÍ8âÿÌ9æÿË:êÿÊ;îÿÉ<òÿÈ=õÿÇ>úÿÆ?ÿÿÅ@ÿÄAÿÄB ÿÃC ÿÂDÿÁEÿ¿Fÿ¿Gÿ¾H"ÿ½I&ÿ¼J)ÿ¼K-ÿºL2ÿºM6ÿ¸N:ÿ¸O=ÿ¶PBÿ¶QFÿµRJÿ´SNÿ³TRÿ²UVÿ±VZÿ°W_ÿ¯Xbÿ®Ygÿ®Zjÿ­[mÿ¬\qÿ«]vÿª^zÿ©_~ÿ¨`‚ÿ§a†ÿ¦bŠÿ¥cŽÿ¤d’ÿ£e–ÿ£fšÿ¡gžÿ¡h¢ÿŸi§ÿŸj«ÿžk®ÿl²ÿœmµÿœnºÿšo¿ÿ™pÂÿ˜qÆÿ—rËÿ—sÎÿ–tÒÿ•uÖÿ”vÛÿ“wÞÿ’xãÿyçÿzêÿ{ïÿŽ|òÿ}÷ÿ~úÿ‹þÿ‹€ÿŠÿ‰‚ ÿ‡ƒÿ‡„ÿ†…ÿ…†ÿ„‡ÿƒˆ"ÿ‚‰&ÿŠ*ÿ‹.ÿŒ2ÿ7ÿ~Ž;ÿ}>ÿ|Bÿ{‘Fÿz’Kÿy“Oÿw”Sÿw•Wÿv–[ÿu—^ÿu˜bÿt™gÿsškÿr›nÿpœsÿpvÿož{ÿnŸÿm ƒÿl¡‡ÿk¢Šÿk£Žÿi¤’ÿh¥˜ÿh¦›ÿf§Ÿÿf¨£ÿe©§ÿdªªÿc«¯ÿb¬³ÿa­·ÿ`®ºÿ_¯¿ÿ^°Ãÿ]±Æÿ\²Ëÿ\³Ïÿ[´ÓÿYµÖÿY¶ÛÿX·àÿW¸âÿV¹æÿUºëÿT»îÿT¼òÿR½÷ÿR¾üÿP¿þÿPÀÿOÁÿN ÿMÃÿLÄÿKÅÿJÆÿIÇÿHÈ#ÿHÁÈ ÿý ÿý ÿý ÿý ÿý ÿýÿýÿüÿüÿüÿüÿûÿûÿûÿûÿúÿúÿúÿúÿúÿúÿùÿùÿù ÿø!!ÿø"#ÿø##ÿø$$ÿø%%ÿø&&ÿø')ÿ÷(*ÿö)*ÿö*+ÿö+,ÿõ,,ÿõ--ÿõ./ÿõ/1ÿõ01ÿõ12ÿõ23ÿô33ÿô44ÿô56ÿó66ÿó78ÿó89ÿó9:ÿó::ÿó;<ÿó<>ÿò=>ÿò>?ÿñ?@ÿñ@@ÿñAAÿñBCÿñCCÿñDDÿñEEÿðFFÿðGGÿðHHÿðIJÿïJKÿïKLÿïLMÿïMMÿïNNÿîOMÿîPOÿîQOÿîRPÿîSQÿîTQÿíURÿìVTÿìWVÿìXVÿìYWÿìZXÿì[Xÿì\Zÿì][ÿë^\ÿë_]ÿê`]ÿéa^ÿéb`ÿéc_ÿédaÿéebÿéfcÿégdÿèheÿèifÿèjgÿèkgÿçliÿçmkÿçnlÿæolÿæpmÿæqnÿærnÿæspÿætqÿåurÿåvsÿäwtÿäxtÿäyvÿäzwÿä{xÿä|yÿä}zÿã~zÿã|ÿã€}ÿã}ÿã‚~ÿãƒÿâ„€ÿâ…ÿↂÿ⇃ÿ∄ÿቅÿኅÿወÿገÿá‰ÿàŽŠÿà‹ÿà‹ÿß‘Œÿß’ÿß“ÿß”ÿß•ÿß–’ÿÞ—“ÿÞ˜“ÿÝ™”ÿÝš•ÿÝ›–ÿÝœ˜ÿÝ™ÿÝžšÿÝŸ›ÿÝ ›ÿÜ¡œÿÜ¢ÿÛ£žÿÛ¤ŸÿÛ¥ ÿÛ¦¡ÿÚ§¡ÿÚ¨£ÿÚ©¤ÿÚª¤ÿÚ«¦ÿÚ¬§ÿÙ­¨ÿÙ®©ÿÙ¯©ÿذªÿر«ÿز¬ÿس­ÿØ´¯ÿص¯ÿ×¶°ÿ×·±ÿ׸²ÿ×¹²ÿ׺´ÿÖ»¶ÿÖ¼·ÿÖ½·ÿÖ¾·ÿÕ¿¸ÿÕÀºÿÕÁºÿÕ¼ÿÕýÿÔľÿÔžÿÔÆÀÿÓÇÁÿÓÈÁÿÓ ð                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              "                                                                                                                                                                                                                                 "$                                                                                                                                                                                                                                 $'                                                                                                                                                                         !!!!"! !      ')                                                                                                                                            #""###!#         )*                !                                                       !  !                                                $##$!!%$#$!!       *.            #                                         #!##!                         #" !!!'&&'## "('%'##        .0            %                                   $"$$"                     !  $#"" ""((()%%"#)('(%%      ! ! 01            &                                     &# %&#       !     !     !   "! !"!  %$#$!!##*))*&&#$+*(*&&     ! !"!!" 13             &                            %%          '$!!&  '$!          " "  !  "      "!!! #"!" #" !  &&$%""$$+**+''$&,+*+''    ! "!!"##"$3 6             +                            %&       !"   *'##)!   *'##         $"!## !#   $        $### %$#$!"%$"#  !")(&'$$''.--.**&(/.,.**! !     #  $##$ &%$& 6!8            ! , ! !         !                %'    !   !#  +($$*" ! +($%!        %# #%$ !%  ! %!       ! %$$$!! &%$%"# &%#$!! "#*)()%%((0//0++()10./++" "   ! ! $ ! %$$&!!'&%'!!8#;     " "      #. # #  !      #        "    """ !  %'  "  #   #&  .+&&-% # .+&%# !!    (&"#% & #'! "! #" '#     "! #"!"'&&'## !)(&($%"!)(&&## $%-,*+((**3113..*,4302..$ !!%   #"#"& #"!!(''(##!)((*##;#%? "   $ !#   "  %1 %  %  #      %        !#   ### #  ,-  $ %  " &(   0-)(/'  %  0-)(%  $$    *($!"&)"( "#!" $"&!) #!! $ # % $ "!)% !"     !    $#!"%$#$! *(()%% !"+*(*&($ !#+*((%%  &'/.,.**--544600 ,.653511& ##' !" %$%$) %$"#!!*))*%%!#,+*,%%?&&A #   % !$   "  &2 &  &  $     !!!& !       "$   $$$$!!!!!!!!!!!!!!!!!!!!!!!!   ,- % & !" &)!  1.*) 1(! &! 1.*)&! $$    +)%!"&)#)  "#!" $#'" *!$!! %  $ &!% #!+& !"    ! "!!  %$"#&%$%"!+*)*&& "#,+*+')% "#,+)*&&  '(10./++..766722 .0875722' #$( !# &%&%* &$#$""+**+&&"$-,+-&& A&(D %    ' #  &   $ (5 ( (" %      ###(   #  " !   $   &   &&&%########################  ",- ' (  #$ ( +# 41,,"3*# (#   41,*(#       &&   ! -+!' # $ (+%+" "$!# $#  !(#  !,# &## '"!& (#'"   %!-( # $"   ""# $"# "'&$%!!('&'$#-,+,(( $%.-,-!)+'""""""""$%.-+,(( "")*3201--00:99:44""""""""02;:7:55 )  !%&* #%! """""('(&, (&%&!!$$-,,.(($&/.-/(( D(*G '    ) ' !!(   $! *7* *$'  !!  %%%*  !!!!!!%   # #     % !!!(!   (!(!(!'%%%%%%%%%%%%%%%%%%%%%%%%" #01 )* "%% ) !!-%!  73..$6,% !*%!! 73.- *%! !!!!!!!!&& "" /-  #) !'!%!+/ '-"!"$&"% %% ! #+$!!"#/%"(%% )"#!(" *%)"  !!!'"/*! ' !%'" ""$% %$% $ )'%'"" *(()&%/...** &'1/.0"+-)$$$$$$$$%'1/-.** $$+-6524//33=;;=77$$$$$$$$25>=:<77"!+ ""'(, %&" $$$$$*)*(. !!*('(""&&0..0**%(2002**"G(.N  *    - " "*#$$!!+  '$ .=. .'+ %% ! ((( ."#$$$$$$!!!!(    " "    "#     ' &###)#$$$!!!!!!+$  +$+$+$+(((((((((((((((((((((((("$ ' ""35 -. %!"(""!) /#$$1($"$!! <822';0(  $!!!!!  .(! $$ <82 2# .($    $$!!" $! $$$$$++""! %% 41##" &-##$*"$"'$/2$+2 "'#%')&( *(#$$&/("$!%%'3(%!+!! (!(!-' &"$-$  .(""-'##$$$+&4. "$!*#$"''$%%' "()(('##-+)*&&#".,,-)(4223.. )+5424&/1-'''''''')+5412..''/1;:794477BAAC<<''''''''7:DB@B<< %$/%%++0)*% '''''.-.,2 $$.,++&&))4334..)+6547.. "$N,2U #.#    1%" %#%"-&( (!#%/"  +( 2B2 2+/ (($ ,,,%%%%%%2 %&((((((#### !,%%%    %"%####%&* "*&&&-&(((!!!######/(   /(/(/( /,,,,,,,,,,,,,,,,,,,,,,,,#%'  *##$$78 12 )! $%,!%$$-#2&((6+'!!%'$# A=77*@4,%(#####%%2,$#"(( A=7#7"&%2,(%%((!!##%#'$%(((( '--&!"%%)"")"96'"&!%%!")1&&"'-%(% !."("48'.!"6"$+'' +, )+ .,& (() !! "4,%'!#(!( *!7,(   $0#$##,#,#1+#*"%'"/(%%2,%%1+&&((("!!!".)82%"#%("%-&(%  .",' '*)%%,,+ ,)&&1/-.))&%2001-,876722#"!"-.:879)361))))))))-/:96722))35@?<>99<?  56 !,#!!##'(/#! !'!''0&4)!++!:/*!$ # ("*'%!!!!  FB;;.!E8/(+!& & & & & ((6/'!& %+!+!!FB;& 9$) (6/+!((! ! +!+!$$& & ( &*& !(! +!+!+!+!"*00)$ $((! ,!%$!!, %=:*%)$&(#$ ,!5!))%+0(+'## $0$+%69*2$%:% ' .!! ") ! !*".0#-/ 2/ !"!)#+!* -"$#!"%7/!(!*$&!+#,"-#=@66(()\5:b)!5)"!!!!!!!!!!!!!8+'&+#!)+(!3,.%.'"#)+7'%#! ##""""3"###"!- !!:M"::26%!!!!.#!."")#333++++++:&####+,.....!.))))%%& 3""""#"#####"#"""" # + + + &&&&+(+##"#"#"#"#")")")")"+",#1!("0"!!!!",",","4$,".#.#.#'''"""###)")")")")")"7-% ###"#7-7-7-% 6333333333333333333333333$)* ,! #%!!!!"1**,,CE"! ! !!! 8:###/&##%&* +3&#"#*$!**4(" ;,$..#>2-#'"#&#+$-*($#$$! "!#KF@?1#J=3+ .#)")")")")""+ + :3*#)"(".#.#$KF@)"@',"+ :3.#+ + #"#".#.#'')")"!+")-)##+ #".#.#.#.#% .77,&!#'++## /#'' ##/"("B>-(,&++&'"0#9#,,(.3+.*%&#&3'.';>-6&(?( ##+"3$$"$+"#"# / %!35%0"3"""#74#"$ $#+&.#/#0%&!&$!%'!;4#+#-')#.&/%1&@3.%&#%!%!*"6+*"(#)"3)3)93)!0'+#.$'!6.+ + :3#"*"*"93#$,$,$.#.#.#(& & & '!"60A:!!!!+'")##+.(+3, .*%##%3'3,$& #"$" "! #"$%"/ 11++342%3$"#"""1$$$$$$$$$,,8745//,+:878""""""""43A??@::)''(!!######46CA?B""""""""0;>91111111146CB>?::$$""##""11$$$$$$$$<=JIFGBB""""""""FFTRRTLL11111111FIUTPSLL$$$$$$$++/-<"""""//67=%! "$""""$$""%%35/$11111:8:8@--9867//44B@@B::47ECBE::++,!b8Cr"/&>/"'&&&&&&&&&&&&&A1-+1)&/1#.&<35+5-'(/1?-,)%"%("('('':')((!'%6%&"&& C""Y'C "C9!?,&&&&#$5(&5'(0(;;;111111C+))))2355555&5////,+,%%%%%%;"''''(')))))%)''''&(&1%1%1%+"+"+"+"1.2))')')')')'/(/(/(/(1'3(8'#.'8'&&&&#(3'3'3'<)3'5)5)5)---'!'!'!(((/'/'/'/'/'/'?6,&)")")"'!(?6?6?6,& $?;;;;;;;;;;;;;;;;;;;;;;;;)/1$4& (+&&&&(80022LN(&%&%&$&&A"C(((6,((++0%2;,(()1)&10</'%B3)55)H:4(-'!(+(2*41/*)"))##&%"!'&&WQII9(VF;1%5)/'/'/'/'/''1%1%C;1(/(.'5)5))#WQI/(H-3'1%C;5)1%1%)')'5)5)--/'/'& 1'/40()"1%)'5)5)5)5),&%6$>>3,"&(!""-21)(%6(-.&#))7(.'#LH4.3,01,-(7)B)33.5<151++(,:-5.DH4>,.H.%((/':!))'*3()((""&6%*&:<+8'#;'''(#!>;(')&*)1+5)5)7*,&,)&*#-&D;)!1)5-/)5,6+8,J:6*+"(",&*&0'?01','/';/;/B:/&8-1(5*.&@51%1%C;)'1'1'B:)!)#3)3)5)5)5).#,&,&,&.&(>8KC&&&&1-(/))15.1<3%51+((,:-84)+%)#"')'%(%%)()"*!(6%8812;<:,:)#')(((8)))))))))22A?<>77######32CA@A''''''''<;KIIJCC /--.''))))))<>NLIL((((((((7DHB88888888?77<-J.993;D7;70102B3;3LR:F13Q4)--"7,A%..,/;,.,-&)*;*/+?C0=*'A,,,-"'$DA-,.*-.8/;.<->/2*1.+#0'3+NC.%7-;15-<1=0?1SA37-;/3+H<7)7)KB-,7,7,JA.%.'9.9.;.;.;.3'2*2*2*3+,"F=TK+,*+72,5-.7;37D9*;70-02B3B:..+.'&,.,)-**.,.&/%,;*==78B"CA2A.',.,,,=".........88IGCE=='''''':8KHHI,,,,,,,,CBTRQSKJ#$5323++......CFWURU,,,,,,,,>MPI========CFWUPRKK..'',,..,,==........MP`^Z\UU,,,,,,,,ZZljjmbb========Z^nlhlcc.......77<;M(,,,,,<=FGN/+)*+.,,,,..,,22BE=(.=====KILHR;;JHFG==CCUSSUKJCGYVUYKK77:+"IS*':/L;*1$/////////////&Q<86=20:=,9/J?B5B703;?BBBBB/B;;;;757......I*00002122222/21111.2.<.<.<.6*6*6*6*=9>22020202020:1:1:1:1=1?2F0,90E0////+1?1?1?1J3?1B2B2B27#7#7#0(0(0(3%3%3%;1;1;1;1;1;1OA7.3*3*3*0(3% "$OAOAOA7. -NIIIIIIIIIIIIIIIIIIIIIIII3:=-?/ 25 ////1F::<<\^1&/-0./-//$Q$*S22&2C62256<->I6212=30=4@<;33*33++/.+)1/.le[ZF2jWI<.B2;1;1;1;1;10<.<.SI<2:190B2B23+le[:1Z8?1<.SIB2<.<.2020B2B27#7#;1;1/(=1:A;23*<.20B2B2B2B27.+A*LL>7+01(**%8><22.C28$90+ %&&&&&&22D190,^Y@9?7><681D2R3??9AJ=B=5637I8B8U[@M79Z9.22&<0F)3314?1212*,.B.4/HK5C/+I0002&+(LI213.32>5B2B2E47/630&5,8/VI3)=2A6;2B7C5E6\HB56*3*7.3.;1N<<18/:1I;I;RF:0E8=2A48/OB<.<.SI20=0=0RF3)3+?3?3B2B2B29+7.7.7.8/1&MC]S//0/!<81:23=B9I&JG7H3+12111F% 333333333>>QNJLDD++++++@>SPOQ11111111JI][Z[SR'';87900222222KM`^[^11111111DUYQFFFFFFFFJN`^Y[SS33++112211FF33333333UXjhdf^^11111111ddxuuxllFFFFFFFFdhzxswmm3333333<<8"("5.38.86'765P6888'-)63H32.##44&,\00%x6\,,#.\"O-V<4446/1I%74I#"7!!7A!*7QQQ*BBBBBB[<8888EFIIIII4IAAAA<;=333333P.66667688888686666282B3B3B3<.<.<.<.D?E88686868686A7A7A7A7D6F7M51?5M6444"407F6F6F6R9F6I8I8I8='='='6-6-6-8)8)8)A6A6A6A6A6A6WH<28.8.8.6-8)$#&(WHWHWH<2!!!!!!!!!!!!!!!!!2VQQQQQQQQQQQQQQQQQQQQQQQQ8@C2G47;&44446MAADDhk6+42535245!!!!!!!!!!!!!!!!!!!!!!(Z"("###.\77*8K<88;F6B3[PI8B3B38686I8I8='='A6A64,D6AHB78.B386I8I8I8I8<21I/TTE=/58-./)>EC873K8>'>4/$)##*** ""***88K7?61hcG?F=BB<>7L8Z8FF?ITDIC;<8=R>I?\bGU=?c?377*C6N.996:G7878.02J3:4NR;L50P6667*0-UQ769288D;I8I7L:=4<85+:0>4^Q8.D8H=A8ID7H:?4XIB3B3[P86C6C6ZN8.8/F9F9I8I8I8?0=2=2=2?47*ULg\4444$B>7@88DI?CTF3IC;78NG9;48/.6962733878.:,7I3LNBEQ*RO=?55888888SUkheh77777777K^bZNNNNNNNNRVkhcd\\99//668877NN99999999_bvsnqhh66666666oo…‚‚…xxNNNNNNNNos‡…„yy9999999BBJH_!!$166666JKVW`:4#2358$77778877<GH_DD=%,%927<2<:*;;: W;=<<*1-;7O772' '99*/d22(„:!d//%2d%U1!^D999846P(<9#P&%<$$;G!$-L;O=O=O=C*C*C*:1:1:1>->->-G;G;G;G;G;G;_OD7=2=2=2":1>-'&) +_O_O_OD7$$$$$$$$$$$$$$$$$6^XXXXXXXXXXXXXXXXXXXXXXXX=EI6P9<@)9999;TGGJJqt;.87979699$$$$$$$$$$$$$$$$$$$$$$#,a%,%''!%2d!<<.9IHY,$F:"7dL=OO=kWNK?MHI==2==449831; 89‚znmU<€hXH7 O=G;G;G;G;G;:H7H7cWIAXDODfmM]BDlE7<<-H:U2>>;?M;=;<257Q7?9W[@S:4X:::<-41\X<;>7>=K@O=O3D7B7H;^IH;D:F;XGXG bUF9SDIL>O=O=O=D4A7A7A7D9;-]Spd9899(HC;E==IO DHZL8OI@<>DXDXP>A8=42;>:6;78=;=2?1;Q7SUHKX. YVDW>4;=;;;U-&>>>>>>>>>KKa^Y\RR444444MKd``a;;;;;;;;ZXpmlndc/0GCCD::======Z]tqmq;;;;;;;;RfkbUUUUUUUUY]tqkmdd>>44;;==;;UU>>>>>>>>gj€}x{qq;;;;;;;;yx‘‘ƒ‚UUUUUUUUx}“‹ƒƒ>>>>>>>HHQNg##'6;;;;;QQ]^i?9& 68:=';;;;==;;DDX\Q6>UUUUUeae`n#NNc`]^RRZYqnnrdcY^vsqwddHIP9.ªbâìÆž€ ~O’¼ÇÉÝ†ŠŒ¡Î_cuù…óEMWY[]}´ÄÓÛïôþ    " & 0 : D p y ‰ ¬ ® ´ ¹!!!"!&!.!^""""""""+"H"`"e%Êàÿïýðõøûÿÿ   ’¼ÆÉØ„ˆŒŽ£brŠ€ò HPY[]_€¶ÆÖÝòö    & 0 9 D p t € ¬ ® ´ ¹!!!"!&!.!S""""""""+"H"`"d%Êàÿïýðõøûÿÿÿùÿõÿäÿãþ¢þ—ÿ HHþÀþ¿þ±þâæâzäæäääâäàäÞäÝäÜäÛäÚäØä×äÖäÔäÓäÑäÐà@à:á*àÿàüàöß¶âìâåä1àmâßTàxàSߘߕßߋ߈߅ßyß]ßFßCÛß#ìï ˆ ±”îîööFJNRR:J88{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ     !"#$%'()*+,-./my0123456789:;kw<=>?@ABCDEFGHIJKLMNOPQzRSTUVWXæçèéêëìíîïðñòóôõö÷døùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|YZ[\}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—]˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯i_abcdueãåÏÕ×ÝžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µÓÖØÙÚÛá¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÜßÞàâst˜nocpqeghrlx‚ƒˆ‰Š‹Œ„…†‡Ÿí«­ª¬®¯°   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`aŸ ¢¤¬±·¼»½¿¾ÀÂÄÃÅÆÈÇÉÊÌÎÍÏÑÐÕÔÖ×g‹}~‚r‘º‰„vƒ¦¡³£Œ§¨€šœÅ¤…•žÁÓš|‡¢d¥›†–f{›ž°mystpqnoÒ©Úznblx¬®h’cej¥œ¦£¨©ª§®¯­µ¶´ iuŠabc“ed_Æž€ ~O’¼ÇÉÝ†ŠŒ¡Î_cuù…óEMWY[]}´ÄÓÛïôþ    " & 0 : D p y ‰ ¬ ® ´ ¹!!!"!&!.!^""""""""+"H"`"e%Êàÿïýðõøûÿÿ   ’¼ÆÉØ„ˆŒŽ£brŠ€ò HPY[]_€¶ÆÖÝòö    & 0 9 D p t € ¬ ® ´ ¹!!!"!&!.!S""""""""+"H"`"d%Êàÿïýðõøûÿÿÿùÿõÿäÿãþ¢þ—ÿ HHþÀþ¿þ±þâæâzäæäääâäàäÞäÝäÜäÛäÚäØä×äÖäÔäÓäÑäÐà@à:á*àÿàüàöß¶âìâåä1àmâßTàxàSߘߕßߋ߈߅ßyß]ßFßCÛß#ìï ˆ ±”îîööFJNRR:J88{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ     !"#$%'()*+,-./my0123456789:;kw<=>?@ABCDEFGHIJKLMNOPQzRSTUVWXæçèéêëìíîïðñòóôõö÷døùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|YZ[\}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—]˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯i_abcdueãåÏÕ×ÝžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µÓÖØÙÚÛá¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÜßÞàâst˜nocpqeghrlx‚ƒˆ‰Š‹Œ„…†‡Ÿí«­ª¬®¯°@?XUTSRQPONMLKJIHGFEDCBA@?>=<;:98765/.-,(&%$#" ,E#F` °&`°&#HH-,E#F#a °&a°&#HH-,E#F`° a °F`°&#HH-,E#F#a° ` °&a° a°&#HH-,E#F`°@a °f`°&#HH-,E#F#a°@` °&a°@a°&#HH-, <<-, E# °ÍD# ¸ZQX# °D#Y °íQX# °MD#Y °&QX# ° D#Y!!-, EhD °` E°FvhŠE`D-,± C#Ce -,± C#C -,°(#p±(>°(#p±(E:± -, E°%Ead°PQXED!!Y-, E°C`D-,°C°Ce -, i°@a°‹ ±,ÀŠŒ¸b`+ d#da\X°aY-,ŠEŠŠ‡°+°)#D°)zä-,Ee°,#DE°+#D-,KRXED!!Y-,°%# Šõ°`#íì-,°%# Šõ°a#íì-,°%õíì-, °` <<-, °a <<-,°C°C -,!! d#d‹¸@b-,!°€QX d#d‹¸ b²@/+Y°`-,!°ÀQX d#d‹¸Ub²€/+Y°`-, d#d‹¸@b`#!-,E#E`#E`#E`#vh°€b -,°&°&°%°%E#E °&`bch °&aeŠ#DD-, E°TX°@D E°@aD!!Y-,E±0/E#Ea`°`iD-,KQX°/#p°#B!!Y-,KQX °%EiSXD!!Y!!Y-,E°C°`c°`iD-,°/ED-,E# EŠ`D-,E#E`D-,K#QX¹3ÿà±4 ³34YDD-,°CX°&EŠXdf°`d° `f X!°@Y°aY#XeY°)#D#°)à!!!!!Y-,°CX°%Ed° `f X!°@Y°a#XeY°)#D°%°% XY°%°% F°%#B<°%°% F°%°`#B< XY°%°%°)à°%°%°)à°%°% XY°%°%CH°%°%°`CH!Y!!!!!!!-,°CX°%Ed° `f X!°@Y°a#XeY°)#D°%°% XY°%°% F°%#B<°%°%°%°% F°%°`#B< XY°%°%°)à°) EeD°%°%°)à°%°% XY°%°%CH°%°%°%°%°`CH!Y!!!!!!!-,°% F°%#B°%°%EH!!!!-,°% °%°%CH!!!-,E# E °P X#e#Y#h °@PX!°@Y#XeYŠ`D-,KS#KQZX EŠ`D!!Y-,KTX EŠ`D!!Y-,KS#KQZX8!!Y-,KTX8!!Y-,°CTX°F+!!!!Y-,°CTX°G+!!!Y-,°CTX°H+!!!!Y-,°CTX°I+!!!Y-, Š#KSŠKQZX#8!!Y-, ŠI°QX°@# Š84!!Y-,F#F`#Fa#  FŠa¸ÿ€bб@@ŠpE`h:-, Š#IdŠ#SX<!Y-,KRX}zY-,°KKTB-,±B±#ˆQ±@ˆSZX¹ ˆTX±BYY-,Eh#KQX# E d°@PX|YhŠ`YD-,°°%°%°#>°#>± ° #eB° #B°#?°#?± °#eB°#B°-@ vn)tp@pFnBia)gedeC)cadoaaBYQdWUdUC)SQdoQQBLD)JHdHC)FDdPDDBBAAA/A *U*U**U * U*U*U *U*UTS¸³¸K¸ÿRK°P[°ˆ°%S°ˆ°@QZ°ˆ°UZ[X±ŽY…BK°SX° YK°€SX°±BY+++++++++++^s++t+++++t+++++t+++++++++^µµÿðÿòÿòÿEÁ••€œ¡„‰–•˜|€Œ•˜}€v>:P2F-q€ÃnUK¯$$$$^j4Ú~HnžÐp Òò>ŠÎ6¬ôXÀö~âîú V „ Þ R  °  f ° æ  j ¤  ú~œ P¢æRº,R–¢ø:`‚¨Ôò„à0Œö8¬ò$rô„Âf¼ðt´ònÚ†Ø2L¦î x ‚ Ò Ü ì!!^!~"`"v"¤##,#^#¨#ò$ $>$\$š$ü%%>%Ò%ì%ì&&&€&Ú'R'Ì'ô(Œ(Â)>)–)¢)À)È*b*|*Ì++^+Ò+ð,<,^,h,–,º----.->-²-Ê-â-ú..*//€00 080P0j0‚0˜0®0È1*1@1X1n1„1š1´1î2d2|2’2ª2Ä2Ú3&3¬3Â3Ø3î444,4ä5d5|5’5¨5À5Ö5ê5þ66”6¨6À6Ö6ì777X7Ä7Ü7ò88848‚8š8°8Ä8Ú8î9Ž:.:D:Z:p:„:š:°:Æ:Ú:ò:þ;;t;Œ; ;¸;Ì;ä;ü4>Œ>¢>¶>Ì>à>ö? ?N?¦?¾?Ú?â?î?ú@@$@8@L@X@â@úAA$A8AJAVAhAtA¬AêBBB,B@BXBnBzB†BàC*C@CTCjC~C˜C°CÈCÜCðDDD0DFDZDpD„E"EÖF,FšF°FÂFôG6GLG`GvGŠG G´GÈGÜGöHHzHÞHôI I"I6ILIbIzII¦IºIîJJJ*J>JvJšJ¸JÀJðKKhK KÒKêLLL.LHLbLzLL LàM"MzMÖN NŽNæNðNúOOOO"O,O6O@OJO¢PPP"P2PBPRPbPrP‚P’P¢P²PÂPÒPâPòQQQ"Q2QBQRQbQrQ‚QâR@RhR¾RÆRÜRäRîS*SŠSÄTJTˆTìUPUžUªV$V,V”VœWHWêWòWúXX XXX"X*X2X:XBXJXRXZXbXjXrXzX‚XŠX”XžX¨X²X¼XÆXÐXÚXäXîYY0YRYhYpYxY€YˆYY˜Y Y¨Y°Y¸YÀYÈYÐYØYàYêYöZZ ZvZî[@[–[î\>\Ž\ð]L]T]¬]ü^V^Ô_ _j_Ü``†aa|a¬aàb:bÄccŠcæd>dzdÖeFe¦ff„fægNg°hh€hˆhèiFi~iÐj j`j¸k&kvkêlšlômLm´nn|nîo`oÄp$p|pÆpÎpÚq&q.q>qNq^qjqvq‚qŽqšq¦q¾qÒqèqürr&r€Z€t€Œ€¢€¸€Ò€êlè‚H‚Öƒ\ƒð„d„Ê……<…܆H†˜†ä‡p‡Î‡ÖˆFˆö‰:‰‰øŠbŠÎ‹‹ŠŒVŒºŒèp´ÞŽ&Žp޾&Ff¬ôJb|ê‘‘d‘l‘t‘Ž‘–’’r’Æ’Ü’ô“ “D“L“T“\“z“ȓДœ••R•h•p•´•¼•ĕ̕ԕܕä•ì–†–Ž–––È— —>—z—Θ,˜v˜Ö™:™¬™´šš’š´›››¸œ(œ†œœ&tèž ž(ž0ž8ž@ždžlžØžàŸŸbŸ–ŸÒ . Ž à¡H¡¨¢¢6¢N¢Â¢Ö£>£F£N£h£p£ð¤\¤d¤z¤’¤¦¤ä¥^¥Â¦.¦¦§&§¤¨.¨ª©>©¦ª ª”««0«R«Ž«È¬&¬‚­L®®¦¯N¯¼°°„°Þ±h±ä²N²¶³³L³ˆ³Â´0´’µ,µÂµÊµÒ¶¶4¶<¶’¶ø·`¸¸æ¹&¹`¹°ºº^ºº»»»Š¼ ¼½½"½:½R½´¾¾r¾à¿.¿€¿ÐÀ"ÀnÀÂÁBÁÌÁäÁüÂÂ*ÂBÂJÂRÂjÂ~†Ž¨ÂÂÂÜÂöÃÃ*Ã2Ã:ÃPÃdÃ~ÖðÃÈÄ&ČĦÄÀÄÚÄôÅ ÅÅ8ÅPÅjłŜŴÅâÆÆ.ÆHÆÔÆÜÇ\ÇÐÈÈbȒȚȢȪȲȺÈÂÈÊÉ0É8É@ɼÉÄÉÌÊ ÊÊDÊLʠʨʰË0Ë8Ë€ËÒÌ8Ì ÌðÍhÍäÎNÎŒÎÜÏÏÏ|τόÐÐ$ÐRÐ Ñ Ñ\ÑœÑÔÒ8Ò@ÒŽÒöÓ ÓÓ"Ó.ÓHÓTÓ`ÓzÓ†ÓšÓ®ÓÂÓÖÓðÔÔ"Ô:ÔNÔjÔ€Ô–Ô¬ÔöÕÕ&Õ>ÕXÕpÕˆÕ¢Õ¼ÕÈÕÔÕàÕìÕøÖÖÖÖ0ÖDÖ\Öt֌ְּ֤ÖÈÖÔÖàÖì×××0×J×b×zג׬׸×Ä×Ð×Ü×è×ôØØ Ø"Ø8ØRØl؆ؠغØÔØàØìØøÙÙÙÙ(Ù4ÙJÙ`Ùxْ٪ÙÂÙÎÙÚÙæÙòÙþÚ ÚÚ4ÚLÚfÚ~Ú–Ú®ÚÆÚÒÚÞÚêÚöÛ Û$Û<ÛVÛpÛŠÛ¤Û¾ÛÊÛÖÛâÛîÛúÜÜÜÜ6ÜNÜdÜzÜܨܾÜÔÜêÝÝÝ.ÝFÝ\Ýt݌ݤݾÝÖÝîÞÞ"Þ2ÞBÞRÞbÞrÞ‚Þ’Þ¢ÞºÞÒÞêßßß2ßJßbßr߂ߒߢ߲ßÂßÒßâßúàà*àDà^àxà’à¬à¼àÌàÜàìàüá áá,áBáXárá„ážá¶áÐáæáüâââ â(âRâzâ¦ãã(ã<ãTãjã‚ãŽãšã¦ã²ã¾ãöä.äŠä ä¶äÔäòåå&å<åRå^åjå¤åÜæ:æNæbæ€æœæ´æÊæÞæúçç&ç2ç>çJç”çœç¶çÐçâçúèè(è4è@èLèXèdè|è¤è´èÄèÔèäèôééé$é4éDéTédété„é”é¤é´éÄéÔéäéôêêê$ê6êHêZêäëŒë¦ïŠ2Âî @@ H /Í/ÍÞÍÞ+Í103!'!22þÔîý2Šýv2ÿóìµ *¹ÿÀ@ H  Q ??ÝÎÖ2Äý2ÄÆ+10#.=3#"&54632ß r Ÿ 9$$99$$9QŒHHŒQ³ýš,00,,00ÿÿ2ÒŸø&  Ú7„µ5@Ô          ) )   Y   ¿  _      /?!!!O!o!!Ÿ!&&Y°P ßo Ð ¿` ?3/Þ]]ÀÕ]À?3/Þ]ÀÝ]ÀÖ^]ÀÀÀÖ]Å]Á‡+Á‡}Ä]]]Ö]ÀÀÀÖ]Ô]Á‡+Á‡}Ä]]103733#3##7##7#537#537337#Et!‚!I_w ‚ t ‚ H^vŒ!‚Ott ªªs{sªªªªs{sªþh{#ÿ“ 7­@b 067€7- -) - i)-)-)) 777& a0@ H0999_9&a8 @##@) €?O@66€5/22Í^]Í]2/]3Í]399Í]2Þ2Öí]Þ+í9/]99Á‡+Á‡}Ä_]]3Í2Ä2107.'732654.'.54>753.#"#ÝI[+#a6=-"4"!?3(@,~4K!W00* ),K7*C1~ ! s! *=+!=2#lh x  &1B,;2$z#ÿðsÅ '3«@"""|€O._..}@(|ϸÿÀ@U HÀ@ HU5555@ H|€0 @  }@|€0@4%+~1   ~ ?ÝþÍ?????ÝþÍÞ]ýþ]í^]+]Æ99//‡+‡}Ä+q+qýþ]í]10#"&546324&#"326%3#%#"&546324&#"326…`QQ``QQ`q$##$4‹þy‹²`QQ``QQ`q$##$^dd^^dd^3..33//åýK²^dd^^dd^3..33//#ÿ÷·Å+9EÇ@|C:::Q/O_C B 54$"!À! !!BBB!B BY!!BQ GGG/GOG@@@Q ,SF 1W' ! ?==W ?í]???í9/93ÞíÔ]í^]q3]]ÖÖíÁ‡+‡}Ä]q]]‡ÄÄÄÄćÄÄÄÄ9/]qí]q10]74>7.54632>7#.'#".73267'4&#">#%1&j]/F/E5p |  =™(jBF^9‹ **? Â# # .¸&?3'C(X_+9!=_ p=-..$U+ ' +#7E1 ¡"C$'122ÒÅø !¹ ÿÀ@  H Q  ?ÍÞ2ý2Î+10#.=Å c øJ0r::r1IFÿG_ '@  Q /3/3ÖýÆ2Å210^].5467ÙJ‹J?"#'.''7>7*./7.=3  ( "&$ j  j $&" (   ‚  | K #""# K | #$#  #$#13" 6@0  °€ ° °@€ °/^]í3Ýí3Þý2Ý2öÆ]103533##5#1§ˆ§§ˆ§i¹¹}¹¹ÿ]Ö˜&¹ÿÀ@ HQ  /3/ÞÎ3ý22Î+107'>54.5Ó u˜CDDBt&ç;n#¹ÿÀ@ H/0/]Í]ÞÝÎ+10!!"þÞn‡ÿóØ« #¹ ÿÀ@  H @€ @ €/ÍÞÝÎ+107#"&54632Ø9$$99$$9O-//--//ÿçÿGÎ+@Y////Á‡+Á‡}Ä10#3€™P—¹È"ÿòÅ !0@c@ H###_#c"g g ?í?íÞí^]Þ+í10#"&54>324.#"32>…uu…#B\9u…˜ &% %& \¯»»¯W†\0»®4U>"">U44V>"">VF“µ T@7?O_  ap/?_ ?.   ???9/Í]]Å^]Þ]]]ý2Þ]Å]10>73#F?<7h•J#% %)ýKó! #Å*P@2c @ H ,,,_,""#'## &  a+"g#& e ?í?3í2Î2í]Æ]2]^]Þ+Öí10!!&454>7>54&#"'>32ð0<# *þ22?* 2%/'J,uC=X9ÿ&FA<#$ } "0PE<)'',$h)53IÿñùÅ6R@0c¯,, c2@ H2888_8"7À@ //g' g ?í?í9/Ý]Í]ÞÖÆ^]Þ+íÔ]í10".'732654.+532>54.#"'>32ä<8. Q7?'X’JJ’þÕBQZ-ÿ3x? þ`z››m,oup-&ÿñýµ!^@ c@/?###_# €@ H¸ÿÀ@ H"ge  e ?í?39/íí2Þ2Ö+Ö+Í2^]Ö]íÄ10%4.#>7!##".'7326h@lR wú’‹"DgE;7, R9E>Ì-]ÀT}$C uh0R<" { 7%ÿòº/C@(%(c@P`111_1-c 0e(e% e ?í?ä9/íÞí22^]Ö]íÄ210"32>54&'2#"&54>7>2 (# 3)A[:;[>}‚>s£f3YI6.F$@0 '37t#7!5!Ž&7D#þÓå ME3Iž˜‡1l#|´Z'ÿòÅ!1AP@/˜—§2a*a@CCC_C7.54>3232654.'4.#">>]=F]9#+)!32.'>!2  )$ 5…3A\;:Y?ƒ3k¦r9\F1t  $?/ &64a 9P0(TE-Ÿ•b–f5 < #:ÿÿÿóØ7cÿÿÿ]Ø7c28Ž@@ HQ¸ÿÀ@5 HQ?+?-@O/Í^]Í]/]]]/]]]2Á‡+Á‡}Ä+qÁ‡+Á‡}Ä+q10% %2®'þÆ:'þRiµyzzyµ1~Ö4@/ ? O _  €@€/ÍÞÍ]9/]33/3107!!!!1Öþ*Öþ*û}X}18‹³¸ÿÀ@K HQ@ HQ9,O9+O@/Í^]Í]/]]]/]]2Á‡+Á‡}Ä+qÁ‡+Á‡}Ä+q10%'-7þR':þÆ'®íµyzzyµÿó®Å'3P@-.(€((%S 55@ H@ H4@1€+ W?3í2?ÝÎÆ+2+Öí99//^]ÍÍ10"'>32#.54>7>54&#"&54632É$@'*'j3@S0" „&%99$$99$$9Fq"4>/($ !  -'"-"þ ,00,,002ÿ\œÎDW¢@mEH€_0@@/@?@O@@YYYP€ O%%@666XI@KPKK @ P ` à ð  ;EOU_UU-*O*_*o*ï*ÿ**.11@1P11/^]3Ý]q2Þ22Í]22/Ý]qÞ2Í]2Ö]]Ý]ÞÍ]Ö]Ý]Þ]]Í2210%"&'#".54>3232>54.#"3267#".54>32'.=&#"326½:,C2S;!!@];;[+QuJGwW10YP2Yf9`¨}HL|ŸT\žsB;RÀ!. * >[<3XA& þÆ/Q>>gI)0Y€PS}T+ ^2j¥so§p83b‘^IqL(wÌ$11$ ǵÈ@z$$” L +    + ›   L  Ïÿ@ HH ?????3^]9/3í2?Ö+Å]‡+‡}Ä]]]qq‡ÄÄÄÄÄÄÄÕ]Ƈ+‡}Ä]]]qq‡ÄÄÄÄÄÄ10!.'!#>733.  þò  ¢'FCA#•"BCF'þžÅ$L&&L$p¾¨—HH—¨¾p4DR--RD4Pÿ÷s½)J@,#F F@ Hy+ ++)Dx* H0&HH ?í?í9/]í9öýÀ^]]þ+íÔ2í10"&'>3232654&#'32654&#"79q=0r1BoP-PB0Ÿì(FVHCbLH>@>.    .K7S0V6mn7³(60)w%)*"2ÿòtÅ#6@ !@ H!%%Fy$J  J! ?2í2?3í2þí]Þ+2Æ210"&54>32.#"32>7Œ©±6^‚L,H6$- U6$E5 /L6"6* +!x¼­V‡]0 ~5T<0S<# } Pÿ÷¯½ 4@F @ H yDx JJ ?3í2?3í2þí]þ+í10732654&#"#"&'>32ì uqlu"Ã8g”\*p66u*Y‘h8vhmpÚZ†X, £ (V†P;µ ?@% @ H  Dx H/ H H?í?í9/]íþýÀ]Þ+ÆÆ]103!!!!!PÔþÈþëOµƒˆ€§ƒP µ 4@  Dx HP H?í?9/^]]íöýÀÖÄ103!!!!PÐþÌþ‘ƒþâ2ÿó}Å#>@#! D @ H x% %Fy$ !J  J ?3í2?3í29/þí]ö+íÆ210"326753#".54>32.¢ma0H0%œ|[NZ16^H1O9%- S=yi3S73é9CH$œœ={5¹GOS›G"OOIþÛµþú@‹;TœOE¾sPµ@ DxJ?í?öíÆ10%!3þ1œ††µýÑ<Eµ(^@ "D# D*¸ÿÀ@& H* Ÿ(#)(# "  ?23?????9/Å??ÞÍÜ22Ü]ÍÎ+í22í2210>73#.'#.'#>7/3223/Ž  ˜ ,+(m(+, ˜  µ!aqv44vqa!E«¹ºReîy*ff]!!]ff*yîeRº¹«EP¤µP@4 D@ Hx PÐDx {t  ?2]????3]???þí2]þ+í210!.'#33!CœXš!PSR$›wègþ:µ!`mu6™ýK2ÿòäÅ'.@ F@ Hy)) )Fy(J#J ?í?íþí]þ+í1032>54.#"#".54>32Ó/D,+E//E+,D/5\IG~^68_}EG~^6[3R; ;R33S; !;S2Y‡[..[‡YY‡\..\‡Pa½ 6@D@ H{D xH J?í?9/íþýÀ^]þ+í102+#>"32654. ›¦¨œ1œ3r5! 1QR'8½m|}oè« …È,<& 2ÿDäÅ2D@($$ F@ Hy444 4F)y3J.J$ ?í3ÔÅ?íþí]þ+í9/ÍÄ21032>54.#".'.54>32Ó/D,+E//E+,D/$AZ6"4E( NoM- >jN,8_}EG~^6[3R; ;R33S; !;S2IuX: r,@*5Z~PY‡\..\‡P‡½"d@=  L  F@ H$€$$Dx#J?  J?2í2???9/]í2þýÀÎ^]]]Þ+íÆ‡+‡}Ä102#.'##>"32654&œ¦C?.-*¯')(Mœ3m4 ,XLM½ouI[CIO&"FB;ý« …¼,53+%ÿòÅ1V@3oD&@ H&3D /.2957//J.) J?3í2?3í2]99]]Þ2ÖíÞ+í99Ä]210%2>54&'.54>32.#"#".'7 !+ @N"D6"$B^;Ff!-G281!+6P5ˆ‰.J9),[w "- /C00M6{  '4F2ak |Rµ'@ D@ HH?ýÀ??Ö+ÜýÜÆ10###5Rќѵ…ýÐ0…Fÿò}µ<@'D@ Hx?O¯¿ Dx J ?í????þí]]þ+í10".5332653_IjE!œ!/9Gœ"Fl)Ie=¯þ^*;%FT¢þQ=fI( ȵ©@c  6$ LŸÏ  9+ L @ H  ??????3^]Ö+Ň+‡}Ä]]]‡ÄÄćÄÄÄÄÕ]Ƈ+‡}Ä]]]‡ÄÄÄćÄÄÄ10!.'3>73)PH=¬/1./1/¦73#.'#&'3>7! !"  ¢#[5#B @#5[#© "  k)gnn/3x€;®þš¡`ÓjjÓ`¡f®;€x31nnf( ™µ×@‰     ÄV ËYL   ÄV ËYL  @ H @ H   ????????Ö+Æ+Ƈ+‡}Ä^]]]]]]‡Ä‡ÄÄƇ+‡}Ä]]]]]]]‡ÄćÄ]10]!.'#>7373ÞE-++& ²,uHß½‡„²ÜTr!:w>@HBQ²dNØØþ°m¹?µj@=$LD  L  @ H    ???93???Ö+Ň+Á‡}ÄýÕÆ‡+}Ä^]10>73#.'3N*L ¬9zDœD{9µ J˜GŽHpÒjþ÷jÔpHŽ#DµC@#  L@ H H H?í2?í2ÞÆÞ+ÖÁ‡+Á‡}Ä10!!5>7!5!9 X^\$aýßQX['þÉI!i|„<ƒ]3}w/ƒZÿGi&@   QxUU/í/íþí^]ÖÀ10!#3!Zþñwý&wÿçÿGÎ)@Y////Á‡+Á‡}Ä103#—P™ü8 ÿG&@Qx   UU/í/íÖÀ^]þí10!53#5!þñ¹wÚw!&¹0@/ÅÍ223Ö2Å2/2/Õ2Æ10''3&}}Ïv^=õõ=[ÿGôÿÃ$´¸ÿÀ@  H€0@?]Í+ÀÀ10!!ôþ =|@ý@ /ÍÝÍÞÅÝÅ10'oŽD¥¢=‹#ÿõè1\@9%Q@ Hz333Ÿ3, -0-@-- Q{2%0"""0U ,)U-?3í2?3í]29/]3Í2þíÄ]2^]þ+ýÀ10%2675.#"2#".54>3254&#"'>( $%/BX5 rQ3S< %>P+-.9&J '.3hq#´8P1þÊ)B0.@&&. x Fÿó/ M@.†v S?  {"0"€"""Qz!W W ?3í2?3?3í2öýÀ^]]ö]í10]]4#"3267#".'7>32—j- "=>˜%FfA;94•68V: þñTA?fH' ßþú 'He-ÿòÖB@(hxGW @ H S{W W?3í2?3í2þí]Þ+2Æ210]]4>32.#"3267#".-%Fd@*F!2BA=L>N/HhC9eK,w RCGN z +Je-ÿó O@0‰ vQ @ H z"0"€"""S{!  WW  ?3í2?3í2?3þí^]]ö+ýÀ10]]3267.#"#".54>3257Å>=" -jQ49;AfF% 32!3267#".%.#"-+F[0p‚þ®L@)O (18GiE!^ #$ FiF$‰…  .6 y *Ids$%F­;@! Qz UU?2í2?í?öýÀÜ]Æ3]310^]2.#"3##46**F/% ¸¸•sw $|þn*fx-ÿD  *f@@‡y Q*@ H*z,0,€,,,xS {+ W*%W€qW?3ý2Þ]]2í2?3í2þí]33^]]þ+ýÀ10]]32675.#"#"&'7326=#"&54>32Åe( ;:Gƒ‰0`)#M1@53mt$Ed?983} îNþî}}8, t:_D% F C@) Q @ H zQz W ??3?3í2?öýÀ^]qö+í10]37>32#4&#"F•/@U3•%2#ðü #@X6þ×H<þp7éþ-¹ÿÀ@ HzQ z  ???Í]þ2ý2î+103#37#"&54632Û••5$$55$$5˜)//))//ÿ¸ÿGéþB¹ÿÀ@# Hy Q@€ y W?2í2??Í]þÌ^]3ý2î+10"&'732653#"&546327#•ft5$$55$$5¹y*(÷þhd_)//))//F9²@! Ä9+ Y  ¸ÿø@DM$4 Y    Qz   ????9/??3þýÄ]À99}ÄÄ^]Ö‡+}Ä_]]]]]+Ƈ+}Ä]]]]]]10>73#.'#7Û/,'±5e<@<2«).3••P43.=o;KPP!??:æðFÿö- @ Qz W ?í?3þýÞ2Æ10.57AQ/•  /C*Cýà F'U³)¸ÿÀ@- H)zQ¿%Q'¿''Q z(&  "W  ??333í223??þíÜ^]íÜ]ýî+10]4&#"#>32>32#4&#"#g%-•39<9G S#?Q0•%- +•H<þjü #@X6þ×H< 3þáF 8@" Q@ HzQz W?3í2??þí^]qþ+í10>32#4&#"#F&xBCY4•&4$•ü #@X6þ×H<þj-ÿò28@#S@ H{!0!!!S { —WW ?í?í]þí^]]þ+í10#".54>324&#"3262$D_;:_D&'E_89_D&˜73388337>gI((Ig>>fH((Hf>EOOEEQQFÿG/ I@.v † S @ H {"0"€"""Qz!W W ?3í2??3í2þýÀ^]]þ+í10]4&#"327#"&'#>32—>=" -j˜:V86•49;AfF%ESþó “=dH( Ƶ 'Gf-ÿG I@.y‰Q@ H{ 0 €   S {W  W?3í2??3í2þí^]]þ+ýÀ10]3267.#"4>32#5#"&Åj- "=>˜%FfA;94•6pv  SA=eI( ýKÆ “Fœ%@Q zW  ??33í22öýÜ2Æ10.#"#>32ƒ6' •(mC """ Š þnò'ÿò¼*‹@P !idYQ!@ H!{,,O,(''Q {+('$ ?3Í2?3Í299þí33]þ+í99Á‡+Á‡}Ä^]]]]]]3310]72654&'.54632.#"#"&'7Ý)",-#9(n`0X=&F1@%ukF]&Pk '6&JV t '   #)2!NPyAÿôž©:@   Qz W  U?íÎ2?3í2þýÀÞÆ]3310^]73#3267#".5A•³³!23B0=P0‘›|¹/8 t !;T3Aÿô8@"Q@ Hz Q z W ?3í2??þí^]qþ+í10%#".5332673&xBCY4•&4$• $AZ6%þíH@– ´@|‡xg$”¤Ô"2 Y +›«Û-= Y / R b   $    ??????Í]]qÖ]Ň+‡}Ä^]]]qqÕ]Ƈ+‡}Ä]]]qq10]]]3&'3>73Õ3i/ž   š/i3d ž'[]X$$X]['žþôd (¸@x*S@  6&&‹% %%%‹9I6F@„9 S @ H )& % ÀÐÏß   ????99qq3??????Ö+íÝ^]q2]2]qÝq2]qq2]qÝq2]q2]Ý]íÆ10#.'3>73>73#.†-t*-/ l ›/-+t0.L–L*t‰™N$UZ[*,\YS$$SY\,*[ZU$N™‰t*L–  G@Ú ,+   / .  %   +    &ÆÉYÉÆ Y+;@ H    ????????Ö+Æ^]_]]ÖÖ‡+‡}Ä]]]]]]‡+‡}Ä]]]]]]‡ÄćÄÄÄÄ_]]‡ÄÄ]‡ÄÄÄ]10]q]q]]]]]]q]]]]]q73#.'#>7.'3hš´7-b:*2?*#;$(+3f-ž   ˜þö}-?) w+&dù›'[]X$$X]['#Öf@<$+  Y@ H0 U U ?í2?í2Î2/^]]Î+2/Á‡+Á‡}Ä]]]]103!5>7#5!Ñ=FGþþM;A@ࢪDRZ*|X$STO |#ÿGi&H@*( Q"`&p&€&&@ H&'&W W W 0 `  /]í/í9=/3/íÖ+]Þ2ý2Þ2Æ1026=4>;#";#".=4&##-(3U?-**-?U3(-f4*—+C.w(*…4HH4…*(w.C+—*4ZÿGè@ €//ÖÝ]Æ103#ZŽŽü8 ÿGP&H@*`(p(€(("Q @ H'W&& W0` W /í/]í9=/3/íÖ+2Þ2ý2ÞÆ]10%"+5326=467.=4&+5323P-(3U?-**-?U3(-ð4*—+C.w(*…4HH4…*(w.C+—*4Ä!“0@! @ €@¯€ /2/Ý]ÜÍ]3/ÎÆ10%".#"'>3232>7‚51-f%8'51-f&7Ä>4">4".ÿó5Ã1‡@P, 33@ H Q/)&,'00/002'(1 0/?_o 0W # ?  W?3í]2?3í]29/]3Í2Þ2Í2Ö^]2Þ2222í2222+Ö2Æ29/]3Æ210>32.#"3#3#3267#"&'#53&45<7#5z’r-@ 2% H:@"""|€O._..}@(|€/o=%C+~I17   ~ ?ÝþÍ?????3Ý2þ2Í2/^]ýþ]í]Þ+ý]þ]ýÎ+Þ]ýþ]í]99//‡+‡}Ä+q+q10#"&546324&#"326%3#%#"&546324&#"326%#"&546324&#"326…`QQ``QQ`q$##$4‹þy‹²`QQ``QQ`q$##$`QQ``QQ`q$##$^dd^^dd^3..33//åýK²^dd^^dd^3..33//3^dd^^dd^3..33//ÿÿ%ÿò¶&6_i¡@ 26.&P7O++4,) :@ @€pÀÐ/3Í2Í2Ô^]Å]2ÝÍ210'7Äeq¤¤q»5ðð52ÿú»'B@$D)%Fy(HHH"J J?í?í?í?í9/íþíÖÆÆ9/3í10!#".54>32!!!!!%:7&"#""9X‘g99g‘X9‰þÙþü>ý÷ urr*W…[[„W*ƒˆ€§ƒ~·qkkr(ïä@  Q?3/Þ22ýÎ3Î10.5467,0#iïCy*+l1 æËÿ'¹ÿÀ@ HQ /3?ÜÎ3ý22Î+10'>5<.'Ç0#iÿCy*+l1 (ï·+@!Q Q ?333/3Þ2ýÎÞ2ýÎÎ10.54673.5467,0#eJ0#eïCy*+m1 Cy*+m1 æžÿ+@!Q Q ?3/333ÜÎý2ÞÎý2Î10'>5<.'#'>5<.'š0#eJ0#eÿCy*+m1 Cy*+m1 &ÓFï@  @ H /ÅÖ+ÕÆ10#".54>32F&5!!5&&5!!5&a3''34''4íôi"@/?/?0/]Í]Ð]ÝÀ10!!ôþ i|íèi"@/?/?0/]Í]Ð]ÝÀ10!!èüi|Wvõ&@   /3/3ÝÜÍ3/3Ö2Í210#".#"'>323267v&I&Å$ 0$ U8µ [@3   P +  +P!/? €?33Í2Ä22Æ]ÖÖÝqÖÖÅÍ2Ô]22Ô]qÅrÍr210##5#5!#'#'#>73>7`fvfù s;O;rj&)µgùùg;©|»–• ?4$|©;-]--d&ÿÿ'ÿò¼&V_;@ +/' P 0O++4,3 8@`Ïß@€/3Í2Í2ÜÍÝ^]2Í]2107'7q¤¤qe×5ðð5»-ÿò|'3>o@?>S(( "#4S/{@ @@.S {??99+W4/?"1W# ?33/2í23?33/9/]Íí2]þí]]ö]íÄ29/í29910"&'#".54>32>32!32674&#"326%.#"¤@g#!Z3:^C$%D^8tA$X-p‚þ®L@*N (18þÚ73388337R $# )*(+(Ig>>fH(V0&ˆ†  .6 y EOOEEQQy$%ÿÿ’&<ƒ? @% POO+++442ÿLì *¹ÿÀ@ H Q ??ÝÎÞ2Äý2ÄÎ+10#54673#"&54632ߟ r 9$$99$$9´¸QŒHHŒQ®,00,,00-ÿ“Ö´!N@* !€ @ H#S"W!W/    ?]3Í]3í2/33Íí2ÞíÖ+2Æ29/ÀÝÀ107.54>753.#"3267#à\W/B*Ž/!1?D@I>4 Ž%Š],QB1 ’‡ w K@DG z ‰÷Â!L@,@ H@ H#Q  /  "W WW ?í?í9/3í2Ö]Ý22í22Ö+Æ+Æ2103#!!>7#5354>32.'"ÿ¦¦þW WW$?X4(F!%)'Šy#P!}Pˆ9y5Kc<u  0$`V+f@9  ¿   pàð°&/&&,  #)/ÍÜÍÎ233Î233ÜÍ]]Ü]qrÍ]]Î23333Î21027'#"&''7&547'7>4&#"326-J]HH^J,-J]HH^J,l0""00""0  G[E'33'E\H  G[E'33'E\H Å+,,++,,ÿû=µ —@U Y " D Y   ! 0p€O   ??????9/3/Í2Þ]]q2Í2ÖÔ2Î23‡+Á‡}Äý2ÔÆ3‡+}ÄÎ21035#535#53.'3>733#3#Ñ”””d.,(ª9"!6©&Q.d”””ocAc&TTP!E‹BBCM¡QcAcoPÿGÞ,@Ÿ€  /Í/Í^]9/ÀÍ]q21073#3#PŽŽŽŽÔþsÈþsÿ“âÅ9Ge@Q4CQP,`,,II/IoI9$Q¸ÿÀ@H=Q/H:@1U96!U?3í2?3í29Ö]íÔ+íÆ2^]Ö]íÄ2Ôí10732654.'.5467&54632.#"#"&'>54.A)),%&#'E3- 0qj.a'% E-&"-,F0 ØMm#´CE!46    +=-/@(8MVx *:)#7%£Á"&("OZÈò  @ €@  €/Í/Í3/ÍÞÍ10"&546323"&54632œ....À....Z)##))##))##))##)2ÿñêÅ'C:@1AE8+ D251.P`@=A(#?ÝÖ2Í2?]ÝÖ2Í2ÖÝÖÍÞÝÆ210#".54>324.#"32>"&54632.#"3267ê9`~EE~`99`~EE~`9f$A[66[A$$A[66[A$æY^cQ0; #!(( >[U‡]11]‡UU‡]11]‡U3254&#"'>È  ,#0A(W:OZ-=!! ")8K‰N;(8$ã8F"-  Y ÿÿ,7 &ll2/–@ €@€/ÍÍÎÞÍ10%#5!5!ˆþ²Ö/ê}ÿÿç;n2ÿñêÅ';Fn@A+(@;64@H4H324.#"32>.'##>32'32654&#"ê9`~EE~`99`~EE~`9f$A[66[A$$A[66[A$¹(a";¡6  Æ [V†]11]†VU‡]11]‡U!'Äo]Õ@ ?O_/Í]ÖÍ10!!Bþ¾Õf×V >@$!ð€@ð€@ H oß/ÍÞ]qÍÖ+Ý]qÞÝ]qÆ102#".54>2654&#"µ ;,,; ;,,; """" )9$$9))9$$9)Ô1q D¹ÿÀ@  H °@€ ° °@€ °@ €?ÝÞý2Ýí3Þ2ý2Ý2ý2Î+103533##5#!!1§ˆ§§ˆ§Öþ*Ǫª}ªªÍ}.BÅ"@@#0@   #$_$o$€ /Í?3í2]99//3/í]33/í103!&45467>54&#"'>328$ œþá53!14Q-'7"J$ #[ 1O+"N%!-&@Å,i@?@  )0@?._.o.*)-  _oŸ *€)$ €?3í2Ü2í29/]9Í]Æ223]Þ]í]99/9í]102654+532654#"'>32#".'7•#F)),.&K$(7! (A/%$ "/„)R  O)&20# Y@@ @€/ÍÝÍÞÅÝÅ10'7¥DŽË‹=¢FÿZ E@+ Q @ H z0€Qz W ???í33?öí22^]]qö+í1032673#"&'#Û "#•'m?6•þæ&2 –þ  )%M´(ÿFv½.54632#.##pk«¡ED@4Žgdmt ü£øýÿÿËØƒØ-ÿ##"&'732676&/>73× K?,%  c(,02W    %&.½ @   ?ÝÍ2/ÖÜí10>73#&*OWr*j+þq  !2¨Å/@ !@€Ð¸@@ € €€?íÜíÖíÜ]íÎ10#".54>324&#"326¨3H++H44H++H3r*'&,+''*ú/J33J/0K44K00770-77ÿÿ,A &xxÿÿ^½&”î'ncpþÔÿÿE½&”î'nGþÔÿÿ^Å&Ž'nxpþÔÿ;³ '3R@0.(€(( 55@ H%S /  41+W?3í2?ÝÎÖ]í+Æ^]299//]ÍÍ10267#".54>7>5<'34632#"&þ$@'*'j3@S0! „&%99$$99$$9Fq"4>/($ !  .'!-"÷,00,,00ÿÿ Ç¿&$CÙ ¹ÿù@ " P !O++4ÿÿ Ç¿&$Ù ¹ÿÿ@ !P O++4ÿÿ Ç´&$i¡¦¹ÿÿ@ #P O++4ÿÿ ǘ&$u®£@ -P ,O++4ÿÿ Ç’&$ƒV ±¸ÿù@ !3P +O O+++44 Çr"-9¹ÿÀ@žH441@H..11),-##`$$” #L"";""(&%$##o +    + ›   #L  Ï#ÿ##@ H:"17)(HÀð## ?????3^]9/]qr3í2ÕÖÍ?Ö+Å]‡+‡}Ä]]]qqq‡ÄÄÄÄÄÄÄÕ]Ƈ+‡}Ä]]]qqq‡ÄÄÄÄÄÄ3=/Â/Í+Â/Í+10!.'!#>7.54>323.74&#"326  þò  ¢&DB@"!*+!!AAE&þžÅ+$L&&L$m»¥”G+++,G”¥»m4DR--RD4ö ¿µœ@U  /L D HH? H  H??í2/??í99//^]]3í2í?//3í233Á‡+‡}ÄÄÄÄÄćÄÄÞ]ÆÆ]10%##67!!!!!!3êÜ2«zÒ^ôþÙþü>þ+(+)¤&X&ÛWƒƒˆ€§ƒ@EF2ÿ#tÅ=[@1('; :;@ H;??0Fy>(+J'" :5J ; ?2ÜÍí2?3?3í2þí]Î+29/Í3/3Í2Î2Æ210#"&'732676&/>7.54>32.#"32>7° L>,%  Œ6^‚L,H6$- U6$E5 /L6"6* +e ,02W   ·V‡]0 ~5T<0S<# }ÿÿP;¿&(C« ¹ÿî@  PO++4ÿÿP;¿&(µ ¹ÿþ@  P O++4ÿÿP;´&(iu¦¹ÿö@  P O++4ÿÿP;’&(ƒ, ±¸ÿò@  PO O+++44ÿÿ# ¿&,C ¹ÿú@ PO++4ÿÿ2¿&, @ PO++4ÿÿ<´&,iÿÚ¦@ PO++4ÿÿÿä]’&,ƒÿ• @POO+++44 ÿ÷º½%R@0F@ Hy''À' Dx&?0 J!J ?3í2?3í29/]3Í]2ü2Ìý2Ì]þ+í10732654&#"3#%#"&'#53>32÷ uqlu"~~Ã8g”\*p6QQ6u*Y‘h8vhmp”s-Z†X, %s (V†ÿÿP¤˜&1u¿£@ PO++4ÿÿ2ÿòä¿&2Cü ¹ÿú@ +)P"*O++4ÿÿ2ÿòä¿&2þ @ *(P")O++4ÿÿ2ÿòä´&2iŦ@ ,(P")O++4ÿÿ2ÿòä˜&2uУ@ 6(P"5O++4ÿÿ2ÿòä’&2ƒy ±¸ÿú@ *<P"4O"(O+++44>Mû @@     /3À2Ô2À29Æ223Î223910''7'7¤WˆˆWˆ‡WˆˆW‡ Wˆ‡WˆˆW‡ˆWˆ2ÿÓäâ$.X@5(' Fy0 %Fy/(' *J J ?í33?í933ö]í33öí93310#"&''7.54>3274'32>%&#"ä5\I2[':U=',8_}EcO8U;(-¡û)2+E/þú'2,D/[Y‡[.K?N-}QY‡\.,I?L-~QH3þ» ;R3E3C!;SÿÿFÿò}¿&8C¾ ¹ÿå@ PO++4ÿÿFÿò}¿&8æ @ PO++4ÿÿFÿò}´&8iš¦¹ÿÿ@ PO++4ÿÿFÿò}’&8ƒV @,P$OO+++44ÿÿ¿&<Ô @  PO++4Paµ9@!F/!! D x  / ?Þ]Í?ÜÍöí22^]Þ]í102+#3>2"32654.4BoP,¨œ1œœ! 1QR'8T8X?}o€µd„È,<& Fÿôm<_@9S1$$1*SŸ@ HS@ H>>1Q2z= '-W82 W ?3í2??í9öí^]Þ+í9/+]í9/93í10#"&'73254&'.5467>54&#"#4>32##$6bq7B C6*#&*$0/’;Y=:T6b*2, D6V\x 6) !"*9"! <8ýè5YA$-=ÿÿ#ÿõè&DC{¹ÿþ@ 53P4O++4ÿÿ#ÿõè&DŠ@ 42P3O++4ÿÿ#ÿõè&Di>¹ÿÿ@ 62P3O++4ÿÿ#ÿõèõ&DuQ@ @2P?O++4ÿÿ#ÿõèò&Dƒþ@4FP>O2O+++44ÿÿ#ÿõè.&Dcs ·;2P+44#ÿò=;LWu@C ?WS/BBJMS {Y677JS'{XE "0,,,0<32!3267#"&'#".54>3254&#"'>267.'.#"%.#"2' "V16V>!þ®L@)O (18;XKc3S< %>P+-.9&J '.3&3 & %/Æ #$ &!#DeB  .6 y ,)B0.@&&+ x þL$-#Ô$%-ÿ#Ö7Y@-%$$25 129+S{81.W5 725 %(W! ??í2?3ÆÔÍ9í2öíÆ299//92Í2Í3310#"&'732676&/>7.54>32.#"3267H L>,% 4K1%Fd@*F!2BA=L>C((,02W   ! 1GZ29eK,w RCGN z ÿÿ-ÿò&HC•¹ÿú@ +)P*O++4ÿÿ-ÿò&HŸ@  *(P)O++4ÿÿ-ÿò&Hi]¹ÿÿ@ ,(P)O++4ÿÿ-ÿòò&Hƒ@*<P4O(O+++44ÿÿÿ& C¹ÿú@ PO++4ÿÿ)& @  PO++4ÿÿÿö.& iÌ@ PO++4ÿÿÿÐIò& ƒ±¸ÿü@ POO+++44-ÿò< #6T@/$S!" {8/S {7*W"!!#2W ?í?99//3333333íöíö9í210#".54>32&''7.'77<'.#"32>ã#(@cD?^?>^?9 oP&S#?s¦3 * 14!+ [<ŒOK|Y2(CZ37\@$ 52%TV3'TþÀ  ".6C!7HÿÿF õ&Qul@ "P!O++4ÿÿ-ÿò2&RC ¹ÿù@ #! P"O++4ÿÿ-ÿò2&R¨@ " P!O++4ÿÿ-ÿò2&Rih¹ÿÿ@ $ P!O++4ÿÿ-ÿò2õ&Rur@ . P-O++4ÿÿ-ÿò2ò&Rƒ$@"4 P,O O+++441 I #@  ?ÝÖÝÖÍÖÖ2Ý2ÖÆ10#"&54632#"&54632%!!r4!!44!!44!!44!!4þ¿Öþ*õ*******þA*******ß}-ÿÙ26"+L@0'& S{-#Q {,'& )W  W ?í33?í933öíöí910#"''7.54>3274'326'7&#"2$D_;K;-F1'E_8%B.F1¡6<å 6=>gI(";5?$^9>fH(;5?#^9" ÑUI!ÐSÿÿAÿô&XC€¹ÿå@ P O++4ÿÿAÿô&X¡@  P O++4ÿÿAÿô&Xi_@ P O++4ÿÿAÿôò&Xƒ@(P O O+++44ÿÿÿG&\«@ *#! P"O++4FÿG/ 6@S{"" Q z!W  W ?3í2??3?íöí22]öí10#"&'#7>324&#"32/:V86••*=bE%˜=9' -j=dH( Æ©ø'GfCESþ÷ ÿÿÿGò&\ƒ @#5 P-O!O+++44ÿÿ Çn&$Ь™@  P !O++4ÿÿ#ÿõèÕ&DŠT@  23P4O++4ÿÿ Ç•&$a¥™@  #-P O++4ÿÿ#ÿõèü&DaH@ 6@P2O++4 ÿ#Ûµ,7˜@M# @93 .  - L*€-./02-L- 823H )&*-- ?????3/?Ô2Å29/3í2Ö͇+‡}ÄÄÄÄÄÄÄÄÝ]2‡+‡}ćÄÄÄÄÆÝÕÅ10"&5467>7#.'!#>7332673.xC:  0  þò  ¢'FCA#•"ACF(     8þÖÅÝ2)( $L&&L$p¾¨—HG•§Àr  dõ4DR--RD4#ÿ#êIp@B("!!=-Q@ HzKKKD E0E@EE Q5{J=0:::0%0U-0 DAUE?3í2?33í]2ÜÍ9/]3Í2þíÄ]2^]þ+ý2À3/3ÞÍ10%2675.#"23267#"&546767#".54>3254&#"'>( $%/BX5 $    8C:*3S< %>P+-.9&J '.3hq#´8P1þÊ  d2)()B0.@&&. x ÿÿ2ÿòt¿&& @ ?&$!P%O++4ÿÿ-ÿòÖ&F®@ ; PO++4ÿÿ2ÿòt´&&iæ@ 6($!P%O++4ÿÿ-ÿòÖ&Fid@ ("PO++4ÿÿ2ÿòt”&&b  @ 5&,!P$O++4ÿÿ-ÿòÖô&Fb±@ * &PO++4ÿÿ2ÿòt¶&&_¿¡@ 5$(!P)O++4ÿÿ-ÿòÖ&F_d@ +"P#O++4ÿÿPÿ÷¯¶&'_™¡¹ÿã@ " P#O++4ÿÿ-ÿóÕ&GÏ3ÿÿ ÿ÷º½«-ÿóT(a@;"Q@ Hz*0*€***S{)#&W" W ?3í2?^]3Þ2Í]2í2?3þí]]ö+ÍÀýÀÐÍ103##".54>325#5357327.#">>49;AfF% 7!!!!!!3267ìC:  þŒÔþÈþëO     8Ý2)( µƒˆ€§ƒ  d-ÿ#1<j@@F V (.//!"§22S/{>>¨<<S{=7#".54>32!32673267.#"’C: GiE!+F[0p‚þ®L@)O)    8 #$ Ý2)( *Id:FiF$‰…  .6 y !  d$%ÿÿP;¶&(_u¡¹ÿù@  PO++4ÿÿ-ÿò&H_b@ (,P-O++4ÿÿ2ÿó}´&*i¦@ 0($ P%O++4ÿÿ-ÿD &Jiv@ ,( P#)O++4ÿÿ2ÿó}•&*a¸™@ -(2 P$O++4ÿÿ-ÿD ü&Jap@  ,6 P#(O++4ÿÿ2ÿó}”&*b  @ 0&, P$O++4ÿÿ-ÿD ô&Jb·@ *0 P#(O++4ÿÿ2ÿ$}Å&*Ð ¶0' P+4ÿÿ-ÿD &JÑÐ@ 0*- P#(O++4ÿÿPŽ´&+i¨¦¹ÿÿ@  P O++4ÿÿD Â&K»¹ÿ®@  PO++4 êµU@- D   xDxH  ????99//33Í22íö2Îí22ö^]2Ìí2210353!533##!##)! QœœQQœþúœQóþúdQQQQnþ þäöTW@5Q/z€ÐQzp  W ?3?í??9/3Í]2ö2Îý2Ì3^]]ö]í103573#>32#4&#"##>•/@U3•%2#•>±?W]W #@X6þæH<þTÿÿÿçY˜&,uÿã£@ PO++4ÿÿÿÙKõ& uÕ@ PO++4ÿÿÿÿAn&,Šÿä™@ PO++4ÿÿÿñ3Õ& ŠÖ@ PO++4ÿÿL•&,aÿÝ™@  PO++4ÿÿÿð4ü& aÅ@ PO++4 ÿ#µ+@xDx ??3ÔÍöýæ3/Í231033267#"&5467>7#Pœ     8C:  %µýK  d2)( ÿ#ïþ(4@*z Q # z) &  ?3ÔÍ??Íæ22/Í23ô2æ10"&5467>7#33267#"&54632ŒC:  •     8F5$$55$$5Ý2)( ýò  dƒ)//))//ÿÿNì”&,b" ¹ÿÿ@  PO++4FÛ ¹ÿÀ@ HzQz ??þýî+103#3Û••ÿÿ7éþLÿÿPÿòµ&,-8ÿÿ7ÿGþ&LMÿÿ ÿò´&-i´¦@ PO++4ÿÿÿ¸ÿG,&]iÊ@ F P O++4ÿÿPÿ$¢µ&.ÐÞ ¹ÿÔ´!P+4ÿÿFÿ$9&NУ ¹ÿÒ´%P+4ÿÿPU&.nqF<¾@g Y     Y  ;  @ HQz     ??????9/^]þí299}ÄÄ+ÖÆ9/]‡+}Ä]]]‡ÄÄćÄÄćÄÄ+}Ä]]]‡ÄÄ10>73#.'#3Û/,(±8<8A<3«*03••I550@@=HMM!=<8àÿÿJ¿&/0 ¹ÿ‡@ PO++4ÿÿ2ÿö-Â&Oº ¹ÿõ@  PO++4ÿÿPÿ$µ&/о ¹ÿõ´ P+4ÿÿ0ÿ$-&OÐ" ¹ÿ×´ P+4ÿÿP·&/Ï)ÿ¯ ¶VP+4ÿÿFÿöš&OÏøÿÿPµ&/;D ¶~ P+4ÿÿFÿöí&OM>µ :@   D x H ??í9ö2í293Æ9910737!!5oœz1«3þ1>D89ë>eWƆþÿöÿöj0@ Qz U ?3?í9ö2ý2Ö2Æ10777.= k•G-t AQ/>‰52ÿ$\:Ë {/C*ŸÿÿP¤¿&1õ @  PO++4ÿÿF &Q˜¹ÿþ@ PO++4ÿÿPÿ$¤µ&1Ðø ¹ÿí´P+4ÿÿFÿ$ &QЙ ¹ÿß´ P+4ÿÿP¤¶&1_¥¡¹ÿô@ PO++4ÿÿF &Q_[¹ÿû@ PO++4ÿÿ*'1†^Âÿÿÿí*&Q^­PÿE¤µV@6 D@ Hx PÐDx {t  ?3]Þ2Í2???3]??þí2]þ+ý2Ì210%.'#33#"&'73265 ?‘Oš!PSR$›^g1 *mÑ^þ:µ!`mu6™ý\hdy*(FÿG 5@Q@ Hz   QzW  ?ÔÍ?íöí^]ö+í9104&#"#>32#"&'7325w&4$•&xBCY4Tg -  7H<þjü #@X6þÚ`\kGÿÿ2ÿòän&2ŠÏ™@ ()P"*O++4ÿÿ-ÿò2Õ&RŠs@  ! P"O++4ÿÿ2ÿòä•&2a¾™@ ,6P"(O++4ÿÿ-ÿò2ü&Rab@ $. P O++4ÿÿ2ÿòäÁ&2eÁ¢@)*,P"-O")O+++44ÿÿ-ÿò2&Re^@""$ P%O!O+++44ÿÿP‡¿&5¾ ¹ÿá@ %# P$O++4ÿÿFœ&Uk@ P O++4ÿÿPÿ$‡½&5ÐÔ ¹ÿ×´-$ P+4ÿÿÿ$œ&UÐ ¹ÿ~´P+4ÿÿP‡¶&5_w¡¹ÿÕ@ !% P&O++4ÿÿFœ&U_.@ P O++4ÿÿ%ÿò¿&6¯ @ 42.%P3O++4ÿÿ'ÿò¼&V}@ -+' P ,O++4ÿÿ%ÿò´&6ii¦@  62.%P5O++4ÿÿ'ÿò¼&Vi;@ /+' P ,O++4%ÿ#ÅHj@=o&54.;;D&@ H&JD FEI18957FFJE)B J?3í2?33í2]99]]ÜÍÞ2ÖíÞ+í993/ÍÌ2Ä]210%2>54&'.54>32.#"#"&'732676&/>7.'7 !+ @N"D6"$B^;Ff!-G281!+6P5ff  L>,%  Na,[w "- /C00M6{  '4F2Tg ,02W   "|'ÿ#¼D¢@[ !01*77diYQ!@ H!{FFOFBAAQ {E0-14BA$> ?3Í2?33Í299Ü2Í2þí33]þ+í99Á‡+Á‡}Ä^]]]]]]3/ÍÎ23310]72654&'.54632.#"#"&'732676&/>7.'7Ý)",-#9(n`0X=&F1@%RL L>,%  8J&Pk '6&JV t '   #)2!AM ,02W   yÿ#Rµ"?@! $D"@ H"# !H?ýÀ??ÞÞ2Í2Ö+ÜôÜÆ9/ÍÎ210###"&'732676&/>7##5RÑ   L>,% ѵ…ýÐ ,02W  &0…Aÿ#ž©-T@- +!! / //Qz.% W(  U?íÎ2?33í2ÝÞ2Í2þýÀÞÆ]339/ÍÎ210^]73#3267#"&'732676&/>7.5A•³³!23/ L>,%  -<#‘›|¹/8 t ,02W   !%:L-ÿÿR¶&7_j¡@  P O++4ÿÿAÿôž&WÒô ¶^ P+4Rµ.@D   H??í29/3Í2ÖÝ2ý2ÝÆ10#3###535#5Rќѵ…·nþõ n·…Aÿôž©7@ Qz   U?Í2í?3Í29/Í/33öý22ÝÆ1073#3#3267#".5A•³³²²!23B0=P0‘›|Q] /8 t !;T3ÿÿFÿò}˜&8u§£@ &P%O++4ÿÿAÿôõ&Xuh@ "P !O++4ÿÿFÿò}n&8Š¥™@ PO++4ÿÿAÿôÕ&XŠj@ P O++4ÿÿFÿò}•&8a”™@ &PO++4ÿÿAÿôü&XaZ@ "P O++4ÿÿFÿò}µ&8c¿‡ ·!P+44ÿÿAÿô.&Xc… ·P+44ÿÿFÿò}Á&8e—¢@)POO+++44ÿÿAÿô&XeS@"P O O+++44Fÿ#}µ/N@0$%+D@ Hx1?1O1¯1¿1 1Dx0%($! J ?í3Ü2Í2????þí]]þ+ýÔÍÌ210.53326533267#"&54676YHhC œ!/9Gœ6?    8C:*Id<¯þ^*;%FT¢þQOx&  d2)(Aÿ& ,B@&*# Q@ Hz...Qz-&W ?í3ÔÍ??öí^]ö+í9/3Í210"&5467>7#".53326733267¦C: &CY4•&4$• $    8Ú2)( $AZ6%þíH@–þ  dÿÿ ª&:iœ@ )% P &O++4ÿÿ &ZiÁ¹ÿÿ@ -) P *O++4ÿÿ´&<i…¦@  PO++4ÿÿÿG&\iK@ %! P"O++4ÿÿ#D¿&=¶ @ PO++4ÿÿ#Ö&]€@ PO++4ÿÿ#D”&=b¶ ¹ÿþ@ PO++4ÿÿ#Öô&]b¹ÿþ@ PO++4ÿÿ#D¶&=_o¡@ PO++4ÿÿ#Ö&]_9@ PO++4F­&@  /  x W?í?öÝ^]ÆÄ2102.#"#46**F/% •sw $ýØ*fxÿÿ%ÿ$Å&6З ¹ÿä´>7.%P+4ÿÿ'ÿ$¼&VÐe ¹ÿâ´7.' P+4ÿÿÿ$Rµ&7Р ¹ÿÜ´ P+4ÿÿAÿ$ž©&WÐn ¹ÿí´" P+4ÿ¸ÿGÛ5¹ÿÀ@ Hy Q@€ y W?2í2?þÌ^]ýî+10"&'7326537#•f¹y*(÷þhd@å µ /Í2ÜÍ10'>54&'å"a  >W,-L+ -Je@  /ÝÍ23/ÍÍ1077-7dd9ÓBMMB‰ÿÿo]ÕŠ+Voü @  @ H /Ý+Î23/ÍÞÍ10".=332673Í#;+e""e+<V(;%**%;(,XÊô @p  € @p€/Í]ÞÍ]10"&54632{ // //X*$$**$$*,H.B@+p> p ¯¿¿Ï Р°°À/Í]qÞqÍ]qÜíÞr^]í10#".54>324&#"326!+*!!*+!I»++++3ÿ#@    /Í/Ü2Í2Ì210"&5467>733267°C:&u $    8Ý1*(   d'AÀ9@ @ @€/3Í2Ý2Í2/ÍÖÅÝÅÝÍ10'7'7öŒCx!ŒCxÙ˜3«F˜3«ÿÿ ½&:CKž¹ÿú@ (& P 'O++4ÿÿ &ZCï¹ÿð@ ,* P +O++4ÿÿ ½&:Kž@ '% P &O++4ÿÿ &Z @ +) P *O++4ÿÿ ˆ&:ƒÏ–@'9 P 1O %O+++44ÿÿ ò&Zƒv±¸ÿú@ ,> P 5O )O+++44ÿÿ¿&<C§ ¹ÿå@  PO++4ÿÿÿG&\C]¹ÿ×@ $" P#O++4ÿVCµ #CþŠeµýKµ&\Å 5@!0 @  ?O_oO€ €?íÜíÖí]]Þ]í]104632#"&74&#"326WPOWWOPWâ""""öcllcdlld4AA45AA-[½ F@( 0@?_o  ?Í9/3Í229ÖÍ]Ö]q2Íí]22103##5#5>73-..^»*W5)R½çSVVHGs8o;#&F½$A@$0@?&_&o&% €?ÜíÍ9/9ÖÖÍ9]Þ]í]Ä10#"&'73254.#>73#F(@.#J @(<(í™1B(­2$ Y( A?7[ #  .&P¾ #K@.@?O%_%o%!Op€à$ €€?Üíí9/ÍÖ]í]2]Þ]í]3/10"32654&'2#"&54>3>³ ? %4!$8&NO%Ge@GN ßYI ,2&YR7W>!Y#".Q½ 9@"0@? O  ?_o € ?Ìí2Æ]Î]9/]í]210>7#5!]8-²3)$.b=`TDR^0&WÅ+7a@>@,,5)  0&@&&?O9_9o9?2O22O   85 )#/€#€?Üíí9Öí]3/í]]Þ]í]93/í]10#".5467.54>3232654&'74&#">W'=,2># $&9&,:#%Ù )"i ,"'#-(*  &/. ¡   -OÅ !G@+@?O#_#o#O€à" €€?íÜí9/ÍÖ]í]3/]Þ]í]2102676#"".54>32#'>7¼ = %4!$8&NO„ML !YK!-1%[PnY##ÿÿÿú\™oþÔÿÿ&‘”þÔÿÿB™þÔÿÿÿú@™ŽþÔÿÿ[‘pþÔÿÿÿúF‘qþÔÿÿÿúP’rþÔÿÿQ‘sþÔÿÿÿúW™tþÔÿÿO™uþÔÿòú)3@!+)D * $H?í?Í9Ô2Æí2ÖÍÆ210%#"&''>7546323267'>54&#"ú&b32'4'.#"3!25Û 0|IO„09ER\0S’l??l’SS“m?” 0|HG~/òQÅ 38A6 3$9aƒKKƒb99bƒK ß 06:0 ÁÿÿÿúC½&”î'nGŽþÔÿÿÿúCÅ&'niŽþÔÿÿÿúZ½&”î'nMtþÔÿÿÿúZÅ&Ž'natþÔÿÿÿúZ½&q'natþÔÿÿÿúZ½&sô'n<tþÔÿÿÿúI½&”î'nWqþÔÿÿÿúIÅ&'nuqþÔÿÿÿúIÅ&Ž'ncqþÔÿÿÿúI½&p'nqqþÔÿÿÿúS½&”î'n[rþÔÿÿÿúS½&q'nurþÔÿÿT½&”î'nBsþÔÿÿTÅ&'nbsþÔÿÿTÅ&Ž'nRsþÔÿÿT½&p'n_sþÔÿÿT½&q'nRsþÔÿÿT¾&r'nTsþÔÿÿR½&”î'nMuþÔÿÿRÅ&'npuþÔÿÿR½&p'nkuþÔÿÿR½&q'nauþÔÿÿR½&sô'n9uþÔÿÿRÅ&t'nnuþÔ%ÿô2 01@.c 2&c1.!g)gg?í?í9/3í2Öí9Öí210"'>32#".54>32."32>7.û<#-O#XsCCpS3U?#%Ea<"6S '48($4"7Šu Bl‹JFsH =X9@jK*PVÿ.;<6%B\6 «µ r³¸ÿ¨@<I    L    L H H?í?9/??íÖ^]Å]‡+‡}ÄÕ]Ƈ+‡}Ä]]+]103>73'.' #BAC&‚%EBA#È+G #'n¸¥šPP›¥¸m‚}È5Nbq>Pÿ“е*@a@ H ae/À?íÖí]Þ+í10#!#ŠœþþœµüÞžýb"ÿ“ µY@1   @ H@  @ H  HH /3í?3í9/3Ö+Ö=Í2^]Þ+À99//]10!!5>7.'5!!‰42/Dþ1k34e3ùþË,.0. GHH!ƒ`[œHJ‘K]ƒ@DFÿÿ(çŵ1ìiµ/ÅÆÆ10!!1Öþ*i}ÿÿÿVCµnÿÿËØƒØÿò};@   ??99//3Å2Æ2ÞÍ9/99331073#.'ʪó}:"V`C448$OüãLŠF†^Æ#/4@$ *10'!- $ /3Ô29Å2Å2ÖÅÞÅ910%#"&54632>32#"&'.#"326732654&#">>*JUUJ*?>*JUUJ*?M&$z&$Ð+UKMS* +UKMS*v####ÿGŒ @ ag g?í/íÞÎýÎÎ10463:#"#*.'53265~jr +*$jr +*$(lu‚1)ýþlu‚1)G"?U@+3#*:;A * +@+** ;::0 gg0g%5g /íÔýÖíÔí23333333Ö2Í2Ö2Í2910".#"'>3232>7".#"'>3232>7‚51- f%8'51- f&7&51- f%8'51- f&7;<3!<3!ô<3!<3!1ÿøR8@    e e /3Äý2Ö2ýÆ3Æ2Æ2910!73#3!'7#537#1DT+Y›1ÌþòDT,\2ÏÒ€.R}^}‚.T}^1q ’@@ HQ¸ÿÀ@7 HQ?+?- @O/Í^]Í]/Å/]]]/]]]3Á‡+Á‡}Ä+qÁ‡+Á‡}Ä+q10% %!!2°$þÎ2$þPÖþ*Ä­wqrw­Ôy1q ³¸ÿÀ@M HQ@ HQ9,O9+ O@/Í^]Í]/Å/]]]/]]3Á‡+Á‡}Ä+qÁ‡+Á‡}Ä+q10'-7!5!þP$2þÎ$°þ*ÖM­wrqw­þ7.%.'>/#A><<>A##A><<>A=2332[7aXS))SXa77aXS))SXa7,F##F,,F##FÿÿFP&II£FŒ%´'¸ÿÀµ H'z¸ÿÀ@  HQ @ H ¸ÿÀ³H¸ÿÀ@* H Qz&#  UU?2í2?í????Í]öýÀÜ]2]3Ö++2+ý2+æ+10^]2.#"3##46#37#"&54632**7'% ¸¸•sÅ••5$$55$$5u$|þn*fxüø˜)//))//ÿÿFŒ«FÿöÑ#^@ %#Q¸ÿÀ³H¸ÿÀ@$ H Qz$#W  UU?2í2?í??í?3öýÀÜ]23Þ++ýÞ2Æ10^]2.#"3##46.57**7'% ¸¸•sAQ/• u$|þn*fxüî/C*Cýà ÿÿFÿöÑ­F/+/;«¶=z0¸ÿÀ@  H0/Q6@ H6-¸ÿÀ³H-¸ÿÀ@ H-$$"&Q(¸ÿÀ³H(¸ÿÀ@. H( Qz<39/, '  &U$U?223í223?3í2?????ÍöýÀÜ]23Þ++ýÀÝ]2]3Þ++2+ý2+æ10^]2.#"3##46!2.#"3##46#37#"&54632**F/% ¸¸•s*7'% ¸¸•sÅ••5$$55$$5w $|þn*fxu$|þn*fxüø˜)//))//Fÿöt+9™@ ;,93Q1¸ÿÀ³H1¸ÿÀ@ H1$$$"&Q(¸ÿÀ³H(¸ÿÀ@. H( Qz:239W, '  &U$U?223í223?3í2???í?3öýÀÜ]23Ö++ýÀÍ]2/3Þ++ýÞ2Æ10^]2.#"3##46!2.#"3##46.57**F/% ¸¸•s*7'% ¸¸•sAQ/• w $|þn*fxu$|þn*fxüî/C*Cýà ÿÿ-ÿò!Å ÿÿhµÕÿÿ#ÅÿÿÿñïÅöÿÿ%µ ÿÿ ÿñ÷µúÿÿ)ÿòºÿÿ¶ðÿÿ(ÿòÅÿÿ ÿþÆÿÿž\=oxÿÿ&¦5”xÿÿ¦B=xÿÿž@=Žxÿÿ¥[5pxÿÿžF5qxÿÿžP6rxÿÿ¦Q5sxÿÿžW=txÿÿ¥O=uxÿÿÿ‚\!oþ\ÿÿ&ÿŠ”þ\ÿÿÿŠB!þ\ÿÿÿ‚@!Žþ\ÿÿÿ‰[pþ\ÿÿÿ‚Fqþ\ÿÿÿ‚Prþ\ÿÿÿŠQsþ\ÿÿÿ‚W!tþ\ÿÿÿ‰O!uþ\(¢µ/ÅÖÅ210#5¢!Yôôÿ$ÏÿÌ@  /ÔÅ9/Í2103#"&'52>5Vv(3 4 &2 T WÝ@  /Í29/Í2310#&67ŸzJE1WS]D1,I•µ/ÍÖÍ210#5•!V¿¿ÿÿFÿv_> /ÿÿÿv> /ÿÿ;ž0ÿÿÿçÿvÎ>/ÿÿ2ÿ¡œ#EÿÿZÿvi>>/ÿÿÿçÿvÎ>?/ÿÿ ÿv>@/ÿÿ#ÿvi>^/ÿÿ ÿvP>`/ÿÿj)Jl>ÿÿ&ÓFïrÿÿô˜s/ÿÿè˜t/ÿÿj3Jx>ÿÿ2ìÂ|´ÿÿj7J&l>l>ÿÿjAJ&x>x>ÿÿÿð³Âšµÿó/+T@.S{---$Qz,$'W # W p ?3/39/3Í]2í2?3í2ö2ÎýÌ33^]öí103573#>32#".'#4&#"32>>•68V:%FfA;94>55- ".±?W]` (Fc:32#"&'.32654&#'32654&#"OwŠ;JwT-PB0Ÿ9q=)&vd(FVHCbLH>@>,( AH".K7S0V6mn * ,ʳ(60)w%)*"Pÿù]µA@%F?{! !!Dx H HJ ?3í?í9/íöí2^]]ö]í9/1032#"&'!2>54.+å3MyS,§›*k6Ìù8+,@(. 1r6V>sq ¥„þM$&¾Fÿó/#;@! S{%%%Q z$WU !W ?í2?í/3í2öí2^]öí9/10#".'!!>324&#"326/%FfA;94´þá68V:˜55- "=>=cG' ð{ 'Gb8CG þýRÿñÿó/#>@"S{%%%Q z$W !W  ?3í2?33/3í2öÍí2^]öí10#".''>7>324#"326/%FfA;94U3vA68V:˜j- "=>?fH' AY0þú 'He: þñTÿûÿú]¿!6@F{#D x" JJ ?3í?9/í33öÍí2öí106232!"&''>74.#"232>å  ¥§þ»*i5U3vAÚ/@& !:+Ãquä úY0þ' Ä &ÿòVÅ#4@F/y% !!$J J!?2í2?3í2Î223ö]í102#".'732>54.#"'>üT‚W-6^‚L,H6$- U6$E5 /L6EQ+!xÅ0\‡VV‡]0 ~5T<0S<# } 2ÿòî.:@++ ,0!Fy/J@€+&J, ?2í2?ÜÍí2þíÖÆ223310"&54>32>32.#".#"32>7Œ©±6^‚L 1D2 5$ &  U6$E5 /L6"6* +!x¼­V‡]05%w#I5T<0S<# } -ÿòGn*9@""#,S+"W#& W@ €?ÜÍí2?3í2ÞíÖÆ2233104>32>32.#".#"3267#".-%Fd@=..! "2BA=L>N/HhC9eK,0& o@ RCGN z +Jeÿÿ ÿ÷º½«ÿ÷:½++@%Fy-D , (J"J ?3í?ý2ÄÖÝÖíöí10#"&'.54>3232654&#":8g”\*p6)&v)EW]Z%Y‘h8þ= uqlu"[Z†X, , ,->( (V†þÆvhmp-ÿù:µ<@"D@ Hx!!F HJH?í?í9/íÞí9/^]ö+í2105!#"&54>;52675#"nÌ6k*›§,SyM3> .(@,+81„ý[ qs>V6rþM¾&$-ÿó#F@* Q @ H z%0%%% S{$W  U !W?3í2?í?3íþí9/^]]ö+í2104>325!5!#".73267.#"-:V86þá´49;AfF%˜>=" -5554.'.54>32>54&#"'MF df>P(F*  $6"EH$B^:;^B$þš *% <,,;-Gp$ #AQt  (kH7[A$"?W>%! %(>99#µ C@(D @ H x  H0/H H ?í?í9/]]íÞÄ]Ä]ö+í21035!5!5!5!5!#OþëþÈÔƒ§€ˆƒýK2ÿò¨Å"+8@+F/y- #Fy,#&J J ?3í2?í9/Íþí9ö]í210.#"'>32#".546732>71H15/% ( ,7#"&54>7.54>32.#";Ô^$>-QB62).7?E#Œ)*)'F`8Hq(2%R716#/i'$/& z  fo!5* K&2K1{"" ÿÐÿE µ0@DxHH J/í?í9/íöÆ2í2Î9107#"&'73265!!!!ì^g1ÐþÌþîhdy*( ƒ‘ƒ2ÿó÷.R@/(!'D/x0000Fy/(+@'$€J J ?í3?í29/Ü2Í2þí]ö^]í9Ä2210.#"326753#".54>32>32.#"F S1ma0H0%œ|[NZ16^H$=D2 5$ & yi3S73#"&'4>72654&'D…?©.Z0/Z,§>‚F\QQ\ p­ €gºgd¼h‡ÿ'2)#CPPC#)2Ç::Fÿò0%Y´ Q'¸ÿÀ@/ H'z"Q@!!!Q@z&" W W ?í??3?3í2?þÜ^]]]íÜ]]ýæ+í210"&=4.#"#7>3232653Orp#••/@R/..•ot}4$2 þpðü #@X65E==EþÕ}tPÿòŸµ!@ DxJ ??3í2þýÜ2Æ1033267#".5Pœ2)9*@S0µþ /4w;R3hµ 9@ D @ H ?O0   ??9/]3Í]2Ö+Þ2ý2ÞÆ10333###eœeeœežþénþÐ0P­Ã"D@""$ Dx#"J ???9/99?3í2?öí2ÄÖÆ29/10!.'#3>7>32.#"é9CH$œœ@#$,8&&9!A &@ SG"OOIþÛµþú&N(+#h +I&EÀsF9#¦@À;/Y  ¸ÿø@=M Y  %%##  Qz$!   #?3???9/??3Í2þýÄ]À99}ÄÄÌ2]Ö‡+}Ä]]+Ƈ+}Ä^]]]]]10>73#.'#4632.#"Û/,'±5e<@<2«).3•Tg -  7P43.=o;KPP!??:æL`\kG ÿöI=@! Q@ H@ H  ?3?Í9/3Í+2Ö+Ý2ý2ÍÞ2Æ10373#.=# P•ZZ AQ/PÀ0þ¸_– {/C*´  'Š@F&  Y Y ) (W#&#  #    ?????39/93Å2í2Æ2/333Æ9/‡+‡}ć+Á‡}Ä233310#.'#67''7.#"'>327Åq >6*Ÿ   ! ™-p2 rh  4#Z¨þoZR A!¨þoZR8ý] ÿÐÿE¤µV@6D@ Hx PÐ Dx{  t?2]/3Å2??3]???þí2Î2]þ+í210!.'#"&'7326533!CœX\g1!PSR$›wègþKhdy*( !`mu6™ýKFÿG 6@ Q @ H z0Qz W?3í2??þí^]]ö+í10>32#4&#"#F&xBCY4•&4$•ü #@X6þÐH<þj2ÿòäÅ!H@-F/y## #F y"?O0/JJ ?í?í9/]]Í]þí2]ö]í210#".54>32267!"!.ä5\IG~^68_}EG~^6þ§K] þ— ^KK\ g [[Y‡[..[‡YY‡\..\‡þÇ\OO\Á[MM[2ÿòä! 4G@+ +F/y66 6!F y50J@€&J/í?Îí99þí]ö]í3/Í^]10#".54>32>54&'332>54.#"ä5\IG~^68_}EjR Š&!%ýï/D,+E//E+,D/[Y‡[..[‡YY‡\.2/  /S$-tI3R; ;R33S; !;S-ÿòYx+>@$ S?{-0---&S {,#W)W ?í?Îí99þí^]]ö]í3/Í10#".54>32>5<'34&#"3262$D_;:_D&'E_8U?}*!$˜73388337>gI((Ig>>fH(+% 2I#?WEOOEEQQ2ÿòâÅ&:B@)1FD@ Hx<<< <'F y;$"J6J,J ?í?í?3í2?þí]ö+ýÞí10#".54>32>32#4.#"32>54.#"Ê5ZyDBx[78]x?6f*(W5K\2œ #(&þ -?&&?--?&&?-[Y‡[..[‡YY‡\. )Kg>þT©-9! )c<3R; ;R33S; !;S-ÿG$".N@/#S)Q@ Hz04000)S {/!W&W,W ?í?í?3í2?þí_^]]]ö+í9/í10#".54>32>32#4&#"4&#"326$$B\98\C%&D\6W?M*BQ-•+$˜4/6.5//4>gI((Ig>>fH(0'E]5þ,ÌDC:EEOOEEQQì½'M@-#F;{)K)0) ))D ( H?J?ý2Ä?9/]íÖÝÞí2^]]_]]ö]í10.54>32+#"32654.Û)&v(CW[Z%›¦¨œ1œÚ! 1QR'85 ,-=( m|}oè8È,<& FÿG/+O@. S?{-0---' Qz,'*W &#W  W?3í2?3í2?3í2?þý22Ì2^]]ö]í104632.#">32#"&'#4&#"32FTg -  7*=bE%:V86•Q=9' -jL`\kGA'Gf?=dH( ƼESþ÷ Pÿ”¼$U@.  L  "Fy&&Dx%H J?Æí/?9/í2þý22Æ^]öíÆ‡+Á‡}Ä102#.'##3>"32654&(• C?>A;¯8<9Mœ› % ,XLM¼spI[apq+*ifXýN„¼,53+(ÿò!Å1F@$+-F%/%%3-F 2+J J ?3í2?3í299Þí9/3Æ]2/3í9910%267#"&54>7>54&#"'>329B[,)9J.‰ˆ5P6,!182G-!fF:_B$"6D"N@ +w| ka2F4'  {6M00C/ -" (ÿò½*M@*&(S  /  ,,O,(S {+& ?3Í2?3Í299þí9/3]Æ]2/3í9910%267#"&54>7>54#"'>32'P&]Fku%@1F&=X0`n(9#-,"kyPN!2)#   ' t VJ&6' ÿÿ+µ¯ÿØÿE­ +>@"Qz--+-K--%, +(("?Í?Í9/3Í2ÔÍ_^]]öÆí210.5#".54>324&#"3267˜AQ/ (8-4D%7L/ ç »/C*Ñ*>*+A,!>Z:þ –*$# AÿE¡©)D@%! + ++ Qz* U !P$$ W ?í2Ô2Í]2?íÍ2þý2ÝÆ]3/Í2/310"#".573#3267#"&'73265<$ =P0•³³!2<YP 4 !;T3º›|¹/8%#$UPjzµ(@D @ H H?ýÄ3?Ö+ÍÔýÖÆ10".54>3!##×) x@cw8Ñœ0$,CH …ýÐ0Aÿô¤#:@% #Qz$U#W W ?3í2?3í2?íöý2Î2/3Æ3/310#3267#".54632.#"¹#25D0=Q0qq*D-$|¹/8 t !;T3Sfxw $ÿERµ1@D@ HH /3Í2?í2Ö+ÝýÝÆ9/310%3267#"&5#5!#1g^Ñ>Ñ(*ydh……Fÿòõ!&:@"D!@ H!x(( (Dx'!@€ J ?í??ÎÍþí]ö+íÝÍ10".53326532654&'3_IjE!œ!/9G9/$† .%"Fl)Ie=¯þ^*;%FT¢&  .)þ°=fI(Aÿô|x"F@*Q@ Hz$0$@$`$$Qz#" W @€?ÎÍ?3í2?þí^]]ö+íÝÍ103>5<'3#".533267rS x,&xBCY4•&4$! *%þ\ $AZ6%þíH@#ÿòâµ&l¹!ÿð@BMM ` p  o   F"/""y(( (F' H H J ?í?í2?í2Þí]ö]í99//Í]ÍÍÍ]10++".5467#5!32654.'5!#ƒH{Z343w/."^QQ^#./wh3Z{+TzPH|5t3>K.affa.K>3tkŽPzT+Fÿò¢½$4@!""Fy&D%J !J"?2í2?í?Þíö]í9/3102#".5332>54.#"'>ž‰{-TwIGjG#œ#/+=% /&.½²³Y†Z-)KiA¥þh.?& :R36S9‚Õ¿†@CLL D J?3í22????9/ÅÖÕýÄ2}‡ÄÄ+Á‡}ÄÆÔÁ‡+}ÄÄÄćÄÄ10>32.#"#.'3¡ &4&(F"A  &E%œEz9µ J*<.'!f A†Bþ÷jÔpHHÿGZ(Þ@“# ß + ; {   « » Û ë Ÿ y =   /  $$Y# ## Ðt¤´Ôäv2 Y*/ #@ H#) $#W W ?3í22/?3í2??9/33Ö+ÝÝ^]ÆÁ‡+‡}Ä]]]]]qqq‡+‡}Ä]]]]]qqqÄ23/310%>7>32.#"#"&'73267.'3%@B7 $=#!kV#;$(+2g-ž ³:~6<9 m`Â`XU w+&cûš'[]X#Dµ]@6L/ ? O  0  HH?í2?í29/]3Í]2Î2/3/Î]2/3/‡+‡}Ä10!!5>7#53>7!5!3R9aýßC&gµ=þÉM+‰++U(ƒ]-i8n+N ƒl\6n#Ö[@3  Y   @ H 0  U U ?í2?í29/3Í2Î2/3/^]]Î+2/3/‡+‡}Ä103#!!5>7#53>7#5!Ñ9!W¢'þM2@‡(ꢯA&X5wSG&X3wÿñ/µ(V@0"F /?y**@ H)''J H?í2?3í29/Á2Æ+2/2^]æ]9/32/3í10>7!5!#".'732654.+²+,(þåå *24kZ+OoC*J>/.!e:BJ-?&1ˆ-.+‚]068bQ9S6 |")0& 7ÿñRµ(N@*((!! **Fy)#H!(! J  ?3í2?9/Í2í2æ^]2/í]Æ22/9/10#"3267#".5467.'5!!´1&?-JB:e!./>J*DnO+Zk42* åþå(,+2 &0)| 6S9Qb860]‚+.-(ÿGþ&T@0&& (((/(S/{'!U& W ?3í2?9/Í2í2æ^]2/í]Æ22/9/10%#"32>7#"&54>7.'5!#‡6GL?>,+(!/7:|.?$,R§ê#&%24.4 w nn*C3# 5c f|-.- ÿ?Ï1U@/ S#?##{33+S@ H2W(((./U?í2?399//Í2íÆ+2/í^]æ]2/í9/104>7>54.#5>7#5!. /C),  &H=#" é§#'''<*!?\;+y f$1"   W  |f!%% &5&/>+   ,Å._@7 F/?y000 &'@ H'/&!J*'* H?í?39/3Í2í2Æ+22/Í3^]ö]í3/39103#!!&454>7#53>54&#"'>32ó$O°,&;þ *[Å5)0( J,zH?[;ÿ&>!n*'! } !%:3/n,$ h)53I ÿòµ$W@2 F/?y&&& @ H%J## H J  ?3í2?í29/íÆ+2/3^]ö]í3/9/Í910%#".'732>54.#>7#5!# EkK?7, W6$2 BoT ^éú Ñ0R7#5!#32Ó|xDe *2c&C5Q Jµæ jw¡UZ| 31X+xx(T'ÿò¼©#D@# S{%Qz$ U W ?3í2?Í2í99ö23í2öí3/9910%#"&'732654&'.573#¼ukF]&P')"%0!7(•³³)&<*NPy '<- ›z&6FÿG 8@ S?  {QzUW??3í2Þíöí2^]ö]í104&#">7#>32‡92 +A+˜3YvB•$qB<_C$019þÆ(3@)JnQ;‹©!=WÿÿZÿGè_ÿÿZÿG×&__ïÿG[@2  Q@ H0 @  ?O ??99//3Í]23Í]2Ö+2Ýý23Ý2Æ3310333#3###535#¸····¸¸¸ÉFþºlZlþ°PlZÿÿ2ÿóìµÿÿPÿ÷ö¶&''_!¡=²ÿÿPÿ÷¡&''_]Ëÿÿ-ÿó)&G'_„]SÿÿPÿòüµ&/-1ÿÿPÿGþ&/M.ÿÿFÿG"&OM9ÿÿPÿò»µ&1-ðÿÿPÿGÙþ&1MðÿÿFÿG5þ&QMLÿÿ Ƕ&$_œ¡¹ÿý@ #P $O++4ÿÿ#ÿõè&D_R@ 26P7O++4ÿÿ<¶&,_ÿס@ P O++4ÿÿÿö.& _É@ P O++4ÿÿ2ÿòä¶&2_á@ (,P"-O++4ÿÿ-ÿò2&R_f@  $ P%O++4ÿÿFÿò}¶&8_™¡@ PO++4ÿÿAÿô&X_[@ P O++4ÿÿFÿò}Â&8´¥Ž@$P!2O&OO++++444ÿÿAÿô4&X´f!²¸ÿþ@ P.O "O O++++444ÿÿFÿò}Â&8¾{!²¸ÿú@$P1O&OO++++444ÿÿAÿôp&X·<@$P &O OO++++444ÿÿFÿò}Â&8¿!²¸ÿþ@$P5O&OO++++444ÿÿAÿô\&X¸=@ P1O "O O++++444ÿÿFÿò}Â&8½!²¸ÿþ@$P*2O,O O++++444ÿÿAÿôp&X¶<@$P ,O O*O++++444-ÿò'L@. 'S?{))S/{( '''W0""W ?í]?3í29/^]Íö]2í]ö]í210#"&5467!.#"'>3232>7+F[0p‚RL@*N (18GiE!þ¢ $$  FiG#ˆ†  .6 y *Ids$$ÿÿ ÇÂ&$´ªŽ!²¸ÿþ@$+P(9O -O !O++++444ÿÿ#ÿõè4&D´O@7>P?P<@O4O+++44ÿÿ ¿n&¡Šž™@ uPO++4ÿÿ#ÿò=Õ&ÁŠè¹ÿô@ XY' PZO++42ÿóÎÅ+H@%+!*Dx-!Fy,J* &J ?3í?39/93Í2í2öíö223í29103533##".54>32.#"32675#€aœQQ|[NZ16^H1O9%- S1ma0H0%a8JJk¶ 0\†VW†]0 }yi3S3235.#"32675# DDƒ‰0`)#M1@53mt$Ed?983àK =:16(KPZ´}}8, t:_D% ¬OP32326732>54.#"ÁC:G|\68_}EG~^6E?     8þû/D,+E//E+,D/Ý2)(.[†YY‡\..\‡Yh0   d83R; ;R33S; !;S-ÿ#2*66@(!+S{81S{7.W'$(4W ?3íÝ2Í2?íöíöí9/ÝÄ10"&5467>7.54>3232674&#"326MC: 4V=!'E_89_D&@9#    8673388337Ý2)( ,Ha;>fH((Hf>T|#   dåEOOEEQQÿÿ2ÿ#än&OŠÏ™@ @B PBO++4ÿÿ-ÿ#2Õ&PŠs@ 78 P9O++4ÿÿÿñ/¶&_`¡@ )-P.O++4ÿÿÿGÛ&°_-@ #'P(O++4ÿÿÿ¸ÿG3&]_Î@ M P O++4ÿÿPÿ÷ö½&'=²ÿÿPÿ÷¡½&']Ëÿÿ-ÿó)&G]Sÿÿ2ÿó}¿&* @ L&$ P%O++4ÿÿ-ÿD &Jß@ Q-+ P%,O++4Pÿòéµ:@x D DDH  J ??í??99//íÞý2Üí2Þíæ10332653#".=##33ëœ-76-›9cLKc:ÿœœÿµþUKGGK þâ8`F('E_81þÚµþ÷PÿGw»3@F?  yDxJJ/?í9/íöí2^]ö]í10#>325>54&#"ìœ8@E"’¡"MC,¹A ‡S…iR ’6EY:=BÿÿP¤¿&1CÇ ¹ÿÖ@ PO++4ÿÿF &QC‚¹ÿâ@ PO++4 ÇÂ*6:%@ 89:79797иÿÀ@ H11.@H++..&)* `$$”  L<%#"!  o +    + ›    L  Ï ÿ  @ H;:8.4&%HÀð   ?????3^]9/]qr3í2ÕÖÝ|ÖÅ?Ö+Å]‡+‡}Ä]]]qqq‡ÄÄÄÄÄÄÄÕ]Ƈ+‡}Ä]]]qqq‡ÄÄÄÄÄÄ3=/Â/Í+Â/Í+q99//ÅÅ10!.'!#>7&54>323.74&#"3267'7  þò  ¢$B?= %*? >?C%þžÅ  >© ¢$L&&L$i´ŸD & 33 E‘ ¶i4DR--RD4¾½@54.+532654&#"'>32#*.'72n0YD)2A"A9HY?3'P3+h::bH)43BABo’Q 1 "9,&3 ƒ8902|7W<3Zn?RoDˆ ÿF²*F@%S & S {,%&+0UW%#W&?2í2?í9/í]9Æ22æ2/í9í9102'>54.+52654&#"'>±3W?$.69?Bq—U 2`L.%2KF**E< #*/,C/'JV9D[9~ -$ y*+!z ÿÿP޶&+_§¡@  PO++4ÿÿF Â&K¼¹ÿ¹@  PO++4PÿGuÅ-@ D @ H x Dx J?3í/?þí]ö+í10>32#4.#"#P0„QRnCœ%53œ¦ ,OmAý«W,=&ýÉ-ÿG%1>j@<&-$Q2%488@@@&S/{?$%-0W# >;5  )W ?íÄ2/33ÝÔ2Í2?3í2?3ö^]í_]]ÖÍ]Ô2ý2Ì33910%>32#"&''7"#".54>32573267.#"32654&#" ) :+2C%=" -jQ  †*>),A+0+QH[&Ge?@gH& îþET þc*$# 2ÿò–µ1Ae@; F?  7F/?yC!)**/F)0&&=FyB!J::)2J ??í?9/í99ö^]íÔ]2å2/9ö]íÔ]í2/3/9102654.'3#"&54>7.546732>54&#"d81— #. ¢¢ .# —185(R@@R(5±@1 !%)E-,+')-1fssf1-)'+,-E)%! 1@þ $2--2$ (ÿò.)5S@2Q Ÿ ¯  -S{7$'Q#€    3S{6 W00#*W ??í?9/í99öí3/]3í2öí3/]3í2102654&'3#".5467.546732654&#"+',Œ '3>:&E_99_E&:>3' Œ,'1::11::é>;Z/(Q+>Wo@8[?""?[8@oW>+Q(/Z;>þ‰?;9DD9;?#ÿEDµU@+ L@ HH H?í2Þ2Í2?í2ÞÆÞ+ÖÁ‡+Á‡}ÄÝÌ210!#"&'7325!5>7!5!9 X^\$a[c19þpQX['þÉI!i|„7#5!Ñ=FGþYP 4 þÉ;A@ࢪDRZ*’RQjX$STO |ÿÿ Ç”&$bì ¹ÿÿ@ !'P O++4ÿÿ#ÿõèô&Db‘@ 4:P2O++4Pÿ#;µ&c@7&#  @ H ( ( Dx' H/ H H?í?3í9/]íÜ2Í2þýÀ]Þ+ÆÆ]9/Í3/3Í2Î2103!!!!!##"&'732676&/>7PÔþÈþëO¹  L>,% µƒˆ€§ƒ ,02W  &-ÿ#4?@LV2f2"#)0-))§55S/{AA¨?? S{@"#& W?/ ?  0 ?::W?í]?339/]Íí2?Ü2Í2þí2]]ö]í]Ä29/Í3/3Í2Î210^]]4>32!3267#"&'732676&/>7.%.#"-+F[0p‚þ®L@)OV0 L>,%  6P5^ #$ FiF$‰…  .6 y ,02W   ! /GYl$%ÿÿ2ÿòäÂ&2´ÎŽ!²¸ÿÿ@-4P0BO"6O"*O++++444ÿÿ-ÿò24&R´u@%, P(:O.O"O++++444ÿÿ2ÿòäÂ&2¹ÑŽ@6(PCFO"5O+++44ÿÿ-ÿò24&R¹y@. P;>O-O+++44ÿÿ2ÿòä”&2b @ *0P"(O++4ÿÿ-ÿò2ô&Rb´@ "( P O++4ÿÿ2ÿòäÂ&2µÐŽ@45P16O"*O+++44ÿÿ-ÿò24&Rµt@,- P(.O"O+++44ÿÿn&<ŠŽ™@  PO++4ÿÿÿGÕ&\ŠW@ !" P#O++4ÿûÿGõ$<@&Q$Qz%$!  /3333ÝÖ2Í2?3ö2Æ2ý2ÜýÆ10%>32#"&''7&5732654&#" * :+2C%=ULLv•  †*>),A+1,SHƒ ¼ü÷*$# FÿGü'4^@5Qz56Q.#$$"Q4+41+$##%"" W  ??í3?3333ÝÖ2Í2/_^]]3í223Üý]Æþí104&#"#>32>32#"&''7&532654&#"w&4$•&xBCY4 ) :+2C%=ULLv”  H<þjü #@X6£*>),A+1,SHƒ 5*$# ÿûÿGõ©(G@#*/"(Q)U(%  /3333ÝÖ2Í2?íÍ2Ö2Î2ý2Í3ÜÝ]Æ10%>32#"&''7&573#32654&#" ) :+2C%=ULLv•³³  †*>),A+1,SHƒ ^›|þk*$# -ÿój .:n@E0<<{Q0'@'`'''Q60@`/S/{;669W"55 2W,  ?3ÀýÀ33?À33ýÀ33?3ö^]íÜ]2ý2Ü]íæ]104#"326#".54>3257>32#"&3267.#"Òj- "=>þú"H#AfF% =" -j þñTº &Ge?@gH& îþú 'He>?fH' ET -ÿGj ,8f@@:{-S0@` 3Q0@`S%%/%%{90 W *"47W" ??ÀýÀ3333?3ÀýÀö^]íÜ]2ý29Ü]íæ103267.#"%>32#"&'#5#"&54>324&#"32Åj- "=>"I"AfF%:V86•6pv%FfA!I)>=" -j  S· 'Gf?=dH( ÆÆ “~=eI(þùESþó  ÿŸÝ!&¨@W&  !   LL( ' &&"H  ??3????339/333í233ÖÝÝƇ+‡}Äć+‡}ÄÄÄÄćÄ33392910#.'#'7##>73737.'3k;§  ˆRUID  ¢'FCB#•,WãE=Y.tþñ«$L&÷Þ&L$p¾¨—H'…æ4ES-ºº)O2ÿš{%1G@)%$#*) &3&Fy2-J$ ) J ?333í22?33í2öíÆ292/310.'32>7#"&''7.54>327.#"B - Œ"6* +!xO  bbe6^‚L%dþv'-‰$E5 ¥~ þX } ZR#¬ƒV‡]0UþeAh¡5T-ÿ§äd#*B@&#"(' ,$S{+(W"' W ?333í22?33í2öíÆ2/910.'3267#"''7.54>32377« ^>N/#ND>%Fd@Pü Q64  w þá z QR"‚S9eK,Iþ¹ 4úO *µ ;@ D  xO H ??í9/3Í]2æ29/í2Æ9/10333#!!# Qœ‰‰3þ1Qª þõn¶†<ÿÒ°ö 9@D     H?3í2?39Ö23Ý2ý2ÝÄ3310?#5!7#57#ÃÑ%3GþΜ|OO ø,…A:þzþÊpžøf(ÿG¼:œ@X ,-diYQ@ H{<7#5!Ñ '054/&;54 " 7 %:3/5?)!;A@ࢪ ,8@B@ 23&v*/*X$STO |ÚÅ'/@D F)("J??3í299Æ2Þí9/í10!#54>7>54&#"'>32œ%&5,/,' 219> z…"+"Æ$8+## ~  fZ$7*!$-¤%+@Q S'&W  ??399í2ÆÞí9/í103#54>7>54&#"'>32ö•# *%Q. )5<jp %s 1% v YL-" # ÿ÷s½(3„@+-F%F@ Hy5 553 Dx4°**¸ÿÀ@( H*HO_oŸ¿0H 0  H ?í]?í9/]Þ]2Í2í+]9ô2Îý2Ì^]À]]þ+íÔ2í10"&'5#53>323#32>54&#'32654&#"79q=FF0r1BoP-PB0Ÿì^^(#9)HCbLH>@>.  žXª .K7S0V6mn9/X0 %1*u%)*" ÿòãµ#T@/D x%€%%/%Dx$ OJ ???í9/Í]2333ô2Ìí2^]]ôÌ3í21033333##".=#26=# QœÿœQQ"FlJIjE!Ql9Gÿ!/µÿÿnA=fI()Ie=AÎFT44*;%ÿÿ ȵ¨Pÿ›Q‹@I  @ H Dx H /  H H?333Ì2í222?3íÎ29/]333í222öÅ2/í2]Þ+ÆÄ}‡ÄÄÄÄÄÄ3/}‡ÄÄÄÄ10!'7#!73#337#37#4&U„Š W{0`@Úþ¬‰4½@YeGµSþ¿€§ƒªˆþQ§-ÿ¦(f%/49¬@\ #89&'" 43 !!" " "0S?  {;0;;/5S/{:40&/955"!!8W#  3'*W  ?333/3í22?333í2223/39/333Í222ö^]í2]]ö]í99//3}‡ÄÄÄÄÄÄ3‡ÄÄÄÄÄÄÄ2104>327#3267#"&''7.?"&#"3.'7-+FY/O<@Ú#)K &07(MDBå$&éªFiF$NH|^  ` y TN ƒ„n '-T\# D ÿòµ:@ Dx H  J ?3í2?9/3í2Æ2ôÌ3í29/103##"&'7326=#533ËQQ9aJDb 4B'92yyœ¥nN3ZC'!y8BFnÿºÿG!þ#B@"%zQz$W!W ??3í29/3Í2?íô2Ì3ýÎ33äÄ2103533##"&'7326=##"&54632W•DDf`7#Wú5$$55$$5GÇÇ]×hdy*(Ó¼)//))//2ÿE^Å 2>@#)F Dx4!Fy3.J J&J ?3íÔ2í2?íö^]íöíÌ2í210%#".54>323267#"&532654.#"B"`?Cz\68_}EG|[51g^þ‘/D,X`/E+,D/@$*.[‡YY‡\..\‡Yþº(*yXhV3R; uk3S; !;S-ÿGŽ ,P@1Q,,/,,z. ..S"""{- W,'W W?3í2?3í2?3í2ö]í]]ö]í2Î2103267.#"3267#"&=#"&54>32Åj- "=>Q  SS6pv%FfA;94  Sþà )sNZ “~=eI(  ’½&b@9  L $F@ H(( Dx' HJ?í???9/Àí2ö2Îý2Æ^]]Ö+íÆÁ‡+‡}Ä103>32#.'##5#"32654& Q3m+œ¦C?.-*¯')(MœQ% ,XLMy2 ouI[CIO&"FB;ýý;¼,53+ ¤F@'+ Q zU 0  W ??3í29/]3í2öÌ3ý2Ì_^]]Æ10.#"3##5#535>32‹6' •DD(mC """ Š }]¸¸]Ý Ÿµ$l@9  L  & DL%!!   ?????99//3Í2333Ô͇+Á‡}ÄýÝć+}Ä103.'33>733##.'#>7# B°  §C€? œ!?N  U @;;;;n5f3þü3g6S)) ÿG))0@£2'%$Ðt¤´Ôävd2 #*#Y$$($*ß+;{«»ÛëŸyk=/*Y`** @ H1$#*..' W ?3í2??99//Í233333??Ô+Ä3/3Í]‡+‡}Ä^]]]]]]qqq‡ÄÄÝƇ+‡}Ä]]]]]]qqq‡ÄÄÄ10#"&'73267.'#53.'33>733>7#Í: *2?*#;$(+8_= œ„  ˜  ;þ÷  O LŽE-?) w+&6{G]&R+"T--T"*R']x=##=ÿGÛ(T@0$S ?{***/*@ H)''!W U?í2?3í29/Í2Æ+23^]æ]2/í9/107>7#5!#".'732654&+|&%$ê§ "(+$?.|:7/!(++>?LG6æ-.-|f*/4 #3C*nn w 4.42!Neô@    /ÀÖÍ3/ÍÞÍ102#.#"#54>Ã"<+e""e+;ô(;%**%;(A­A@ @ @  /3Ý2Í2Í29/ÍÖÍÝÍÝÍ10/'5xCŒsxCŒ«3˜F«3˜Pêµ#6@pp$t!t /ýÞýÞÝÝ}ÅÔí3/ÍÝÍÞí10'7#".54>324&#"326æ«¢,%$$%?d@=Tþþ% %% %JZ4 ,@Ÿ¯   /3Ý2ÞÍÖÄ]ÝÞÝÄ]10#"&54632#"&54632%!!ž&%%&¼&&&&þßþü‰""""""""ŽP9K=4 @   /ÝÞÍÞÌÝÌ10#"&54632'!!û&&&&ÂþüŠ""""P#N¬p4@  /3Í29/3Í2ÖÝÞÍ9=/3/3/310'4632#"&%4632#"&­w?‡Î&%%&þ÷&&&&pª/™£""""""""#N¬p6@  /3Í29/33/3ÖÝÞÍ9=/3/3/310'7#"&54632#"&54632q‡?w&%%& &&&&0™/ªã""""""""#N¬\ :@  /3Í23/ÍÍ22ÖÝÞÝÄ29=/3Ä210#"&54632#"&54632%77£&%%& &&&&þ©1`a2“""""""""x:II:€LW4>@$¯¿/O_ °    /3Ý2Ü2Í2ÞÍÖ2Æ]Õ]2Æ]10#".#"'>323267'!!W!7"èþü«  ,  fP( ´/ÍÖÍ10'7 ÚÔ]EEe1WÂ@  /3ÝÍÖÍ2Í210''7W+gi+”W?<32#"&'732654&#"##5Rå  QqH %@U1*332.#"!!32>7#".26^~I7>52>54.+Å3MyS,§›)s6ª +KpQHN8+,@(. µö6V>sq !C‡~oS2ˆ9;IèŽýÉ$&¾Pÿùµ%`@;"DD/y''' 'Dx&H"HJ ??3í??9/]í3/íþí2]ö]í9/^]3í210332#"&'!#3!2>54.+òœ3MyS,§›)s6þúœœÚ8+,@(. µö6V>sq þÚµþ÷þÒ$&¾ÛµX@8/? D @ H x?D@ HHJ ???9/íí2Ö+Õ^]í2]ö+í9/]10#>32#54&#"##5Rå2Ni?œ8E.œ½µ…ƒ">X6ÇÇ64þÕ0…ÿÿP¢¿&. @ $PO++4ÿÿP¤¿&ØCë ¹ÿú@  PO++4ÿÿÿò‚™&ã§™@ '/P"O++4PÿGе H¹ ÿÀ@* H xD0D D x H??í3Í?öýÔ]íÔ^]]ýæ+107!3##5#3ìœÑ–Óœ„1ýK¹¹µÿÿ ǵ$ÿÿPÿù]µèÿÿPÿ÷s½%P)µ@ DxH??íþí]Æ103#!!ìœÙþõ„ÿG"µJ@-D/?D D /D@ H  H H?í?í23Í2Ö+í^]ÖíÞýÞ]í1073>=!3#5!#3d%*Êw–þ–` !ù„@~‚ŠLýÏþù¹ê6roi-­ÿÿP;µ( ͵/@—€1t1+11' "'""L!!! L(€!!'(D)***/ )/*/*/L   L  ) /0/)("!  ???????????9/3/?Ö]ÆÄ9/‡+Á‡}Ä^]‡+Á‡}Ä]3ÄÄ]]ý2}ÄÄÔ]Æ9/‡+}Ä]]‡+}Ä]]10_]]]]3>7.'33>73#.'# BEI%*HA> ¼534˜744»$?@C(Q†:®66:#˜$:563f_S!+RPQ+*FB@$þê%CBE'/RNN+K»g/PJG&þÊ6*HHM/ÿò5Ä4W@144%.FF@ H6 %@ H%5H/444&+J% J ?3í2?3í29/]í9Æ+2/Î+2/íí99/1032>54&#"'>32#".'732654.+Ži/#617R%2(qH8`F')*)Œ#E?7.)26BQ-=$^§ ""{1K2&K *5!oe  z &/$P¤µF@. D @ H x Dxdt k {  ??3]??3]öí2]ö+í21033>73#P›$RSP!šXœCµþg6um`!ýKÆgèwÿÿP¤œ&ØМ@   PO++4ÿÿP¢µ.ÿòŵD@+DD@ Hx p@ HHH ?í?í?Æ+]ö+í9/í^]10'>7>5!# +KpQHNÙœ1C‡~nT2ˆ9;IçýK1ÿÿ<Eµ0ÿÿP޵+ÿÿ2ÿòäÅ2ÿÿPе­ÿÿPa½3ÿÿ2ÿòtÅ&ÿÿRµ7ÿò‚µ!Ê@W–$ L#/_oŸß™+L0`pð¸ÿÀ@,H @ H"°$ J ?3í2????933]]]Æ+2/3Í+]‡+‡}Ä^]]]]]qÝ]qƇ+‡}Ä]]]]]10%#"&'73267.'3>73Á@DF$"I 109)KC9­',- :§20/ËBU0 }.@‡ƒy2'Y__-X¸[M†xlÿÿ.8â²ÿÿ ™µ;PÿGµ 6@ D D 0 €  Dx  H?Íí2??öí^]]ÖíÜå10%3#5!3!3Šx–ý䜜„þùµýÏ1(Xµ7@ D @ H xDJ  ??9/í?Þí^]ö+í21032673#5#".=3Ä%47œœ"@?gH'œé)3 IýKè;cLÔP¬µ 9¹ ÿÀ@ H x D DDx  H?í23???öíÔíÔýæ+10)33333¬ü¤œÄœÄœµýÏ1ýÏ1PÿG$µA³ D ¸ÿÀ@ H DDDx H  ????Íí23öíÔíÔí2/+ýÆ10333333#5!PœÄœÄœx–üµýÏ1ýÏ1ýÏþùÿ÷ص!B@(F/?y### D@ H"JH J ?í?í9/íÖ+Ýí2^]ö]í10%#"&'#5!6232*232>54.ج›+o6­I  ©¥þ¤ :,1Eãuw !„ætÏ (( Pÿ÷Oµ#K@,!F D@ Hx%%% D x$J J ?í?9/í??öí2_^]]ö+í9/í10%#"&'362323#*232>54&\-SwI*k7œ  £¤WœœþX 6)[ã:X< ¥ætYýKLÏ (=,Pÿ÷fµ4@F?y!!Dx J J ?í?9/íöí2^]ö]í10%#"&'36232*232>54.f¬š+o6œ  ©¤þ¥ :,1Eãtx ¥ætÏ (( (ÿòwÆ"U@3F/?y$$@ H#JH? J ?3í2?39/^]íí2Æ+2]ö]í29/10#"&'73267!5!.#"'>32w7_€HEs92&/9 P` þÞ ]P;b.9y;I~^6[`ˆX)} SQ„PLz,Y‰PÿòÆ&R@$FF/y((¸ÿÀ@ HDx'H/J !J?í?í??9/]íöí2+ö]í9/3í102#".'##33>2654&#"¸Dz[65\yE?rZ:œœ‚ =Xm7.54>ˆ7*KJA *q7œ0 !O"¥)*(+"-Sw6 %5(»† ýZù-‡G)PH= !.?)9V:ÿÿ#ÿõèD-ÿò,0C@')S?{20222 S{1 .W U&W ?í?í9/3í2þí2^]]ö]í910632#"&54>7>732654.#"%B#<3&A=0R=#(E[4‹x*T|R!C#þÉ1:14 &9‰#5' @_?DdC!©¤l—e:þ[$XZL@/$ Fÿö) 2U@3S&&)S?..{404€444Qz3) ?W!0W ?í]3?í]39/Í9öí2^]]ö]í93/í10732654&+72654&#"".'>32Û/2831WT%.4*-O@>77>@AY7"5!3#5!##A šYþ€z z"eqp,þlþð––#KIFÿÿ-ÿòH G"×@mY Y$  Q"  ""Y  Y#"        ???????????9/3/?ÖÆÌ9/‡+Á‡}ć+Á‡}Ä3ÄÄí299}ÄÄÜÆÆ9/‡+}ć+}Ä103>7.'353>73#&'#5 2j32#".'73254.+532654&#"-#\6)N=%$!,*&@R,850W7Zuv$!,,Ný #9+'7>0-=& t2 jF%n@NK*:Q@ Hz04  %  Qzt”¤+;  {›«$4?2]]??3]]?öí2]]^]]ö+í2]]10#4>5#3>7%–:5/ƒ•73#.'#3Û1.*µ;BCDA;ª.23••V21.>CBDNP#;92Ó ÿ÷-H@.Q Q@ Hz@ H @ H  U U ?í?í?Æ++ö+í9/]í^]10'>7>=!#2 %9Q638 ‹•”AA> 7,| %BIL#<ýò”<½„@Q Q 0  +;    Q@$ 4     „    ??3/2/9/^]Í]??Ö]2]]í2]]ÔÔ2]]Æ]í2]]10#>73>73#.'#Ú‘ |+H(*P ~ ”ng/#RSK7Šˆ6F–Z`£36ˆŠ7NšHòF  E@* Q@ Hz 0   Qz U/ ???9/]í?öí2^]]ö+í210!#5##3353 •›••›•ÐÐÄÄÿÿ-ÿò2RÿÿF ÅÿÿFÿG/Sÿÿ-ÿòÖFù$@ Q@ HU ??í2Ö+ÖýÖÆ10###5!ù¨•¨å”þl”zÿÿÿG\-ÿGí+U@2-{ S&& +QS/{, W!W+ ??3í2?3í2?3ö^]íÝ]23ý23Ý]íæ1032>54.'#5.54>757D4''4ýº·,F\42XE-æÿ$@]?@^@#ÿÿ  [Fÿjd N@3 Q› «  Q D d „ ” ä ô  +  Qz U ?Æí2??öí_^]]]Öí3/]í10%3#5!333 Yþa•›•zþð–þl”-òA@) Q @ H z_Q/W ??9/í?Ö^]í]ö+í210326753#5#".=Â1, &••/ 3S; ª&éýò­+I6«F <¹ ÿÀ@ H z Q@ ÀQ@ÀQ U ?í2???ÞíÜíÜýæ+10333333F•‰•ˆ•þl”þl”ýòFÿjo@@"Q Q@ ÀQ@ÀQz  U ?Æí23???þíÜíÜí2/íÆ10)333333#ðýV•‰•ˆ•Yþl”þl”þlþðÿõ\#L@/S;{%%+%[%% Q !@ H!$W? U"W ?í?í9/]íÖ+Ýí2_^]]ö]í10%2654.#"'>32#"&'#5!p)/%$ (4-0Q;" 32#"&'3ò••þ3)/%$ (4-.Q<# 32#"&'3%)/%$ (4-/Q<" 7#53.#"'>32æ(Gc<2W2N#.%ÈÇG3&=!-T'=dH( ChF%u  'k8* s%GfFÿò;&N@0({$S0PpS  Q z' U/W  !W ?í???í9/]íþý2Þ2íÜ^]]íæ10".'##33>32"32654&?0TA+l••n ,AQ/6\D&&D\6.66..669S3ÐÄ0N7'Hf??gI'ªQCCSSCCQ"@UY+;K "Q@ Hz$$$S  #0""U`p°À  U   ???3í?9/]3í]Ö^]íÆ]ö+ý2Ö]]]‡+‡}Ä_]]10%#>7.54632#=.#"; 2™<*2p=<7• *7( H»/_-Al'E4X^ þ»è%ÿÿ-ÿò&HC•¹ÿú@ +)P*O++4ÿÿ-ÿòò&Hƒ@*<P4O(O+++44ÿG)p@A&Q@ Hz+0+++))*'&Q'z*' W("W   ?3?^]3í9/3Í2?3í2?ö2í239/]]ö+í99//3103573#>32#"&'7326=4&#"##>•/>T3a[3%2#•>±?W]W "=U4þêg_y&&÷H<þTÿÿF»&óz@ PO++4#ÿôì"h@A¯ $$$/$S/{#WP/?¿Ï ?  W?3í]2?39/]Í]í2ö^]í2]Æ22/39/]104>32.#"3#3267#".#(Hd='T-!=&3GÇÈ%.#N3U37>=!>32#"&'2654.#"2 %9Q638 ‹-+P>%  7,| %BIL#<Å)B..C+ „þÔ#xFÿõA)\@5+{Q@0À'Q@0ÀQz*U0#W? W ?3í??9/]3í3/]í?öí2Ü]2í2Ü]ýæ10>32#"&'5##33532654.#" -+P>% 3:>7#"#".%4'326-QF '.H0+01<_#+2 5&$D_;:_D&mp328337ôN{$A-!8)t 09E+>cE%#B`HaAX5EHHÿ÷¾â'X@6) ))yD@o%%% ÀD   (H `p€ H  H ?í?Ý2ý2Þ]íÖÝ]2ýÍ33Ü]]ýæ]10%#"&'#53533#6232*232>54&¾-SwI*k7££œ¾¾  £¤þ¯ 6)[ã:X< {PP{HtÏ (=, ÿõO )\@40++{Q@@pÀ'Q*&#  W ?U?3?3í]2?3í9/^]3Í2ÖÝ2ýÍ33Ü]ýæ]103573#>32#"&'#2654.#" z•ÀÀ-+P>% 3227.#">32"3267#".ä5\IG~^68_}EG~^6é% ]KL^ 3 2,*³)ZHGZ& 2,*[Y‡[..[‡YY‡\..\‡4N]_QQ GRQG -ÿò2#5a@=&S?{70777.S  /  {6$1.&1¯1ß1ï111+WW ?í?í99//]9ÍÍö^]í2]]ö]í210#".54>32"3267#".727.#">322$D_;?aB!'E_8?`A"þ´;1-:! "‚(-9  ">gI(,Le9>fH(-LdH :H=6 &,"94  +¿Ÿ@_6$ L Ÿ4 9+ L  @ HJ$ „   ???99//]??3í2Ö+Í]‡+‡}Ä^]]]Ý]]]ÆÁ‡+‡}Ä]]]3/310!#.'3>32.#"²–#@BF'©,,,…&<.(D#< J˜¦½pL„zu=w2+h  _»@`pÐàð¸ÿÀ@hH”¤Ô"2 Y ß +;›«Û-= Y Wð    ???99//]??3í2Ö=͇+‡}Ä^]]]qqÉ/qÆÁ‡+‡}Ä]]]+q3310!#&'37>32.#"Q|1m-ž  O "/!7 f™&\^X"í, mPÿCœ)s@D%$ D   /  + + +Dx*dt k{%$!?ÞÝÎ223?3]?ÍÄ2?3]öí2]Ô]Í2/3í29/]3/Î21033>733'>7#".'73267P›$RSP!nBEe! eXœC³ ;0g%%f/<µþg6um`!ýÏP«F@#9!Ægèwò%5"& ("5$2ÿZl!3@[)!9!! Q{5+5;5[5k5›5«5»5Û5D55+55/.(''`'''$Qz4!/''.(+"  ?ÍÄ?3?ÞÝÎ223?3öí2]3/]qÝÞÍ_^]]]]qÔ]Í23í2]103'>7#4>5#3>7'".'73267Z!/\ V:5/ƒ•54.+ct3MyS,§›*k6PP•>8+,@(. tnG6V>sq önAAþ $&¾ ÿõ"){@KS?{+++*&Q*&`##  € 0 €   W /Ÿ/^]?3í99//]]3Í]23Í]2Ö2í229/]ö]í9/103533#>32#"&'#2654.#" >•-+P>% )/%$ (ç;;]A)B..C+ zþÞ#xPk½&p@<  "D@ H{((Dx'H  J?í?9/993333í23þýÀ^]þ+í993}‡ÄÄ3‡ÄÄ102'+#>"3:7'7654.*›¦?66hC)Bœ;:7+ 4 0g<'8½m|H`[9qè«…ÒS:h1& FÿG9(v@=$#%%$%%'&&& S?{*0** Qz)%&& W  #W  ?33í2??í9933öí2^]]ö]í993}‡ÄÄ39‡ÄÄÄ10'#"&'#>324&#";'769/-6^<  @•7=>AfF%˜>=, 79]5Mv#]4i Ƶ 'GfCESþé c5\#P)9 @D DxH??ÎíöíÖí103#!53!ìœC–þõ„þøF»Š @Q QzU ??íÎöíÖí10##353»à•ö”þl|<fµ C¹ ÿÀ@$ H 0P`D x H H ??í9/3í2öÎ3ý2Ì]Æ+103###53!!)¨¨œQQÙþÓnþÛ%n"„2ù C@(P`p 0@Q z  U  ??í9/3Í]2öÎ3ý2Ì]Æ]10#3##5#535!ùà……•RRu”]¶¶]ûPÿGwµ&G@(%%!F/?y((!D"x'J &H#"J /í??í9/íöí2^]ö]í9/9/10632#"&'732>54.#"#!!ì32CmM)'IkD );&0C( œÑþ˯)NqHGuT.w5I*4D)þ̵„FÿF&F@(#S ?  {((#Q$z'WU%$ W?í??í9/íöí2]ö^]í9/9/10#>32#"'732654.#"##!Ôù+4X>##?V4  62"0 •Ž”Y@aCB^<pG=+8"Ê ÿRêµ3@Œw&+&&L!!!L,!}!!!¯¿5$Dÿ"p"°"",++,D-..3 -.3.3L  L  - 43-,$!H&  ????????íÆ?9/3/??ÖÆÄ9/‡+Á‡}ć+Á‡}Ä3ÄÄí299}ÄÄÔ]]íÆÆ]3/]]9/‡+}ć+}Ä]103>7.'33>733#5#.'# BEI%*HA> ¼534˜744»$?@C(4[*u–566:#˜$:563f_S!+RPQ+*FB@$þê%CBE'/RNN+0p>þî/PJG&þÊ6*HHM/ ÿoU$÷@„0@°Y Y¿&Q@p  Q !!$  !$!$Y  Y %$   U   ????????íÄ??9/3/?ÖÆÄ9/‡+Á‡}ć+Á‡}Ä3ÄÄí299}ÄÄÔ]íÆÆ]]9/‡+}Ä3/‡+}Ä]103>7.'353>733#5#&'#5 2j54&#"'>32#"&'732676&/>7.'732654.+Ži/#617R%2(qH8`F')*)rj  L>,%  @u&.)26BQ-=$^§ ""{1K2&K *5!`d ,02W    z &/$ÿ#ÌGƒ@M &-*?&O&&&<&<0 6SAS/{II/I0H =/32#"&'732676&/>7.'73254.+532654&#"-#\6)N=%$!,*,;" L>,%  .Y W7Zuv$!,,Ný #9+'7>0$6&,02W   t2 jPÿG͵ˆ@F LLD/  D x   H?Æí???9/???öí299}ÄÄÖ^]í3/3/9/‡+}ć+}Ä105#.'#3>7337N9CH$œœ={5¹GO9n5„¹¹"OOIþÛµþú@‹;TœO0zHþÃFÿoJc@5Q   Qz  U ???íÆ??9/99öí2]Æ2/Í3/9/]]í2/]10>733#5#.'#3Û1.*µ;BC$R&a5.23••V21.>CBV0þõ‘;92ÓPµ q@?t  "Dx! yxuvvy??????9/]Í]3]Ý]Í]3]9=/öý2Þ2Í2ÖÅÖÅ9/]10>73#.'#5##335}200¹!==D(Q;¹18;a0œœ07Ž"??D(1QKI)G¸w"TSK“þεþí•F  R@)"S SQz!    ????9/3ÅÕ2Å9=/öý2Þ2Ý2íÎ2/í2/Æ10>73#.'#5##335P+J"±7;8A<3«&+.M(••(·o3a2A?:HMM!<>;pvêÏx ºâ µ@c‹ L „L    " D x!    ????99//3Í2Ì2/??öÎ3ýÌ3/399}ÄÄÄÖÆ9/^]]‡+}Ä]]]‡+}Ä]]]10!.'##53533#>73ó9CH$œQQœVV!HGA¹'JMT1S›G"IGCþï.dPPd“ HJH 1WQP*EªsT;š@PY  Y     Qz     U?3í2?Î2?????9/ö2ÎýÌ3399}ÄÄÄ^]Ö]Æ9/‡+}Ä]]‡+}Ä103533#>73#.'##F•KK2i+±>{=D@6«-46•F--I1r6M6BEG!742Ìŵ„@Ct L  {L   D   H?í???????9/Öí299}ÄÄ9ÖÆ9/‡+}Ä]‡+}Ä]10!>73#.'##I={5¹GOS›G¹9CH$œ­µþú@‹;TœOE¾s"OOIþÛ1‡v@;Y  Y  Q     U?í???????9/Ö9í299}ÄÄÖÆ9=/‡+}ć+}Ä10!>73#.'##/,(±8<8A<3«*03•}Å550@@=HMM!=<8à PÿGµ^@<D_@ HD0€Ðàð D xH/   H??íÆ??9/]íöí2^]]Öí2/+]qí21033#5#!#3!òœ…–‹þúœœµýÏþù&þÚµþ÷Fÿog`@=Q[«@ HQdt„+ Q z U/ U ?íÆ??9/]í?öí2_^]]Ö]í2/+]í210%3#5#5##3353 \r›••›•zþõ‘ÐÐÄÄP;µ A@%D D x H  H?í???9/íöí2]Æ]9/í210!##!#3!òI­œþúœœµ„ýÏ&þÚµþ÷Fƒ C@' QO¿ QzU U/  ???9/]í?íöí2]Æ9/í210##5##335!ƒx•›••›  þ`ÐÐÄÄPÿG(µ)]@6#D$$$$'F/  y++ +'F(x*"J#&H)(#J/3í2???í9/3í2öí]ö]í9/^]í2/9/10>32#"&'732>54.#"#!#Š=CmM)'IkD );&0C(*œþþœµþø)NqHGuT.w5I*4D)þÎ1ýϵFÿFF(N@-QS/{* **Qz)W#W U ???í9/í?íöí]]ö]í9/í29/10!###!>32#"'732654.#"# •›•Å+4X>##?V4  62"0 ’þnÓ@aCB^<pG=+8"2ÿGýÅ3Cs@4(32.#".54>32.'.4&#">2(Z‘i%P %:?U3*# =[;6O46T;#d@†§.]}K 6%*7! \C‚f>| $A\8#>2% 1>54&#";'B.,;$,0\YSO'=+I7;XB0}~ Cf…"(  o -97*_4•3d(Ÿ   ëiÞâièŽ,]ZT$$TZ],µ€@G  $LDL@ H   ???9/3Í2???Ö+Ň+Á‡}ÄýÕÆ‡+}Ä^]3/Î3/Î10>733##5#53.'3N*L ¬6t@w„œƒt?t6µ J˜GŽHjÈen°°ndÉjHŽ ÿG{@@Y   YQ o    ?????Í]2???ÖÔÎýÎÔÆÄ}‡Ä+Á‡}ÄÄ}‡Ä+}Ä103##5#53.'3>7$Q-Xs•w]-U#Ÿ   |Ñ^]¹¹]^Ð},]ZT$$TZ], ÿG¸µé@•  0    ÄV ËYL   ÄV ËY L@ H @ H   ?Í??????Ö+Æ+Ô‡+‡}Ä^]]]]]]‡Ä‡ÄÄƇ+‡}Ä]]]]]]]‡ÄćÄ]Õ]Í]10]!.'#>73733#5ÞE-++& ²,uHß½‡„²Ü0Lk–:w>@HBQ²cOÙÙþ¯>p2þù ÿo7h@ñ ,+   / . %?0    +    &ÉÆ     YÉÆ Y4;k{‹!t!!+!;!!@ H    ???ÍÎ????Ö+Æ^]_]]]Ô]Ö]‡+‡}Ä]]]]]]‡+‡}Ä]]]]]]‡ÄćÄÄÄÄ_]]‡ÄÄ]‡ÄÄÄ]|Õ]Í]10]q]q]]]]]]q]]]]]q733#5#.'#>7.'3fœ³8b:  š )25-Y,£pžý'L$þõ‘,10-/-DII ??ÿGµH@,_oDD/   D H H/?í2?í2?ÖÜýÍ]Ô]íÖíÆ]10%3#5!#5!#!3x–ýг³œ„þù0……þT1 ÿj¥>@#QQ   Q U  U ?Îí2/?í2?ÖÞýÝ^]ÞýÝýÆ10%3#5!#5!#33LYþMigi¯•zþð–“{{þç”2ÿG¶µM@0 D D   x@p€°Ð/DJ  H ??íÍ9/í?Þí^]]ö]Õíí210326733#5#5#".=3Î%47œT–Z"@?gH'œé)3 IýÏþùè;cLÔÿoCQ·+; Q ¸ÿÀ@'H Q+ ;  zQW  ??ÍÎ9/í?Þí_^]ô]í2Õ+í10]3267533#5#5#".=³1, &•`v/ 3S; ª&éþlþõ‘­+I6«2Xµj¹ÿÀ@> HzD?_oßï p ï D@€H@ € ??9/Í3ýÍ3?ÞýÞ]]]2Ý]2Þ]q2ýæ+10>73#5#5.=35 œœ"aH\4œ!/ÙtIýKçvv(BZ7ÔÔ3; pd¹ÿÀ@  HzQ ¸ÿÀ@%HQ@€U@  €  ????9/33Í^]ý22Í?ÞýÞ+2Ý2Þ2ýæ+10>753#5#5.=35?  ••  M3O6•#vUéýò­US-F3«ªTP€µL@/D@ HðÏ  D xH      ?????9/3í2?öí2]]]Ö+í10%4.#"#3>32#ä !7+9œœ;Xq@œÔ /þ·µç$C_;ÔÿÿF K ÿñ>Ä1:N@) 2D1.y<:F$!;$2H/5J) J  ?3í2?í9/]3ý2Ì2Ö2Ý2Ü2í2ö2í3/31032>7#".'.5467>32'.#"l1H15/% ( ,EpP,›J@&7%*1D* z 2WwF';)-#DgD",W‚V ) €GO)6 ÿò—)4a@7*S {6À66O64S 'W'&4 /? ?//W?í]?39/]3Í2Ì2í2Ö2Ý2Ü2í2]]ö2í3/310>32!3267#".'.5467.#" 1BO)p‚þ®L@)O (18BdE&UKqˆ #$ ‰ 4N4‰…  .6 y $AX4 LP R$% ÿG>Ä4=\@01 5D41y?=F'!$ >! '5H/8J, J  ?3Í3í2?í9/]3ý2Ì2Ö2Ý2Ü2í2ö2í3/39/Í1032>7#5.'.5467>32'.#"l1H15/% ( %1="–=Y< -F2v, 8Sj>EpP,›J@&7%*1D* z ¬¶:Rf:';)-#DgD",W‚V ) €GO)6 ÿj—(3y@E(&''"##)S{5À55O53S 4"W& 3/?(((#& ?..W?í]?33Í]9/]3Í2Ì2í2Ö2Ý2Ü2í2]]ö2í3/39/3Í210.'.5467>32!3267#.#"r_aUKq 1BO)p‚þ®L@)OJ+• #$ ~X LP  4N4‰…  .6 y ‹Ò$%ÿÿPìµ,ÿÿ Í™&Ö4™¹ÿÿ@ 5=!P 0O++4ÿÿ G&öñ¹ÿÿ@ (0P#O++4PÿGµ&N@) D""y(Dx'/2Í2????9/3Í2??/öí2æ29/3í210"&'732>54.#"#33f ':'!7J(œœè¹8B4X@$%Hk¹w0?!1D*þåµþæB˜F 1Id>?kP-FÿF"([@6 S ?{***?*O*_*Qz) %% ???9/Í2????3Í2öí2^]æ]29/3í2103#3>73#"'732654.#"Û••./+ ¡.32O`#?V4  62$1  Ó;>79=<vpB^<pG=(8# ÿC+µP@1DP/D@ HHHH ?í?í?íÌ2Ö+Öí^]]]Ö2Ýí3310'>7>5!3'>7#u +KpQHNÙnBEe! g1C‡~oS2ˆ9;IèŽýÏP«F@#9!1 ÿZ"n@H "Q$ $k$Û$›$T$t$?$$+$$Q @ H #U! U U ?í?í?íÌ2Ö+Þ]]í^]_]]]]]qÖ2Ýí3310'>7>=!3'>7#2 %9Q638 ‹a!/\ \”AA> 7,| %BIL#<þl*QKA:0”PÿE޵K@- D@ Hx pDxH/ H?/3í2?9/]í?öí2]ö+ý2Ì2103#"&'73265!#3!òœ\g1þúœœµý\hdy*(þÚµþ÷FÿGY@7Q @ H z0€ÐQz0 U/  ???9/]í?3Í]2öí2^]]ö+í2Ì210%##3353#"&'73265}¢••¢•a[3ÐÐÄÄýÿf`y&&PÿCÿµX@4 DÐ0€°ÀDxH/   ??ÍÄ29/]í??öí2^]]_]Ö2Ýí2331033'>7#!#3!òœoBEe! hþúœœµýÏP«F@#9!&þÚµþ÷FÿZ__@: S «Dd„”+SzU/       ?ÍÌ????9/]íöí2_^]]]]Ö2Õ23í210%3'>7#5##3353 S!/\ N›••›•z*QKA:0ÐÐÄÄ(ÿGXµC@'D  D @ H xDJ H  ??Îí9/í?Þí^]ö+í22/í1032673##35#".=3Ä%47œ–y"@?gH'œé)3 IýK¹‚;cLÔ-ÿoòX@9Q  /  Q @ H z_Q/W  ??ÌÍ^]9/í?Ö]í]ö+í22/]í10326753##35#".=Â1, &•xb/ 3S; “&Òýò‘O+I6”<ÿC¯µ0l@'*D+ D2¸ÿÀ@( H2 Ÿ"!0+10+!! *H  ''?23???íÌ2?9/Å??ÞÍÜ22Ü]ÍÌ+Í233í22í2210>733'>7#.'#.'#>7/3223/Ž oBEe! ] ,+(m(+, ˜  µ!aqv44vqa!8‡’—IP«F@#9!eîy*ff]!!]ff*yîeRº¹«E2ÿZ(”@Y #Q""* *0**+;    Q$ 4    )@# „ ((( &&  ??3/2/9/^]Í]??ÍÌ2Ö]2]]í2]]ÔÔ2]]Ä]Í233í2]]10#>73>733'>7#.'#Б |+H(*P ~ b!/\ Vng/#RSK7Šˆ6F–Z`£3)bjl3*QKA:0NšHòFÛµ@ zQz /?öýæ103#F••µýKÿÿ Ç™&$­™¹ÿû@ $,P O++4ÿÿ#ÿõè&D_@ 7?P2O++4ÿÿ Ç’&$ƒV ±¸ÿù@ !3P +O O+++44ÿÿ#ÿõèò&Dƒþ@4FP>O2O+++44ÿÿ ¿µ¡ÿÿ#ÿò=ÁÿÿP;™&(‰™¹ÿú@  P O++4ÿÿ-ÿò&Hz@  -5P(O++4ÿÿ2ÿò¨Åõÿÿ-ÿòBÿÿ2ÿò¨’&õƒQ ±¸ÿð@ /AP8O,O+++44ÿÿ-ÿòò&Bƒ±¸ÿü@ *<P4O(O+++44ÿÿ Í’&Öƒà @2D!P 32%"!.267!ä5\IG~^68_}EG~^6þ§K] h ]KK\ þ™ ][Y‡[..[‡YY‡\..\‡ˆ]NN]þ?ZNNZ-ÿò2#X@:S?{%0%%%S {$0@?Ooÿ?WU ?í?í]9/]qÍqþí2^]]ö]í210#".54>32267#"3.2$D_;?aB!'E_8?`A"þþ-9Ý 9--: Þ&>gI(,Le9>fH(-LdÕ;63>:96(ÿÿ2ÿòä’&…ƒƒ @$6 P.O"O+++44ÿÿ-ÿò2ò&†ƒ±¸ÿù@ &8 P0O$O+++44ÿÿ(ÿòw’&íƒ* ±¸ÿæ@ %7P/O#O+++44ÿÿÿôæò& ƒë±¸ÿõ@ %7P/O#O+++44ÿÿÿò‚n&㊖™@ "#P$O++4ÿÿÿGÕ&\Š[@ !" P#O++4ÿÿÿò‚’&ãƒJ @ $6P.O"O+++44ÿÿÿGò&\ƒ@#5 P-O!O+++44ÿÿÿò‚Á&ãe~¢@&$&P'O#O+++44ÿÿÿG&\e;@#% P&O"O+++44ÿÿ(X’&çƒ6 @, P $O O+++44ÿÿ-òò&ƒ@* P"OO+++44PÿG)µ 3@ 0 DDx HH?íÍ?íþí2/^]í]Æ103#!!3#ÓƒÙþÃ}–µ„þSþÃFÿo» 8´ Q¸ÿÀ@ HQy UU ?íÍ?íö^]í2/+íÆ10#3#5#!»àbxu”þæþõ‘ÿÿPÿ÷OŽ&ëƒËœ@&8P 0O $O+++44ÿÿFÿõòò& ƒ–@);$P2O&O+++44PMÄ#/3}@N D/x@0***€ 0@1$€55@ HDx420-' {t  ?2]????3]????ÍÜÍÞÍþí2+ÖÍÄÜ^]Í]Äþ]í210!.'#33#".54>324&#"326!! CQš!LNK ›½4H**H44H**H4y'$#&&#$'ôTþ¬xÝgþDµ!]ir6ýK+F22F++G11G+&..&%..ì{ÿÿíèitÿò!Å3l@>#$D55/5 D*3,4# '3` 2_2o22o,,- $' ?   ?]3Í]2?39/3Í]2Ü]]2Í]2Í2ÖÀÞíÄ2]ÖÀÜíÄ210654&#"'>323#3!3267#"&=#53>7#5X1.,:-]@ku6tCòþ®1:;K,fSw(W=Ëå  "voad&d ,w%l`d&d ,µ˜@a              °     D @ H    H?ý2À?93333?Ö+ÜýÜÆ3Ì223Î]223310#77#5'75'75#5,ÂQ)zQ+|œI+tK)tµ{a&W9N&[:²i"[6N#W6ª{µ -@ D @ H H H??ýÞí2Ö+ÀÖýÖÀÆ10###5%!5°œ®úþô{þ‡y{Á{{½)Q@-%F+++!D*"H°0H H ?3í2?Þ2ý]2Þ]2í2Ö2ÞÀÀýÀÀ^]ÖÄí1075#53>32+3##5#5"32654.`II',,?gK) ßß’I  J>#ÔMu0N8keMu__uh£*- Vc@   /ÝÌ223ÖÝÞÍ10".'73267¶ ;0g%%f/<V%5"& ("5$ÿÿ ǵ$ÿÿPÿ÷s½%ÿÿP)µÓÿÿ «µ›ÿÿP;µ(ÿÿ#Dµ=ÿÿP޵+2ÿòäÅ'+J@.) F@ Hy- --(Fy,@((**¯***J#J ?í?í9/]qÍ]þýÎ]]þ+ýÎ1032>54.#"#".54>323#Ó/D,+E//E+,D/5\IG~^68_}EG~^6þ8ßß[3R; ;R33S; !;S2Y‡[..[‡YY‡\..\‡|ÿÿPìµ,ÿÿP¢µ. ȵ­@c  +; L  $4  L  @ H ?2???Ö+Õ]ÕÆÁ‡+‡}Ä^]]]‡ÄÄÄćÄÄÄÄÁ‡+‡}Ä]]]‡ÄÄÄćÄÄÄÄ10#.'#>7´)OH=¬/1//0/¦=HP)µW½·¨B<‹Š~..~Š‹÷662ýþÒ*Z&5:6Iýô0r^B?;eƒ3n39?<ƒl9}ÿÿRµ7ÿÿµ<.8â $/t@1 /% 1011yF$  D *Fy0% H0@¸ÿÀ@H /H$   ?Ý]2í2?/+]3Ý2í2ö^]íÔýÀ}ÄÄÄÄÔíæ]À}ÄÄÄÄ10%>54.'#5.54>753ÿ(;''<(˜PvM&&MvP˜PvM&&MvP˜(<'';(Ô*77+ýîR2Oc54dQ6NN6Qd45cO2À+77*ÿÿ ™µ;A µ;¹ÿÀ@ HDD D  H?Ý2í2???ÞýÞ2ý2ÞýÆ+10!#5.=33>=3ð“IkF"—BA—AB—"FkI¥,Kg>ðÞZT’þnTZÞð>gK,(çÅ%6@'F F!&H H J?í?í2?í2ÞÖ2ýÖÖÖý2ÖÆ1023!5>54&#"!53&54>ˆH{Z3hwþÑ.#^QQ^".þÑwg3Z{Å+T{Okt5?L-affa-L?5tlO{T+-ÿõ[&S@5QÏß(`(€((°(à(((/($Q {'!WW ?33í22?3í2þí^]]Ö2Þ]í2210"&'#"&54>32%267&=.#"G7JM6py%Fd?7s)þÐ* 9?7 "‘=eI( þÊ "(ÁSEHIFÿFR/G@' 11{S S*#Qz0#W$$ -WW ?í??í9/3/íöý2ÞÜí2Ô]ýæ]10#"'#4>3232654&+532>54&#" (/L=&D_8?7•73Ä*16ž  #š$uC ¹f¹®¦T!Ybc+"[cb(›þýu5\#-ÿò2*5V@K-+S!{777Q¸ÿÀ@ H0S{6- 3W&  ?3Í2?í9þíÔ+í^]öÄ29í99]107467.54>32.#"#".%4'326-QF '2L32*' @/!+2 5&$D_;:_D&mp328337ôN{$A-!9, q 09E+>cE%#B`HaAX5EHH%ÿòê2f@=Ï 44 S.S({30@PUŸ`p++U # ?  U?2í]2?3í29/3/]]í]þíÔí^]Ö2Æ]22/102.#";#"3267#".5467.54>"3/% "J&3  eg.26\ qQ&SE.$)#>W o  m p  %A4#A4!(=)<ÿAù(Z@/ "& &"Y  "&S**S{)U&?3?99í2þ2Äí^]Õ2Äí299Á‡+Á‡}Ä10'>54.'.54>7#5!ù ~&/J31IR!Ó‘ ^W> -"2D)))J#+'  #6K5?tfV!|nThyA%  )3FÿG 8@" Q@ HzQz W?3í2??þí^]qþ+í10>32#4&#"#F&xBCY4•&4$•ü #@X6þÐH<þj0ÿò7 C@(S?{0S{U¯W  W ?í?í9/]íþí2^]]ö]í210#"&54632267#"3.7Šyy‹‹yyŠþý65Ü7667Ü5~ÈÄÄÈÇÃÃþ-maamkaakDÿõ! %@Ï   Qz  U ?í?öýÞ^]Æ]10".5332    ™-i3   4#"9/(.+'" 'be^$$^eb'› d/ x  5&1quvm`%ÿÿFÿZ ÿÿ Y1ÿAô:{@C%$9 9 Y99 0/?<<+S @6S{;/U00(W! ?3?í9/3/í99þíÔ]2^]í]Ö]Ä99Á‡+Á‡}ÄÄ210%'>54&'.54>7.54>32.#";#"D1D) ~(;2L4$03*"?Y66V 8 ;0D3b\62#.ƒ!(4!*I#+'# #2E/%:.! T4,I3u 5&1)|+%$ÿÿ-ÿò2RF 4@ Q@ Hz 0   Qz  U?í??öí^]]ö+í10### •›•ýò’þnFÿG7!7@ S{#`#€##Qz"W W ?2í2??íþí2^]]öí10"&'#4>32'32654&#"I$6•!>Y8€ >X¦*5=04#  ÈÞ7[@#“€=dH(‘ CQMF.!-ÿAÓ)Z@-"%S ((Y((!+S{*"!W ?3í2?399þíÆ299Á‡+Á‡}Ä3/3í2107.54>32.#"'>54.ã)C0%Fd@*G!!1BA '0A' ~$ $;T<;eI*w LC-! )3 )J#+' -ÿòm!>@%S{#@###/#Q {"UW ?í?í2/þí^]]þ]Î3í210%#".54>3!#4&'#"326.$B^::_D&)Kj@"x –;K8335ñ8]D&'Ge>@dD#|"X1PCLELN ÿôÅ:¹ÿÀ@ H Q @ H  U W ?3í2?ýÀÖ+ÝýÍ2/3Î+10%#".=#5!#3267´4"9F(‡»Ÿ% :S3¾||Ê/'Aÿò2@ Q/zQz W ?í??öí^]ö]í10"&5332653)tt•#00"•st}+þæE==EþÕ}t-ÿGé$P@00&&{S@PÀ Q@!P  ÀS/{% !U "U?í2?í2?ö^]íÜ]2ý2Ü]íæ]102#5.54>4&'>%‹T‚Z.$FhD‘DgF$.Z‚?AA?þp?@@?)Je<5]G0°°0G]5>L & Kÿÿ  [AÿGíF¹ÿÀ@$ HzQ@À Q@ÀQz U ???3í2??þíÜ2ý2Üíæ+10>=3#5.=3ß<þfUHøÿ6_K1¯¯2J_6ÿøHUš0ÿö,N@)+, S@ ..{ À,Q@+À!$S {- !!, 'W ?33í2?3Ì33þ2í2ÜýÜ2æ]í2910%32654&'7#"&'#".5467326=3ï-*#%-z86 :O02''2>dHL—=*=u=ELI=¬ÿÿÇÍ&$ä ¹þö´!P+4ÿÿÿýÈÍ'(ä”ÿÿÿýÍ'+ä”ÿÿÿýyÍ',ä”ÿÿÿä]™&,ƒÿ•§@POO+++44ÿÿÿýÿòGÍ&2cä”ÿÿÿýXÍ'<Èä”ÿÿ™&<ƒ8§±¸ÿù@ % POO+++44ÿÿÿý?Í&µXä”ÿÿ-ÿõ[3&¶ãn@ )'P (O++4ÿÿ%ÿòê3&ºãE@ +42' P3O++4ÿÿFÿG 3&¼ãZ@ PO++4ÿÿDÿõ"3&¾ãÆ@   P O++4ÿÿÿÚÿõSò&¾ƒ‹±¸ÿä@   PO O+++44ÿÿÿ½ÿõ—1&¾åÿv!²¸ÿø@ P%OOO++++444ÿÿ-ÿò23&RãW@ " P!O++4ÿÿAÿòò&ʃ@&POO+++44ÿÿAÿò3&Êãa@ &PO++4ÿÿAÿò!1&Êå@ P+O OO++++444ÿÿ0ÿö3&ÎãÉ@ /- P .O++4F\3´/ÍÞÍ10'7\‘Lë¥8µiÔÍ´/ÍÞÍ10'7Oa6«×àG=!1 :@! Ÿ¯ÿ €/3Ö]2Å2Í2ÞÝÖÝ]qÔÍ10#"&54632#"&54632''7Û,++,F,,,,ŠmEW¥"''"#''#"''"#''=È!Óÿÿ-ÿõ[?&¶–Œ¹ÿý@ '2P 6O++4ÿÿ-ÿõ[?&¶ÎŒ¹ÿú@ )6P 'O++4ÿÿ-ÿõ[?&¶£@ +(P :O )O+++44ÿÿ-ÿõ[?&¶° ±¸ÿè@ -(P +O )O+++44ÿÿ-ÿõ[?&¶¤<@+'P :O (O+++44ÿÿ-ÿõ[?&¶±@-'P +O (O+++44ÿÿ-ÿõ[š&¶¥‚±¸ÿü@ 2<P NO 'O+++44ÿÿ-ÿõ[š&¶²j±¸ÿä@ 2<P =O 'O+++44ÿÿäË&$–±Œÿÿ äË&$αŒÿÿÿþÀË'$ù£“Œÿÿÿÿ¢Ë'$Û°ŒÿÿÿùpË'$©¤Œÿÿ ŽË'$DZŒÿÿÿø(&&$a¥×Œÿÿÿø(&&$a²×Œÿÿ%ÿòê?&º–d@ 2=' PAO++4ÿÿ%ÿòê?&ºÎ^@ 4A' P2O++4ÿÿ%ÿòú?&º£ï@"63' PEO4O+++44ÿÿ%ÿòê?&º°ç@83' P6O4O+++44ÿÿ%ÿòê?&º¤ @62' PEO3O+++44ÿÿ%ÿòê?&º±ì@82' P6O3O+++44ÿÿÜË'(¡–§ŒÿÿÈË'(ΧŒÿÿÀË'(…£Œÿÿ¡Ë'(f°¦Œÿÿ™Ë'(^¤§Œÿÿ«Ë'(p±—ŒÿÿFÿG ?&¼–n¹ÿú@ P#O++4ÿÿFÿG ?&¼Îx@ #PO++4ÿÿFÿG ?&¼£ê±¸ÿü@ P'OO+++44ÿÿFÿG ?&¼°ð±¸ÿé@ POO+++44ÿÿFÿG ?&¼¤@P'OO+++44ÿÿFÿG ?&¼±ù@POO+++44ÿÿFÿG š&¼¥n@)P;OO+++44ÿÿFÿG š&¼²j±¸ÿÿ@ )P*OO+++44ÿÿ/Ë'+¡–§ŒÿÿË'+ΧŒÿÿË'+…£ŒÿÿôË'+f°¦ŒÿÿìË'+^¤§ŒÿÿþË'+p±—Œÿÿÿø“&'+¥×Œÿÿÿø‘&'+²×Œÿÿ7ÿõ!?&¾–Ú¹ÿÝ@  PO++4ÿÿDÿõ!?&¾Îî¹ÿî@  P O++4ÿÿÿ¿ÿõ_?&¾£ÿT±¸ÿÝ@   POO+++44ÿÿÿËÿõJ?&¾°ÿi±¸ÿØ@   POO+++44ÿÿÿáÿõb?&¾¤…±¸ÿï@   PO O+++44ÿÿÿØÿõf?&¾±ÿl±¸ÿí@   PO O+++44ÿÿÿùÿõ3š&¾¥Ø±¸ÿä@ ! P3O O+++44ÿÿÿùÿõ3š&¾²Ø±¸ÿä@ ! P"O O+++44ÿÿ‰Ë',–§Œÿÿ‹Ë',ŸΧŒÿÿqË',…£ŒÿÿRË',f°¦ŒÿÿJË',^¤§Œÿÿ\Ë',p±—Œÿÿÿøñ&',¥×Œÿÿÿøï&',²×Œÿÿ-ÿò2?&R–‚@  + P/O++4ÿÿ-ÿò2?&RÎ|¹ÿÿ@ "/ P O++4ÿÿ-ÿò2?&R£û@$! P3O"O+++44ÿÿ-ÿò2?&R°±¸ÿô@ &! P$O"O+++44ÿÿ-ÿò2?&R¤1@$ P3O!O+++44ÿÿ-ÿò2?&R± @ & P$O!O+++44ÿÿÿòQË&2m–§ŒÿÿÿòoË'2‹ΧŒÿÿÿòUË'2q£Œÿÿ ÿò7Ë'2S°§ŒÿÿÿòË'20¤§Œÿÿÿò<Ë'2X±§ŒÿÿAÿò?&Ê–x@ P!O++4ÿÿAÿò?&Ê΂@  !PO++4ÿÿAÿò?&Ê£ï@P%OO+++44ÿÿAÿò?&ʰ÷±¸ÿð@ POO+++44ÿÿAÿò?&ʤ@P%OO+++44ÿÿAÿò?&ʱ@(POO+++44ÿÿAÿòš&Ê¥x@ 'P9OO+++44ÿÿAÿòš&ʲj@'P(OO+++44ÿÿÿ÷/Ë'<ŸÎŒÿÿÿÿ÷Ë'<g°Œÿÿÿÿ)Ë'<™±“ŒÿÿÿîÍ&'<=²ÍŒÿÿ0ÿö?&Ζð@ -8 P ;P+444ÿÿ-ÿ$[?&¶'• ° ²¸ÿè´@;P+444ÿÿ-ÿ$[?&¶'• ¤<@ >:P+444ÿÿ-ÿ$[?&¶'• ±@ @:P+444ÿÿ-ÿ$[š&¶'¥‚• ²¸ÿü´2<P+444ÿÿ-ÿ$[š&¶&²j• ²¸ÿä´2<P+444ÿÿ ÿõñË'¾Ð&$–¯Œÿÿ ÿõË'¾ï&$αŒÿÿÿþÿõïË'¾Î'$ù£“ŒÿÿÿÿÿõÎË'¾­&°Œ$ÛÿÿÿùÿõœË'¾{&¤Œ$©ÿÿ ÿõºË'¾™'$DZŒÿÿÿøÿõV&&$a&¥×Œ¾5ÿÿÿøÿõV&&$a&²×Œ¾5ÿÿFÿ$ ?&¼&•–n±¸ÿ¾´!2P+44ÿÿFÿ$ ?&¼&•Îx±¸ÿÁ´!6P+44ÿÿFÿ$ ?&¼&•£ê²¸ÿû´!(P+444ÿÿFÿ$ ?&¼&•°ð²¸ÿé´-(P+444ÿÿFÿ$ ?&¼&•¤²¸ÿþ´!'P+444ÿÿFÿ$ ?&¼&•±ù²¸ÿú´!'P+444ÿÿFÿ$ š&¼&•¥n²¸ÿå´!<P+444ÿÿFÿ$ š&¼&•²d²¸ÿà´!<P+444ÿÿÿõ¡Ë'+¡&–§Œ¾€ÿÿÿõ Ë'+Ÿ&ΧŒ¾ÿÿÿõ‘Ë'+&£Œ¾pÿÿ ÿõrË'+q&°§Œ¾QÿÿÿõrË'+r&¤§Œ¾Qÿÿÿõ•Ë'+”&±§Œ¾tÿÿÿøÿõ&'+&¥×Œ¾äÿÿÿøÿõ&'+&²×Œ¾ãÿÿ0ÿ$?&Î'•–ð ·@2 P+44ÿÿ0ÿ$?&Î'•Îð ·B2 P+44ÿÿ0ÿ$?&Î'•£n@ DA P+444ÿÿ0ÿ$?&Î'•°o²¸ÿì´FA P+444ÿÿ0ÿ$?&Î'•¤ª@ !D@ P+444ÿÿ0ÿ$?&Î'•±‚@ F@ P+444ÿÿ0ÿ$š&Î'¥æ•²¸ÿÿ´8B P+444ÿÿ0ÿ$š&Î'²ì•@ 8B P+444ÿÿÿõžË&µm&–§Œ¾}ÿÿÿõÏË'µŸ&ΧŒ¾®ÿÿÿõ¬Ë'µ{&£Œ¾‹ÿÿ ÿõË'µ]&°§Œ¾nÿÿÿõUË'µ"&¤§Œ¾4ÿÿÿõŠË'µX&±§Œ¾iÿÿÿøÿõ&&¥×Œ'µÝ¾íÿÿÿøÿõ&&²×Œ'µÝ¾íÿÿ-ÿõ[ü&¶ah¹ÿñ@ +5P 'O++4ÿÿ-ÿõ[Õ&¶Šy¹ÿñ@ '(P )O++4ÿÿ-ÿ$[&¶'• Â¥±¸ÿð´=;P+44ÿÿ-ÿ$[&¶•  ¶4,P+4ÿÿ-ÿ$[&¶'• ͬ±¸ÿð´<:P+44ÿÿ-ÿõ[ü&¶—‚¹ÿû@ 5+P -O++4ÿÿ-ÿ$[ü&¶'• —‚±¸ÿû´H>P+44ÿÿ Ç£&$a›§@ #-P O++4ÿÿ Ç|&$Ь§@  P !O++4ÿÿÊ&$UCñ«ÿÿÊ&$=ø«ÿÿ ÿõóµ&$¾Òÿÿ]F ?–Kÿ$ ÿÌ· ÞÞÍÞÝÎ103#".54673Ä 3(vB T 2& ]F ?·  /3ÌÜÍÆ210>7.54632]%( ,J9q%#%'%-Z&V_ü@   /3ÖÅÞÝÞÍ102#.#"#54>½"<+e""e+;ü(;%**%;(]Rºš -P@1"Ÿ""#€- Ÿ  Ÿ.((-# Ÿ  /3Ý]2Þ2ÜÍ]Þ]Ý]ÞÝ]ÔÅ]ÔÅ]10#"&54632#"&54632'.#"#>32â(&&(Ø'(('_ M*88*”$$$$$$$$I*;'';*ÿÿFÿ$ &¼&•Â~±¸ÿÈ´!(P+44ÿÿFÿ$ &¼• ¹ÿŠ´!P+4ÿÿFÿ$ &¼&•Ín±¸ÿ½´!'P+44ÿÿFÿG ü&¼—e¹ÿù@ "PO++4ÿÿFÿ$ ü&¼&•—e±¸ÿâ´!+P+44ÿÿÊ'(ÈCì«ÿÿ  Ê'(Ïó«ÿÿVÊ'+ÈCì«ÿÿ ]Ê'+Ïó«ÿÿPÿõµ&+¾àkF ?&@  /3Æ2ÜÄ2ÔÆ2ÝÞ2Í210'>7.54632’yBŽÐ%& %G5=À0²Ž%#%'%.Y&\FÝ?$@  /3Æ2ÔÄ2ÜÆÝÞ2Í210'7>7.54632ÝŽByþÖ%& %G5ÿ²0ÀÌ%#%'%.Y&!D[š'>@#Ÿ¯"'€    ( '/ÕÔ2ÞÍ]Î2/Å]Æ2Í2/Å]10.#"#>32>7.54632 M*88*ê   &&ü*;'';*Ž   $ÿÿÿûÿõ?ü&¾aйÿë@  P O++4ÿÿÿüÿõ>Õ&¾Šá¹ÿë@  PO++4ÿÿÿ¤ÿõ~1&¾Àÿ]!²¸ÿß@ P&OOO++++444ÿÿÿ½ÿõ—1&¾åÿv!²¸ÿø@ P%OOO++++444ÿÿÿóÿõ7ü&¾—عÿã@  PO++4ÿÿÿêÿõGš&¾˜!²¸ÿæ@ P$OOO++++444ÿÿÿþB£&,aÿÓ§@ PO++4ÿÿÿÿA|&,Šÿä§@ PO++4ÿÿÍÊ',áCñ«ÿÿÝÊ',ñø«bFá?,@   /3/3Ä2/3ÞÝÞ2Í2Æ210'.54632hyBŽ35G% &%=À0²¹%[-%'%#%lFú?(@  /3/3Ä2/3ÖÝÖÞ2Í210'7.54632úŽBy»5G% &%ÿ²0À÷%[-%'%#%!D[š'B@%'!Ÿ¯!€    ( '/3ÝÔ2ÞÍ]Î2/Å]Í2/Å]Æ210.#"#>32.54632 M*88*u&&   ü*;'';*¸$   ÿÿAÿòü&Êa[@  PO++4ÿÿAÿòÕ&ÊŠl@ PO++4ÿÿ:ÿò1&ÊÀó!²¸ÿÿ@P,O OO++++444ÿÿAÿò1&Êåú@P+O OO++++444ÿÿFÿG7?&Æ–„¹ÿû@ "- P 1O++4ÿÿFÿG7?&ÆÎ¹ÿó@ $1 P "O++4ÿÿAÿòü&Ê—m@  PO++4ÿÿAÿòš&ʘ@P*O OO++++444ÿÿ£&<a}§@  PO++4ÿÿ|&<ŠŽ§@  PO++4ÿÿlÊ'<ÜCì«ÿÿ Ê'<ÿó«ÿÿ Ë'3©ΧŒG=!1 :@! Ÿ¯ÿ €/3Ö]2Í2Í2ÞÝÔÕ]qÖÅ10#"&54632#"&54632''Û,++,F,,,,öWEm¥"''"#''#"''"#''iÓ!ÈÿÿG=!1å C@ /3Å2Ö2Å210'LÆ3ÓƒOkÿÿ0ÿ$&Î'•Âö±¸ÿñ´C2 P+44ÿÿ0ÿ$&Ε ¶#:2 P+4ÿÿ0ÿ$&Î'•Í+ ·B@ P+44ÿÿ0ÿöü&Ηè@ ;1 P 3O++4ÿÿ0ÿ$ü&Î'•—è ·ND P+44ÿÿÿò¼Ê'2ØCñ«ÿÿÿò—Ê'2³ø«ÿÿÈÊ'µáCñ«ÿÿ™Ê'µ²ø«ÿÿ(ÿõ3Å&µ¾C ¶/3Å2ÖÅ10'7 Ó3Æ®kOƒZF ?· /Ä3ÖÕÆ210.54632Ý9J, (%F&Z-%'%#%ÿÿÿ$Ë&$;'• –±Œÿÿ ÿ$Ë&$;'• αŒÿÿÿþÿ$ÔË'$ '•Þ£“Œÿÿÿÿÿ$¶Ë'$ï'•À°Œÿÿÿùÿ$˜Ë'$Ñ'•¢¤Œÿÿ ÿ$£Ë'$Ü'•­±Œÿÿÿøÿ$(&&$a'•2¥×Œÿÿÿøÿ$(&&$a'•2²×Œÿÿÿ$/Ë'+¡'•†–§Œÿÿÿ$-Ë'+Ÿ'•„ΧŒÿÿÿ$Ë'+'•t£Œÿÿ ÿ$ÿË'+q'•V°§Œÿÿÿ$Ë'+r'•W¤§Œÿÿÿ$"Ë'+”'•y±§Œÿÿÿøÿ$“&'+'•ê¥×Œÿÿÿøÿ$‘&'+'•è²×Œÿÿÿ$TË&µm'•l–§Œÿÿÿ$†Ë'µŸ'•žΧŒÿÿÿ$vË'µ'•Ž£Œÿÿ ÿ$XË'µq'•p°§Œÿÿÿ$EË'µ^&¤§Œ•`ÿÿÿ${Ë'µ”&±§Œ•–ÿÿÿøÿ$Ä&'µÝ&¥×Œ•Ýÿÿÿøÿ$Ä&&²×Œ'•ÙµÝÿÿ ÿ$ǵ&$•Ñ ¶,$P+4ÿÿPÿ$޵&+•å ¶!P+4ÿÿ(ÿ$çÅ&µ•ÿ ¶#3+P+4-Sµ& @A$D (& '%@& @@P`ð0 @ / p € À Ð à À Ð  ¸ÿÀ@)H¿   @ p   @@P`ð?Í]qr2??9/]]+]qrrÝ]qrÅ9/3År2Î22Æ222/3í210.+5!#3##.'53267!5R!'«& NA 1CQ+::8´9;:i;^þç cc(c(8'>EH"#FB<e'c Y»+=Pco#".54>32"32654&7>'.'467'7.727&'"'.'&#"6"'327>76267'7676&'&»":O--N:"":N--O:"þ–  Á  šT"/)#    #)/  0-N:"":N--O:"":O  ƒ  `$ $%  $$ $j- /!  #©#  !/ -»  ÿÿÿóJ™'oþÔ'k'oaþÔ'sÌþÔ”7þÔI‡µ #'+/37ù@Š&6Ff†= &6Ff†= &f&fIYIY i i6f 6 f  9  9=š1ª1i1y1‰11@ H 11/€4;H/(((¸À³,/H(¸€@#(+Hš(ª(i(y(‰((@ H (($€4;H$$$¸À@!+/H $$ý$š$ª$i$y$‰$$@ H $$6¸ÿ€@ 4;H6652¸ÿ€@ H2'2722+¸þ@-1H1+ +++ñ++¸ÿ€@ H+'+7++'¸þ³-1H'¸þ@³(,H'¸ÿ€@ÿ H'''7''  "/ ;Ÿÿ^½íý[Lªºy  ; ? o =O ¿ ï  ­ í { L  ª Ú 9 i   /_ ;é¿í{LªÚ8 f†3`=P€ðáñ²SDµv¦ 0`=€°àAár¢DÔ@=¥f7  0 = À ! ñ ‚ T ä µ F   9æ¸ÿ€@ 4EH",585¸þ@91;Ha5@5P5!51555á5ñ5²5Â5Ò5“5£5‚5c5s5T5C5•55¸ÿ€@ H55'55"¸ÿ@Hµ"Å"Õ"¦""3Ý,,¸@@ &HK,[,<,,¸@Hª,º,Ê,,€H,@ H,¸·2EH11&4¸³0;H4¸À³,/H4¸€@-#+H|4Œ4k4\4K44€H4@ H4#+#;##ÀH#)+-¸þ€³$'H-¸þÀ³#H-¸ÿ³H-¸ÿ@³H-¸ÿ€@ H- -¸þ@ª2EH$& @P`€ ;Àà±`€ !Aá¢Âƒrc$D¥ÅÕå6Ff†'  <Ö€wáC¥ i™3/?<¯ïžO ¸`@ÿ*IL\l¬ì ˪º)i AØŸýîL\»ª  /O_o¯;¿Ïï®Oo.­ÍíLl| +Û늪ÊIi8) >ÙŽxíKª f  3  `=€ àAáñ¢ScDe¥µÅ@:' Aàð§PA²£`p¯ ?Ír2_]_q_qqrrrr^]2^]]]qqqqrr^]?Í^]]2^]]qqrrr^]2^]]]]]]qqqrrrr^]9/]3^]]]qqqrr^]3^]]]]qq+rrrr^]]Í^]]2^]]qqrrr^]]2^]]]qqqqqqrrrr^]]]?Í2+2^]+++++?Í2+q2++qqqq+++9/3+3++]+qq+qÍ2]]+2]+]qqqqqqqrrrrr+Þ2Ü2+Þ2Ü2rÎÍ22]]]]qqqrr^]2^]]]]qqqrr^]2^]]]qqqqr^]Í^]]2^]]qqqrrr^]]2^]]]qqqqrr^]2^]2^]]]qqqqrr^]]Í^]22]+++2]+qrrr+2]+Í]+2]+]]qr+r+2]+]]++r2+2]+]]10^]]]]]]]]]]]]^]^]^]^]335!5!35!3335!5!35!3jþ¯4þÌ4þ¯4þ¯›þ®5þË5þ®5þ®k*þÖþ´*þÖyýhk*þÖþÓ*þÖL*þÖþ´*þÖyýhk*þÖþÓ*þÖžN`` >@³ÿî¶ÿö¸ÿö²ÿâ¸ÿö²ÿË´ µ¸ÿÛºÿô $ &ÿì *ÿì - 2ÿì 4ÿì 7ÿ° 9ÿº :ÿØ ; <ÿœ Dÿì Fÿì Gÿì Hÿì Jÿì Rÿì Tÿì YÿÛ Zÿâ [ \ÿÛ $ÿÎ -ÿ© 9 : ¡ÿ” µÿÎ ¶ÿö ·ÿì ¸ ¹ÿö Èÿ¡ ÐÿÆ ÔÿÆ ÛÿÁ â äÿñ ç ðÿð ôÿÖ õÿã ûÿÓ üÿð þÿã ÿà ÿÐ ÿí  ÿç ÿñ  Fÿã qÿœ rÿð vÿô žÿÆ ¡ÿÆ ¨ÿÆ « ° ²ÿñ ¶ÿã ¹ÿì ºÿï »ÿð Äÿã ÆÿÞ Çÿã Èÿà ËÿÜ Îÿë ÿã P ÿì ÿö #ÿâ &ÿì *ÿì 2ÿì 4ÿì 7 9 : ; <! = Dÿç Fÿâ Gÿâ Hÿâ Iÿó Jÿâ L MU Qÿë Rÿâ Sÿë Tÿâ Uÿë Vÿî Xÿç Yÿö Zÿö \ ºÿð Ëÿâ ±ÿñ ²ÿõ ´ µÿã ·ÿæ ¸ ¹ÿî ºÿð Åÿô Ô Ö Þÿì áÿë â ã äÿâ å ðÿç ñÿô òÿò ô õÿé øÿò úÿò üÿö ýÿò þÿâ ÿÿò ÿé  ÿÜ ÿì ÿò  ÿò ÿò  ÿî ÿî  U  ÿò Eÿà Fÿâ K Zÿð q rÿî uÿô vÿí ~ £ ¥ÿì ©ÿö ¬ÿì ° ±! ²ÿì ³ ¶ÿí ·ÿð ¸ÿö ¹ÿé ºÿô ¼ÿë ½ÿò ¾ÿï ¿ÿë À Áÿë Âÿö Ãÿó Äÿâ Åÿë Çÿâ Èÿâ Êÿî ËÿÞ Íÿã Îÿì ÿé ÿí  #ÿó $ÿì -ÿó 7ÿí 9ÿß :ÿó ;ÿì <ÿØ =ÿõ [ÿò ¡ÿì (ÿê ²ÿê ³ÿå ´ÿò ¶ÿð ¸ÿè ¹ÿö Åÿñ Èÿó Ðÿì Öÿñ ×ÿñ âÿí ãÿë åÿì íÿë ïÿê ÿò ÿî Kÿß }ÿï ~ÿï žÿì ¡ÿì £ÿõ ¨ÿì °ÿí ±ÿØ ³ÿì ´ÿí »ÿò Àÿò Æÿö Ìÿò Íÿð #ÿí $ÿ° -ÿ˜ 0ÿö ;ÿê <ÿö Dÿï Fÿâ Gÿâ Hÿâ Jÿâ Mÿö Rÿâ Tÿâ Vÿö Y Z [ \ ¡ÿu ËÿÑ (ÿó µÿá ¶ÿð ·ÿô Èÿ˜ Ðÿ° Ôÿ¸ Öÿï ×ÿð Ûÿ´ Üÿö ãÿô åÿê íÿñ ðÿï ôÿÓ õÿð ûÿÒ üÿñ þÿâ ÿð ÿî  ÿô ÿö ÿö ÿö Fÿð qÿ· rÿõ uÿó }ÿõ žÿ° ¡ÿ° ¨ÿ° ©ÿò ±ÿö ³ÿê ¶ÿð ¸ ¹ÿì »ÿæ Àÿë  Ãÿï Äÿâ Æÿê Çÿâ Èÿâ Ëÿï Ì Îÿõ&*-ÿñ247ÿÉ9ÿâ;ÿà<ÿ½=ÿöDF G H IJ R T Z[ÿì¡ÿÓË (±²ÿÞ³ÿíµ&·%¸ÿà¹ÅÿöÈÿñÖÿãÞáâÿÉãÿèäåÿàíÿððñò õöÿéø ú ý þ ÿ  ÿì       *EFKÿÓX Zuv}ÿñ£ÿö¥¬¯ÿð°ÿɱÿ½²³ÿൠ¶ · ¹ º »¼ ½¾¿ ÀÿìÁ ÃÄ Å Æ Ç È ÊË ÌÿìÍÎ$&ÿØ*ÿØ-(2ÿØ4ÿØ6 7ÿ¯8ÿâ9ÿ®:ÿÖ;<ÿ¡=DÿâFÿâGÿâHÿâJÿâRÿâTÿâYÿÇZÿÉ[\ÿÇ]¡Ëÿì±ÿì²ÿ±³´¶¸ÿðÅ È(ÐÔÖ ×ÛÞÿØáÿñâÿ¯äÿØåçÿ´ô÷ûþÿâÿÛÿáÿÔ ÿí "ÿñEÿïKÿÀLÿßYÿ­ZÿÑquÿö} ~ÿמ¡£¥ÿب«¬ÿد°ÿ¯±ÿ¡²ÿس´ÿ°µ¶ÿì¸ÿǹÿö½ÿìÀÂÿÇÄÿâÇÿâÈÿâÉÿãÊÿìËÿâÌÍÿâ#ÿÝ$ÿ¿&ÿè*ÿè-ÿ¹2ÿè4ÿè7+90:+;!<2=DÿÙEFÿÆGÿÆHÿÆJÿÆKLMNOQÿàRÿÆSÿàTÿÆUÿàVÿáXÿí]ÿö¡ÿˆËÿѱÿö³´µÿ·ÿÙ¸(¹ÿñÈÿ¹Ðÿ¿ÔÿÌÖÛÿËÞÿèáÿîâ+ãäÿîå!ç ïÿîðÿÙñÿóòÿñôÿÒõÿßøÿñúÿñûÿÒüÿäýÿñþÿÆÿÿñÿðÿßÿÝÿñ ÿñÿóÿåÿåÿáÿñEÿîFÿßKqÿÊrÿëvÿî~ÿöžÿ¿¡ÿ¿£¥ÿè¨ÿ¿©ÿ쫬ÿè¯ °+±2²ÿè³!µÿì¶ÿƹÿâºÿؼÿà¾ÿò¿ÿàÀ(ÁÿàÄÿÆÅÿàÆÿÄÇÿÆÈÿÆÊÿìËÿÄÍÿìÎÿÎ$-7ÿÂ9ÿó;<ÿÚ= YZ[ \] ¡± ´¶ ¸ÿìº ÈÐâÿÂåû "*KÿêYZqž¡£ ¨°ÿ±ÿÚ³¸ÂÉÌ #$ÿì#-ÿï#7ÿÜ#9ÿã#:ÿõ#;ÿç#<ÿÖ#=ÿô#[ÿö#¡ÿÉ#(ÿð#²ÿó#³ÿç#´ÿô#¶ÿô#¸ÿê#Åÿõ#Èÿï#Ðÿì#Öÿà#×ÿî#âÿÜ#ãÿè#åÿç#íÿæ#ïÿï#ÿö#ÿò#KÿÜ#qÿï#}ÿí#žÿì#¡ÿì#£ÿô#¨ÿì#¯ÿô#°ÿÜ#±ÿÖ#³ÿç#Àÿñ#Ìÿö$ ÿÍ$ ÿî$ ÿ°$$$$"ÿà$$%$&ÿç$*ÿç$-!$2ÿç$4ÿç$6$7ÿ®$8ÿì$9ÿ¿$:ÿØ$;%$<ÿœ$=$?ÿ°$@ÿæ$Dÿõ$Fÿõ$Gÿõ$Hÿõ$Jÿõ$Rÿõ$Tÿõ$V $YÿÝ$Zÿæ$[$\ÿÝ$]$^ÿö$c*$lÿñ$nÿ´$oÿ¿$x $¡$Ëÿò$Óÿí$Ô $Ö$×ÿò$ÙÿÏ$Ú$Ûÿö$Ü$Ýÿì$õÿï$ÿñ$ÿï$ÿî$}ÿÔ$¤ÿò% ÿó% ÿô% %ÿâ% %"ÿì%$ÿö%7ÿî%9ÿâ%:ÿö%;ÿê%<ÿÞ%?ÿì%@ÿé%Yÿö%[ÿø%\ÿö%]ÿö%`ÿö%c %l %x %¡ÿæ%Ùÿî%Úÿê%Üÿõ%}ÿò& & ÿô& & ÿö&ÿõ&& &&"&$&&ÿç&*ÿç&-&2ÿç&4ÿç&6&7&9&:&;&<&=&?&@&D &Fÿô&Gÿô&Hÿô&Jÿô&Rÿô&Tÿô&V&Xÿó&[&]&c'&lÿè&n&o$&x&¡&Ëÿö&Õÿî&Ö&Ù &Ýÿí' ÿì''ÿØ'ÿÌ'"ÿí'$ÿç'-ÿé'7ÿé'9ÿç':ÿö';ÿÚ'<ÿÓ'=ÿö'@ÿì'`ÿð'cÿô'l 'o '¡ÿÄ'Ôÿñ'Öÿè'Ùÿé'Úÿã'Üÿï'ìÿò'ÿð'ÿò'}ÿë'•ÿð(-(2ÿî(4ÿî(9 (;(< (= (Dÿô(Fÿô(Gÿô(Hÿô(Jÿô(Rÿô(Tÿô([(c((n (o(x (¡(Ëÿö(( (Ö (Ú (Ü ) ÿì) ÿò) ))ÿÂ)ÿ²)")#ÿö)$ÿÐ)&ÿø)*ÿø)-ÿµ)0ÿö)2ÿø)4ÿø)7)9):); )<)?)@)Dÿè)Fÿö)Gÿö)Hÿö)Jÿö)Qÿì)Rÿö)Sÿì)Tÿö)Uÿì)Vÿó)Xÿì)[ÿö)]ÿì)cÿÁ)n()o%)xÿõ)¡ÿ‹)Ëÿö)ÖÿÞ)Ù)Úÿã)•ÿî* ÿæ*** *7ÿö*9ÿì*:ÿì*<ÿì*Yÿõ*\ÿõ*c*nÿö+ÿö,ÿö-ÿá-$ÿí--ÿó-? -n-o-x -¡ÿØ-Öÿï-Úÿí. ÿì. ÿí. . ÿØ.ÿÎ... .#ÿò.$.&ÿÉ.*ÿÉ.-.2ÿÉ.4ÿÉ.7.9.: .;$.<.=.?.@.Dÿö.FÿØ.GÿØ.HÿØ.JÿØ.RÿØ.TÿØ.V .Wÿö.XÿÞ.YÿÒ.ZÿÒ.[".\ÿÒ.].^ÿó.c.lÿÍ.¡.Ê+.ËÿÞ.#.. .Óÿë.Ô .ÕÿÏ.Ö.×ÿã.Ù.Ú.Ûÿö.Ü.ÝÿÈ.áÿô.ñÿð.òÿö.õÿï.Bÿï/ / / ÿŸ/ ÿš/ÿì/(///"ÿÜ/$/&ÿì/*ÿì/-/0 /2ÿì/4ÿì/6/7ÿ²/8ÿö/9ÿ«/:ÿÎ/;/<ÿœ/=/?ÿ°/@ÿà/D /V/YÿÑ/Zÿã/[/\ÿÑ/]/^ÿð/`ÿô/c//lÿí/nÿÀ/oÿÉ/x/¡/Õÿç/Ö/ÙÿÆ/Ú/Ûÿñ/Ü/Ýÿá/á /}ÿÎ/¤ÿõ0 ÿö0ÿö0"ÿð07ÿö09ÿö0<ÿñ0?ÿì0nÿì0oÿñ0Ùÿô1ÿö2 ÿì22ÿØ2ÿÌ2"ÿí2$ÿç2-ÿé27ÿé29ÿç2:ÿö2;ÿÚ2<ÿÓ2=ÿö2@ÿì2`ÿó2cÿô2l 2o 2¡ÿÄ2Ôÿõ2Öÿè2Ùÿé2Úÿç2Üÿï2ìÿõ2ôÿî2ÿð2ÿõ2}ÿê3 ÿì3 ÿø3ÿ˜3ÿ±3 3$ÿ¼3-ÿ§37 3;ÿê3<ÿö3>ÿò3@ÿó3Dÿì3Fÿñ3Gÿñ3Hÿñ3Jÿñ3Rÿñ3Tÿñ3Y3Z3[ 3\3`ÿö3cÿ¤3lÿö3n3o3x 3¡ÿƒ3Ëÿé3Ôÿí3ÖÿÖ3Úÿà3Üÿî3ñÿó3 ÿí3ÿò3•ÿë4 ÿì44ÿØ4ÿÌ4"ÿí4$ÿç4-ÿé47ÿé49ÿç4:ÿö4;ÿÚ4<ÿÓ4=ÿö4@ÿì4M4cÿô4l 4o 4¡ÿÄ4Ùÿé4ìÿõ4ÿð4ÿõ5 ÿö5ÿì555 5"ÿñ5#ÿö5$5&ÿî5*ÿî5-52ÿî54ÿî57ÿö58ÿø59ÿñ5;5<ÿß5=5?ÿö5@ÿé5Dÿç5Fÿç5Gÿç5Hÿç5Jÿç5Rÿç5Tÿç5Wÿö5Xÿö5[5] 5c 5lÿê5n 5o 5¡5Ëÿä5Ö5Ùÿó5Ú5Ü6 ÿø6 ÿÝ66 6ÿñ6"ÿö67ÿì69ÿö6:ÿö6<ÿö6D 6Yÿð6Zÿó6[ÿõ6\ÿð6c6l6nÿì6¡ÿì6Úÿì6Üÿô7 ÿì7 ÿî7 7ÿÉ7ÿ¯7ÿž7ÿÃ7"7#ÿÜ7$ÿ®7&ÿé7*ÿé7-ÿ­70ÿö72ÿé74ÿé77797:7;7<"7= 7?(7@7Dÿµ7Fÿµ7Gÿµ7Hÿµ7Jÿµ7Qÿ»7Rÿµ7Sÿ»7Tÿµ7Uÿ»7Vÿ¸7Xÿ»7Yÿµ7Zÿµ7[ÿµ7\ÿµ7]ÿ¹7^ÿî7cÿË7lÿµ7n7o7xÿ¾7¡ÿ7Çÿ÷7É7Ê.7Ëÿ¤7,7 77)ÿÉ7ÕÿÙ7ÖÿÅ7Ù7Úÿè7Ûÿñ7Ýÿâ7á 7BÿÃ8ÿâ8ÿÊ8 8$ÿì8-ÿí8? 8n8o8¡ÿÉ8Öÿî8Úÿì9 ÿâ9 9 ÿá9 9ÿâ9ÿ°9ÿ¢9ÿô9"9#ÿã9$ÿ¿9&ÿç9*ÿç9-ÿ©90ÿö92ÿç94ÿç97 99%9: 9; 9<'9=9?(9@%9Dÿ×9FÿÉ9GÿÉ9HÿÉ9JÿÉ9Qÿé9RÿÉ9Sÿé9TÿÉ9Uÿé9VÿÚ9Xÿë9]ÿô9^ÿî9cÿÁ9lÿØ9n9o%9¡ÿl9Ç9Ê39ËÿÃ9,9$9!9)ÿî9Óÿí9Ô 9ÖÿÏ9×ÿï9Ù9Úÿí9Ûÿõ9Ýÿë9Bÿë: ÿì: : ÿõ: :ÿÔ:ÿÂ:":#ÿõ:$ÿØ:&ÿö:*ÿö:-ÿÑ:2ÿö:4ÿö:7:9 :::;:<#:= :?(:@ :Dÿä:Fÿß:Gÿß:Hÿß:Jÿß:Qÿñ:Rÿß:Sÿñ:Tÿß:Uÿñ:Vÿð:Xÿò:Y :Z :[ :\ :^ÿö:cÿè:lÿð:n:o(:¡ÿË:Ê.:ËÿÜ:):Öÿä:Ù:Úÿè:ñÿõ; ÿì; ÿí; ; ÿæ;ÿà;;;;";#ÿò;$$;&ÿÚ;*ÿÚ;-;2ÿÚ;4ÿÚ;6;7;9;:;;$;<!;=;?;@;Dÿâ;Fÿâ;Gÿâ;Hÿâ;Jÿâ;Rÿâ;Tÿâ;V ;Xÿè;Yÿè;Zÿè;[;\ÿè;];^ÿó;c";lÿÛ;n ;o;¡$;Ê(;Ëÿë;(;; ;Óÿð;Ô ;Õÿæ;Ö;×ÿò;Ù;Ú;Ûÿö;Ü;ÝÿÜ;ñÿó;õÿô;Bÿò< < ÿÎ< ÿÙ< "< ÿö<ÿ½<ÿ¡<ÿœ<ÿÚ<"<#ÿÅ<$ÿœ<&ÿÓ<*ÿÓ<-ÿ¬<0ÿñ<2ÿÓ<4ÿÓ<6ÿö<7"<9'<:"<;"<<)<=<?(<@'<Dÿ·<Fÿ¨<Gÿ¨<Hÿ¨<Jÿ¨<QÿÛ<Rÿ¨<SÿÛ<Tÿ¨<UÿÛ<Vÿº<XÿÞ<Yÿö<[ÿì<\ÿö<]ÿÝ<^ÿñ<cÿ¾<lÿ±<n<o<xÿæ<¡ÿp<¿ÿË<Ê5<Ëÿ¦<-<'<<)ÿâ<Óÿí<Ô<Õÿè<ÖÿÁ<×ÿå<Ù<Úÿï<ÝÿÐ<öÿï<Bÿß= ÿö= =ÿì==="=#ÿö=$=&ÿô=*ÿô=-=2ÿô=4ÿô=6 =7=9=:=;=<== =?=@=D =Fÿö=Gÿö=Hÿö=Jÿö=Rÿö=Tÿö=[=] =c+=lÿá=n=o=x=¡=É =Ê$=!= =Õÿí=Ö=Ù =Ú=Ü=Ýÿì>$ÿä>&ÿì>*ÿì>-ÿä>2ÿì>4ÿì>7>9#>:>;><&>=>@Z>DÿÝ>FÿÜ>GÿÜ>HÿÜ>JÿÜ>L >M^>QÿÞ>RÿÜ>SÿÞ>TÿÜ>UÿÞ>Vÿß>XÿÝ>Yÿâ>Zÿâ>[ÿâ>\>]ÿá>¡ÿä>ËÿØ>±ÿê>²ÿî>´>µÿÚ>·ÿÜ>¸>¹ÿñ>Åÿò>Èÿä>Ðÿä>Ô>Ö>Ûÿå>Þÿì>áÿâ>â>ã>äÿÚ>å>ïÿß>ðÿÝ>ñÿë>òÿæ>ô>õÿà>öÿê>÷ÿç>øÿê>úÿê>ûÿê>üÿå>ýÿê>þÿÜ>ÿÿê>ÿà>ÿç>>ÿÚ>ÿâ>ÿÜ>ÿê> ÿõ> ÿç> ÿç>ÿê>ÿä>>ÿå>ÿß> >^>>ÿõ>"ÿï>*ÿð>EÿÛ>FÿÜ>K>Lÿê>Zÿê>rÿå>vÿä>~ >žÿä>¡ÿä>£>¥ÿì>¨ÿä>« >¬ÿì>°>±&>²ÿì>³>µÿî>¶ÿä>¸ÿâ>¹ÿï>ºÿç>¼ÿÞ>¾ÿä>¿ÿÞ>À>ÁÿÞ>Âÿâ>ÄÿÜ>ÅÿÞ>ÇÿÜ>ÈÿÜ>Éÿì>Êÿå>ËÿÚ>Ìÿâ>Íÿ×>Îÿã?$?%ÿâ?&ÿØ?'ÿâ?(ÿâ?)ÿâ?*ÿØ?+ÿâ?,ÿâ?- ?.ÿâ?/ÿâ?0ÿâ?1ÿâ?2ÿØ?3ÿâ?4ÿØ?5ÿâ?7ÿ¦?8ÿØ?9ÿ’?:ÿº?;?<ÿ’?= ?Dÿç?Fÿç?Gÿç?Hÿç?Jÿç?MŒ?Rÿç?Tÿç?Wÿö?Xÿì?Yÿâ?Zÿì?\<?¡?Ëÿì?±ÿÓ?²ÿº?´ ?µÿö?·ÿâ?¸ÿÎ?¹ÿñ?ºÿâ?ž?Ÿÿâ? ÿâ?¡?¢ÿâ?£ ?¤ÿâ?¥ÿØ?¦ÿâ?§ÿâ?¨?ªÿâ?¬ÿØ?­ÿâ?®ÿâ?°ÿ¦?±ÿ’?²ÿØ?³?´ÿ¦?¶ÿç?¸ÿâ?¹ÿâ?»ÿâ?½ÿÎ?À ?Âÿâ?Ãÿì?Äÿç?Çÿç?Èÿç?ÉÿÎ?Êÿì?Ëÿâ?Íÿâ@M!@²ÿò@³ÿð@µÿò@·ÿö@¸ÿõ@Åÿö@Þÿö@áÿö@äÿð@íÿó@ïÿó@ÿð@!@Eÿî@Fÿð@uÿö@~ÿõ@¥ÿö@¬ÿö@²ÿð@´ÿî@»ÿê@Ãÿî@Çÿð@Ëÿð@ÍÿðD ÿñD ÿëD ÿâD"ÿßD?ÿØD@ÿÞDYÿóDZÿöD\ÿóD`ÿîDc DnÿêDoÿêE ÿíE ÿçE ÿâE EÿâEÿäE"ÿäE?ÿÎE@ÿÜEYÿòEZÿôE[ÿîE\ÿòE]ÿöE`ÿíEl EnÿæEoÿçE•ÿðFÿöFF F"ÿóF#ÿöF@ÿÜFDÿçFFÿçFGÿçFHÿçFJÿçFRÿçFTÿçFYFZ F[ F\FcFlÿñFn FoFËÿâG ÿëG ÿçGG"ÿÛG?ÿÄG@ÿÞGYÿðGZÿöG\ÿðGc Gn GoI 5I IÿÄIÿÂII"I?PI@4IDÿøIFÿøIGÿøIHÿøIJÿøIL IM IRÿøITÿøIYIZI[I\I`IcÿÇIlÿöIn&Io7IxIÇIÊ4IËÿìI-I(I,J ÿóJ ÿçJ"ÿéJ?ÿâJ@ÿÞJMJYÿðJZÿöJ\ÿðJc JnÿçJoÿñK ÿìK ÿëK ÿçK"ÿÛK?ÿÄK@ÿÞKYÿðKZÿöK\ÿðK`ÿîKc KnÿçKoÿñL L ÿçL"ÿÛL?ÿÄL@ÿÞLYÿðLZÿöL\ÿðLc LnÿçLoÿñL•ÿòM M ÿçM"ÿÛM?ÿÄM@ MMMYÿðMZÿöM\ÿðMc MnÿçMoÿñN ÿìN ÿôN NÿÔN NN N#ÿêN@ÿæNDÿöNFÿÜNGÿÜNHÿÜNJÿÜNRÿÜNTÿÜNWÿøNXÿöNYNZN[N\N]N^ÿðNcNlÿÝNn NoNËÿàNòÿïNóÿêO ÿëO ÿèOOO"ÿòO?ÿÄO@ÿÞODOYÿõOZÿõO[O\ÿõO]OcOlÿòOnÿçOoÿæOxQ ÿîQ ÿëQ ÿçQ"ÿÛQ?ÿÄQ@ÿÞQYÿðQZÿöQ\ÿðQ`ÿîQc QnÿçQoÿñR ÿîR ÿçR ÿâR RÿâRÿäR"ÿäR?ÿÎR@ÿÜRYÿòRZÿôR[ÿîR\ÿòR]ÿöR`ÿéRl RnÿæRoÿçR•ÿîS ÿíS ÿçS ÿâS SÿâSÿäS"ÿäS?ÿÎS@ÿÜSYÿòSZÿôS[ÿîS\ÿòS]ÿöS`ÿíSl SnÿæSoÿçS•ÿðT ÿëT ÿçTT"ÿéT?ÿâT@ÿÞTM*TYÿðTZÿöT\ÿðTc TnÿçToÿñU ÿìU UÿÄUÿÈUU" U? U@ÿöUDÿöUFÿöUGÿöUHÿöUJÿöURÿöUTÿöUYUZU[U\U] UcÿÈUlÿòUnUo0UxUËÿòV ÿóV ÿöVÿõV"ÿÜV?ÿâV@ÿÞV]ÿøV`ÿîVcV•ÿïWÿöWW W"ÿñW?ÿìW@ÿßWDÿìWFÿìWGÿìWHÿìWJÿìWRÿìWTÿìWY WZ W[W\ WcWlÿíWnWËÿöX ÿìX ÿçX"ÿéX?ÿÄX@ÿãXYÿðXZÿöX\ÿðXc XnÿçXoÿñY ÿöY YÿÈYÿØYY@ÿãYDÿöYFÿòYGÿòYHÿòYJÿòYRÿòYTÿòYYYZY[Y\Y] Ycÿ×YnYo'YxYËÿíZ ÿöZ ZZÿËZÿÞZZ@ÿäZDÿöZFÿôZGÿôZHÿôZJÿôZRÿôZTÿôZYZZZ[Z\Z]ZcÿåZnZo(ZxZËÿò[ ÿì[ ÿô[ [ÿì[[[[#ÿö[@ÿã[Dÿè[Fÿè[Gÿè[Hÿè[Jÿè[Rÿè[Tÿè[Y[Z[[ [\[][^ÿô[c[lÿå[n[o[Ëÿé[òÿó[óÿî\ ÿö\ \ÿÈ\ÿØ\\@ÿã\Dÿö\Fÿò\Gÿò\Hÿò\Jÿò\Rÿò\Tÿò\Y\Z\[\\\] \cÿ×\n\o \x\Ëÿí]] ] ]"ÿõ]@ÿä]Dÿñ]Fÿñ]Gÿñ]Hÿñ]Jÿñ]Rÿñ]Tÿñ]Y]Z][]\]`ÿô]c]lÿð]n]o]x ^&ÿô^*ÿð^2ÿð^4ÿð^`Z^±ÿê^²ÿî^´^µÿÚ^·ÿÜ^¸^¹ÿñ^Åÿò^Ô^Ö^Ûÿò^Þÿé^áÿé^â^ã^äÿå^å^ïÿë^ðÿï^ñÿò^òÿð^ô^õÿë^÷ÿò^øÿð^úÿð^üÿî^ýÿð^þÿë^ÿÿð^ÿë^ÿò^^ÿä^ÿç^ÿð^ ÿõ^ ÿò^ ÿî^ÿð^ÿî^^ÿï^ÿð^@^^ÿõ^Eÿã^Fÿä^K^rÿï^vÿî^~ ^žÿä^¡ÿä^£^¥ÿì^¨ÿä^« ^¬ÿì^°^±&^²ÿì^³^µÿô^¶ÿë^¸ÿâ^¹ÿï^ºÿò^¼ÿÞ^¾ÿî^¿ÿÞ^À^ÁÿÞ^Âÿâ^ÄÿÜ^ÅÿÞ^ÇÿÜ^ÈÿÜ^Êÿì^Ëÿä^Ìÿâ^ÍÿÞ^Îÿî`-ÿó`7ÿî`9ÿï`;ÿó`<ÿñ`¡ÿó`²ÿò`³ÿð`µÿò`·ÿö`¸ÿõ`Åÿò`Èÿó`Ðÿö`Ôÿð`Öÿó`×ÿï`Ûÿî`âÿî`ãÿë`åÿó`íÿì`ïÿñ`ôÿõ`öÿó`ûÿó`Kÿð`Z `}ÿê`~ÿò`žÿö`£ÿñ`¨ÿö`¯ÿí`°ÿî`±ÿð`³ÿóc$c&ÿßc*ÿßc-c2ÿßc4ÿßc6 c7ÿ´c8ÿìc9ÿƒc:ÿ´c;c<ÿ”c=cD cE cI cK cL cMcN cO cQ cS cU cV cX cYÿ×cZÿãc[c\ÿ×c]c¡l$ l-l7ÿ½l9ÿöl<ÿål= lYlZl\l]l± l´l¸ÿëlºlÈlÐ lâÿ½lûl"l*lKÿílL lYlZ lž l¡ l£ l¨ l°ÿ½l±ÿål¸l¹ÿölÂlÉlËÿölÎÿön$ÿ®n&ÿân*ÿân-ÿ¡n0ÿìn2ÿân4ÿân6n7n8n9n:!n;n<n=nDÿänFÿànGÿÖnHÿànJÿànRÿÖnTÿànVÿìnY nZ n\ n¡ÿ=nËÿºn´ nµÿ¾n·ÿçn¸nº nÅnÈÿ¡nÐÿ®nÔÿÉnÖ nÛÿÄnÜÿìnÞÿânânäÿônånçnðÿänôÿÕnõÿànûÿÒnüÿònþÿÖnÿãnÿËnÿìnnÿénÿìnnFÿänKnqÿ›nrÿðnvÿönžÿ®n¡ÿ®n£n¥ÿân¨ÿ®n« n¬ÿân°n±n²ÿân³nµÿân¶ÿØn¸ n¹ÿânºÿìn»ÿìn½ÿìnÀn nÃÿìnÄÿÖnÆÿÎnÇÿÖnÈÿÖnÉ nËÿÄnÍÿìnÎÿâo$ÿžo&ÿÛo*ÿÛo-ÿ—o2ÿÛo4ÿÛo6ÿìo7o8 o9o:o;o<o=oDÿÁoEÿöoFÿ¸oGÿ¸oHÿ¸oIÿíoJÿ¸oKÿöoLÿöoNÿöoOÿöoQÿÖoRÿ¸oSÿÖoTÿ¸oUÿÖoVÿ³oXÿßoYÿöoZÿöo\ÿöo]ÿßo¡ÿoºÿìoËÿ·oµÿ²o¶ÿöo·ÿÜo¸oÅÿìoÈÿ—oÐÿžoÔÿÂoÛÿ¾oÞÿÛoáÿîoâoäÿçoåoïÿóoðÿÁoòÿëoôÿÆoõÿÏo÷ÿñoøÿëoúÿëoûÿÂoüÿáoýÿëoþÿ¸oÿÿëoÿèoÿÏoÿ»oÿëo ÿëo ÿòoÿîoÿÚoÿÓoÿ³oÿëoEÿîoFÿÏoK oZÿôoqÿ”orÿâouÿôovÿåo~ÿïožÿžo¡ÿžo£o¥ÿÛo¨ÿžo¬ÿÛo°o±o²ÿÛo³oµÿðo¶ÿ¦o·ÿìo¸ÿöo¹ÿÎoºÿºo»ÿõo¼ÿÖo½ÿâo¾ÿìo¿ÿÖoÀoÁÿÖoÂÿöoÃÿØoÄÿ¸oÅÿÖoÆÿœoÇÿ¸oÈÿšoÊÿíoËÿ’oÍÿÎoÎÿºx$ÿðx& x* x-ÿâx2 x4 x6ÿìx7ÿµx9ÿ×x:ÿíx;ÿÚx<ÿ°x=ÿèxD xF xG xH xJ xR xT x[ÿäx]ÿïx¡ÿÔxË x±x²ÿÒx³ÿÝx´ÿèxµx·x¸ÿÉxºÿöxÅÿìxÈÿâxÐÿðxÔÿñxÖÿÓx×ÿèxÛÿîxÞ xâÿµxãÿßxåÿÚxíÿáxïÿèxôÿîxöÿäxûÿðxþ xÿäx ÿôxKÿÀxqÿéx}ÿãx~ÿèxžÿðx¡ÿðx£ÿèx¥ x¨ÿðx¬ x¯ÿæx°ÿµx±ÿ°x² x³ÿÚxÄ xÇ xÈ xÌÿä|7ÿÁ|9ÿß|:ÿö|<ÿÏ~±ÿõ~²ÿæ~³ÿô~·ÿï~ºÿó€± €³€´€· €¸$€¹ €º ’±!’²ÿé’³ÿÔ’´ÿî’µ’·’¸ÿÕ’º š$ÿÖš%ÿáš&ÿØš'ÿáš(ÿáš)ÿáš*ÿØš+ÿáš,ÿáš-ÿÉš.ÿáš/ÿáš0ÿìš1ÿáš2ÿØš3ÿáš4ÿØš5ÿáš6ÿÞš7ÿ—š8ÿßš9ÿš:ÿÖš;ÿš<ÿ²š=ÿΚDÿÙšEÿßšFÿØšGÿØšHÿØšIÿßšJÿØšKÿßšLÿßšMEšNÿßšOÿßšQÿßšRÿØšSÿßšTÿØšUÿßšVÿÛšWÿÞšXÿÚšYÿéšZÿéš[ÿáš\š]ÿßš¡ÿ¸šºÿßšËÿÕš(ÿá¹ ÿè¹¹ÿȹÿù ¹"ÿå¹$ÿä¹-ÿ×¹7ÿì¹9ÿê¹:ÿö¹;ÿݹ<ÿÚ¹=ÿé¹?ÿì¹@ÿݹDÿø¹`ÿì¹l¹¡ÿ˹Ôÿí¹Öÿè¹Ùÿî¹Úÿà¹Üÿê¹Ý ¹ìÿë¹ÿê¹ÿë¹}ÿ칕ÿ칞ÿõº ÿÛº ÿèº ÿ¶ºº"ÿÓº>ÿõº?ÿκ@ÿêºYÿݺZÿáº[ÿöº\ÿݺ`ÿêºnÿÁºoÿƺÿíº~ÿ溕ÿèË Ë ËÿâËÿæË"Ë?Ë@Ë` Ël Ën ËoÙ ÿçÙ ÿëÙ ÿñÙÿëÙ"ÿçÙ@ÿâÙYÿöÙ[ÿôÙ\ÿöÙ`ÿíÙnÿìÙoÿðÙ•ÿðê ê <êÿìêÿçêÿÿê"#ê?Zê@FêDÿíêEêFÿÙêGÿÙêHÿÙêJÿÙêKêLêMêNêOêQÿíêRÿÙêSÿíêTÿÙêUÿíêVÿãêWêXÿòêY êZ ê[ê\(ê]ê`Fênêoê¿êÇ/êÉGêÊvêeêVê^(M) ÿæ) ÿð)"ÿî)nÿë)oÿí±± ÿò±±ÿì±ÿÓ± ±?ÿì±@ÿë±`ÿë±l±o ±x ±³ÿñ±´ÿö±µ ±¸ÿô²ÿò²ÿî² ÿç² ÿë² ÿô² ÿé²ÿë²#ÿî²>ÿê²^ÿê²lÿó²}ÿö²‹ÿö²²ÿî²³ÿó²µÿî²¶ÿö²¸ÿñ²¹ÿõ²ºÿö³ÿó³ ÿö³ ÿï³ÿð³³>ÿö³?ÿö³@ÿò³^ÿö³`ÿò³lÿé³}ÿî³´³µÿö´ÿô´ ÿâ´ ÿð´ ÿç´ ÿò´´ÿì´ÿÝ´>ÿñ´?ÿì´@ÿè´^ÿñ´`ÿè´‹ÿâ´²ÿö´³ÿñ´¶ÿö´¸ÿö´ºÿöµÿçµ ÿâµ ÿôµ ÿêµ&µ µ?ÿöµlµ}µ‹ÿâµ± µ²ÿïµ´ µµµ· µ¹ ¶ÿö¶ ÿö¶ ÿò¶ ÿê¶¶ÿö¶ÿè¶>ÿñ¶^ÿñ¶‹ÿö¶²ÿì¶µ·ÿô· ÿö· ÿè·%·ÿï·?ÿö·l·}·‹ÿö·²ÿò·µ ¸ÿò¸¸ ¸ ÿæ¸ ¸ÿÛ¸ÿ´¸ÿ¸ÿí¸#ÿÖ¸>ÿô¸?(¸@¸^ÿô¸`¸lÿƸn¸o¸xÿî¸}ÿÒ¸‹¸±ÿô¸³¸´¸µÿȸ¶ÿò¸·ÿݸ¸¹ ÿö¹ ÿô¹¹ ¹ÿñ¹?ÿñ¹@ÿö¹`ÿö¹l ¹n ¹o ¹}¹µ º º ÿöº ÿ꺺ÿÛºÿ̺?ÿöº@ÿíº`ÿíºl ºo º}º´ÿôº¶ÿöÓ$Ó&ÿõÓ*ÿõÓ2ÿñÓ4ÿñÓ9 Ó;Ó<Ó¡ÓÔPÓÐÓÔÓÖÓÞÿêÓáÿîÓäÿàÓåÓ%ÓEÿâÓKÓqÓuÿîÓžÓ¡Ó¥ÿêÓ¨Ó¬ÿêÓ±Ó²ÿàÓ³Ô$ÿíÔ-ÿôÔ9ÿíÔ;ÿðÔ<ÿíÔ¡ÿëÔÈÿôÔÐÿíÔÖÿëÔ×ÿòÔãÿîÔåÿëÔíÿíÔïÿíÔ%ÿíÔKÿíÔqÿëÔ}ÿñÔžÿíÔ¡ÿîÔ£ÿóÔ¨ÿîÔ¯ÿõÔ±ÿíÔ³ÿëÔ´ÿòÕ-ÿâÕ7ÿÙÕ: Õ;ÿçÕ<ÿéÕ=ÿòÕ¡ÿçÕÈÿàÕÔÿëÕÖÿÒÕÛÿãÕâÿãÕãÿëÕåÿßÕêÿëÕíÿìÕKÿâÕqÿßÕ}ÿïÕ£ÿëÕ¯ÿáÕ°ÿãÕ±ÿâÕ³ÿßÕµÖ$ÿÏÖ&ÿèÖ*ÿèÖ-ÿ»Ö0ÿõÖ2ÿèÖ4ÿèÖ7Ö9Ö:Ö;Ö<Ö¡ÿ´ÖÈÿ»ÖÐÿÈÖÔÿÅÖÖÖÛÿÃÖÜÿõÖÞÿèÖáÿèÖâÖãÖäÿéÖåÖç ÖêÖïÿéÖ%ÖEÿèÖKÖqÿ´ÖžÿÈÖ¡ÿÍÖ¥ÿèÖ¨ÿÈÖ©ÿõÖ« Ö¬ÿèÖ°Ö±Ö²ÿéÖ³Öµÿê×$ÿç×-ÿä×;ÿë×<ÿðסÿÑ×Èÿä×Ðÿæ×Ôÿë×Öÿæ××ÿï×Ûÿç×ãÿë×åÿä×íÿê×Kÿð×`ÿö×qÿÑ×}ÿõמÿæ×¡ÿèרÿæ×¯ÿõ×±ÿð׳ÿäØ$Ø&ÿçØ*ÿãØ- Ø2ÿãØ4ÿãØ7ÿèØ8ÿíØ9ÿíØ:ÿèØ;Ø<ÿïØ=Ø¡ØÚZØÈ ØÐØÔØÖØÛØÞÿÜØáÿàØâÿèØäÿÛØåØçÿÞØêÿèØïØ%ÿíØEÿÙØKÿïØYÿíØqØuÿàØžØ¡Ø£Ø¥ÿÜØ¨Ø«Ø¬ÿÜØ¯Ø°ÿèØ±ÿïØ²ÿÛØ³Ø´ÿÒØµÙ$Ù&ÿêÙ*ÿéÙ-Ù2ÿèÙ4ÿèÙ7ÿÅÙ8ÿîÙ9ÿÏÙ:ÿãÙ;Ù<ÿÁÙ=Ù¡ÙÈÙÐÙÔ,ÙÖÙ× ÙÛÙÞÿèÙáÿêÙâÿÅÙäÿâÙåÙçÿÕÙêÿÍÙï Ù%ÿÈÙEÿèÙKÿºÙYÿÞÙqÙuÿìÙ} ٞ١٣٥ÿè٨٫٬ÿèٯٰÿÅÙ±ÿºÙ²ÿâٳٴÿÌÙµ ÚäÿóÚíÿöÚïÿöÚEÿñÚ²ÿóÚ´ÿòÛ$Û&ÿïÛ*ÿïÛ- Û2ÿïÛ4ÿïÛ;Û=Û¡ÛÜZÛÈ ÛÐÛÔÛÖÛÛÛÞÿèÛáÿèÛäÿäÛåÛïÛEÿäÛqÛuÿèÛžÛ¡Û£Û¥ÿèÛ¨Û«Û¬ÿèÛ¯Û²ÿäÛ³Û´ÿìÛµÜ$ÿöÜ-ÿöÜ7ÿñÜ9ÿöÜ;ÿöÜ¡ÿöÜÈÿöÜÐÿöÜÔÿñÜÖÿöÜ×ÿóÜÛÿñÜâÿñÜãÿðÜåÿöÜêÿñÜíÿëÜ%ÿõÜYÜqÿöÜ}ÿòÜžÿöÜ¡ÿöÜ£ÿõܨÿöܯÿðܰÿñܳÿöÝ7 ÝÔ Ýâ ÝYݰ á$ÿìá-ÿÖá7ÿáá9ÿìá;ÿÜá<ÿÐá=ÿíá¡ÿÊáÈÿÖáÐÿìáÔÿááÖÿÐá×ÿçáÛÿÝáâÿááãÿááåÿÔáêÿÞáíÿàá%ÿìáKÿÐáqÿÊá}ÿåážÿìá¡ÿïá£ÿæá¨ÿìá¯ÿÜá°ÿáá±ÿÐá³ÿÔå$å&ÿòå*ÿòå-å2ÿòå4ÿòå6 å9ÿöå:ÿóå;å<ÿöå= å¡è:ÿôè;ÿóé[ÿöó[ÿôóÿöö*ÿôö2ÿñö4ÿñöFÿôöGÿóöHÿóöJÿðöRÿòöTÿõöWÿööXÿòöËÿööóÿíöûÿóöÿööÿöö¤ÿóú9ÿôú;ÿðú<ÿêú¡ÿïû&ÿðû*ÿîû2ÿîû4ÿîû7ÿËû8ÿòû9ÿÐû:ÿßû<ÿÒûYÿÞûZÿãû\ÿÜûóÿîûÿöûÿñûÿñû}ÿÍû~ÿãû¤ÿéYÿñ\ÿô~ÿð$ÿí-ÿî¡ÿÝ9ÿî<ÿë Jÿö Ëÿö óÿô •ÿï*ÿõ2ÿõ4ÿõóÿó)$ÿð-ÿñ¡ÿâ•ÿô$ÿî-ÿð9ÿò;ÿï<ÿì¡ÿâÿóÿò}ÿò•ÿíYÿëZÿî[ÿî\ÿëÿî~ÿé•ÿç&ÿö*ÿö2ÿò4ÿòJÿõXÿõóÿòûÿöÿõ¤ÿô•ÿë <ÿö#•ÿç$[ÿó$ÿõ$ÿõ$•ÿç\$ÿß\-ÿÓ\;ÿç\<ÿô\Dÿñ\¡ÿÇ\ÿô\ÿó\•ÿé}9ÿï}<ÿê}(ÿõ}ÿõ9ÿë<ÿå•&ÿê•*ÿç•2ÿæ•4ÿæ•7ÿÕ8ÿî•9ÿÁ•:ÿÖ•<ÿ»•Rÿö•YÿÓ•ZÿÝ•ÿõ•ÿê•ÿî••••¤ÿå——•7ÿ½9ÿÄ:ÿà<ÿ³YÿâZÿé\ÿà}ÿÎ~ÿð¤ÿôž$ÿÓž-ÿÉžDÿîžFÿÍžGÿÓžHÿΞJÿÒžQÿðžRÿΞSÿñžTÿΞUÿîžVÿážXÿöž¡ÿÞËÿìž)ÿóžóÿמ$ÿî Dÿö Ëÿî¤$ÿò¤-ÿ褡ÿÚ¤ÿò¤ÿó°M Å ÿóÅ ÿõÅ ÿøÅ ÿÝÅÅ ÅÿñÅ"ÿöÅ>ÿðÅlÅnÿìÅÚÿìÅÜÿíÅâÿìÅçÿõÅíÿõÅïÿêÅð ÅÿåÅÿêÅÿõÅ ÿçÅ"ÿîÅLÿéÅYÿîÅ~ÿÖÈÿáÈnÈoÈx ÈÖÿïÈÚÿåÈÜÿðÈÈÿóÈÐÿíË ÿ×Ë ÿæËËË"ÿïË@ÿâË`ÿêËnÿßËoÿàËÖ ËÙÿÜËÚ ËÜ ËâÿÔËçÿôËÿñË"ÿñËKÿÜËLÿôËYÿôËqË~ÿãÐ ÿÆÐ ÿîÐ ÿ°ÐÐÐÐ"ÿàÐ@ÿæÐ^ÿöÐlÿñÐnÿ´Ðoÿ¿Ðx ÐÓÿíÐÔ ÐÖÐ×ÿòÐÙÿÈÐÚÐÛÿöÐÜÐÝÿìÐÅÐÈ!ÐÐ%ÐÔÐÖÐ× ÐÛ ÐÞÿçÐáÿíÐâÿ®ÐäÿäÐå%ÐçÿÖÐôÐöÐûÐþÿõÐÿåÐÿëÐÐÿèÐ ÿìÐ ÐÐ Ð"ÿîÐEÿëÐKÿºÐLÿéÐYÿÝÐZÿîÐq&ÐuÿîÐ~ÿÖÑ ÿñÑ ÿõÑ ÿåÑÑÿïÑ"ÿòÑ>ÿöÑÔÿìÑÙÿöÑÚÿÞÑÜÿêÑÅÿñÑâÿòÑãÿöÑåÿòÑçÿòÑíÿôÑïÿêÑöÿîÑÿðÑÿòÑÿòÑ ÿðÑ"ÿòÑLÿòÑYÿóÑ~ÿÝÒ ÿóÒ ÿôÒ ÒÿâÒ Ò"ÿìÒ@ÿéÒ`ÿîÒl Òx ÒÔÿñÒÙÿîÒÚÿâÒÜÿîÒÅÿöÒÐÿöÒÖÿóÒâÿîÒåÿêÒíÿõÒïÿîÒÿøÒKÿìÓ ÿîÓ ÓÿÉÓÿ¯ÓÿžÓÿÃÓ"Ó#ÿÜÓ>ÿóÓ@Ó^ÿåÓlÿµÓnÓoÓxÿ¾ÓÓÿóÓÕÿØÓÖÿºÓ×ÿôÓØÿöÓÙ ÓÚÿÞÓÛÿèÓÝÿÔÓÈÿ­ÓÐÿ®ÓÔÿ·ÓÛÿ²ÓÜÿöÓÞÿéÓáÿîÓâÓäÿèÓåÓïÿòÓðÿµÓñÿöÓòÿÎÓôÿÁÓõÿÃÓ÷ÿöÓøÿÎÓúÿÎÓûÿÀÓüÿ¿ÓýÿÎÓþÿµÓÿÿÎÓÿÎÓÿÁÓÿ¹ÓÿµÓÿÎÓÿÎÓ ÿÎÓ ÿ¿ÓÿÎÓÿÌÓÿÈÓÿ¸Ó&ÓÿÎÓEÿîÓFÿÂÓK ÓZÿ¬Óqÿ”ÓrÿµÓuÿòÓvÿÃÓ~ÿÐÔ ÿîÔ Ô ÿÜÔÔ$Ô"ÿôÔ@Ô^ÿòÔ`ÔlÿòÔnÿóÔoÿôÔÔÔÖ,ÔÙÿèÔÚÔÛÿõÔÜÔÝÿêÔá ÔÈÔÐÔÔÔÖÔ× ÔÛÔâÿåÔäÿãÔåÔçÿâÔôÔöÔûÔÔÔÿëÔ<ÔKÿìÔYÿêÔq"ÕÖ ÕÚ ÕÜ ÕÈÕÖ ÕÞÿîÕäÿîÕåÕþÿôÕÕÿôÕqÕ~ÿèÖ ÿíÖ Ö ÿØÖÿÎÖÖÖ Ö" Ö#ÿòÖ@Ö^ÿóÖ`ÖlÿÍÖÓÿêÖÔÖÕÿÒÖÖÖ×ÿåÖÙÖÚÖÛÿöÖÜÖÝÿËÖÈÖÐÖÔÖÖÖÛ ÖÞÿÉÖáÿÞÖâÖãÖäÿÔÖå$ÖðÿöÖñÿíÖôÖõÿîÖöÖûÖþÿØÖÿîÖÿåÖÿêÖÿèÖ"ÖÿÛÖ ÿçÖÖÿðÖ ÖÖ"ÿîÖEÿÞÖFÿîÖKÖLÿæÖYÿôÖZÿÕÖq&ÖuÿöÖvÿòÖ~ÿÓ× ÿó× ÿô× ×ÿâ× ×"ÿì×@ÿé×`ÿî×l ×x ×Ôÿô×Ùÿñ×Úÿè×Üÿî×Åÿõ×Ðÿö×Öÿö×âÿî×åÿê×ïÿð×ÿø×KÿîÚ ÿíÚ Ú ÿØÚÿÎÚÚÚ Ú#ÿòÚ@Ú^ÿòÚ`ÚlÿÍÚÓÿëÚÔ ÚÕÿÈÚÖÚ×ÿãÚÙÚÚÚÛÿöÚÜÚÝÿÁÚáÿôÚÈÚÐÚÔÚÖÚÛ ÚÞÿÉÚáÿÜÚâÚã ÚäÿËÚå$ÚðÿöÚñÿìÚôÚõÿìÚöÚûÚþÿØÚÿìÚÿØÚÿÜÚÿåÚ"ÚÿÍÚ ÿçÚ ÚÚ ÚÿîÚ Ú Ú"ÿîÚEÿØÚFÿìÚKÚLÿÙÚYÿèÚZÿËÚq&ÚuÿïÚvÿñÚ~ÿÆÜ ÿõÜ ÿðÜ ÿöÜ"ÿðÜ>ÿöÜ@ÿóÜ`ÿóÜnÿìÜoÿñÜÙÿôÜâÿöÜÿôÜÿôÜKÿôÝÿöÞ ÿìÞÞÿØÞÿÌÞ"ÿíÞ>ÿöÞ@ÿìÞ`ÿèÞl Þo ÞÔÿêÞÖÿèÞÙÿéÞÚÿàÞÜÿçÞÈÿéÞÐÿçÞÖÿÝÞ×ÿìÞâÿéÞãÿçÞåÿÚÞíÿåÞïÿñÞKÿáÞqÿêÞ}ÿèà ÿøàÿ˜àÿ±à à>ÿòà@ÿóà`ÿöàlÿöànàoàx àÔÿíàÖÿÖàÚÿààÜÿîàÈÿ§àÐÿ¼àÔÿÈàÖÿðà×ÿôàÛÿÄàâ àåÿêàíÿöàðÿìàôÿÖàûÿÕàüÿõàþÿñà à à* àL àY àqÿÄá ÿôá á ÿöáÿõáá áá"á@á^ÿñá`álÿèánáo$áxáÓÿôáÕÿæáÖá×ÿôáÙ áÛÿõáÝÿåáÅáÈáÐáÔáÖá× áÛ áÞÿçááÿïáâáäÿåáåáð áôáö áûáþÿôáá áá áEÿîáK áZÿìáqáuÿöá~ÿðâ â ÿîâ âÿÉâÿ¯âÿžâÿÃâ"â#ÿÜâ@â^ÿîâ`âlÿµânâoâxÿ¾âÕÿçâÖÿÅâÙâÚÿèâÛÿñâÝÿââá âÈÿ­âÐÿ®âÔÿÂâÖâÛÿ¾âÜÿöâÞÿéâââãâäÿõâåâðÿµâôÿÒâõÿÑâûÿÐâüÿìâþÿµâÿÏâÿÈâÿµâÿÜââÿÖâÿ¸â0ââFÿÐâKâYâqÿÎârÿóâvÿòã ã ÿáã ãÿâãÿ°ãÿ¢ãÿôã"ã#ÿãã@%ã^ÿîã`ãlÿØãnão%ãÓÿíãÔ ãÖÿÂã×ÿïãÙãÚÿíãÛÿõãÝÿêãÈÿ©ãÐÿ¿ãÔÿÃãÖãÛÿ¾ãÜÿöãÞÿçãáÿëãâ ãããäÿêãå ãïÿìãðÿ×ãñÿñãòÿïãôÿÈãõÿÛãøÿïãúÿïãûÿÇãüÿâãýÿïãþÿÉãÿÿïãÿîãÿÚãÿØãÿïã ÿïãÿñãÿáããÿàãÿÚã5ããÿïãEÿëãFÿÛãKãqÿ±ãrÿéãvÿëä ÿóä ÿßääÿÙäÿÙä"ÿçä>ÿñä@ÿÛä`ÿæäÔÿàäÖÿâäØÿóäÙÿéäÚÿÛäÜÿääÈÿÝäÐÿåäÔÿãäÖÿÕä×ÿåäÛÿßäâÿöäãÿàäåÿÙäíÿÞäïÿôäôÿèäûÿåäüÿöäÿöäÿöäKÿÞäqÿÜä}ÿßå ÿíå å ÿæåÿàåååå"å#ÿòå@å^ÿòå`ålÿÛån åoåÓÿëåÔ åÕÿßåÖå×ÿëåÙåÚåÛÿöåÜåÝÿÔåÅåÈåÐ$åÔåÖå× åÛ åÞÿÚåáÿååâåãåäÿØåå$åñÿîåôåõÿîåöåûåþÿâåÿïåÿëåÿïåÿêååÿàå ÿëååÿòå åå"ÿóåEÿáåFÿîåKåLÿíåZÿÜåq&åuÿôåvÿôå~ÿÙæ ÿîæ æ ÿÜææ$æ"ÿôæ@æ^ÿòæ`ælÿòænÿóæoÿôæÔæÖ,æÙÿèæÚæÛÿõæÜæÝÿêæá æÈæÐæÔæÖæ× æÛæâÿåæäÿãæåæçÿâæôæöæûæææÿëæ<æKÿìæYÿêæq"ì ÿÃì ÿßì ÿèììÿîì"ÿÞì>ÿðì@ÿÚì`ÿåìnÿÅìoÿÍìÔÿçìØÿóìÙÿÒìÚÿÛìÜÿéìÅÿðìÖÿîìâÿÀìãÿõìåÿðìçÿõìíÿóìïÿæìöÿíìÿõìÿóìÿòì ÿõì"ÿñìKÿ¸ìLÿôì~ÿâí ÿìííÿØíÿÌí"ÿíí>ÿöí@ÿìí`ÿéíl ío íÔÿêíÖÿéíÙÿêíÚÿàíÜÿèíÈÿéíÐÿçíÖÿÞí×ÿìíâÿéíãÿèíåÿÚííÿèíïÿñíKÿâíqÿëí}ÿéð ÿèð ÿëð ÿâðð"ÿßð@ÿÞð`ÿïðnÿêðoÿêð~ÿññ ÿïññÿíñ>ÿõñöÿòñÿõñ~ÿðò ÿìò ÿîò ÿðò"ÿîò@ÿäò`ÿîònÿðòoÿóò~ÿóóÿÇóÿÚóó@ÿìónóoóxóôÿãóöóûÿàóóóó ó"ó*óLóZô ÿëô ô ÿêôô!ô"ÿôô@ô`ôlÿöônÿïôoÿõôôôöôûôÿóôôôÿôô ÿöô ô;õ ÿéõ ÿêõ ÿâõ õÿìõÿôõ"ÿèõ@ÿàõ`ÿîõl õnÿöõoÿîõÿñõ~ÿöö ÿôö öÿÔö öö ö#ÿêö@ÿæö^ÿóölÿÝön öoöðÿööôöõÿòööö÷ öûöþÿÜöÿòöööÿîöö ö öö"ö* öFÿòöL÷ ÿó÷ ÿõ÷÷ ÷"ÿõ÷@ÿè÷`ÿó÷û ú ÿôú úÿÔú úú ú#ÿêú@ÿæú^ÿóúlÿÝún úoúðÿöúôúõÿîúöú÷ úûúþÿÜúÿîúúúÿëúú ú úúÿóú"ú* úFÿîúLû ÿòû û"ÿòû@ÿêû`ÿóû~ÿòü ÿóü ÿôü ÿòü"ÿðü@ÿåü`ÿîü~ÿëý ÿòý ý"ÿñý@ÿéý`ÿòý~ÿòþ ÿãþ ÿçþ ÿâþ þÿâþÿäþ"ÿäþ@ÿÜþ`ÿëþl þnÿæþoÿçþöÿòþÿîþ~ÿòÿ ÿòÿ ÿ"ÿñÿ@ÿéÿ`ÿòÿ~ÿò ÿã ÿâ ÿðÿí"ÿí>ÿð@ÿÜ`ÿänÿêoÿèöÿñÿõ~ÿóÿö "ÿó#ÿö@ÿÜ`ÿîlÿñn oöþÿç " L ÿÛÿÖ@ÿæ`ÿòn oôÿãöûÿäÿ÷ "*LZÿãÿß@ÿën oôÿçöûÿìÿõ "*LZ  ÿÓ ÿÜ ÿîÿê"ÿâ>ÿð@ÿÚ`ÿänÿÓoÿÜöÿë÷ÿ÷ÿ÷ÿõÿñÿúÿøÿõÿõ~ÿî ÿô ÿì#ÿö@ÿã^ÿölÿånoôõÿõö÷ ûþÿèÿõÿñ   "* FÿõL ÿë  ÿê!"ÿô@`lÿönÿïoÿõôöûÿóÿô ÿö ; ÿò "ÿñ@ÿé`ÿò~ÿò ÿ¸ ÿê ÿË   "ÿê >ÿõ @ÿß `ÿì nÿ oÿ¹ û  ÿÜ ÿê  ÿä "ÿè Lÿê ~ÿØ ÿç ÿç ÿâ   ÿâ ÿä "ÿä @ÿÜ `ÿï l  nÿæ oÿç ÿî ÿã ÿç ÿâ ÿâÿä"ÿä@ÿÜ`ÿël nÿæoÿçöÿñÿî~ÿó ÿò "ÿñ@ÿæ`ÿï~ÿò ÿÜ ÿð ÿê"ÿënÿÝoÿæÿñ~ÿõ"ÿö@ÿç`ÿîlÿôöÿ÷ ÿó ÿöÿõ"ÿÜ@ÿÞ`ÿî~ÿö  ~ÿò ÿõ  @ ~ÿò ÿÜ ÿõ ÿò ÿê"ÿë@ÿÞ`ÿånÿÞoÿæÿö~ÿî ÿò "ÿñ@ÿõ`ÿõ~ÿò" ÿÎ" ÿå" ÿÒ""ÿå">ÿð"@ÿÚ"`ÿæ"nÿÒ"oÿÝ"ÿß"ÿé"ÿö" ÿê"ÿö"ÿõ"ÿõ""ÿà"Lÿç"~ÿÔ% % % ÿõ% %ÿÍ%ÿž%ÿÂ%""%#ÿå%@&%`&%lÿÅ%n%o%Ô%Õÿâ%ÖÿÉ%Ù$%ÝÿÜ%Èÿ®%ÐÿÂ%ÔÿÑ%Ö%×%ÛÿÌ%Þÿô%áÿô%â"%ã%äÿð%å%ç%í%ðÿî%òÿõ%ôÿÍ%õÿÍ%øÿõ%úÿõ%ûÿË%üÿè%ýÿõ%þÿÍ%ÿÿõ%ÿò%ÿË%ÿÃ%ÿõ% ÿõ%ÿ×%$%ÿÒ%ÿà%$%ÿõ%Eÿô%FÿÌ%K$%Y %Zÿõ%qÿ¤%rÿî%vÿî%} & & &ÿË&ÿÖ&&@ÿõ&n&o &x&ôÿë&ö&÷&ûÿé&&"&&& & &""&* &L"&Z2 ÿî2 ÿõ2 ÿî22"ÿî2nÿò2ö 2û 2 2ÿð2$D ÿ£D ÿõD ÿ·DD"ÿíD>ÿõDnÿ®Doÿ¥Dö Dû DÿÕD DÿëD ÿàD$D"ÿâDLÿÜDZÿëE ÿßE ÿöEE"ÿëE>ÿõEnÿàEoÿéEÖEÙÿàEÝ EÅÿïEÖÿéEâÿÓEãÿòEåÿëEíÿðEïÿîEöÿôE"EKÿÊF ÿÍF ÿàFFF"ÿéFnÿÓFoÿÔFÿêF ÿðF*F"ÿòFLÿôK ÿßK KÿÓKÿÀKÿ¶KÿêK"K#ÿÒK@K^ÿðK`KlÿÀKo KxÿìKÓÿíKÔKÕÿáKÖÿºK×ÿåKÙKÚÿïKÝÿÐKÅÿõKÈÿ·KÐÿºKÔÿÅKÖKÛÿÁKÜÿôKÞÿàKáÿàKâKãKäÿÝKåKç KïÿåKðÿÞKñÿêKòÿåKôÿ½KõÿÆK÷ÿîKøÿåKúÿåKûÿ»Küÿ×KýÿåKþÿÆKÿÿåKÿâKÿÅKÿÁKÿïKÿåK ÿåK ÿïKÿçKÿÏKKÿËKÿÕKKÿåKEÿàKFÿÆKKKZÿíKqÿÃKrÿÞKvÿßLÿßLÿäL@ÿêLoLx LôÿèLöLûÿéLLLL L"L*LLLZ W ÿÃW ÿòW ÿôW ÿäWW W"ÿâW>ÿñW@ÿÖW`ÿáWnÿÄWoÿÍWÓÿôWØÿõWÙÿÌWâÿÁWçÿïWKÿ»WYÿõWqX ÿàX ÿõX ÿòX ÿëXX"ÿëX@ÿÞX`ÿåXnÿäXoÿíXÿöX~ÿïY ÿëY YÿîY"ÿñY>ÿöY@ÿåY`ÿíYÔÿîYÙÿìYÚÿïYÜÿïYãÿîYíÿòYïÿòYKÿæ` ÿî` ÿÜ`>ÿî`Óÿí`×ÿõ`Øÿñ`Ûÿô`Ýÿé`Þÿï`áÿð`äÿé`ÿÛ`ÿì` ÿâ``"ÿæ`Eÿï`LÿÛ`Yÿß`Zÿð`uÿòa ÿõaalÿöao aö aû a aa a a$a"aL e e"ÿòee~ÿòqqÖ qÚ qÜ qÈ qÐ qÖ qäÿïqå qqr ÿér ÿîr ÿôrr"ÿîr@ÿär`ÿîrnÿîroÿîr~ÿöu ÿëuuÿñuÿàu"ÿñu@ÿåu`ÿìuÔÿîuÖÿêuÙÿëuÚÿàuÜÿëuÈÿïuÐÿíuÖÿáu×ÿîuãÿëuåÿåuíÿèuïÿñuKÿãuqÿíu}ÿê} ÿò}}ÿñ}Óÿõ}Úÿà}Üÿé}Åÿó}ïÿî}öÿò}ÿí}ÿñ}ÿõ} ÿî}"ÿö}Lÿî}~ÿÛ~ ÿõ~~"ÿñ~^ÿô~lÿñ~ö ~ÿõ~ ~&ž ÿÆž ÿîž ÿ°žžžž"ÿàž?ÿ°ž@ÿæž^ÿöž`ÿæžlÿñžnÿ´žoÿ¿žx žÓÿížÔ žÖž×ÿòžÙÿÈžÚžÛÿöžÜžÝÿìžž%ž¡%ž£ž¥ÿ瞨%ž«ž¬ÿ瞯ž°ÿ®ž±ÿœž²ÿçž³%ž´ÿΞµ ž¶ÿöž¸ÿÝž»ÿçž½ÿïžÀžÂÿÝžÃÿìžÄÿõžÇÿõžÈÿõžÉÿâžÊÿìžËÿöžÌžÍÿ⟠ÿóŸ ÿôŸ Ÿÿ⟠Ÿ"ÿìŸ?ÿìŸ@ÿéŸ`ÿéŸl Ÿx ŸÔÿñŸÙÿîŸÚÿâŸÜÿÿöŸ¡ÿöŸ¨ÿöŸ°ÿÿÞŸ³ÿꟴÿ쟸ÿöŸÂÿöŸÌÿø    ÿõ   ÿ° ÿ¦ ÿˆ " #ÿê ?( @ ^ÿñ ` lÿÉ n o2 xÿØ Óÿó ÕÿØ Öÿº ×ÿô Øÿö Ù  ÚÿÞ Ûÿè ÝÿÔ žÿ¦ ¡ÿ¦ ¥ÿì ¨ÿ¦ « ¬ÿì ° ± ²ÿì ³ µÿö ¶ÿ¦ ¸ÿÕ ¹ÿÄ ºÿ¦ »ÿê ¼ÿΠ¾ÿΠ¿ÿΠÀ  ÁÿΠÂÿÌ Äÿµ ÅÿΠÆÿ’ Çÿ­ Èÿ« ÊÿΠËÿ¦ Ìÿâ ÍÿΠÎÿ° Ü/ Ý= *   Pÿë Qÿë ¦ÿö ¨T ©> ª  «¡ ÿÆ¡ ÿî¡ ÿ°¡¡¡¡"ÿà¡?ÿ°¡@ÿæ¡`ÿæ¡lÿñ¡nÿ´¡oÿ¿¡x ¡Óÿî¡Ô ¡Ö¡×ÿó¡Ùÿ͡ڡÛÿö¡Ü¡Ýÿ%¡¡%¡£¡¥ÿ硨%¡«¡¬ÿ硯¡°ÿ®¡±ÿœ¡²ÿ硳%¡´ÿΡµ ¡¶ÿö¡¸ÿÝ¡»ÿ硽ÿð¡À¡ÂÿÝ¡Ãÿì¡Äÿõ¡Çÿõ¡Èÿõ¡Éÿâ¡Êÿì¡Ì¡Íÿ⢠ÿö¢"¢ ¢¢? ¢@ ¢` ¢n ¢o¢x ¢Ö ¢Ú ¢Ü ¢ž¢Ÿ ¢  ¢¡¢¢ ¢£ ¢¤ ¢¥ÿ ¢§ ¢¨¢ª ¢¬ÿ ¢® ¢¯¢± ¢²ÿ¢´ÿö¢À ¢Äÿô¢Çÿô¢Èÿô¢Ëÿì¢Ì¢Íÿì¢Ý'¢¢¢¨?¢©4£ £ÿ죣£"£#ÿö£?£@£^ÿð£`£lÿá£n£o£x£Õÿæ£Ö£Ù £Ú£Ûÿô£Ü£Ýÿ壞£¡££ £¥ÿô£¨£« £¬ÿô£°£±£²ÿô£³£¶ÿ죹ÿì£À £Ãÿö£Äÿö£Çÿö£Èÿö£Ì£Ü!£Ý/£*£ £ ££¨I£©4¤ÿö¤Ãÿö¤Ý¤¨4¤©¥ ÿ쥥ÿØ¥ÿÌ¥"ÿí¥>ÿö¥@ÿì¥`ÿì¥l ¥o ¥Ôÿê¥Öÿè¥Ùÿé¥Úÿà¥Üÿ神ÿ祡ÿ祣ÿö¥¨ÿ祩ÿ÷¥«ÿÿö¥°ÿ饱ÿÓ¥³ÿÚ¥´ÿ÷¥Àÿî¥Æÿö¦Ý¦¦¨4¦©§ ÿí§ § ÿاÿΧ§§ §#ÿò§?§@§^ÿó§`§lÿͧÓÿë§Ô §Õÿȧ֧×ÿã§Ù§Ú§Ûÿö§Ü§ÝÿÁ§áÿô§ž§¡§£§¥ÿɧ¨§« §¬ÿɧ¯§°§±§²ÿµ§³$§´ÿö§µ§¶ÿا¸ÿÒ§¹ÿا»ÿâ§½ÿا¾ÿì§À§ÂÿÒ§Ãÿâ§ÄÿاÇÿاÈÿاÉÿΧÊÿاËÿاÌ"§ÍÿΧÎÿاÜ)§Ý6§*§)§§§§ §¨S§©?§« ¨ ÿƨ ÿî¨ ÿ°¨¨¨¨"ÿà¨?ÿ°¨@ÿæ¨^ÿö¨`ÿæ¨lÿñ¨nÿ´¨oÿ¿¨x ¨Óÿí¨Ô ¨Ö¨×ÿò¨ÙÿȨڨÛÿö¨Ü¨Ýÿ먞%¨¡%¨£¨¥ÿ稨%¨«¨¬ÿ稯¨°ÿ®¨±ÿœ¨²ÿ稳%¨´ÿΨµ ¨¶ÿö¨¸ÿݨ»ÿ稽ÿï¨À¨ÂÿݨÃÿì¨Äÿõ¨Çÿõ¨Èÿõ¨Éÿâ¨Êÿì¨Ëÿö¨Ì¨Íÿâ© ÿô© ÿò©"ÿö©Ùÿô©¥ÿ÷©¬ÿ÷©°ÿø©±ÿø©²ÿõ©´ÿé©»ÿòªÿöªÃÿöª ª¨ª© « «««?«@ «` «n «o«Ö «Ù «Ú «Ü «ž«¡«¥ÿ«««¬ÿ «²ÿ «À «Ì «Ü$«Ý2«=«)«« «§ «¨T«©?«ª««¬ ÿ쬬ÿجÿ̬"ÿí¬>ÿö¬@ÿì¬`ÿì¬l ¬o ¬Ôÿê¬Öÿè¬Ùÿé¬Úÿà¬Üÿ笞ÿ笡ÿ笣ÿö¬¨ÿ笩ÿ÷¬«ÿÿö¬°ÿ鬱ÿÓ¬³ÿÚ¬´ÿ÷¬Àÿî¬Æÿö­ÿö­Ãÿö­Ý ­ ­¨4­©® ÿø®ÿ˜®ÿ±® ®>ÿò®@ÿó®^ÿò®`ÿó®lÿö®n®o®x ®Ôÿí®ÖÿÖ®Úÿà®Üÿÿ¼®¡ÿ¼®¨ÿ¼®©ÿ÷®° ®±ÿö®³ÿê®¶ÿ쮸®¹ÿ쮺ÿø®»ÿó®Àÿò®Â®Ãÿó®Äÿñ®Æÿâ®Çÿñ®Èÿñ®É®Ëÿç®Ì ®Îÿì¯ ÿõ¯ÿì¯ ¯?¯^ÿò¯lÿé¯n¯o¯Óÿö¯Õÿì¯Ö ¯Ù ¯Ú ¯Ûÿõ¯Ü ¯Ýÿ篞 ¯¡ ¯¥ÿ⯨ ¯«¯¬ÿ⯱¯²ÿ⯳ ¯¶ÿ쯹ÿì¯Äÿì¯Çÿì¯Èÿì¯Éÿì¯Êÿö¯Ëÿì¯Íÿì¯Îÿì¯Ü!¯Ý/¯6¯¯¯¨S¯©;° ° ÿî° °ÿɰÿ¯°ÿž°ÿð"°#ÿܰ?(°@°^ÿî°`°lÿµ°n°o°xÿ¾°Õÿç°ÖÿŰٰÚÿè°Ûÿñ°Ýÿâ°á °žÿ®°¡ÿ®°£ °¥ÿé°¨ÿ®°¬ÿé°°°±"°²ÿé°³°µÿö°¶ÿœ°¸ÿµ°¹ÿì°ºÿ°°»ÿì°¼ÿ»°¿ÿ»°Áÿ»°Âÿµ°Äÿµ°Åÿ»°Æÿœ°Çÿµ°Èÿµ°Êÿ»°Ëÿœ°Ìÿµ°Íÿ»°Îÿº°Ü,°Ý9°>°4°)°)°§°¨h°©H°ª °«*°µÿÒ°¶ÿÒ± ± ÿÙ± "± ÿö±ÿ½±ÿ¡±ÿœ±ÿÚ±"±#ÿű?(±@'±^ÿð±`'±lÿ±±n±o±xÿæ±Óÿí±Ô±Õÿá±Öÿº±×ÿå±Ù±Úÿï±Ýÿбžÿœ±¡ÿœ±£±¥ÿÓ±¨ÿœ±©ÿø±« ±¬ÿÓ±°"±±)±²ÿÓ±³"±µÿè±¶ÿ¨±¸ÿö±¹ÿº±ºÿº±¼ÿÛ±¾ÿ屿ÿÛ±À±ÁÿÛ±Âÿö±Äÿ¨±ÅÿÛ±Æÿœ±Çÿ¨±Èÿ¨±ÊÿÛ±Ëÿœ±Ìÿì±ÍÿÛ±ÎÿıÜ2±ÝT±?±>±±*±P±Q ±¦±§*±¨s±©^±ª±«4² ÿñ² ÿì²²ÿزÿ̲"ÿí²>ÿð²@ÿì²`ÿì²l ²o ²Ôÿà²Öÿâ²Øÿó²Ùÿé²ÚÿÛ²Üÿ䲞ÿ粟ÿõ² ÿõ²¡ÿç²¢ÿõ²£ÿö²§ÿõ²¨ÿ粩ÿõ²«ÿî²®ÿõ²¯ÿö²°ÿé²±ÿÓ²³ÿÚ²Àÿð²Æÿö³ ÿí³ ³ ÿæ³ÿà³³³³"³#ÿò³?³@³^ÿò³`³lÿÛ³n ³o³Óÿë³Ô ³Õÿß³Ö³×ÿë³Ù³Ú³Ûÿö³Ü³ÝÿÔ³ž$³¡$³£³¥ÿÚ³¨$³« ³¬ÿÚ³¯ ³°³±!³²ÿÚ³³$³´ÿö³µ ³¶ÿ⳸ÿè³¹ÿð³»ÿì³½ÿâ³À³Âÿè³Ãÿì³Äÿâ³Çÿâ³Èÿâ³ÉÿسÊÿî³Ëÿé³Ì³Íÿå³Îÿì³Ü+³Ý9³%³ ³ ³³§ ³¨]³©?³ª ³«´ ÿí´ÿ°´ÿ¦´#ÿô´>ÿî´o ´Óÿò´ÖÿÌ´Øÿò´ÚÿÒ´Üÿì´žÿδŸÿô´ ÿô´¡ÿδ¢ÿô´¥ÿ÷´§ÿô´¨ÿδ©ÿö´¬ÿ÷´®ÿô´³ÿö´´ÿó´µÿ÷´¶ÿâ´·ÿõ´¹ÿï´ºÿì´»ÿê´¼ÿö´¾ÿö´¿ÿö´Áÿö´Ãÿê´Äÿâ´Åÿö´Æÿì´Çÿâ´Èÿâ´Êÿö´Ëÿâ´Íÿó´Îÿì´Ü´Ý$´´´¨4´©)µ µµ?ÿìµ@ÿíµ`ÿôµÖ µÙÿêµÚ µÜ µž µ¡ µ¨ µ°ÿöµ±ÿèµ³ µ´ÿ÷µÀ ¶ ÿð¶ ÿñ¶¶ ¶"ÿö¶?ÿâ¶@ÿê¶`ÿõ¶nÿõ¶x ¶À ¶Êÿö¶Ì¶Îÿö· ÿñ· ÿì··ÿð·>ÿñ·?ÿì·¸ÿì·Âÿì·Ìÿö·¨ ¸ ¸ÿ ¸ÿظ¸@ÿã¸`ÿã¸n¸o'¸x¸¶ÿö¸¸¸¹ÿñ¸»ÿñ¸Àÿì¸Â¸Äÿò¸Æÿì¸Çÿò¸Èÿò¸É¸Ëÿñ¸Ì¸Îÿù¹ ÿê¹ ÿî¹ ¹ÿö¹ÿì¹"ÿï¹>ÿò¹nÿá¹oÿö¹¸ÿö¹Âÿö¹Ìÿñ¹¨ºÿ캺"ÿñº?ÿöº@ÿåº`ÿïºlÿóºo º¶ÿ캹ÿ캻ÿغ½ÿìºÀºÃÿöºÄÿâºÇÿâºÈÿâºÉÿöºÊÿöºËÿìºÌºÍÿìºÎÿì» » ÿö»ÿì»»F»»"»?2»@»`»lÿÙ»o(»¶ÿ컸ÿö»¹ÿö»»ÿ컼 »½ÿö»¿ »À2»Á »Âÿö»Äÿç»Å »Çÿç»Èÿç»Éÿë»ËÿÚ»Ì(»Íÿâ»Îÿö»Ü/»Ý\»¨i»©]¼ ÿå¼ ÿë¼ ÿç¼¼¼"ÿÛ¼?ÿļ@ÿÞ¼`ÿÞ¼nÿç¼oÿñ¼¸ÿð¼Âÿð¼Íÿö½ ÿó½½ÿì½ÿؽo½º½¨¾ ÿô¾ ÿñ¾¾"ÿó¾@ÿç¾`ÿó¾À¾Ì ¿ ÿô¿ ¿ÿÔ¿ ¿¿ ¿#ÿê¿@ÿæ¿^ÿò¿`ÿæ¿lÿÝ¿n ¿o¿¶ÿÝ¿¸¿¹ÿ⿺ÿö¿»ÿë¿À¿Â¿Ãÿî¿ÄÿÜ¿Æÿö¿ÇÿÜ¿ÈÿܿɿËÿؿ̿Íÿì¿ÎÿäÀ ÿÕÀ ÿ×ÀÀÀ À"ÿöÀ?ÿØÀ@ÿíÀnÿÖÀoÿÄÀ¸ÿñÀÀÀÂÿñÀÉÿìÀËÿöÀÌÀÍÿñÁ ÿïÁ Á"ÿòÁ@ÿíÁ`ÿðÁ»ÿó ÂÿÈÂÿØÂÂ@ÿãÂ`ÿãÂnÂo'Âx¶ÿö¸¹ÿñ»ÿòÂÀÿìÂÂÂÃÿöÂÄÿòÂÆÿìÂÇÿòÂÈÿòÂÉÂËÿñÂÌÂÎÿùÃÿöà ÿÞà ÿêÃÿâÃÿöÃ#ÿæÃ>ÿíÃ^ÿîÃlÿçÃnÿðÃxÿðöÿÊøÿâùÿÎúÿâûÿìüÿàýÿìþÿØÃ¿ÿàÃÁÿàÃÂÿâÃÃÿºÃÄÿºÃÅÿàÃÆÿñÃÇÿºÃÈÿºÃÉÿâÃÊÿÎÃËÿÉÃÍÿØÃÎÿÎÃÜÿïÃÝè5é Ä ÿãÄ ÿçÄ ÿâÄ ÄÿâÄÿäÄ"ÿäÄ?ÿÎÄ@ÿÜÄ`ÿÜÄl ÄnÿæÄoÿçĸÿòÄÂÿòÄÉÿøÄÌÿîÅ ÿòÅ Å"ÿñÅ@ÿéÅ`ÿòÆ ÿæÆ ÿãÆ ÿôÆ ÆÿìÆÿäÆ"ÿîÆ>ÿðÆ?ÿÎÆ@ÿÜÆ`ÿäÆnÿëÆoÿöÆÀÿìÆÌÿöÇ ÿòÇ ÇÿìÇÇ#ÿôÇ@ Ç^ÿòÇ` ÇlÿèÇoÈ ÈÿØÈÿÎÈÈ@ÿìÈnÈo<ÈxȸÈÂÈÉÈÌÈÎÿöÉÿìÉ@ÿæÉ`ÿñÉoɶÿöɸ É ÉÄÿîÉÇÿîÉÈÿîÉÉÉÌ Ê ÿîÊÊÿìÊÿìÊ"ÿîÊ?ÿöÊ@ÿåÊ`ÿìË ÿÝË ÿßË ÿïË ËÿâËÿìË"ÿæË>ÿðË?ÿØË@ÿÚË`ÿäËnÿèËoÿâËxÿö˸ÿñËÀÿöËÂÿñËÌÿçÌ ÿôÌ ÌÿìÌÌÌÌ#ÿöÌ@ÿãÌ^ÿöÌ`ÿãÌlÿåÌnÌo̶ÿâ̸̹ÿçÌ»ÿñÌÀÌÂÌÃÿöÌÄÿèÌÇÿèÌÈÿèÌÉÌËÿçÌÌ ÌÍÿöÌÎÿôÍ ÿðÍ ÿãÍÍÿâÍÿâÍ"ÿíÍ>ÿðÍ@ÿ×Í`ÿÞÍÀÿñÍÆÿóÎ ÿêÎ ÿìÎ ÿõÎÎÿâÎ"ÿîÎ?ÿìÎ@ÿâÎ`ÿíÎnÿîÎoÿñÎxÿöκÎÌÿôÝ·Ý»,ݽ ÝÀbÝè» ¨ÀH©·©»*©½©Àf©Ã>IH„n } { p@ 0_ _ £  ‡  ‡ ’  d Ü >° Î Ê ´ €4 ’ ’ Fî 4â 4âCopyright 2010 Canonical Ltd. Licensed under the Ubuntu Font Licence 1.0Dalton Maag LtdDaltonMaagLtd: Ubuntu Bold 0.71The Ubuntu Font Family are libre fonts funded by Canonical Ltd on behalf of the Ubuntu project. The font design work and technical implementation is being undertaken by Dalton Maag. The typeface is sans-serif, uses OpenType features and is manually hinted for clarity on desktop and mobile computing screens. The scope of the Ubuntu Font Family includes all the languages used by the various Ubuntu users around the world in tune with Ubuntu's philosophy which states that every user should be able to use their software in the language of their choice. The project is ongoing, and we expect the family will be extended to cover many written languages in the coming years.Ubuntu and Canonical are registered trademarks of Canonical Ltd.Ubuntu-BoldVersion 0.71http://www.daltonmaag.com/Copyright 2010 Canonical Ltd. Licensed under the Ubuntu Font Licence 1.0Dalton Maag LtdDaltonMaagLtd: Ubuntu Bold 0.71The Ubuntu Font Family are libre fonts funded by Canonical Ltd on behalf of the Ubuntu project. The font design work and technical implementation is being undertaken by Dalton Maag. The typeface is sans-serif, uses OpenType features and is manually hinted for clarity on desktop and mobile computing screens. The scope of the Ubuntu Font Family includes all the languages used by the various Ubuntu users around the world in tune with Ubuntu's philosophy which states that every user should be able to use their software in the language of their choice. The project is ongoing, and we expect the family will be extended to cover many written languages in the coming years.Ubuntu and Canonical are registered trademarks of Canonical Ltd.Ubuntu-BoldVersion 0.71http://www.daltonmaag.com/ÿ…xî  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`aĦū‚ÂØÆä¾°¶·´µ‡²³ÙŒå¿±»£„…½–膎‹©¤Šƒ“òó—ˆÞñžªõôö¢­ÉÇ®bcdËeÈÊÏÌÍÎéfÓÐѯgð‘ÖÔÕhëí‰jikmln oqprsutvwêxzy{}|¸¡~€ìîº     ýþÿ !øù"#$%&'()*+,-./012×3456789:;<=>?@ABCâãDEFGHIJKLMNOPQRSTUVWXYZ[\]ûü^_`abcdefghijklmnopqrstuvwæçxyz{|}~áÛÜÝà߀‚ƒ„…†‡¼ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²˜³š™´ïµ¶¥’œ§”•¹·À¸Á¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ŸÀÁÂÃÄÅÆÇÈÉÊËÌÍΛÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö.nullEurouni00A0uni00ADmacronperiodcenteredAmacronamacronAbreveabreveAogonekaogonek Ccircumflex ccircumflex Cdotaccent cdotaccentDcarondcaronDcroatdcroatEmacronemacronEbreveebreve Edotaccent edotaccentEogonekeogonekEcaronecaron Gcircumflex gcircumflex Gdotaccent gdotaccent Gcommaaccent gcommaaccent Hcircumflex hcircumflexHbarhbarItildeitildeImacronimacronIbreveibreveIogonekiogonek Idotaccenti.loclIJij Jcircumflex jcircumflex Kcommaaccent kcommaaccentkgreenlandic.case kgreenlandicLacutelacute Lcommaaccent lcommaaccentLcaronlcaronLdotldotNacutenacute Ncommaaccent ncommaaccentNcaronncaronnapostrophe.case napostropheEngengOmacronomacronObreveobreve Ohungarumlaut ohungarumlautRacuteracute Rcommaaccent rcommaaccentRcaronrcaronSacutesacute Scircumflex scircumflexuni0162uni0163TcarontcaronTbartbarUtildeutildeUmacronumacronUbreveubreveUringuring Uhungarumlaut uhungarumlautUogonekuogonek Wcircumflex wcircumflex Ycircumflex ycircumflexZacutezacute Zdotaccent zdotaccentlongs Scommaaccent scommaaccentuni021Auni021Bdotlessj apostropheuni02C9WgravewgraveWacutewacute Wdieresis wdieresisYgraveygrave zerosuperior foursuperior fivesuperior sixsuperior sevensuperior eightsuperior ninesuperior zeroinferior oneinferior twoinferior threeinferior fourinferior fiveinferior sixinferior seveninferior eightinferior nineinferior afii61289 estimatedonethird twothirds oneeighth threeeighths fiveeighths seveneighthsonefifth twofifths threefifths fourfifthsonesixth fivesixths oneseventh twosevenths threesevenths foursevenths fivesevenths sixseventhsoneninth twoninths fourninths fiveninths sevenninths eightninthsDeltauni2126uni2215uni2219f_ff_if_lf_f_if_f_lzero.altone.alttwo.alt three.altfour.altfive.altsix.alt seven.alt eight.altnine.alt zero.supsone.supstwo.sups three.sups four.sups five.supssix.sups seven.sups eight.sups nine.sups zero.sinfone.sinftwo.sinf three.sinf four.sinf five.sinfsix.sinf seven.sinf eight.sinf nine.sinf caron.alt commaaccentrevcommaaccentcaron.alt.short Parenleft ParenrightHyphenSlashAt Bracketleft Backslash Bracketright Braceleft Braceright GuilsinglleftBulletEndashEmdashGuilsinglright Exclamdown GuillemotleftGuillemotright Questiondownuni0180uni0181uni0182uni0183uni0184uni0185uni0186uni0187uni0188uni0189uni018Auni018Buni018Cuni018Duni018Euni018Funi0190uni0191uni0193uni0194uni0195uni0196uni0197uni0198uni0199uni019Auni019Buni019Cuni019Duni019Euni019FOhornohornuni01A2uni01A3uni01A4uni01A5uni01A6uni01A7uni01A8uni01A9uni01AAuni01ABuni01ACuni01ADuni01AEUhornuhornuni01B1uni01B2uni01B3uni01B4uni01B5uni01B6uni01B7uni01B8uni01B9uni01BAuni01BBuni01BCuni01BDuni01BEuni01BFuni01C0uni01C1uni01C2uni01C3uni01C4uni01C5uni01C6uni01C7uni01C8uni01C9uni01CAuni01CBuni01CCuni01CDuni01CEuni01CFuni01D0uni01D1uni01D2uni01D3uni01D4uni01D5uni01D6uni01D7uni01D8uni01D9uni01DAuni01DBuni01DCuni01DDuni01DEuni01DFuni01E0uni01E1uni01E2uni01E3uni01E4uni01E5Gcarongcaronuni01E8uni01E9uni01EAuni01EBuni01ECuni01EDuni01EEuni01EFuni01F0uni01F1uni01F2uni01F3uni01F4uni01F5uni01F6uni01F7uni01F8uni01F9 Aringacute aringacuteAEacuteaeacute Oslashacute oslashacuteuni0200uni0201uni0202uni0203uni0204uni0205uni0206uni0207uni0208uni0209uni020Auni020Buni020Cuni020Duni020Euni020Funi0210uni0211uni0212uni0213uni0214uni0215uni0216uni0217uni021Cuni021Duni021Euni021Funi0220uni0221uni0222uni0223uni0224uni0225uni0226uni0227uni0228uni0229uni022Auni022Buni022Cuni022Duni022Euni022Funi0230uni0231uni0232uni0233uni0234uni0235uni0236uni0238uni0239uni023Auni023Buni023Cuni023Duni023Euni023Funi0240uni0241uni0242uni0243uni0244uni0245uni0246uni0247uni0248uni0249uni024Auni024Buni024Cuni024Duni024Euni024Funi0292breve_inverted double_grave ring_acutedieresis_macron dot_macrondieresis_gravedieresis_acutedieresis_breve tilde_macron acute.asccircumflex.asc caron.ascdieresis_grave.capdieresis_acute.capdieresis_breve.capuni0400 afii10023 afii10051 afii10052 afii10053 afii10054 afii10055 afii10056 afii10057 afii10058 afii10059 afii10060 afii10061uni040D afii10062 afii10145 afii10017 afii10018 afii10019 afii10020 afii10021 afii10022 afii10024 afii10025 afii10026 afii10027 afii10028 afii10029 afii10030 afii10031 afii10032 afii10033 afii10034 afii10035 afii10036 afii10037 afii10038 afii10039 afii10040 afii10041 afii10042 afii10043 afii10044 afii10045 afii10046 afii10047 afii10048 afii10049 afii10065 afii10066 afii10067 afii10068 afii10069 afii10070 afii10072 afii10073 afii10074 afii10075 afii10076 afii10077 afii10078 afii10079 afii10080 afii10081 afii10082 afii10083 afii10084 afii10085 afii10086 afii10087 afii10088 afii10089 afii10090 afii10091 afii10092 afii10093 afii10094 afii10095 afii10096 afii10097uni0450 afii10071 afii10099 afii10100 afii10101 afii10102 afii10103 afii10104 afii10105 afii10106 afii10107 afii10108 afii10109uni045D afii10110 afii10193afii10066.locluni0462uni0463uni0472uni0473uni0474uni0475uni048Auni048Buni048Cuni048Duni048Euni048F afii10050 afii10098uni0492uni0493uni0494uni0495uni0496uni0497uni0498uni0499uni049Auni049Buni049Cuni049Duni049Euni049Funi04A0uni04A1uni04A2uni04A3uni04A4uni04A5uni04A6uni04A7uni04A8uni04A9uni04AAuni04ABuni04ACuni04ADuni04AEuni04AFuni04B0uni04B1uni04B2uni04B3uni04B4uni04B5uni04B6uni04B7uni04B8uni04B9uni04BAuni04BBuni04BCuni04BDuni04BEuni04BFuni04C0uni04C1uni04C2uni04C3uni04C4uni04C5uni04C6uni04C7uni04C8uni04C9uni04CAuni04CBuni04CCuni04CDuni04CEuni04CFuni04D0uni04D1uni04D2uni04D3uni04D4uni04D5uni04D6uni04D7uni04D8uni04D9uni04DAuni04DBuni04DCuni04DDuni04DEuni04DFuni04E0uni04E1uni04E2uni04E3uni04E4uni04E5uni04E6uni04E7uni04E8uni04E9uni04EAuni04EBuni04ECuni04EDuni04EEuni04EFuni04F0uni04F1uni04F2uni04F3uni04F4uni04F5uni04F6uni04F7uni04F8uni04F9 afii61352 afii00208uni20B4uni20AEtengeroublekratkaAlphaBetaGammauni0394EpsilonZetaEtaThetaIotaKappaLambdaMuNuXiOmicronPiRhoSigmaTauUpsilonPhiChiPsialphabetagammadeltaepsilonzetaetathetaiotakappalambdauni03BCnuxiomicronrhosigma1sigmatauupsilonphichipsiomega Alphatonos EpsilontonosEtatonos Iotatonos Iotadieresis Omicrontonos UpsilontonosUpsilondieresis Omegatonos alphatonos epsilontonosetatonos iotatonos iotadieresisiotadieresistonos omicrontonosupsilondieresis upsilontonosupsilondieresistonos omegatonostonos tonos.cap dieresistonosuni1F00uni1F01uni1F02uni1F03uni1F04uni1F05uni1F06uni1F07uni1F08uni1F09uni1F0Auni1F0Buni1F0Cuni1F0Duni1F0Euni1F0Funi1F10uni1F11uni1F12uni1F13uni1F14uni1F15uni1F18uni1F19uni1F1Auni1F1Buni1F1Cuni1F1Duni1F20uni1F21uni1F22uni1F23uni1F24uni1F25uni1F26uni1F27uni1F28uni1F29uni1F2Auni1F2Buni1F2Cuni1F2Duni1F2Euni1F2Funi1F30uni1F31uni1F32uni1F33uni1F34uni1F35uni1F36uni1F37uni1F38uni1F39uni1F3Auni1F3Buni1F3Cuni1F3Duni1F3Euni1F3Funi1F40uni1F41uni1F42uni1F43uni1F44uni1F45uni1F48uni1F49uni1F4Auni1F4Buni1F4Cuni1F4Duni1F50uni1F51uni1F52uni1F53uni1F54uni1F55uni1F56uni1F57uni1F59uni1F5Buni1F5Duni1F5Funi1F60uni1F61uni1F62uni1F63uni1F64uni1F65uni1F66uni1F67uni1F68uni1F69uni1F6Auni1F6Buni1F6Cuni1F6Duni1F6Euni1F6Funi1F70uni1F71uni1F72uni1F73uni1F74uni1F75uni1F76uni1F77uni1F78uni1F79uni1F7Auni1F7Buni1F7Cuni1F7Duni1F80uni1F81uni1F82uni1F83uni1F84uni1F85uni1F86uni1F87uni1F88uni1F89uni1F8Auni1F8Buni1F8Cuni1F8Duni1F8Euni1F8Funi1F90uni1F91uni1F92uni1F93uni1F94uni1F95uni1F96uni1F97uni1F98uni1F99uni1F9Auni1F9Buni1F9Cuni1F9Duni1F9Euni1F9Funi1FA0uni1FA1uni1FA2uni1FA3uni1FA4uni1FA5uni1FA6uni1FA7uni1FA8uni1FA9uni1FAAuni1FABuni1FACuni1FADuni1FAEuni1FAFuni1FB0uni1FB1uni1FB2uni1FB3uni1FB4uni1FB6uni1FB7uni1FB8uni1FB9uni1FBAuni1FBBuni1FBCuni1FBDuni1FBEuni1FBFuni1FC0uni1FC1uni1FC2uni1FC3uni1FC4uni1FC6uni1FC7uni1FC8uni1FC9uni1FCAuni1FCBuni1FCCuni1FCDuni1FCEuni1FCFuni1FD0uni1FD1uni1FD2uni1FD3uni1FD6uni1FD7uni1FD8uni1FD9uni1FDAuni1FDBuni1FDDuni1FDEuni1FDFuni1FE0uni1FE1uni1FE2uni1FE3uni1FE4uni1FE5uni1FE6uni1FE7uni1FE8uni1FE9uni1FEAuni1FEBuni1FECuni1FEDuni1FEEuni1FEFuni1FF2uni1FF3uni1FF4uni1FF6uni1FF7uni1FF8uni1FF9uni1FFAuni1FFBuni1FFCuni1FFDuni1FFE uni1F88.alt uni1F89.alt uni1F8A.alt uni1F8B.alt uni1F8C.alt uni1F8D.alt uni1F8E.alt uni1F8F.alt uni1F98.alt uni1F99.alt uni1F9A.alt uni1F9B.alt uni1F9C.alt uni1F9D.alt uni1F9E.alt uni1F9F.alt uni1FA8.alt uni1FA9.alt uni1FAA.alt uni1FAB.alt uni1FAC.alt uni1FAD.alt uni1FAE.alt uni1FAF.alt uni1FBC.alt uni1FCC.alt uni1FFC.altuni20B9uniE0FFuniEFFDuniF000 ÿÿ BŠcyrlgrek latn,ÿÿÿÿÿÿkernkern$kern4"*2:BJ@ &3.uî|x,® Ðtÿ¼€ 6LVh~¦¼Òè*Hb|– ¶ÈÚì&0:Pf|Ž¨ÂØêü 6LRX^djpv|‚ˆŽ”šÌâ$N\Šœºð*Xrx~–¨¾ÌÞð*dz¦¼Òèþ (6DR`n€’¤¶ÈÚìþ 8 r ¬ æ ü  . 8 N ` r „ – Ð D ~ Œ š ¨ ¶ Ä Ò àÊ+# Çÿ÷ÉÊ., ÇÊ3,$!Ê.)Ê(( ¿ÿËÊ5-'É Ê$! ÇÊ4-(,ÇÊ4-(,¿ÿËÊ5-'¿ÿËÊ5-'¿Ç/ÉGÊveV^Ê+# Ê+# ¿Ç/ÉGÊveV^Çÿ÷ÉÊ., Çÿ÷ÉÊ., Çÿ÷ÉÊ., Ê.)¿ÿËÊ5-'É Ê$! É Ê$! É Ê$! ÇÊ4-(,Çÿ÷ÉÊ., Ê.)Ê.)Ê.)¿ÿËÊ5-'ÇÊ4-(,ÇÊ3,$!Ê+# Çÿ÷ÉÊ., Çÿ÷ÉÊ., ¿ÿËÊ5-'É Ê$! Ê+# É Ê$! É Ê$! ¿ÿËÊ5-'¿ÿËÊ5-'&5&05&&00555& Ü/Ý=*PÿëQÿë¦ÿö¨T©>ª «Ý'¨?©4Ü!Ý/*  ¨I©4ݨ4©Ý¨4© Ü)Ý6*)§ ¨S©?«  ¨© Ü$Ý2=) § ¨T©?ª«Ý  ¨4©Ü!Ý/6¨S©; Ü,Ý9>4))§¨h©Hª «*µÿÒ¶ÿÒÜ2ÝT?>*PQ ¦§*¨s©^ª«4 Ü+Ý9%  § ¨]©?ª «ÜÝ$¨4©)¨ ¨Ü/Ý\¨i©]¨Üÿïݨ5© Ý'¨?©4ݨ4©Ý¨4©Ý¨4©Ü2ÝT?>*PQ ¦§*¨s©^ª«4Ü2ÝT?>*PQ ¦§*¨s©^ª«4·»,½ ÀbÃÝ'¨?©4Ý'¨?©4Ý'¨?©4Ý'¨?©4Ý'¨?©4Ý'¨?©4ݨ4©Ý¨4©Ý¨4©Ý¨4©Ý¨4©Ý¨4©Ý¨4©Ý¨4©Ý¨4©Ý¨4©Ý¨4©Ý¨4©Ý¨4©Ý¨4©Ý¨4©Ý¨4©Ü2ÝT?>*PQ ¦§*¨s©^ª«4Ü2ÝT?>*PQ ¦§*¨s©^ª«4Ü2ÝT?>*PQ ¦§*¨s©^ª«4Ü2ÝT?>*PQ ¦§*¨s©^ª«4Ý'¨?©4Ý'¨?©4ݨ4©Ý¨4©» ÀH·»*½ÀfÃݨ4©Ý¨4©Ý¨4©Ý¨4©Ü2ÝT?>*PQ ¦§*¨s©^ª«4Ü2ÝT?>*PQ ¦§*¨s©^ª«4Ü2ÝT?>*PQ ¦§*¨s©^ª«4Ü2ÝT?>*PQ ¦§*¨s©^ª«4ݨ4©Ý¨4©Ý¨4©Ý¨4©Ý¨4©Ý¨4©Ý¨4©Ý¨4©ôÒúÿ64`ÿëÿâÿßÿØÿÞÿóÿöÿó ÿêÿêÿñÿîÿçÿâÿäÿÎÿÜÿòÿôÿòÿæÿçÿíÿí ÿâÿäÿîÿö ÿðÿóÿÜ  ÿö ÿñ ÿöÿçÿçÿçÿçÿçÿçÿçÿâÿëÿçÿÛÿÄÿÞÿðÿöÿð 5P4ÿÇ&7ÿÄÿÂÿöÿøÿøÿøÿøÿøÿøÿøÿì ÿóÿçÿéÿâÿÞÿðÿöÿð ÿçÿñÿëÿçÿÛÿÄÿÞÿðÿöÿð ÿçÿñÿìÿî ÿçÿÛÿÄÿÞÿðÿöÿð ÿçÿñÿò ÿçÿÛÿÄ ÿðÿöÿð ÿçÿñ ÿæ ÿÔ ÿÝ ÿêÿöÿÜÿÜÿÜÿÜÿÜÿÜÿàÿìÿôÿøÿöÿðÿêÿïÿëÿèÿòÿÄÿÞÿõÿõÿõÿçÿæÿòÿëÿçÿÛÿÄÿÞÿðÿöÿð ÿçÿñÿîÿîÿçÿâÿäÿÎÿÜÿòÿôÿòÿæÿçÿîÿé ÿâÿäÿîÿö ÿîÿçÿâÿäÿÎÿÜÿòÿôÿòÿæÿçÿíÿí ÿâÿäÿîÿö ÿðÿëÿçÿéÿâÿÞÿðÿöÿð ÿçÿñ* ÿöÿÈ0ÿÄÿÈ ÿòÿöÿöÿöÿöÿöÿöÿöÿòÿìÿóÿöÿÜÿâÿÞÿîÿõÿøÿïÿñÿìÿß ÿöÿí ÿìÿìÿìÿìÿìÿìÿìÿöÿìÿçÿéÿÄÿãÿðÿöÿð ÿçÿñÿãÿ×'ÿÈÿØ ÿöÿòÿòÿòÿòÿòÿòÿíÿöÿäÿå(ÿËÿÞÿöÿôÿôÿôÿôÿôÿôÿòÿö ÿãÿì ÿåÿöÿèÿèÿèÿèÿèÿèÿèÿéÿìÿôÿôÿîÿóÿãÿ× ÿÈÿØ ÿöÿòÿòÿòÿòÿòÿòÿíÿöÿõÿäÿô ÿð ÿñÿñÿñÿñÿñÿñÿñ ÿèÿ¶ÿÓÿÎÿêÿÝÿáÿÝÿÁÿÆÿÛÿêÿöÿèÿõÿíÿæ  ÿâÿæ ÿëÿñÿçÿâÿöÿöÿìÿðÿçÿíÿëÿôÿðÿðÿîÿëÿíÿæ<#ZF (FÿìÿçÿÿÿíÿÙÿÙÿÙÿÙÿÙÿÙÿòÿãÿíÿíÿíÿ°ÿàÿ°ÿæÿÝÿæÿÝ*ÿ´ÿ¿ÿÍÿñÿõÿõÿõÿõÿõÿõÿõÿò ÿîÿö %ÿçÿç!ÿçÿçÿ®ÿìÿ¿ÿØ%ÿœÿñÿïÿîÿÔÿòÿïÿòÿìÿíÿÏÿö ÿóÿôÿìÿìÿéÿöÿö ÿö ÿâÿøÿö ÿöÿîÿâÿöÿêÿÞÿæÿòÿîÿêÿõÿö'$ÿõ ÿè ÿôÿôÿôÿôÿôÿôÿöÿôÿóÿçÿçÿçÿçÿí ÿîÿìÿíÿìÿô ÿðÿØÿÌ ÿðÿçÿéÿéÿçÿöÿÚÿÓÿöÿÄÿëÿéÿñÿèÿãÿïÿðÿòÿò( ÿôÿôÿôÿôÿôÿôÿôÿö ÿîÿî   ÿÁ(%ÿÂÿ²ÿöÿìÿîÿöÿèÿöÿöÿöÿöÿöÿöÿöÿõÿìÿòÿìÿóÿìÿìÿìÿÐÿøÿøÿµÿøÿø ÿ‹ÿÞÿãÿöÿæÿõÿõÿö ÿöÿìÿìÿìÿöÿö ÿá ÿíÿóÿØÿïÿíÿØÿÒÿÒÿÒÿÎ"ÿÍ ÿòÿöÿØÿØÿØÿØÿØÿØÿÞÿìÿíÿöÿÞÿóÿö ÿÉÿÉÿÉÿÉ $ÿïÿãÿÈÿëÿö ÿÏÿïÿðÿôÿšÿÜÿ°ÿàÿÑÿãÿÑ/ÿÀÿÉÿŸÿôÿì(ÿí  ÿðÿìÿìÿìÿìÿ²ÿöÿ«ÿÎÿœÿÎÿõÿáÿÆÿñÿç ÿöÿðÿìÿìÿñÿöÿöÿöÿñÿôÿöÿìÿíÿìÿô ÿóÿØÿÌ ÿçÿéÿéÿçÿöÿÚÿÓÿöÿÄÿêÿéÿõÿèÿçÿïÿðÿõÿõÿîÿøÿóÿ¤ÿöÿ˜ÿ± ÿöÿë ÿìÿñÿñÿñÿñÿñÿñÿé ÿìÿòÿ¼ÿ§ ÿêÿöÿƒÿíÿÖÿàÿîÿóÿíÿòÿìÿíÿìÿô ÿØÿÌ ÿçÿéÿéÿçÿöÿÚÿÓÿöÿÄÿéÿðÿõÿõÿöÿñÿöÿé ÿì ÿê ÿöÿçÿçÿçÿçÿçÿçÿçÿäÿöÿöÿîÿîÿîÿîÿöÿøÿñÿßÿóÿøÿÝÿöÿðÿóÿðÿì ÿñÿõ ÿìÿöÿöÿöÿìÿìÿô(ÿµÿµÿµÿËÿÉÿ¯ÿžÿµÿ¹ÿµÿÃÿÜÿµÿµÿµÿµÿµÿµÿµÿ¤ÿ¾ÿìÿîÿ»ÿîÿ¸ÿ»ÿ»ÿ»ÿ®ÿéÿéÿ­ÿéÿé" ÿÿâÿñÿÅÿèÿÙÿöÿà ÿÉ ÿâÿÊ ÿìÿíÿÉÿîÿì (%ÿÁ%ÿâÿ°ÿ¢ÿôÿØÿôÿãÿ×ÿÉÿÉÿÉÿÉÿÉÿÉÿÃÿâÿáÿëÿîÿÚÿéÿéÿéÿ¿ÿçÿçÿ©ÿçÿç % 'ÿlÿïÿëÿíÿõ ÿÏÿíÿöÿëÿîÿÔÿÂÿõÿìÿõÿØÿöÿöÿÑÿöÿö # ÏÝ„ßÎFz( ÿäÿßÿßÿßÿßÿñÿßÿñÿßÿñÿðÿò ÿèÿð(ÿËÿÜÿöÿõÿäÿèÿâÿâÿâÿâÿâÿâÿâ ÿèÿèÿèÿè"ÿÛ $ÿëÿóÿóÿìÿíÿæÿàÿò$ÿÚÿÚÿÚÿÚ$!ÿòÿôÿòÿÜÿðÿæÿö ('ÿ·ÿ¨ÿ¨ÿ¨ÿ¨ÿÛÿ¨ÿÛÿ¨ÿÛÿºÿÞÿöÿìÿöÿ¾ÿ±ÿpÿ¦ÿñÿÁÿïÿÎÿÙ"ÿöÿ½ÿ¡ÿœÿÚÿÅÿœÿÓÿÓÿ¬ÿÓÿÓÿö"'"")ÿÝÿßÿåÿÐÿíÿè ÿñÿæÿâÿï ÿöÿöÿöÿöÿöÿö+ÿá ÿöÿìÿöÿôÿôÿôÿô  ÿìÿíÿìÿÝÿøÿËÿîÿèÿàÿèÿÈÿà ÿåÿäÿ×ÿìÿêÿöÿÝÿÚÿé ÿêÿíÿìÿêÿëÿìÿìÿõÿëÿçÿâÿâÿâÿâÿëÿâÿëÿâÿëÿîÿçÿöÿöÿâÿãPÿìÿöÿâÿìÿìÿìÿì! Uÿó ÿðÿñÿõ ÿãÿæÿîÿðÿòÿìÿéÿíÿóÿìÿóÿíÿßÿóÿìÿØÿõÿêÿòÿèÿöÿêÿåÿðZÿÝÿÜÿÜÿÜÿÜÿÞÿÜÿÞÿÜÿÞÿßÿÝÿâÿâÿâÿäÿØÿäÿìÿìÿäÿìÿì#&ÿá^ ÿêÿîÿÚÿÜÿñ!ÿòÿòÿöÿõÿðÿôÿðÿðÿðZÿêÿîÿÚÿÜÿñÿóÿóÿîÿïÿóÿñÿòÿòÿöÿõÿðÿïÿâÿâÿâÿâÿâÿâÿö ÿuÿÑÿíÿ°ÿ˜ÿêÿöÿöÿöÿáÿôÿóÿðÿ”ÿÎÿ©ÿÎÿì ÿöÿöÿäÿàÿÖÿàÿàÿÖÿàÿì ÿ=ÿºÿ®ÿâÿâÿ¡ÿâÿâ!ÿì ÿ¾ÿç ÿÁÿ¸ÿ¸ÿ¸ÿ¸ÿÖÿ¸ÿÖÿ¸ÿÖÿ³ÿßÿöÿöÿöÿÿ·ÿžÿÛÿÛÿ—ÿÛÿÛÿìÿßÿíÿöÿìÿ²ÿÜÿö ÿöÿöÿöÿö ÿ×ÿãÿ×ÿßÿßÿßÿß ÿ´ÿƒÿ´ÿ” ÿì  ÿ½ÿöÿå  ÿë ÿäÿÔ ÿð ÿâ ÿìÿµÿ×ÿíÿÚÿ°ÿèÿïÿÒÿèÿÉÿöÿÝ ÿìÿÓ ÿñÿÉÿâÿàÿ½ÿöÿÞ&%ÿàÿíÿâÿâÿâÿâÿâÿâÿâÿÇÿÉÿÇÿìÿØÿØ(ÿØÿØ ÿ¯ÿ®ÿÖÿ¡ÿìÿ±ÿðÿâ ÿÂÿóÿÚ ÿì ÿçÿçÿçÿçÿçÿçÿçÿìÿâÿì<ÿìÿØÿØ ÿØÿØÿ¦ÿ’ÿºÿ’ ÿâŒÿÓÿº ÿöÿâÿÎÿñÿâÿØÿâÿâÿâÿâÿâÿâÿâÿâÿâÿâÿâÿöÿÙÿÆÿÆÿÆÿÆÿàÿÆÿàÿÆÿàÿáÿíÿˆÿÑÿÝÿ¿ÿèÿèÿ¹ÿèÿè+0+!2ÿöÿöÿÂÿÙ(ÿñÿìÿìÿìÿìÿìÿìÿìÿÛÿâ ÿÛÿìÿìÿìÿìÿ°ÿºÿØ ÿœÿÁÿßÿöÿÏÿÙÿØÿØÿØÿØÿßÿØÿßÿØÿßÿÛÿÚÿéÿéÿáÿ¸ÿÕÿÖÿØÿØÿÉÿØÿØÿÞÿ—ÿÂÿÖÿÂÿ²ÿÎÿßÿìEÿßÿßÿßÿáÿßÿßÿßÿßÿßÿáÿáÿáÿáÿáÿáÿáÿáÿáÿáÿáÿÞÿöÿÉÿìÿïÿÜÿãÿõÿçÿÖÿôÿóÿôÿêÿðÿçÿôÿöÿîÿöÿâÿöÿõÿæÿïÿóÿô  $ ÿË ÿÛÿôÿõÿõÿñÿñ PÿëÿíÿôÿíÿðÿíÿçÿâÿÙ ÿçÿéÿòÿ´ÿÏÿèÿèÿ»ÿèÿèÿõÿÑÿçÿäÿëÿðZÿçÿã ÿãÿãÿèÿíÿèÿïÿíÿêÿéÿèÿèÿÅÿÏÿãÿÁÿîÿïÿï ÿïÿïZÿöÿöÿöÿñÿöÿö ÿÊÿìÿÖÿáÿìÿÜÿÐÿíÿòÿòÿòÿò ÿöÿóÿö ÿìÿë ÿòÿìÿÓ  ÿëÿö ÿôÿñÿóÿçÿêÿëÿôÿéÿëÿîÿîÿîÿñÿõÿöÿóÿöÿòÿîÿêÿöÿöÿöÿòÿéÿöÿöÿïÿðÿòÿöÿóÿöÿîÿìÿèÿâÿñÿðÿçÿòÿìÿÝÿèÿöÿöÿöÿñÿöÿôÿñÿâÿöÿâÿôÿê& ÿï  ÿçÿâÿöÿñÿòÿêÿöÿèÿìÿöÿñÿöÿöÿöÿè%ÿïÿò ÿôÿö(ÿÆ ÿôÿæÿÛÿ´ÿÿíÿÖÿîÿôÿÈÿÝÿòÿòÿôÿÒÿñÿö ÿöÿô ÿñÿö ÿöÿí ÿöÿêÿÛÿÌÿíÿôÿö !ÿéÿîÿÕ ÿÔÿôÿóÿöÿïÿôÿðÿêÿÝÿíÿîÿîÿëÿöÿîÿöÿÓÿÝÿêÿçÿæÿæÿÃÿÁÿÖÿ»ÿîÿõÿêÿîÿåÿôÿöÿôÿóÿóÿðÿòÿõÿòÿöÿôÿñÿñÿöÿöÿöÿóÿíÿóÿÞÿãÿÜÿðÿîÿîÿîÿËÿÐÿßÿÒÿÍÿòÿöÿñÿñÿéÿîÿãÿñÿôÿðÿöÿöÿïÿôÿó ¢d¢Ô1ÿõÿõÿõ)ÿôÿðÿñÿâÿíÿîÿðÿâÿóÿòÿòÿòÿïÿìÿçÿëÿîÿîÿëÿîÿéÿöÿòÿòÿõÿõÿòÿöÿõÿôÿöÿëÿöÿçÿçÿóÿõÿõ ÿéÿßÿÓÿÇÿçÿôÿôÿñÿóÿïÿêÿõÿõÿëÿåÿÎÿÄÿ³ÿâÿéÿàÿðÿôÿ½ÿàÿÓÿÉÿÃÿÒÿöÿ×ÿîÿÍÿÓÿÎÿðÿÎÿñÿÎÿîÿáÿìÿóÿîÿòÿèÿÚÿòÿ󆸡`£D3R ÿìÿöÿì!ÿìÿíÿðÿöÿéÿôÿëÿòÿïÿëÿëÿöÿóÿâÿëÿâÿâÿîÿÞÿãÿìÿõÿíÿØÿìÿòÿðÿìÿìÿìÿíÿòÿöÿòÿìÿì&ÿìÿäÿâÿïÿçÿÞÿäÿÞÿÞÿâÿÜÿÞÿÜÿÜÿåÿÚÿ×ÿãÿäÿäÿäÿâ ÿîÿìÿöÿöÿðÿîÿðÿðÿðÿîÿêÿìÿì&ÿìÿëÿâÿïÿòÿÞÿîÿÞÿÞÿâÿÜÿÞÿÜÿÜÿìÿäÿÞÿîÿäÿäÿäÿâ ÿôÿñÿîÿðÿóÿöÿöÿíÿòÿöÿêÿðÿìÿëÿïÿâÿâÿâÿïÿõÿ°ÿ°ÿ°ÿæÿê ÿñÿãÿìÿïÿãÿãÿàÿÜÿëÿÆÿÆÿÆÿðÿÞ ÿâÿâÿâÿØ ÿâÿìÿì ÿìÿÖÿÖÿÖÿÄÿìÿâÿ®ÿ®ÿ®ÿìÿÎ ÿâ ÿÛÿÛÿÛÿ¦ÿìÿöÿÎÿºÿÖÿâÿìÿÖÿÖÿöÿØÿ¸ÿÖÿ¸ÿšÿíÿ’ÿÎÿºÿžÿžÿžÿõÿœÿð ÿ½ÿåÿöÿöÿö ÿè ÿµÿ° ÿÚ ÿðÿðÿðÿäÿæÿöÿÉÿ½ÿà  ÿì    ÿì ÿðÿØÿØÿ¯ÿ¡ÿØÿìÿÇÿöÿìÿÇÿâÿâÿâÿìÿâÿâÿ°ÿã ÿÂÿÚ  ÿØÿØÿ¦ÿ’ÿØÿçÿâÿâÿÎ ÿâÿìÿçÿçÿçÿìÿâÿâÿ¦ÿâÿÎÿâÿâÿâÿâÿâÿâÿâÿâÿâÿèÿìÿè+2ÿè!ÿÆÿâÿØÿàÿòÿà(ÿàÿÆÿàÿÆÿÆÿìÿÄÿìÿÎÿ¿ÿ¿ÿ¿ÿÄÿì ÿôÿÜÿÖÿçÿñÿìÿìÿìÿöÿôÿêÿêÿàÿóÿíÿëÿíÿîÿîÿòÿõÿëÿãÿâÿßÿáÿèÿõÿèÿéÿÈÿÍÿÈ ÿêÿðÿäÿæÿèÿæÿõÿÜÿÜÿèÿïÿÛÿÒÿèÿèÿÅÿºÿâÿÌ ÿóÿòÿèÿèÿäÿìÿõÿñÿöÿöÿöÿöÿð ÿæÿáÿÐÿÔÿìÿïÿìÿÜÿçÿçÿ®ÿœÿç%ÿöÿÝÿïÿÝÿìÿõÿõÿõÿìÿöÿâ%%%ÿÎÿç ÿâÿÆÿîÿ°ÿàÿ°ÿæÿöÿæÿñÿ´ÿ¿ ÿòÿìÿíÿÈÿöÿîÿÞÿêÿöÿöÿöÿöÿöÿìÿøÿôÿâ ÿìÿìÿéÿé ÿñÿâÿîÿîÿó ÿìÿìÿìÿ¦ÿÕÿÄÿ¦ÿÎÿÎÿÎ ÿÎÿÌÿµÿÎÿ­ÿ«ÿÎÿ¦ÿÎÿ°ÿ¦ÿ¦ÿ¦ÿêÿ’ÿâÿöÿõÿ¦ÿˆ(ÿñÿÉ2ÿØÿºÿÞÿôÿÔÿó ÿèÿ°ÿêÿØÿöÿçÿçÿ®ÿœÿç%ÿöÿÝÿðÿÝÿìÿõÿõÿõÿìÿâ%%%ÿÎÿç ÿâÿÆÿîÿ°ÿàÿ°ÿæÿæÿñÿ´ÿ¿ ÿóÿîÿîÿÍÿö ÿîÿî ÿî ÿôÿôÿôÿìÿìÿö ÿö"   ÿôÿôÿôÿìÿì ÿöÿöÿöÿö ÿðÿáÿå ÿôÿìÿöÿæÿöÿöÿöÿ÷ÿéÿÓÿÚÿîÿçÿçÿçÿ÷ÿöÿîÿöÿØÿÌÿíÿìÿì ÿêÿèÿàÿçÿéÿìÿöÿÉÿÉÿµ$ÿØÿÒÿØÿØÿìÿÒÿâÿØÿØÿØÿØÿØÿÎÿØÿöÿâ" ÿÎÿíÿØ ÿóÿÍ ÿãÿÁÿëÿöÿÎÿòÿÈÿôÿçÿçÿ®ÿœÿç%ÿöÿÝÿïÿÝÿìÿõÿõÿõÿìÿöÿâ%%%ÿÎÿç ÿâÿÆÿîÿ°ÿàÿ°ÿæÿöÿæÿñÿ´ÿ¿ ÿòÿëÿíÿÈÿöÿ÷ÿ÷ÿøÿøÿõÿéÿòÿòÿöÿôÿôÿöÿöÿîÿî ÿî     ÿöÿ÷ÿéÿÓÿÚÿîÿçÿçÿçÿ÷ÿöÿîÿöÿØÿÌÿíÿìÿì ÿêÿèÿàÿçÿéÿìÿöÿöÿöÿ÷ ÿöÿêÿìÿìÿøÿòÿóÿñÿñÿñÿçÿìÿ¼ÿ¼ÿ¼ÿóÿâ ÿ˜ÿ± ÿóÿòÿóÿö ÿíÿÖÿàÿîÿøÿòÿâÿâÿâ ÿìÿìÿìÿìÿìÿöÿìÿìÿì ÿìÿõ ÿòÿé ÿçÿö ÿõÿìÿì ÿéÿé"ÿéÿœÿµÿìÿ°ÿ»ÿ»ÿ»ÿµÿµÿ»ÿµÿµÿ»ÿœÿ»ÿºÿ®ÿ®ÿ®ÿìÿœÿµÿöÿîÿ¯ÿžÿÃ(ÿîÿµÿ¾ÿÅÿèÿâÿñÿÉÿÜÿç ÿÓÿøÿÓ")ÿÓ"ÿ¨ÿöÿºÿºÿÛÿåÿÛÿÛÿöÿ¨ÿÛÿ¨ÿ¨ÿÛÿœÿÛÿÄÿœÿœÿœÿœÿì ÿèÿÙÿöÿ¡ÿœÿÚ('ÿð'ÿ±ÿæÿºÿïÿåÿÐÿí"ÿ½ÿÅÿá ÿöÿõÿéÿÓÿÚÿðÿçÿçÿçÿöÿîÿöÿõÿõÿõÿõÿõÿñÿØÿÌÿíÿìÿì ÿàÿâÿÛÿäÿéÿìÿóÿð$ÿíÿæÿòÿÛ ÿàÿòfÆ…ª‡LM$ÿÚ$ ÿÚ !ÿÚ$ÿö ÿâÿèÿðÿìÿâÿèÿìÿâÿâÿâÿØÿîÿéÿåÿìÿëÿÔ ÿëÿßÿöÿÎÿ÷ÿÎÿ÷ÿöÿóÿ÷ÿâÿïÿêÿêÿâÿâÿâÿöÿâÿóÿìÿÌÿÒÿìÿòÿíÿ°ÿ¦ÿôÿî ÿÎÿôÿôÿôÿôÿöÿôÿõÿìÿöÿöÿöÿöÿöÿìÿò ÿöÿè ÿ÷ ÿê  ÿìÿíÿô ÿöÿöÿâÿêÿõÿðÿñ ÿöÿõ ÿìÿìÿöÿðÿñÿìÿìÿñÿöÿñÿñÿìÿòÿòÿòÿñÿùÿ ÿØ'ÿìÿãÿãÿöÿöÿñÿöÿìÿòÿö ÿêÿîÿïÿáÿìÿìÿØÿìÿöÿâÿâÿâÿöÿöÿìÿìÿì ÿìÿöÿåÿïÿñÿóÿìÿöÿöÿìÿö2ÿöÿçÿçÿçÿëÿÚ(ÿâÿöF( ÿì2ÿöÿÙÿðÿðÿöÿñÿÄÿÞÿÞÿåÿçÿÛÿçÿëÿìÿØÿó ÿçÿóÿôÿñÿóÿÝÿâÿëÿîÿÜÿÜÿÜÿØÿìÿäÿô ÿêÿöÿöÿÔÿæÿæ ÿÝÿòÿñÿñÿìÿöÿñÿÄÿØÿíÿÕÿ× ÿöÿÖÿó ÿíÿðÿòÿïÿöÿñÿòÿìÿöÿòÿòÿòÿñÿùÿÈÿØ'ÿìÿãÿãÿÊÿâÿÎÿìÿìÿâÿºÿºÿºÿºÿâÿÎÿÉÿØÿÎÿÞÿöÿæÿíÿâÿàÿØÿàÿàÿàÿñÿâÿêÿðÿðÿçÿîÿöÿòÿòÿøÿîÿâÿäÿç ÿÎÿÜÿÜÿãÿâÿäÿæÿç ÿéÿòÿñÿòÿìÿöÿìÿäÿðÿö ÿÎÿÜÿäÿæÿôÿîÿëÿãÿöÿØÿÎ< ÿìÿòÿôÿì ÿèÿòÿö ÿîÿîÿî ÿìÿæÿñÿìÿìÿöÿåÿìÿîÿîÿñÿöÿñÿçÿâÿìÿðÿâ ÿØÿÚÿäÿÝÿïÿæÿèÿöÿßÿâÿçÿñÿöÿèÿèÿèÿç ÿöÿôÿôÿöÿìÿãÿã ÿåÿöÿñÿðÿâÿâÿðÿóÿ×ÿÞÿíÿãÿôÿâÿñÿìÿâÿíÿêÿõÿîÿîÿöÿìVNyP{š,dÿôÿìÿëÿâÿçÿôÿòÿéÿòÿòÿöÿòÿâÿòÿéÿÜÿìÿòÿòÿòÿîÿî Uÿòÿàÿâÿð ÿîÿôÿí ÿñÿñÿíÿëÿìÿîÿßÿïÿóÿìÿñÿëÿêÿòÿïÿòÿìÿâÿÚÿÝÿëÿæÿàÿêÿêÿåÿêÿÜÿêÿàÿÚÿÜÿêÿõÿêÿåÿß ^ÿõÿÛÿÜÿêÿåÿä ÿäÿäÿßÿâÿåÿêÿçÿêÿçÿçÿçÿäÿïÿðÿêÿöÿöÿöÿðÿð!ÿîÿðÿöÿõÿóÿóÿòÿéÿéÿåÿïÿòÿðÿëÿðÿðÿîÿðÿëÿðÿëÿäÿçÿðÿõÿðÿïÿð@ÿõÿãÿäÿïÿî ÿëÿòÿòÿòÿòÿîÿîÿòÿðÿóÿîÿëÿóÿõÿð ÿòÿóÿöÿïÿìÿñÿêÿîÿóÿóÿ¸ÿïÿôÿêÿïÿÓÿðÿñÿâÿðÿîÿöÿöÿöÿðÿ·ÿõÿóÿ˜ÿ°ÿðÿñ ÿõÿ´ÿÒÿôÿöÿÆÿñÿðÿÖÿãÿðÿãÿàÿÐ ÿçÿñ ÿãÿœÿðÿôÿ¡ÿÆÿÁÿÓÿí ÿÉ ÿâÿôÿäÿÕÿàÿòÿÖÿãÿËÿéÿìÿäÿ›ÿðÿöÿ¡ÿ®ÿÄÿÒÿìÿìÿìÿÂÿÛÿîÿçÿÁÿëÿÆÿÏÿëÿëÿáÿëÿ¸ÿëÿÏÿ»ÿëÿëÿîÿÓÿ³ÿëÿîÿÏ ÿôÿ”ÿâÿôÿåÿïÿ—ÿžÿóÿ¾ÿñÿÂÿòÿÚÿèÿ½ÿí   ÿìÿñÿÓ ÿµÿßÿÚÿî ÿÀÿéÿèÿâÿðÿèÿáÿèÿäÿãÿîÿäÿðÿôÿöÿãÿÉÿèÿà    ÿÓÿñÿðÿìÿñÿé   ÿØÿñÿ¯ÿØÿâÿáÿÔÿïÿÀÿÑÿöÿ×( ÿÛÿíÿñÿßÿ´ÿ­ÿÂÿê ÿÌÿèÿî+ÿî!ÿÙÿóÿñÿÒÿßÿñÿñÿäÿñÿÆÿñÿßÿÝÿñÿñÿóÿåÿáÿñÿîÿßÿÊÿëÿîÿöÿ¹ÿ¿ÿîÿËÿÒÿå ÿðÿõÿàÿÜÿèÿçÿòÿÜÿïÿïÿìÿîÿæÿïÿöÿíÿêÿîÿàÿâÿîÿëÿîÿëÿíÿëÿôÿíÿòÿíÿíÿñÿíÿëÿÒÿãÿëÿßÿâÿßÿàÿìÿïÿãÿëÿÅÿèÿèÿéÿèÿ´ÿ»ÿÈÿéÿÃÿõ ÿëÿæÿëÿäÿðÿÑÿäÿæÿïÿêÿõÿçÿöÿÜÿàÿèÿÛÿÙÿïÿà ÿÞÿíÿíÿè,ÿèÿêÿÅÿâÿèÿºÿì ÿÕÿÞÿÈÿÍÿóÿñÿöÿöÿèÿèÿäÿäÿè ÿñÿöÿñÿðÿöÿöÿöÿöÿóÿëÿòÿñÿõÿñ ÿáÿÐÿáÿáÿÔÿÐÿÊÿÖÿìÿçÿàÿåÿÝÿìÿÞÿçÿíÿ®ÿä%ÿõÿëÿè ÿëÿºÿî&ÿîÿÖ!%  ÿåÿìÿîÿéÿÖÿÝÿÆÿîÿ°ÿàÿæÿöÿñÿ´ÿ¿ ÿòÿìÿíÿÈÿöÿñÿòÿöÿòÿòÿÝÿôÿêÿòÿîÿðÿðÿòÿòÿòÿóÿñÿåÿïÿòÿìÿöÿÞÿêÿõÿöÿöÿóÿîÿêÿìÿöÿõÿîÿøÿôÿâ ÿìÿé ÿñÿîÿâÿîÿó ÿîÿ·ÿéÿîÿèÿµÿöÿÎÿÁÿÃÿÎÿÎÿ¿ÿÎÿµÿÎÿÁÿ¹ÿÎÿÎÿÎÿÎÿÈÿ¸ÿÎÿîÿ ÿ¬ÿ”ÿµÿòÿÃÿÐÿ­ÿ®ÿòÿµÿ²ÿöÿÀÿ¿ÿÌÿöÿÎÿîÿ¯ÿžÿÃÿåÿµÿ¾ÿºÿôÿÔÿó ÿèÿÞÿÉÿóÿÜÿØÿöÿåÿãÿë<ÿì" ÿâÿêÿîÿÜ$ÿôÿòÿòÿóÿô,ÿêÿèÿõ ÿîÿîÿôÿôÿè ÿÉÿÞÿÔ$ÿöÿíÿîÿØÿîÿêÿèÿÛÿð ÿÞÿîÿÕ&ÿöÿòÿÓ" ÿåÿçÿîÿæÿôÿíÿØ ÿóÿÍÿåÿËÿêÿöÿÎÿòÿÒÿõÿöÿîÿêÿîÿöÿðÿøÿôÿâ ÿìÿé ÿôÿñÿèÿîÿó ÿîÿÉÿÜ ÿË$ÿöÿìÿìÿØÿìÿÜÿåÿÍ ÿî ÿØÿìÿË&ÿïÿñÿÆ" ÿØÿçÿîÿÙÿèÿíÿØ ÿòÿÍ ÿãÿÁÿëÿöÿÎÿòÿÈÿôÿöÿôÿôÿôÿõÿöÿðÿóÿìÿñÿôÿðÿöÿóÿöÿÝÿéÿçÿÚÿáÿêÿéÿçÿìÿåÿñÿèÿØÿÌÿíÿì ÿêÿèÿéÿàÿçÿìÿöÿèÿÈÿð ÿêÿìÿÖÿõÿñ ÿÄÿ§ÿ¼ÿôÿö ÿÄÿÕ ÿ˜ÿ± ÿóÿö ÿíÿÖÿàÿîÿøÿòÿöÿçÿïÿå ÿô  ÿî ÿìÿöÿð  ÿôÿö ÿñÿè$ÿôÿåÿô ÿõÿõÿæÿÂÿéÿõÿµÿÒÿÑÿµÿÏÿÈÿ¸ÿÎÿ­ÿ®ÿµÿ¾ÿöÿîÿ¯ÿžÿÃÿîÿµÿ¾ÿÉÿÜ4²]ö_ ?`ÿÐÿìÿÜÿÖÿÐÿóÿò ÿâÿçÿÅÿèÿñÿÇÿâÿáÿàÿÛÿéÿëÿêÿÂÿíÿõ ÿá ÿâÿ°ÿ¢ÿôÿã%ÿîÿØ%ÿ©ÿ¿ÿÃÿ¾ÿöÿçÿë ÿê ÿìÿ×ÿÉÿÚÿëÿ±ÿñÿïÿÈÿÛÿïÿïÿïÿïÿîÿÚÿØÿïÿïÿñÿï ÿïÿíÿåÿöÿéÿâÿÛÿóÿßÿÙÿÙÿçÿÛÿæÿÝÿåÿãÿÕÿßÿöÿàÿÙÿôÿÞÿÜÿöÿöÿèÿàÿñÿåÿÞÿßÿóÿäÿòÿîÿôÿÔÿßÿöÿíÿàÿòÿòÿÛ $ ÿÚÿåÿØ$ÿâ ÿá&ÿîÿîÿïÿê ÿëÿë ÿæÿôÿïÿíÿëÿàÿëÿóÿÜÿÙ ÿèÿê,ÿõÿî$ÿôÿòÿòÿóÿôÿåÿãÿì" ÿÜÿëÿâÿê<ÿÒÿÛÿÃÿßÿîÿÞÿÚÿåÿÅÿÍÿîÿÀÿõÿðÿæÿ¸ÿçÿðÿóÿóÿéÿèÿðÿòÿíÿóÿôÿõÿõÿñÿâÿõÿêÿéÿàÿìÿØÿÌÿíÿìÿé ÿéÿçÿÞÿéÿèÿÚÿñÿâÿëÿêÿöÿìÿèÿéÿèÿìÿóÿõÿø ÿñÿöÿìÿìÿê ÿðÿõÿíÿÝÿõÿêÿéÿåÿçÿîÿÖÿõÿîÿïÿåÿáÿóÿíÿð ÿÜ ÿ×ÿïÿâÿêÿßÿàÿÔÿÜ ÿæÿôÿñÿñÿãÿôÿôÿà ÿßÿëÿàÿéÿéÿÓÿòÿëÿîÿÊÿõÿðÿöÿïÿô"ÿ»ÿ×ÿÏÿËÿÆÿÞÿßÿÐÿáÿºÿïÿßÿÓÿÀÿ¶ÿêÿÒÿðÿÀ ÿ·ÿºÿÅÿÁÿôÿàÿàÿÝÿåÿÞÿÆÿÕÿàÿÃÿêÿåÿ½ÿÆÿåÿåÿåÿåÿâÿÅÿÁÿåÿåÿçÿåÿåÿíÿõÿïÿí ÿìÿîÿïÿÌÿÃÿòÿô ÿâÿÖÿáÿÄÿÍÿÁÿ»ÿôÿñÿõÿäÿïÿõÿìÿïÿë ÿîÿñÿåÿíÿîÿòÿæÿîÿöÿòÿïÿéÿôÿîÿïÿðÿéÿïÿõÿíÿîÿñÿÜÿòÿÛÿÛÿìÿâÿæÿðÿß  ÿï  ÿëÿêÿàÿëÿñÿàÿñÿåÿìÿïÿíÿáÿëÿåÿñÿãÿíÿîÿîÿèÿêÿëÿàÿñÿîÿõÿéÿòÿóÿõÿòÿñÿîÿíÿîÿöÿÛÿËÿèÿ×ÿÒÿÌÿîÿî$ÿÜÿâÿÉÿõÿÍÿžÿÂ"ÿå&&ÿÅÿ®ÿÂÿÑÿÌÿôÿô"ÿðÿîÿÍÿàÿô$ÿ¤$$ÿõÿÍÿÍÿõÿõÿõÿõÿòÿËÿÃÿõÿõÿõ ÿõ ÿèÿëÿßÿÞÿïÿêÿêÿâÿñÿíÿõÿïÿõÿòÿðÿìÿîÿîÿäÿîÿðÿóÿðÿóÿàÿÇÿÚÿìÿãÿë!ÿôÿöÿïÿõÿêÿóÿôÿö; ÿéÿê ÿìÿôÿèÿàÿî ÿöÿîÿâÿñÿöÿòÿôÿÔ  ÿêÿæÿóÿÝ ÿöÿÜÿòÿòÿî   ÿóÿõ ÿõÿèÿóÿóÿîÿôÿÔ  ÿêÿæÿóÿÝ ÿöÿÜÿîÿîÿë   ÿò ÿòÿêÿóÿòÿóÿôÿðÿåÿîÿòÿëÿò ÿñÿéÿòÿòÿãÿç ÿâÿäÿäÿÜÿë ÿæÿçÿâÿîÿòÿòÿò ÿñÿéÿòÿòÿãÿâÿíÿíÿÜÿäÿêÿèÿõÿðÿðÿñÿóÿö ÿóÿöÿÜÿîÿñ ÿç  ÿäÿÛÿÖÿæÿò ÿãÿ÷ÿìÿãÿßÿë ÿçÿõ ÿøÿÓÿÜÿêÿâÿÚÿäÿÓÿÜÿõÿõÿðÿîÿñÿëÿõÿ÷ÿúÿîÿ÷ÿõÿôÿìÿöÿãÿöÿåÿèÿõÿõÿñ   ÿë!ÿôÿöÿïÿõÿêÿóÿôÿö; ÿò ÿñÿéÿòÿò ÿ¸ÿê ÿêÿßÿìÿÂÿ¹ÿõÿËÿêÿêÿÜÿäÿèÿØÿçÿç ÿâÿäÿäÿÜÿï ÿæÿçÿâÿîÿãÿç ÿâÿäÿäÿÜÿë ÿæÿçÿâÿîÿñÿóÿò ÿñÿæÿïÿòÿÜÿðÿëÿÝÿæÿñÿêÿõÿöÿçÿîÿôÿ÷ÿóÿõÿÜÿÞÿîÿöÿö ÿòÿõ ÿòÿÜÿõÿòÿëÿÞÿåÿÞÿæÿêÿîÿöÿò ÿñÿõÿõÿòÿöÿÎÿåÿåÿÚÿæÿÒÿÝÿõÿõÿðÿÒÿéÿçÿßÿöÿêÿàÿÔÿéÿËÿÖÿõ ÿë""" ÿîÿõÿîÿòÿî ÿð$ ÿ£ÿõÿíÿ®ÿ¥ÿõÿ· ÿÜÿÕÿëÿàÿâÿë$ÿÍÿéÿÓÿÔÿàÿôÿêÿðÿò*ÿéÿßÿäÿêÿè ÿàÿõÿòÿëÿÞÿåÿäÿíÿëÿïÿö ÿõÿö  $ ÿòÿòÿéÿîÿîÿäÿîÿîÿîÿôÿöÿõÿñÿôÿñÿõ &€.79:;<=Idz¸ê<>@NPRTVX[fhjlªùý)MV…“®ÃÎÓâã-/AI‹“ ¢£¤¦§ª«­¯°±³´·¹»½ÃÐÑÒÓÕÖÝüýþÿ     !6789žŸ ¡¨©¬­®¯»¼½¾×ØÙÚÛÜÝÞ7$:DGI]dd0kk1mm2ww3›±4³·KºÀPÂÂWÇÑXÓícïï~ññóó€õõ÷'‚)O³QQÚSSÛUUÜW]Ýfkämmꪰëççòììóïðôõõö÷÷÷ùùøýÿùü  ÿ*GIR%UU/W[0]a5ci:kkAm|B€R†‰T‹’X””`˜œaŸŸf££g¥¦h¬¬j¯¯kj #:;<=>?@^`cefjlnopqstxz|~€†’–š¸¹(NPRTV^fhjl¡±²³´µ¶·¸¹ºÓÔÕÖרÙÛÜÝßàáãäåèéóöúû )V…“•–— ® #$ST\}ž¤°!  ## >@ ^^``ffllnqstxx††––^^ÓÝßá(ãä+ž¥-§³5ÏÑBÔÖEîõHüP V(-^69d’hž¡l»¿pÈÉuÏÞw³Î×âæí(öû0 6>"'F.5L:ŽT““©™ª¢¢¯¦«°³º¶ÃǾÊÌÃßæÆééÎh #>@^`flnopqstx†–^ÓÔÕÖרÙÚÛÜÝßàáãäÀÁÂÃÄÆÇÌÍÏÐÑÒÓÔÕÖרÙÚÜÝÞßàáâèëî!#-/13579;=AGI]^lmosy{ƒ…‡“•&ÅÅÈËÎÎâæéê ìí ð÷ú :""=$*>,,E..F00G22H44I66J88K::L<<M>FNHTWWYd[[g_ahcgkikpnnsprttuwwwyzzz|~{„„~††ˆ€””‰––Š$Œ !"#$%&'()*+,-./0123 /!!!!!!%%%% *++++++1111   !!!!!####$$%%%%%&&' ' ( ( (( ( * * * * + + + ...///0001111113/0333  + +"2' * +, .00&&%+ 11111 !##' + + #* !+ !!%%+ + ..11$!+ + + +  !.¬[ " #4567W89:;<=>?@A),- ./11230$%& :8 0!@!444444B5888888<<<<@1%%%%44455556666--7 ./////1111V_888333:0:0:0;$;$;$<%<%<%<%<%<%>@AAA:0;$ >>>@KNROILPMQJRRZJZ,,,U5Y('\H8=./C1888]S$;<%DE@AT^*/148<%<%<%<%<%X44B66.88T 614B8448833<%<%F+-A48888@1450G4@a     ##;;<<==>>??@@ ^^ `` cceeffjj llnnooppqqstxxzz||~~€€††’’7––šš¸¸¹¹((PPRRTTVV^^ll¡¡7±±-²².³³/´´0µµ1¶¶2··3¸¸4¹¹5ºº6ÓÓ!ÔÔ"ÕÕ#ÖÖ$××%ØØ&ÙÙ'ÛÛ(ÜÜ)ÝÝ*ßà#áá+ãã*ää+åå,èè8éé9óó@ööAúú:ûûBC;<  DE))VV……““•–>——?  =®®¬@lm !"$#$%&&'()`*abc+de,fgAh-i.j/0[12345n\M]NL^_ k6EL$m/-## B 4opB))))))*bbbbeeeeah------[[[[4ONNNN )))****abbbbb++++d]d]eNeNeNeNeNNeN,Lf^fg_g_g_g_g_hhhhXC- - - j j j / / / 0k0k0k[[[[[[24565656M/ 0kL2224MMMMMMMPQYRSZTUVW;?<9>=:<<:\\\K*w8Dc-1xf^_qh-- - Fk0[rs456Gvuaagg_gg)eN- [[[[[7))++f^- - GLaa+h)- ))bbeNeN- - j j [[Hyd]56)b- - - - 4II )*J 6t)b4  ##$$ SSTT \\ }}  žž¤¤°° $Œ# $ %&'(()*+,--)%''''.())))))%%%%&&'''''(((("/))),,,---###$-#$$$% ()) # 0&())) &()'')),, !&'))))(&+%-'P      ##>>??@@^^``ff ll nnoo ppqq st xx †† –– ^^ ÓÓÔÔÕÕÖÖ×רØÙÙÚÚÛÛÜÜÝÝßàááããääžžŸŸ   ¡¡!¢¢"££#¤¤$¥¥%§§&¨¨'©©(ªª)««*¬¬+­­,®®-¯¯.°°/±±0²²1³³2ÏÏÐÐ"ÑÑ$ÔÔ+ÕÖ0îõü" $(-+690’žŸ" ¡$»¾0¿¿-ÈÉ+ÏÖ×Þ$…Q2 2 3 J 45K567""8##L>>O??9@@:^^;``<ff5ll=nn>oo?pp>qq?stKxx@††=––@^^?ÓÓGÔÔAÕÕMÖÖB××EØØNÙÙHÚÚCÛÛIÜÜDÝÝFßàMááPããFääPžžŸŸ)  *¡¡¢¢+££¤¤,¥¥¦¦-§§.¨¨ ©©ªª/««%¬¬­­0®®1¯¯(°°±±²²³³´´!µµ&¶¶ ·· ¸¸ ¹¹ ºº »»"¼¼½½¾¾¿¿ÀÀÁÁÂÂÃÃÄÄÅÅÆÆ#ÇÇÈÈÉÉ'ÊÊËËÌÌ$ÍÍÎÎÓÓ-ÖÖØØ ÙÙ ÚÚÛÝÞÞßáââæí öû  "'.5:AJK LM NOPQRSTUVWX_ hoxˆŽ ™¦«¬­-³¶·¸#¹º»¼¿¿1ÃÇççèè,éé&E´´µµ¶¶··¸¸¹¹ºº»»¼¼ ½½ ¾¾ ¿¿ ÀÀ ÁÁÂÂÃÃÄÄÅÅÆÆÇÇÈÈÉÉÊÊËËÌÌÍÍÎÎ×רØÙÙÚÚ ÛÝ ÞÞßáââæíöû  "'.5:ABIJKLMNO PQ RSTUVWX_`g ho pw x€‡ ˆŽ““ ™ ¢¢ ¦« ³¶·¸¹ºÃÇÊËÌÌ ßæéé|LC C ) I D*?*+E""F##,>>-??@@@A^^K``Bff*llJnnGoo.ppGqq.st?xxH††J––H^^.ÓÓ&ÔÔ#ÕÕ'ÖÖ!×רØ>ÙÙ"ÚÚ$ÛÛ(ÜÜ%ÝÝ ßà'ãã žž/ŸŸ0  1¡¡¢¢2££¥¥§§3¨¨©©4««¬¬®®5¯¯°°±± ²² ³³ ´´ µµ ¶¶··6¸¸¹¹ºº7»»¼¼8½½¾¾9¿¿:ÀÀÁÁ;ÂÂÃÃÄÄÅÅ<ÆÆ=ÇÇÈÈÉÉÊÊËËÌÌÍÍÎÎÖÖ ØØÙÙ7ÚÚ8ÛÝ9ÞÞßáââæíöû7 89"'.5:AJKLM7NO8PQ9RSTUVWX_ho8xˆŽ/™8¦«9³¶·¸=¹º»¼ ¿¿5ÃÇçç/éé a      ##>>@@^^``ff ll nnoo ppqq st xx †† –– ^^ ÓÓÔÔÕÕÖÖ×רØÙÙÚÚÛÛÜÜÝÝßàááããääÀÁ"ÂÂÃà ÄÄ*ÆÇ'ÌÌ%ÍÍ'ÏÏ'ÐÐÑÑÒÒÓÓ ÔÔ!ÕÕ"ÖÖ#××$ØÙ'ÚÚ%ÜÜ&ÝÝ'ÞÞ(ßß'àà)áá*ââ+èè'ëë'îî(!!##(-- // 1133#55$77%99%;;%==%AA+GG*II+]]'^^#ll'mmooss"yy#{{$''ƒƒ(……(‡‡(““ ••'ÌF F G \ HI]IJK""L##`>>^@@M^^N``_ffIllOnnPooQppPqqQst]xxR††O––R^^QÓÓWÔÔSÕÕaÖÖT××UØØbÙÙXÚÚZÛÛYÜÜ[ÝÝVßàaáácããVääcÂÂÄÄÅÅÈÈ,ÉÉ3ËËÎÎÐÐ-ÔÔÖÖ××.ÛÛ3ÜÜ>ÞÞááââããääåå çç?êêDíí/ïï0ðð ññ òò óóôô õõöö4÷÷5øùúúûû6üüýýþþÿÿ@71    8    9: 6!"  !!"";##$$%%C&&((**<,,@..00223344455.66588::<<>>@@BBDDEE#FF$GGHHIIJJ7KK%LL=MM%NN=OO PP1QQRR7SS?TTUU?VVXXBYYAZZ&[[A\\&^^__4``Eaabb3cc6eegghh?iikkmm-nn oo-pp qq'rr(ttuu)vv*ww)xx*yyzz4{{.||5}}2~~+€€‚‚ƒƒ„„……††‡‡ˆˆ‰‰/ŠŠ5‹‹ŒŒŽŽ‘‘?’’””––ÅÒ  !"#$%&'('))*+,-./001))2$345')!6'7 8"# 9 9&'' : ;'<''=>$$$È^    K""##>>E@@^^``ffllnnooppqqstxx[††––[^^ÓÓDÔÔBÕÕ ÖÖ ××CØØIÙÙ ÚÚ ÛÛÜÜJÝÝ ßà ááãã ääÂÂ&ÄÄ%ÅÅLÈÈÉÉ"ËË&ÎÎ'ÐÐÔÔ ÖÖ!××FÛÛ"ÜÜ#ÞÞ$áá%ââ&ãã'ää(åå)ççXííGïï*ðð+ññ3òò4óó9ôô5õõ6ööO÷÷\øù7úú8ûûüüýý9þþ,ÿÿ:;<RP=M9S>  ?  T  9  ]@619-Z9287PA  3!!&""U##$$$,&&P((7**_,,;..900922933!44O55F66\888::8<<8>>8@@9BB9DD9EE.FFGG%HH<II&JJRKK/LLQMM/NNQOO)PPMQQ&RRRSSXTTSUUXVVSYYYZZV[[Y\\V^^!__Oaa9bb"ccee9gg9hhXiiSkkmmnn+oopp+qq0rrtt6uuNvvwwNxxyy!zzO{{F||\}}H~~W€€7‚‚7ƒƒ$„„,……$††,‡‡$ˆˆ,‰‰GŠŠ\‹‹'ŒŒP'ŽŽP'P‘‘X’’S””9––9 „Zcyrlgrek’latn´BGR 0MKD JSRB dÿÿ -9FS^iÿÿ  '.:GT_jÿÿ  (/;HU`kÿÿ  )0<IValÿÿ   1=DJQWbm"AZE BCRT ^MOL zROM ’TRK ªÿÿ !28>EKRXcnÿÿ "*3?LYdoÿÿ #+4@MZepÿÿ $5AN[fqÿÿ %6BO\grÿÿ &,7CP]hstcaseºcaseÂcaseÊcaseÒcaseÚcaseâcaseêcaseòcaseúdnomdnomdnomdnomdnomdnom dnom&dnom,dnom2dnom8dnom>fracDfracPfrac\frachfractfrac€fracŒfrac˜frac¤frac°frac¼ligaÈligaÎligaÔligaÚligaàligaæligaìligaòlocløloclþlocllocl loclloclnumrnumr"numr(numr.numr4numr:numr@numrFnumrLnumrRnumrXordn^pnumdpnumjpnumppnumvpnum|pnum‚pnumˆpnumŽpnum”pnumšpnum salt¦salt°sinfºsinfÀsinfÆsinfÌsinfÒsinfØsinfÞsinfäsinfêsinfðsinföss01üss01subssubssubssubs"subs(subs.subs4subs:subs@subsFsubsLsupsRsupsXsups^supsdsupsjsupspsupsvsups|sups‚supsˆsupsŽtnum”tnumštnum tnum¦tnum¬tnum²tnum¸tnum¾tnumÄtnumÊtnumÐ                                             8@HPX`hpx€ˆ˜ ¨°¸ÀÈÐØàèðøØÖÔÒÐÎÌÊÈ*,ŽðR´¶)l)Î)Ø**ü+*+X+†+–+¦+¶+ÈÁ+ÂÁ+¼Á+¼/+¶/+°/+°ž+´þb+¸2o”Žpqrstuo”Žpqrstuo”Žpqrstuo”Žpqrstuo”Žpqrstu+d…•+b2vwxyz{|}~xywvz{|}~vwxyz{|}~vwxyz{|}~vwxyz{|}~+2»¼½¾¿ÀÁÂÃĽ¾¼»¿ÀÁÂÃÄ»¼½¾¿ÀÁÂÃÄ»¼½¾¿ÀÁÂÃÄ»¼½¾¿ÀÁÂÃÄ*Ø2ÅÆÇÈÉÊËÌÍÎÇÈÆÅÉÊËÌÍÎÅÆÇÈÉÊËÌÍÎÅÆÇÈÉÊËÌÍÎÅÆÇÈÉÊËÌÍÎ*n2ÅÆÇÈÉÊËÌÍÎÇÈÆÅÉÊËÌÍÎÅÆÇÈÉÊËÌÍÎÅÆÇÈÉÊËÌÍÎÅÆÇÈÉÊËÌÍÎ*&nn*$0fH:,âԌʼ® F 8 v ð .ôªœÚT’tfX>¸öØÊ¼rd¢  Z"<#.$ $Ö%È&&€0bjrz‚Š’š¢ª²ºÂÊÒÚâêòú "*2:BJRZbjrz‚Š’š¢ª²ºÂÊÒÚ˜n‚n—nˆnŒnŽn„n”n˜n‚nŽ—npˆnqŒnrŽns„nt”nu˜nx‚ny—nzˆn{Œn|Žn}„n~”n˜n³‚n´—nµˆn¶Œn·Žn¸„n¹”nº˜n½‚n¾—n¿ˆnÀŒnÁŽn„nÔnĘnÇ‚nÈ—nɈnÊŒnËŽnÌ„nÍ”nÎ2:BJRZbjrz‚Š’š¢ª²ºÂÊÒÚâêƒn‰nn•nƒnމnqns•nuƒny‰n{n}•nƒn´‰n¶n¸•nºƒn¾‰nÀn•nănȉnÊnÌ•nÎ2:BJRZbjrz‚Š’š¢ª²ºÂÊÒÚâê™nŠnn…n™npŠnqns…nt™nzŠn{n}…n~™nµŠn¶n¸…n¹™n¿ŠnÀnÂ…nÙnÉŠnÊnÌ…nÍ&.6>FNV^fnv~†Ž–ž¦®‹n‘n–n‹nq‘ns–nu‹n{‘n}–n‹n¶‘n¸–nº‹nÀ‘n–nÄ‹nÊ‘nÌ–nÎ2:BJRZbjrz‚Š’š¢ª²ºÂÊÒÚâên’n†n—nnr’ns†nt—nun|’n}†n~—nn·’n¸†n¹—nºnÁ’n†n×nÄnË’n̆nÍ—nÎ&.6“n“ns“n}“n¸“n“nÌ "*2:BJRZbjr‡n˜n‡nt˜nu‡n~˜n‡n¹˜nº‡nØnćn͘nÎ&.6™n™nu™n™nº™nÄ™nÎ2:BJRZbjrz‚Š’š¢ª²ºÂÊÒÚâêƒn‰nn•nƒnމnqns•nuƒny‰n{n}•nƒn´‰n¶n¸•nºƒn¾‰nÀn•nănȉnÊnÌ•nÎ2:BJRZbjrz‚Š’š¢ª²ºÂÊÒÚâê™nŠnn…n™npŠnqns…nt™nzŠn{n}…n~™nµŠn¶n¸…n¹™n¿ŠnÀnÂ…nÙnÉŠnÊnÌ…nÍ0bjrz‚Š’š¢ª²ºÂÊÒÚâêòú "*2:BJRZbjrz‚Š’š¢ª²ºÂÊÒÚ˜n‚n—nˆnŒnŽn„n”n˜n‚nŽ—npˆnqŒnrŽns„nt”nu˜nx‚ny—nzˆn{Œn|Žn}„n~”n˜n³‚n´—nµˆn¶Œn·Žn¸„n¹”nº˜n½‚n¾—n¿ˆnÀŒnÁŽn„nÔnĘnÇ‚nÈ—nɈnÊŒnËŽnÌ„nÍ”nÎ&.6>FNV^fnv~†Ž–ž¦®‹n‘n–n‹nq‘ns–nu‹n{‘n}–n‹n¶‘n¸–nº‹nÀ‘n–nÄ‹nÊ‘nÌ–nÎ2:BJRZbjrz‚Š’š¢ª²ºÂÊÒÚâên’n†n—nnr’ns†nt—nun|’n}†n~—nn·’n¸†n¹—nºnÁ’n†n×nÄnË’n̆nÍ—nÎ&.6“n“ns“n}“n¸“n“nÌ "*2:BJRZbjr‡n˜n‡nt˜nu‡n~˜n‡n¹˜nº‡nØnćn͘nÎ&.6™n™nu™n™nº™nÄ™nÎ0bjrz‚Š’š¢ª²ºÂÊÒÚâêòú "*2:BJRZbjrz‚Š’š¢ª²ºÂÊÒÚ˜n‚n—nˆnŒnŽn„n”n˜n‚nŽ—npˆnqŒnrŽns„nt”nu˜nx‚ny—nzˆn{Œn|Žn}„n~”n˜n³‚n´—nµˆn¶Œn·Žn¸„n¹”nº˜n½‚n¾—n¿ˆnÀŒnÁŽn„nÔnĘnÇ‚nÈ—nɈnÊŒnËŽnÌ„nÍ”nÎ2:BJRZbjrz‚Š’š¢ª²ºÂÊÒÚâêƒn‰nn•nƒnމnqns•nuƒny‰n{n}•nƒn´‰n¶n¸•nºƒn¾‰nÀn•nănȉnÊnÌ•nÎ2:BJRZbjrz‚Š’š¢ª²ºÂÊÒÚâê™nŠnn…n™npŠnqns…nt™nzŠn{n}…n~™nµŠn¶n¸…n¹™n¿ŠnÀnÂ…nÙnÉŠnÊnÌ…nÍ&.6>FNV^fnv~†Ž–ž¦®‹n‘n–n‹nq‘ns–nu‹n{‘n}–n‹n¶‘n¸–nº‹nÀ‘n–nÄ‹nÊ‘nÌ–nÎ2:BJRZbjrz‚Š’š¢ª²ºÂÊÒÚâên’n†n—nnr’ns†nt—nun|’n}†n~—nn·’n¸†n¹—nºnÁ’n†n×nÄnË’n̆nÍ—nÎ&.6“n“ns“n}“n¸“n“nÌ "*2:BJRZbjr‡n˜n‡nt˜nu‡n~˜n‡n¹˜nº‡nØnćn͘nÎ&.6™n™nu™n™nº™nÄ™nÎ0bjrz‚Š’š¢ª²ºÂÊÒÚâêòú "*2:BJRZbjrz‚Š’š¢ª²ºÂÊÒÚ˜n‚n—nˆnŒnŽn„n”n˜n‚nŽ—npˆnqŒnrŽns„nt”nu˜nx‚ny—nzˆn{Œn|Žn}„n~”n˜n³‚n´—nµˆn¶Œn·Žn¸„n¹”nº˜n½‚n¾—n¿ˆnÀŒnÁŽn„nÔnĘnÇ‚nÈ—nɈnÊŒnËŽnÌ„nÍ”nÎ2:BJRZbjrz‚Š’š¢ª²ºÂÊÒÚâêƒn‰nn•nƒnމnqns•nuƒny‰n{n}•nƒn´‰n¶n¸•nºƒn¾‰nÀn•nănȉnÊnÌ•nÎ2:BJRZbjrz‚Š’š¢ª²ºÂÊÒÚâê™nŠnn…n™npŠnqns…nt™nzŠn{n}…n~™nµŠn¶n¸…n¹™n¿ŠnÀnÂ…nÙnÉŠnÊnÌ…nÍ&.6>FNV^fnv~†Ž–ž¦®‹n‘n–n‹nq‘ns–nu‹n{‘n}–n‹n¶‘n¸–nº‹nÀ‘n–nÄ‹nÊ‘nÌ–nÎ2:BJRZbjrz‚Š’š¢ª²ºÂÊÒÚâên’n†n—nnr’ns†nt—nun|’n}†n~—nn·’n¸†n¹—nºnÁ’n†n×nÄnË’n̆nÍ—nÎ&.6“n“ns“n}“n¸“n“nÌ "*2:BJRZbjr‡n˜n‡nt˜nu‡n~˜n‡n¹˜nº‡nØnćn͘nÎ&.6™n™nu™n™nº™nÄ™nÎ0bjrz‚Š’š¢ª²ºÂÊÒÚâêòú "*2:BJRZbjrz‚Š’š¢ª²ºÂÊÒÚ˜n‚n—nˆnŒnŽn„n”n˜n‚nŽ—npˆnqŒnrŽns„nt”nu˜nx‚ny—nzˆn{Œn|Žn}„n~”n˜n³‚n´—nµˆn¶Œn·Žn¸„n¹”nº˜n½‚n¾—n¿ˆnÀŒnÁŽn„nÔnĘnÇ‚nÈ—nɈnÊŒnËŽnÌ„nÍ”nÎ2:BJRZbjrz‚Š’š¢ª²ºÂÊÒÚâêƒn‰nn•nƒnމnqns•nuƒny‰n{n}•nƒn´‰n¶n¸•nºƒn¾‰nÀn•nănȉnÊnÌ•nÎ2:BJRZbjrz‚Š’š¢ª²ºÂÊÒÚâê™nŠnn…n™npŠnqns…nt™nzŠn{n}…n~™nµŠn¶n¸…n¹™n¿ŠnÀnÂ…nÙnÉŠnÊnÌ…nÍ&.6>FNV^fnv~†Ž–ž¦®‹n‘n–n‹nq‘ns–nu‹n{‘n}–n‹n¶‘n¸–nº‹nÀ‘n–nÄ‹nÊ‘nÌ–nÎ2:BJRZbjrz‚Š’š¢ª²ºÂÊÒÚâên’n†n—nnr’ns†nt—nun|’n}†n~—nn·’n¸†n¹—nºnÁ’n†n×nÄnË’n̆nÍ—nÎ&.6“n“ns“n}“n¸“n“nÌ "*2:BJRZbjr‡n˜n‡nt˜nu‡n~˜n‡n¹˜nº‡nØnćn͘nÎ&.6™n™nu™n™nº™nÄ™nÎ0bjrz‚Š’š¢ª²ºÂÊÒÚâêòú "*2:BJRZbjrz‚Š’š¢ª²ºÂÊÒÚ˜n‚n—nˆnŒnŽn„n”n˜n‚nŽ—npˆnqŒnrŽns„nt”nu˜nx‚ny—nzˆn{Œn|Žn}„n~”n˜n³‚n´—nµˆn¶Œn·Žn¸„n¹”nº˜n½‚n¾—n¿ˆnÀŒnÁŽn„nÔnĘnÇ‚nÈ—nɈnÊŒnËŽnÌ„nÍ”nÎ2:BJRZbjrz‚Š’š¢ª²ºÂÊÒÚâêƒn‰nn•nƒnމnqns•nuƒny‰n{n}•nƒn´‰n¶n¸•nºƒn¾‰nÀn•nănȉnÊnÌ•nÎ2:BJRZbjrz‚Š’š¢ª²ºÂÊÒÚâê™nŠnn…n™npŠnqns…nt™nzŠn{n}…n~™nµŠn¶n¸…n¹™n¿ŠnÀnÂ…nÙnÉŠnÊnÌ…nÍ&.6>FNV^fnv~†Ž–ž¦®‹n‘n–n‹nq‘ns–nu‹n{‘n}–n‹n¶‘n¸–nº‹nÀ‘n–nÄ‹nÊ‘nÌ–nÎ2:BJRZbjrz‚Š’š¢ª²ºÂÊÒÚâên’n†n—nnr’ns†nt—nun|’n}†n~—nn·’n¸†n¹—nºnÁ’n†n×nÄnË’n̆nÍ—nÎ&.6“n“ns“n}“n¸“n“nÌ "*2:BJRZbjr‡n˜n‡nt˜nu‡n~˜n‡n¹˜nº‡nØnćn͘nÎ&.6™n™nu™n™nº™nÄ™nÎÔ2o”Žpqrstuo”Žpqrstuo”Žpqrstuo”Žpqrstuo”Žpqrstu0LPÓÔÕÖרÙÚÛÜÝÞßàáâãäå6-N$%&'()*+,-./0123456789:;<=km›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±³´µ¶·¸¹zÛÝßáãåçéëíïñóõ÷ùûýÿ   "$&(*,.02468:<>@BDFHJLNPRTVY[fhjlL "(¯IL°IOªI¬L®O "(¯IL°IOªI¬L®Oà "(¯IL°IOªI¬L®O° ÏÐÑÒÓÔÕÖç¨ ×ØÙÚÛÜÝÞè  ßàáâãäåæé xywvz{|}~Lñ±ºv ±ÎDRŽ ”” ou ±ÎŽ ”” o ±ºÅÎ(Ž ”” o ±Ä Ž”” pt w~²¹¼à ÆÍ(—™nnv‚™Ž””ou #>?@^`lrstx|†–šX]DEFGHIJKLMNOPQRSTUVWXYZ[\]wy»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÓÔÕÖרÙÚÜÞàâäæèêìîðòôöøúüþ  !#%')+-/13579;=?ACEGIKMOQSUWZ\gikmI`g““pw¢¢€‡ÌÌ0(0‚$ *†H†÷  ‚0‚1 0 +0a +‚7 S0Q0, +‚7¢€<<<Obsolete>>>0!0 +£.T½»ïg7oA+¦§gB ‚˜0‚l0‚T  0  *†H†÷ 0Ï1 0 UUS10UArizona10U Scottsdale1%0#U Starfield Technologies, Inc.1:08U 1http://certificates.starfieldtech.com/repository/1604U-Starfield Services Root Certificate Authority0 100506193433Z 150506193433Z0Œ1 0 UUS10UArizona10U Scottsdale1%0#U Starfield Technologies, Inc.1/0-U&Starfield Services Timestamp Authority0‚"0  *†H†÷ ‚0‚ ‚»3¡5å§¶fwO¶H--øög·Ä-ò¢PÍ–JŸòTÝW…m—"]sãºuË“ î7Ac. ˜aL|XÌÊ•r¾Ì!Ð Aƒ•Lèì“U‡€h‚6Ô ÚOz©ú›lã 4“(G’Õ³øª9Ë´D4Ål œ:…[ö;¤~qƒ:‚·½z('ÝV¿Nx[Ô]!~òKžm÷ ÌºWã¾:÷ô!&œ1¢µ J=IFZ¯]ý[£‚‘0‚0 Uÿ00UÿÀ0U%ÿ 0 +0Uˆ Àëàß9CU×^˜ñ•õS£ð·0U#0€´ÆCÌ›u]/ÄKò‹˜éñQ0„+x0v0*+0†http://ocsp.starfieldtech.com/0H+0†x«µ k/j+±Åˆ~Ä»°ÁØE'oª7X÷‡&ר-ö©·r6N¦?e˜’Û*n]¢þˆà ÞåáëË:Õâ¢-ØŽ¯_= ¶\¥e8E™£``tÅA¥rbbÅo_B¾Qe¨®#jüx©M€Ãú«Zü¡@¤Êþ²Èï^s îw½šöy˜¼±g¢ Ý XÆD{ >b(_ºASXÏ~8tÅøÿµi„tê—¯£À0½0UÒİґÔLq³aË=¡þݨjÔã0U#…0‚€ÒİґÔLq³aË=¡þݨjÔã¡g¤e0c1 0 UUS1!0U The Go Daddy Group, Inc.110/U (Go Daddy Class 2 Certification Authority‚0 U0ÿ0  *†H†÷ ‚2Kó²Ê>‘üÆ¡ŒŽw 3\÷¦= ù‡€niä–0ÿ4‘cr8îÌ£”(¤1özÄT×öå1X¢ÌÎbÛ”Esµ¿EÉ$µÕ‚­#yi¸¶MÎÏLÊ3#航‹AnÉ å‰žÍ;Úp÷~™& T%«ns…æ›! l‚¨øÂ úl–ï‡ Äa‹­îƒ+•øŽ’„r9ë êƒíƒÍ—n¼ëN&¶s+äÓöLþ&qâatJÿW‡uH.ÏQi a•ÕÑ@²LîĬC¦¥ž Õ•bš ψ‚Å2 ä+ŸEæ Ÿ(œ±¹*ZW­7¯Û½Ÿ0‚Þ0‚Æ 0  *†H†÷ 0c1 0 UUS1!0U The Go Daddy Group, Inc.110/U (Go Daddy Class 2 Certification Authority0 061116015437Z 261116015437Z0Ê1 0 UUS10UArizona10U Scottsdale10U GoDaddy.com, Inc.1301U *http://certificates.godaddy.com/repository100.U'Go Daddy Secure Certification Authority10U079692870‚"0  *†H†÷ ‚0‚ ‚Ä-ÕŒœ&Lì25ë_¸YZ¦aY;pc«ãÜ=Ç*¸É3Óyä:í<0#„޳0¶²‡Ã=•Tžß™Ý %!Þe)~5¨©Tëö÷29Ô&U•­ïûþX†×žôŒ* ½BΧ?öî€òªïR¡ifÚ¾­]Ú,fêk»åQJ/Hǘuع)Èîøfm œ³óüx|¢ø£òµÃó¹z‘Á§æ%.œ¨íenjöDSp0•Ü+X+=tJò¾Q°¿‡ÐL'Xkµ5ů1ø î­6‰˜Ï:¯%‡ÀIê§ýg÷EŽ—Ì9â6…µ~7ýöqšt0þ”£?„ O£‚20‚.0Uý¬a2“lEÖâî…_šºçv™hÌç0U#0€ÒİґÔLq³aË=¡þݨjÔã0Uÿ0ÿ03+'0%0#+0†http://ocsp.godaddy.com0FU?0=0; 9 7†5http://certificates.godaddy.com/repository/gdroot.crl0KU D0B0@U 0806+*http://certificates.godaddy.com/repository0Uÿ0  *†H†÷ ‚Ò†Àì½ù¡¶gîf ¢:PŽr¬Jt•SË7ËDIïk3Ù–ð”V¥0<…2!{ÉÇ ¨$¤ÞFÓ%#gÂÖo]{zÌŸÅX*ÁÄž!¨Zó¬¤FóžäcË/¤))Ùr,)ß7'¼OîhÓ!À³äõ íÒªS´¾ðÌY Ö;–•$IßÎìý§H‘E:6oÚE³E¢AÉÔ×DN>¹tvÕ¢U,Ƈ£µ™¬„‡uü¿LÌnÄß=·qôèñQ@"(IàK‡¨4Ì¢ÝZц6d5oownëò…P˜^«S­‘#cœÍ¹²c:áôh5•Sî0‚>0‚&  ïô¿i{0  *†H†÷ 0Ê1 0 UUS10UArizona10U Scottsdale10U GoDaddy.com, Inc.1301U *http://certificates.godaddy.com/repository100.U'Go Daddy Secure Certification Authority10U079692870 090924134423Z 120924134423Z0k1 0 UGB10 ULondon10 ULondon10U Dalton Maag Limited10UDalton Maag Limited0‚"0  *†H†÷ ‚0‚ ‚¢_æØÛÒ¡¢ó~Å4çrØ®û•Ïì¤ê’Ûö¬S5ñ”œ£Ž™Fà+‘¶¦ÿ  º+Fnb执 AõæÀêkUr]ŽÏÜX3‰ÿåuÜÃÌ-`>Ö驯T>”¼ìŠ‘6zíUýØ=k'F _ÔÛÁ_¢÷ˆäˆ~úã‚à/BbQF»Æ0q{²ÌŒ3ví൙­Ã ãˆwx1http://certificates.godaddy.com/repository/gd_intermediate.crt0U#0€ý¬a2“lEÖâî…_šºçv™hÌç0Uhf0gU¡³¡é7Æu‰3ã…×0  *†H†÷ ‚½V> ´}úíÓþE¶ßßHø£ŒÕTÔ’DÁqi£Ã0€Ú7®ÊGhÙ³% 6 é;âÛQtþ^ÉÞ;$±ž9–àLRÊçBfZuhI:-#k^ÄCñž±/ ¥œ>=nZ°•t?.Ká0msÞo¯ãGúÝ$`d§\cÝ©·P4eÇ(IþZzêÀF¶š*Ùe²‘Ê Ö{ˆðê>éU0‡Ï¯‘¨#kE™Ü‘7 ¿ÔÝf_Uôñãí`4•>—¢ÂÊja@0‘Ä¥[Ð`mO4~ 1Såéx–ЃĪ½åbª2"#N.|¶Ÿß\#–1‚þ0‚ú0Õ0Ê1 0 UUS10UArizona10U Scottsdale10U GoDaddy.com, Inc.1301U *http://certificates.godaddy.com/repository100.U'Go Daddy Secure Certification Authority10U07969287 ïô¿i{0 + †0 +‚7 100 +‚7(10 *†H†÷  1  +‚70 +‚7 10  +‚70# *†H†÷  1aÍ÷ÁlCô¬È:œ-Ü'»çt0  *†H†÷ ‚—/®< ¼Å½€ú HV·–"Ìþ0í„Z þ§"º˜²%êN)U5i“ o#ì§CÞ?ÏøÇH„#\OVvËF›ô”Ù"€{4Ak©÷Ë\ݦoz¼„Šý¿N°Ñé8Þ"øçÕ–£Ï— ÉÑÔV˪ǿLûC…il…ÿ¿Ionbw»Â7,"Ý ³ÞÑø¿áú];Q—âK<„ã¥Ô¤ÉÅßÕãášR¼ëûM­OB1kQð:u1ùþþÔø62¦jW7 ž–¬­~%$Iް;IÐqJubuntu-sso-client-13.10/data/UbuntuOne-ValiCert_Class_2_VA.pem0000664000202700020270000000205212151461736024352 0ustar dobeydobey00000000000000-----BEGIN CERTIFICATE----- MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG 9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMTk1NFoXDTE5MDYy NjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vY dA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9 WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QS v4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9v UJSZSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTu IYEZoDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd -----END CERTIFICATE----- ubuntu-sso-client-13.10/data/Ubuntu-R.ttf0000664000202700020270000127636412151461656020505 0ustar dobeydobey00000000000000PDSIGè ûNc°DGPOSÈ+fý/úGSUBmCëv-6°LTSHá24¶ðòOS/2‰.ù©Ø`VDMXïØ÷ÅäÖcmap`¯ûÏIJcvt *o Hèfpgmv½DÄßx#gasp üôglyf8¹WýÌKHhdmxëOB!1¼žhead÷Ãt\6hhea 5 !”$hmtx–çÁ+8¸kern‰šŸI{rlocaKÝ4ê¼maxp ’ ¸ name$H13Ĉ ÇpostÍ µ ÐP,¢prep™>NÞåœq-œÛC_<õèÉŠ¶XÉšg–ÿYÿC ¤ÿC’ÿYÿ]îîpq/Y ùZ¼ŠŒ¼ŠÝOú àÿP [DAMA@ûÿG8¤½ ŸVµ ô2ççG¢H›14=Z2š.ñHDNDà%45ö&+ö8€ÿè424]48474(4A4?4<4743ö8ö&454545”¶A—ƒVl:ÉV;VV :ÁV VôuVVgCØV :`V :uV!5°Q ¡wV=!I`€ÿèI4/ìÿüx= +MPÑ3M3/3‚PB3;PýBýÿ¼ PN]P>PN3MPM3‚P¾(’J>Jö ÿñ×$M(`M4*4-ë!‚ÿ¼¡!äbÜ'Ü'x4Ë2!#á:ë<ë!¡<¡!h4ðÿþäÿþx÷¾(#(³3VçG4V4<4,4`ì+x#.A…&ó45+.Ax.L45gg xDP†+ö8xEg2¾+ó(j2j2j ”——————§l:;V;V;V;V  D ÿÿ ÿîÖØV : : : : :4P :°Q°Q°Q°QVaVoP + + + + + +[,Ñ3/3/3/3/3ýý<ýÿ÷ýÿæM3>PN3N3N3N3N345N3>J>J>J>JñMPñ— +— +— +l:Ñ3l:Ñ3l:Ñ3l:Ñ3ÉVn3ÖM3;V/3;V/3;V/3;V/3;V/3 :B3 :B3 :B3 :B3ÁV;5Û; ÿãýÿÛ ÿùýÿñ ýÿù ý  KýPýBVþBôýÿ¼uV PèVPV;V'VNVqNÿþØV>PØV>PØV>PH>ØV>P :N3 :N3 :N3uV‚PuV‚uV‚P!¾(!¾(!¾(5’J5’J5’J°Q>J°Q>J°Q>J°Q>J°Q>J°Q>J¡ Vñ=!×$=!×$=!×$P!¾(5’Jýÿ¼xtx4x.x9x€xUxGx$¡ ¡ ¡ Vñ”ÿYggg(g%g%g ggg2gg gg(g%g%g g¤Aj2jj2j j(j%j2jj jj2j(j2jj jj(j%j2jjj(j%j I)‹¹V445”ÿYö84 Lq4*454545(PƒPƒP—P—P PP42uïøð"3×&1"/gg2gg gg(g%g%g ggg2gg gg(g%g%g gx–ùù@xDND+€ÿè¶AI`€ÿèIM(M#h4ðÿþäÿþ#(Góó(”MèkVMPM ll—:ü3Ö.q.M3F3;%Á8<3ÿä :Š{PxVE˜V PþÏVØÿä>P : :N3953ÆMPuV¾'3!ÿ¤’JP’J5ÆQUJ4¶Q :=!×$772×(Ú!(ðÏ/;P`ã`9,G V¤V(3úVVNËVÙV?P— + ýÿù :N3°Q>J°Q>J°Q>J°Q>J°Q>J/3— +— +§[,¾:N3 :B3uV 5 :N3 :N37×ÿýýÿ¼ V¤V(3 :B3!VƒVØV>P— +§[, :N3— +— +;V/3;V/3 ÿ¶ýÿ® ýÿû :N3 :N3uT‚uV‚P°Q>J°Q>J´ ÁV;5¤V×3ž1O4=!×$— +;V/3 :N3 :N3 :N3 :N3VñšÿüÎPšÿü33— :Ý3l¾#Õ&Ý¡ ÊŒSV>3#ÿÖ:M3‚Žj×ÿýx6xx_x!x=xxxx"x]xAxAxÿþxÿþxÿþ;V;VïýVl:! V ÿîô VíuVØVK»V—kVƒVýVÓ;V‰<ØVØVuVà gCÁV :»V`Vl:5K`8wÎVw:×VêVÖXVhVlV{$ +S>$P¢P[/3ûé,UPUPPV ÛCJPN3BPMPÑ3Ïñþ2ÿJP.7PBPVöPPò"+P$/3/3;¢Pò3¾(ýBýÿçýÿ¼_ SP;PUPñ?PL3ÖV :N3ñ 4éV`Pu `VMPýV¬P ªpV P™<é,V"PÃVkP,ã_ÔVUP/VPV\P:a3l:Ñ35ÏVöVö N•Š: .~:'V;PCž Cž  V‰ûwV PÔ a ÁVJPÒVUP~A.ƒCïC V— +— +§[,;V/3Á8/6Á8/6‰û<é,7×ÿýØVUPØVUP :N3 :N3 :N3lò"KñKñKñw:.ýV¢PXVöPjVäÿþ4%4(404x*—ƒVýV‹;V=!ÁV : VuVŒgCØV(% :»V`V3!5V`8w/A4^3cP÷M3÷7»4>PZ7NPýDPöÖ2N3BPSJÀ3e3½@J3ÿJF9—zÿãÿãQÿã ÿî#ÿãÔÿãV&ÿã^3÷7>P9ÿæÿ¹N3@J@J@JF9xŽxwxÿö^3^3^3^3^3^3^3^3—— ÿ×þÿÖÕÿ×ðÿÜ—ÿÔ¡ÿÔ÷7÷7÷7÷7÷7÷7zÿ×zÿÜ8ÿ×)ÿÜ"ÿ×=ÿÜ>P>P>P>P>P>P>P>Pÿ×ÿܾÿׯÿܨÿ×ÃÿÜqÿÔqÿÔ>/ÿØÿÃÿØÿúÿúLÿ×LÿÜ ÿ×ûÿÜôÿ×ÿܽÿÔ½ÿÔN3N3N3N3N3N3ÿ×8ÿÜöÿ×çÿÜ­ÿ×ÈÿÜ@J@J@J@J@J@J@J@J¿ÿÜcÿÜ—ÿÜMÿÔF9F9F9F9F9F9F9F9ÿ×:ÿÜøÿ×éÿܯÿ×ÊÿÜeÿÔ‚ÿÔ^3^3÷7÷7>P>Pÿø+N3N3@J@JF9F9^3^3^3^3^3^3^3^3¬¬"ÿ×ÿÜêÿ×ÿܬÿÔ¶ÿÔ>P>P>P>P>P>P>P>Pÿ×ÿÜÓÿ×Äÿܽÿרÿ܆ÿÔ†ÿÔF9F9F9F9F9F9F9F9,ÿ×OÿÜ ÿ×þÿÜÄÿ×ßÿÜzÿÔ—ÿÔ^3^3^3^3^3^3^3———ÿç—¬xxZxxx6x!>P>P>P>P>P´ÿÞ´ÿá:ÿÞ:ÿáÖVxxx7ÿùÿñÿ¹ÿ¹ÿùÿä  ÿü†ÿÞ†ÿáxxx7@J@J@J@JSJSJ@J@JVVäÿÞÿáŸÿÜxÿöxÿöx/F9F9F9F9F9qÿÞBÿásÿÞEÿá%4xnxo—— ÿ×þÿÜÕÿ×ðÿÜ—ÿÔ¡ÿÔÿ×ÿܾÿׯÿܨÿ×ÃÿÜqÿÔqÿÔÿ×:ÿÜøÿ×éÿܯÿ×ÊÿÜeÿÔ‚ÿÔ—ÁV44Cà ’ÑIî¤ /(¸ €& ­—^z* !(ÄÄÈx ¯Zd   z ¬¤//////¸¸¸¸z ÄÄÄÄdd/ / / !!!!(((¸Ä¸Ä¸Ä¸Ä¸ÄÄ ÈÈ-+§     ­­­^Zzd* * *  ­^Z^Z^Zzd0-+1KK¤  /(7§f  •­ -z*  ( / ¸Ä/ /  !  (!/  / / ¸Ä¸Ä   ((* / zd  ‚‚/  ¸¸ / d €(&­T2 &  h/U!Òd€ = .( ÄÄÄ (d f‰& & #g`/ {ž+ ­Òz©z© # (¸dh#( |B¸/ /  ((dh/ ddd  ¬/*(¸ €1&­zT=-. 2ȯ ! Þ/€w/¸"z2ÈÈÈ///w//#/1 ÈÈÈÈÈÈÈÈ&0////////!wwwwwwww +ÈÈ//ww, wwwwwwww////ÈÈÈÈÈȸ¸//////zz('wwwww///  +/(-Z$® 8 ÂLÁÈ ÿý ÿý ÿý ÿý ÿý ÿýÿýÿýÿýÿýÿýÿüÿüÿüÿüÿûÿûÿúÿúÿúÿúÿúÿúÿú ÿù!!ÿù"!ÿù#"ÿù$$ÿù%%ÿù&%ÿù'&ÿø('ÿø))ÿø**ÿ÷+*ÿ÷,+ÿ÷-,ÿ÷.-ÿ÷/.ÿ÷0/ÿ÷10ÿ÷21ÿö31ÿö42ÿö53ÿö64ÿõ76ÿõ87ÿõ98ÿõ:9ÿõ;:ÿô<;ÿô=<ÿô><ÿô?>ÿô@?ÿôA@ÿôBBÿóCBÿóDCÿóEDÿóFEÿòGEÿòHGÿòIGÿòJHÿòKIÿñLJÿñMKÿñNKÿðOMÿðPMÿðQOÿðRPÿðSPÿðTQÿðURÿïVSÿïWUÿïXVÿïYVÿïZWÿï[Xÿî\Yÿî]Zÿî^[ÿî_\ÿí`^ÿía^ÿíb_ÿíc`ÿídaÿìeaÿìfbÿìgcÿìhfÿìifÿìjgÿëkhÿëliÿëmjÿênkÿêokÿêplÿêqmÿêrnÿésoÿétpÿéuqÿévrÿéwsÿéxtÿéyuÿézwÿè{xÿè|yÿè}yÿç~zÿç{ÿç€|ÿç}ÿç‚}ÿçƒ~ÿç„€ÿæ…€ÿ憂ÿ懃ÿ戄ÿ扄ÿ抅ÿ拆ÿ指ÿå‰ÿ厉ÿãŠÿã‹ÿã‘‹ÿã’ÿ㓎ÿã”ÿã•ÿã–‘ÿã—’ÿ㘓ÿã™”ÿãš•ÿã›–ÿ㜗ÿâ˜ÿ➘ÿ⟙ÿá ›ÿᡜÿ࢜ÿà£ÿञÿय़ÿঠÿà§¢ÿਣÿà©£ÿતÿà«¥ÿ߬¦ÿß­§ÿß®¨ÿ߯©ÿݰªÿݱ«ÿݲ¬ÿݳ­ÿÝ´®ÿݵ¯ÿݶ°ÿÝ·±ÿݸ²ÿݹ´ÿݺ´ÿÝ»µÿܼ¶ÿܽ¶ÿܾ·ÿÜ¿¸ÿÜÀ¹ÿÛÁºÿÛ»ÿÛüÿÚĽÿÚÅ¿ÿÚÆ¿ÿÚÇÀÿÚÈÂÿÚÁÈÿþ ÿý ÿý ÿý ÿý ÿýÿýÿýÿýÿýÿýÿüÿüÿüÿüÿûÿûÿúÿúÿúÿúÿúÿúÿú ÿù!!ÿù"!ÿù#"ÿù$$ÿù%%ÿù&%ÿù'&ÿø('ÿø))ÿø**ÿ÷+*ÿ÷,+ÿ÷-,ÿ÷.-ÿ÷/.ÿ÷0/ÿ÷10ÿ÷21ÿö31ÿö42ÿö53ÿö64ÿõ76ÿõ87ÿõ98ÿõ:9ÿõ;:ÿô<;ÿô=<ÿô><ÿô?>ÿô@?ÿôA@ÿôBBÿóCBÿóDCÿóEDÿóFEÿòGEÿòHGÿòIGÿòJHÿòKIÿñLJÿñMKÿñNKÿðOMÿðPMÿðQOÿðRPÿðSPÿðTQÿðURÿïVSÿïWUÿïXVÿïYVÿïZWÿï[Xÿî\Yÿî]Zÿî^[ÿî_\ÿí`^ÿía^ÿíb_ÿíc`ÿídaÿìeaÿìfbÿìgcÿìhfÿìifÿìjgÿëkhÿëliÿëmjÿênkÿêokÿêplÿêqmÿêrnÿésoÿétpÿéuqÿévrÿéwsÿéxtÿéyuÿézwÿè{xÿè|yÿè}yÿç~zÿç{ÿç€|ÿç}ÿç‚}ÿçƒ~ÿç„€ÿæ…€ÿ憂ÿ懃ÿ戄ÿ扄ÿ抅ÿ拆ÿ指ÿå‰ÿ厉ÿãŠÿã‹ÿã‘‹ÿã’ÿ㓎ÿã”ÿã•ÿã–‘ÿã—’ÿ㘓ÿã™”ÿãš•ÿã›–ÿ㜗ÿâ˜ÿ➘ÿ⟙ÿá ›ÿᡜÿ࢜ÿà£ÿञÿय़ÿঠÿà§¢ÿਣÿà©£ÿતÿà«¥ÿ߬¦ÿß­§ÿß®¨ÿ߯©ÿݰªÿݱ«ÿݲ¬ÿݳ­ÿÝ´®ÿݵ¯ÿݶ°ÿÝ·±ÿݸ²ÿݹ´ÿݺ´ÿÝ»µÿܼ¶ÿܽ¶ÿܾ·ÿÜ¿¸ÿÜÀ¹ÿÛÁºÿÛ»ÿÛüÿÚĽÿÚÅ¿ÿÚÆ¿ÿÚÇÀÿÚÈÂÿÚÁÈ ÿý ÿý ÿý ÿý ÿý ÿýÿýÿýÿýÿýÿýÿüÿüÿüÿüÿûÿûÿúÿúÿúÿúÿúÿúÿú ÿù!!ÿù"!ÿù#"ÿù$$ÿù%%ÿù&%ÿù'&ÿø('ÿø))ÿø**ÿ÷+*ÿ÷,+ÿ÷-,ÿ÷.-ÿ÷/.ÿ÷0/ÿ÷10ÿ÷21ÿö31ÿö42ÿö53ÿö64ÿõ76ÿõ87ÿõ98ÿõ:9ÿõ;:ÿô<;ÿô=<ÿô><ÿô?>ÿô@?ÿôA@ÿôBBÿóCBÿóDCÿóEDÿóFEÿòGEÿòHGÿòIGÿòJHÿòKIÿñLJÿñMKÿñNKÿðOMÿðPMÿðQOÿðRPÿðSPÿðTQÿðURÿïVSÿïWUÿïXVÿïYVÿïZWÿï[Xÿî\Yÿî]Zÿî^[ÿî_\ÿí`^ÿía^ÿíb_ÿíc`ÿídaÿìeaÿìfbÿìgcÿìhfÿìifÿìjgÿëkhÿëliÿëmjÿênkÿêokÿêplÿêqmÿêrnÿésoÿétpÿéuqÿévrÿéwsÿéxtÿéyuÿézwÿè{xÿè|yÿè}yÿç~zÿç{ÿç€|ÿç}ÿç‚}ÿçƒ~ÿç„€ÿæ…€ÿ憂ÿ懃ÿ戄ÿ扄ÿ抅ÿ拆ÿ指ÿå‰ÿ厉ÿãŠÿã‹ÿã‘‹ÿã’ÿ㓎ÿã”ÿã•ÿã–‘ÿã—’ÿ㘓ÿã™”ÿãš•ÿã›–ÿ㜗ÿâ˜ÿ➘ÿ⟙ÿá ›ÿᡜÿ࢜ÿà£ÿञÿय़ÿঠÿà§¢ÿਣÿà©£ÿતÿà«¥ÿ߬¦ÿß­§ÿß®¨ÿ߯©ÿݰªÿݱ«ÿݲ¬ÿݳ­ÿÝ´®ÿݵ¯ÿݶ°ÿÝ·±ÿݸ²ÿݹ´ÿݺ´ÿÝ»µÿܼ¶ÿܽ¶ÿܾ·ÿÜ¿¸ÿÜÀ¹ÿÛÁºÿÛ»ÿÛüÿÚĽÿÚÅ¿ÿÚÆ¿ÿÚÇÀÿÚÈÂÿÚÁÈ!ÿù %ÿù *ÿ÷ -ÿ÷ 1ÿö 4ÿõ9ÿõ>ÿôBÿóEÿòIÿñMÿðPÿðVÿïYÿî^ÿíaÿìfÿìiÿëmÿêqÿéuÿéyÿç}ÿç €ÿæ!…ÿæ"‰ÿã#ÿã$‘ÿã%•ÿã&˜ÿâ'ÿà(¢ÿà)¥ÿß*©ÿÝ+­ÿÝ,±ÿÝ-¶ÿÜ.¹ÿÛ/½ÿÚ0ÂÿÚ1ÅÿÙ2ÉÿØ3Íÿ×4Ñÿ×5ÕÿÖ6ÙÿÔ7ÝÿÔ8áÿÓ9æÿÓ:êÿÑ;îÿÑ<ñÿÐ=õÿÐ>øÿÏ?ýÿÍ@ÿÍAÿÍB ÿËC ÿËDÿÊEÿÊFÿÇGÿÇH!ÿÆI%ÿÆJ)ÿÆK.ÿÄL1ÿÄM6ÿÃN:ÿÁO=ÿÁPAÿÁQFÿÀRJÿ¾SMÿ¾TRÿ½UVÿ½VYÿ¼W]ÿ»XaÿºYeÿºZjÿ¸[mÿ·\qÿ·]vÿ·^yÿ´_}ÿ´`‚ÿ´a…ÿ´b‰ÿ³cŽÿ±d’ÿ±e•ÿ°f™ÿ®gÿ®h¡ÿ­i¦ÿ­jªÿ«k­ÿ«l²ÿªm¶ÿªn¹ÿ©o¾ÿ§pÂÿ§qÆÿ§rÉÿ¥sÎÿ¥tÑÿ¤u×ÿ¤vÚÿ¢wÞÿ¢xãÿ¡yåÿ¡zéÿ {îÿž|òÿž}õÿž~úÿ›þÿ›€ÿ›ÿš‚ ÿ˜ƒÿ˜„ÿ—…ÿ—†ÿ—‡ÿ•ˆ"ÿ”‰'ÿ”Š*ÿ’‹.ÿ‘Œ2ÿ‘6ÿ‘Ž:ÿ>ÿAÿ‘GÿŽ’Iÿ“NÿŒ”Rÿ‹•Vÿ‹–Zÿˆ—^ÿˆ˜bÿˆ™fÿ‡škÿ…›nÿ…œsÿ…vÿ„žzÿ„Ÿ~ÿ‚ ƒÿ‚¡†ÿ¢Šÿ£Žÿ¤’ÿ¥—ÿ~¦›ÿ|§Ÿÿ|¨¢ÿ{©¦ÿ{ª©ÿz«¯ÿx¬³ÿx­¶ÿx®ºÿv¯¾ÿu°Âÿu±Çÿu²Êÿr³Îÿr´ÒÿrµÖÿq¶Úÿq·Þÿo¸âÿn¹æÿnºêÿl»ïÿl¼òÿl½öÿk¾ûÿi¿ÿÿiÀÿhÁÿh ÿgÃÿfÄÿeÅÿeÆÿcÇÿbÈ"ÿbÁÈ ÿý ÿý ÿý ÿý ÿý ÿýÿýÿýÿýÿýÿýÿüÿüÿüÿüÿûÿûÿúÿúÿúÿúÿúÿúÿú ÿù!!ÿù"!ÿù#"ÿù$$ÿù%%ÿù&%ÿù'&ÿø('ÿø))ÿø**ÿ÷+*ÿ÷,+ÿ÷-,ÿ÷.-ÿ÷/.ÿ÷0/ÿ÷10ÿ÷21ÿö31ÿö42ÿö53ÿö64ÿõ76ÿõ87ÿõ98ÿõ:9ÿõ;:ÿô<;ÿô=<ÿô><ÿô?>ÿô@?ÿôA@ÿôBBÿóCBÿóDCÿóEDÿóFEÿòGEÿòHGÿòIGÿòJHÿòKIÿñLJÿñMKÿñNKÿðOMÿðPMÿðQOÿðRPÿðSPÿðTQÿðURÿïVSÿïWUÿïXVÿïYVÿïZWÿï[Xÿî\Yÿî]Zÿî^[ÿî_\ÿí`^ÿía^ÿíb_ÿíc`ÿídaÿìeaÿìfbÿìgcÿìhfÿìifÿìjgÿëkhÿëliÿëmjÿênkÿêokÿêplÿêqmÿêrnÿésoÿétpÿéuqÿévrÿéwsÿéxtÿéyuÿézwÿè{xÿè|yÿè}yÿç~zÿç{ÿç€|ÿç}ÿç‚}ÿçƒ~ÿç„€ÿæ…€ÿ憂ÿ懃ÿ戄ÿ扄ÿ抅ÿ拆ÿ指ÿå‰ÿ厉ÿãŠÿã‹ÿã‘‹ÿã’ÿ㓎ÿã”ÿã•ÿã–‘ÿã—’ÿ㘓ÿã™”ÿãš•ÿã›–ÿ㜗ÿâ˜ÿ➘ÿ⟙ÿá ›ÿᡜÿ࢜ÿà£ÿञÿय़ÿঠÿà§¢ÿਣÿà©£ÿતÿà«¥ÿ߬¦ÿß­§ÿß®¨ÿ߯©ÿݰªÿݱ«ÿݲ¬ÿݳ­ÿÝ´®ÿݵ¯ÿݶ°ÿÝ·±ÿݸ²ÿݹ´ÿݺ´ÿÝ»µÿܼ¶ÿܽ¶ÿܾ·ÿÜ¿¸ÿÜÀ¹ÿÛÁºÿÛ»ÿÛüÿÚĽÿÚÅ¿ÿÚÆ¿ÿÚÇÀÿÚÈÂÿÚ ð                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  "                                                                                                                                                                                                                "#                                                                                                                                                                                                                         #'                                                                                                                                                                                                                         '(                                                                                                                                                                              (*                                                                                                                                                              *-               !                                                     # ! #                                        !!!!##!"        -/               "                                               $!" $!                                #""# $$"# !       /1               $                                               %"$ %"                         !         $##$"" &%#$!"       12              %                                            '$ % '$                         "          %%$%## !'&%%"#      2 6                '                                !"        !    )&"!'  )&""     !!     !! !   !   $         !  "! !!!(''(%%"#))'(%&   " ! 6!8               ! ( ! !                              "#    !    !"    +'#"(! +'##   !!    "" !" "  %!         !! "!  #"!""")(()&&#$+*()&'   #   "! 8#;    !       # + # #  !       !            !  $%  ! #   !$   -*%$+" ! -*%%! !!   %$!##$ !$ !  !!(#      "!!" ##!" $#!" !!%%#$!!%%++*+))%'--+,()! "   % "!!"$#!";#%>     # #    !  %- %  % #        #         #  ### "  &'   #  % !  #&   0,'&-$ #  0,''#  ##  '&##% & #&  #  # # *%    ###$!! &%#$ "&%#$ ! ##''%&##''.--.++()0/-.*+# $ !!'###$!!&%#$ !>&&@ !   $ "#      &/ & & $     !!!$ !        #  ####!!!!!!!!!!!!!!!!!!!!!!!! '(  $  & !  $'   1-('/%  $! 1-(($! &&  ('"""%&!'  ! "'!    "# $!"!+& ""      $$$%!! '&$%!# '&$%!"  $$((&'$$((/../,, )*11./,-$ %  ! " ($$$%!!'&$%!"@&(C "   & "%    "  (1 ( ( &  ! !  ###% "       "%  %%%%######################## )*  &  ( !$  ()!   40+)1'! %" 40+*%" ((  *)$""&(")  !  #"%!)""!! $# %"$"-( ""!   "   "! !&&%'##  !)(&'#%""""""""" !)(&'#$ ""&&**()&&**1112..""""""""+,4312./& !!' """""#!#!*&&%'## !)(&'#$C(*G $   ( &!!'  $!  *4 * *  (  " " %%%' !!!!!!$       #!!!'!  '!'!'!'%%%%%%%%%%%%%%%%%%%%%%%%! !+,  ( * "% *!!+" !  62-+!4)# !'$!! 62-,'$! !!!!!!(( !  ,+&&!$**$+  "# " $$!' "+$!$## & ( '$& !!!$ /*! &!$!!   "  "" "!  #""# (('(%% !#+*()$'#""""""""!#+*()%& ""'',,*+'(,,433411""""""""-.663401' ##) !"""""%#%#-!   (('(%%!#+*()%&!G(.M '   ,! (!$$ +  ($  .8 . .# ,  % % (((+ !!$$$$$$ ( !! " # "    !!!'!$$$      +$  +$+$+$+(((((((((((((((((((((((( $ $00  , . "!% ( ,!$$/&! !$   ;71/$8-& $     +( $$ ;711!+($ $$   !$$$$!,,! $# 0/"! !*!!!( $ &!,.!'/$!"&&#% ('!$#"+% "!%/($'&& *$! !*# +(  *$!!$$$'#4. $ (!$ &%$ "$&$ %!% &$#!#&%%&##,++,)) $&/.+- (*'&&&&&&&&$&/.+-() &&++10./+,00988955&&&&&&&&13;;8956+  &&- "$&&&&&)&)'1$#!###,++,))$&/.+-() $M,2T !+!    0! $"# -$''"#/  +' 2=2 2&/ )) ,,,!!!!!!/ $$''''''""""+ !!!$$""""#% & %$$$*$'''""""""/' /'/'/'/,,,,,,,,,,,,,,,,,,,,,,,,!#' ' !!45 02%!$)#"!,!1$''3)$$'#!A;53'=1*! '"""""!!/+#"'' A;5"5 $!/+'!! ''""#"$"!''''$11! !$!' & 43%$#! $-$$#-#'#+ $ 12$+4 '#'(*&) ++$'&%-'!# %$)!4+'!*!!  *"*" -' $#$ .% !!/+##-'$$''' +&92! !#' !-$'#+ )'''+! ' ($(+!!'&$&!" )(()&&0//0,,')32/0#+.*++++++++()32/1+-++//5423/044>==>::++++++++57A@=>9;!!!!/##))1 %'"+++++,*,*5!!'&$&!"&&0//0,,()32/1+-!#'T16[ $.$    3$#!'$&"/'*!*"%%3"   / ) 6B6 6)3 ,,# ///$$$$$$2!''******%%%%!".    $$$!!!!'"' $$$$&'     )"('''-'* * * """%%%%%%3)3)3)3)2//////////////////////// #&*  *####89 36 (! !!$'," &$#/$5'** 7,& " & *%#F@97*B5-$ * %%%%%$$2.& $"* * F@9$9#'$2.* $$  * * ""%%&%'$ $* * * * '33$#!#'# * #!)!87("' &$!#'1''"&/&*&!! /"'"56'.!!8" !)  )  + .- ), /.  ' * )(!"! "2*#&!#(!' ,#8.*!!#.$#"#-$-$1)"'!& ' "1)$$2.&&1)' ' * * * !   ".)=6$##&*"#/'*&!/"-*!! !  !++-$"*+',! -!!!!!!!!$$*)')$$""-,+-))433400 +-7634&/2.--------+-7634/0!! --!!!!!!!!3398683388CBBC??--------:?!!!!!!!$$$$3%%--5 (*$-----0-0-9$$*)')$$))433400+-7634/0$&*[5:b '!2'!!!!!!!!!!!!!!7&%$)!')$2*-#-$"((6%"!!"" "!3!"""!-!!:G::,7" !!!"/!/!"%333&&&&&&6$!!!!**-----!-(((("#$2 "!"""""!"!!!!"&&&$$$$)$*"! ! ! ! ! '"'"'"'")!*!-$+*!*!*!1!*!-"-"-"$$$"""(!(!(!(!(!(!6-"!!!"6-6-6-" 6333333333333333333333333"&(-! !"!!!! -%%''<=!  7:"+$""$$&*/$""!)!'&3'8*!--";0)"$!#")#-(&!!!! !!KE>;-G90&-"(!(!(!(!(! &&62)"'"$-"-"!KE>'"=%*!&62-"&&! ! -"-"$$(!(!)!'*'"!&! -"-"-"-""*99&%$&)&#!."%$!!,$=<+$*")&$%*!4!**$)2)-)#$""2%*%::*2$$<%# # -###+""""-"/0#,/ !21!#!"*#-"-!+#$#"$ 5-!& )%% +#*#/&<2.#$"""&1&& %%!0'0'4-% *#)"*#%4,&&62! ) ) 4-!!*#*#-"-"-"$"""%2,B:! !!&%&!!)-$&2* -)#!""2%.-##"!#"""#$!-//&%-/*"/#!"!!!/########&&-,*,&'%%0//0!!!!!!!!--876833"""""".0;:78!!!!!!!!)251////////.0;:7824##!!""!!//########77==:<77!!!!!!!!==HGFHCC////////>@KJGHBD#######&&&&7!!!!!((009!!!!##!!""+-'/////3031>&&-,*,&'--876833.0;:7824&)-!b8Cq"-&9- &&&&&&&&&&&&&&@,+*0&$-/"*#;14)4*$'.->*'&&!#''%'&#<&(''&"4"! &&C R$C!C3?'&&&'!7!&7&'+!;;;,,,,,,?*&&&&1144444&4....')*######:%%%%'&(((((&(&&&&!'!,#,#,#****0*1'&%&%&%&%&%-'-'-'-'/&1&3""*#2$####$1&1&1&8&1&4(4(4(***$$$'''.&.&.&.&.&.&>4'!& & & $'>4>4>4'! >;;;;;;;;;;;;;;;;;;;;;;;;',/#5& &'&&&&%4++--EG&!"$!% %%@!C!!'2)''**,"17*''&/&$-,<,#"C1&44(E70'*$&('0(5/-&& && %$!& &VPGD4$RB8,#4(.&.&.&.&.&%,#,#?:/(-'*#4(4(& VPG-'G+1&,#?:4(,#,#&%&%4(4(**.&.&$/&-1-(& ,#&%4(4(4(4('!0BB,+ $* ,0,(&#5'+)# &&2"*$"FE2*1'/,)+"0&=&11*/;/4/)*'';*0*BC19)*E+#(%(%4!(($(0'(''!4"'$68(3#!6%%%&!:9&$(!''1(4(3&2)*#)'"#*$>4&!,%0)+%2)1(7,E:5)*''"'",#9,,$+$+&8-8-=4*$1)/'0(+$=2,#,#?:&%/%/%=4&!& 1(1(4(4(4(*!'!'!'!*$"93LC&'&&,+",&&/4*,;1%4/)&'';*75))"'"&($"'"('()'4"68,*461'6)"&('''8)))))))),,4312,-""""""**7668&&&&&&&&33@??A;;#""#((((((57DC?A''''''''/:>98888888857DC?A:<))""&&((''88))))))))??GFCE?@&&&&&&&&FFSRQSNN88888888HJWVRTMO))))))),,,,?&&&&&..77B''''((''''24-88888;8;8G,,4312,-33@??A;;57DC?A:<,/5&qCK~&2*@2$**************G20/5+(25&/'B7:.:/()41F/++*%',#,*++'A+,,,!+%:&%#**K$$\(J%K9!G+***+%=%*=*,0!%BBB222222F/++++67:::::*:4444+./''''''@#****,+,,,,,*,++++%,%2'2'2'/#/#/#/#5/6,+*+*+*+*+*2+2+2+2+5+7+:&&/'8(''''(7+7+7+?+7+:,:,:,///(!(!(!)))4+4+4+4+4+4+F:+%+#+#+#(!)F:F:F:+% "FBBBBBBBBBBBBBBBBBBBBBBBB,14';* *,****):0022MO*%&(%)#))G%K%%,8.,,//2&6=/,,+5+(21C2'&I7+::,M>5,/(!*+)5-;41++#++#$)(%#+$+aYPL:(\J>2':,4+4+4+4+4+*2'2'F@5,2+/':,:,+#aYP2+O07+2'F@:,2'2'+*+*:,:,//4+4+(!5+372,+#2'+*:,:,:,:,+%6EE20$(/!#$161-+';,0.'#++8&/(&NM8/7,42.0&6+E+77/5B5:4./),A/6/JK6@./M0'-)-*9%--(-7,,+,##%;&,(>?-9(%=)**+%!A@+(-%+,6-:,8+8./'.,& ' /)F:+%1)5/0*7.6-=1MA;./#)#+%+%1'?21)0(0+?2?2E9/)6.5,6-0(D82'2'F@+*5*5*E9+%+#7-7-:,:,:,/%,%,%,%/(&@9UK*+**20&1++5:/1B7):4.*)+A/=;-.&,&!+-(&,%#,+-".!+;&;?20:<6+<-&+,+++?--------22;96822&&&&&&00>=<>++++++++::HGFHBB'&&(!!,,,,,,;>LKGI++++++++5AE?????????;>LKGIAC--&&++,,++??--------GGONKMGG++++++++NN]\[]WW????????PSa`\^VX-------2222G+++++44>>J++++--++++8;2?????B?B?P22;96822::HGFHBB;>LKGIAC25;*"~ISŒ*#7/G7(/ /////////////"O753;/-8;*4+F-++++-<0<0<0F0<0A1A1A14 4 4 ,%,%,%.!.!.!909090909090LB2)0'0'0',%.!LBLBLB2) %MIIIIIIIIIIIIIIIIIIIIIIII16:+A/ /1////.@5577VW/)*,)-'.- O )S))"1>311337**3,*WU>4<1:735*)22-2=1101'&)@*1,DE2?,)C-../#)%HG/-2)01<2A1@/>24+21*$+#4-K?/)6-:45.=2<2D6VGA33'.&2*2*6,F76-5,5/E8E8K>4-<3;1<25,I>7+7+NG/.;.;.K>/)/'<2<2A1A1A13)1)1)1)4,*#G?^S/.//75*6/0;A46F<.A:2/.2F4DA23*1*%02-*0*'101%3%0@*BD75@C<2C2*01000D2222222277A@<>78******55DCCE00000000@@PNNPII+**,%%111111ADTSNP00000000:HLFDDDDDDDDBETSNQHK22**001100DD22222222NNXWSUNO00000000WWgeeg``DDDDDDDDY\kjeh_b22222227777N0000099EER 0000110022=A8DDDDDIEIEX77A@<>78@@PNNPIIBETSNQHK7;A/%ŒP\›.&=4O=,4#4444444444444%W=;9B51>A.:0QCH8H:13?=V:85#4-#06+63$550Q5666$)%5/H/-+44#&\,,#q1[&&!.\#F)W84444-#K$.4K#4!!#5;#!).PPP%======V95555CCHHHHH4H????889000000O+33336566666465555-6-=0=0=09+9+9+9+B9C65353535353>5>5>5>5A5C5G/.:0D10000"1C5C5C5M5C5H6H6H6:$:$:$1)1)1)3%3%3%?5?5?5?5?5?5VH8-5+5+5+1)3%########VHVHVH8-!!!!!!!!!!!!!!!!!)VPPPPPPPPPPPPPPPPPPPPPPPP6<@/H446"44443G;;==_a4"..1.2+32!!!!!!!!!!!!!!!!!!!!###W#!.\..%6D96699=/CK:665A51>5:0H6H64+wmb>5a;C5=0VOH6=0=05353H6H6:$:$?5?51(A5>C>65+=053H6H6H6H68-&B&WW=;,19)+,&M>SE:2C8A6B7;1SE=0=0VO53A3A3SE5-4+C7C7H6H6H69.6-6-6-:1/&OFh\4544#=;/<55AH:......::LJJL55555555GGXWVYQQ0/.0))666666IL]\WY55555555APUNMMMMMMMMIL]\WYPS88..556655MM88888888VVa`\_VW55555555``rpprkkMMMMMMMMbewvpsil8888888====V####55555@@LLZ###$$###5555775588DH>###MMMMMQMQMb##==HFCE=>GGXWVYQQIL]\WYPS=AH4)›[d¨2*C8VC 08&8888888888888(_B@>G96CG2?4VIN=N?5:EB]?=9!&!81&4;/;8':94W9;;;'-(93N32/!!88&*d00&{5c**$2d&L-_=888:1&Q'28Q&!8$$&:A&$-2WWW(BBBBBB^>9999IINNNNN8NEEEE==>444444V/8888;9;;;;;8;99992;2B4B4B4>/>/>/>/G>I;9898989898C:C:C:C:G9I9M32?4J64444%6I9I9I9T9I9N;N;N;?'?'?'5-5-5-:(:(:(E9E9E9E9E9E9]N=29/9/9/5-:(&&&&&&&&]N]N]N=2$$$$$$$$$$$$$$$$$-]WWWWWWWWWWWWWWWWWWWWWWWW;AF4N88;%88887N@@BBgi8%22527/77$$$$$$$$$$$$$$$$$$$$&& &_!&!!!$2d22(;J>;;>>B3IQ?;:9G96CAY&!B43bI9NN;fRG;?5-8(=(:G-/0*BGA<94O;@(>4/&&&&&&&&&&&&&&&99K3>52hgK?I;FB>@3H9Z9II?GVGNF=>:;V?H?bdIV>>g@4<7*<8L1<<66\N91B7G=@8J=H/:/=3=3A5UBA6@5@9TCTCZL?6H=G;H<@5ZKB4B4^V98G8G8ZL919/I2;2;2;2?53*VLqd8:88&B@3A99GN?AVI7NF=8:=V?RN==2;2,9<63:3/;:<-=-:M3OSB?M"PH=Q=29;:::S&&&========BBNMIKBC222222??RQPS99999999MM`^^`XX!!4325--;;;;;;ORed^a::::::::FW\USSSSSSSSOSfd^aWZ==2299;;::SS========^^jhdg^_99999999ii|zy|ttSSSSSSSSkn€z}sv=======BBBB^&&&&99999EESSb&&&''&&&::::<<::==JNC&&&SSSSSXSXTj&&BBNMIKBCMM`^^`XXOSfd^aWZBGN8-¨bâìÆž€ ~O’¼ÇÉÝ†ŠŒ¡Î_cuù…óEMWY[]}´ÄÓÛïôþ    " & 0 : D p y ‰ ¬ ® ´ ¹!!!"!&!.!^""""""""+"H"`"e%Êàÿïýðõøûÿÿ   ’¼ÆÉØ„ˆŒŽ£brŠ€ò HPY[]_€¶ÆÖÝòö    & 0 9 D p t € ¬ ® ´ ¹!!!"!&!.!S""""""""+"H"`"d%Êàÿïýðõøûÿÿÿùÿõÿäÿãþ¢þ—ÿ HHþÀþ¿þ±þâæâzäæäääâäàäÞäÝäÜäÛäÚäØä×äÖäÔäÓäÑäÐà@à:á*àÿàüàöß¶âìâåä1àmâßTàxàSߘߕßߋ߈߅ßyß]ßFßCÛß#ìï ˆ ±”îîööFJNRR:J88{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ     !"#$%'()*+,-./my0123456789:;kw<=>?@ABCDEFGHIJKLMNOPQzRSTUVWXæçèéêëìíîïðñòóôõö÷døùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|YZ[\}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—]˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯i_abcdueãåÏÕ×ÝžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µÓÖØÙÚÛá¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÜßÞàâst˜nocpqeghrlx‚ƒˆ‰Š‹Œ„…†‡Ÿí«­ª¬®¯°   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`aŸ ¢¤¬±·¼»½¿¾ÀÂÄÃÅÆÈÇÉÊÌÎÍÏÑÐÕÔÖ×g‹}~‚r‘º‰„vƒ¦¡³£Œ§¨€šœÅ¤…•žÁÓš|‡¢d¥›†–f{›ž°mystpqnoÒ©Úznblx¬®h’cej¥œ¦£¨©ª§®¯­µ¶´ iuŠabc“ed_Æž€ ~O’¼ÇÉÝ†ŠŒ¡Î_cuù…óEMWY[]}´ÄÓÛïôþ    " & 0 : D p y ‰ ¬ ® ´ ¹!!!"!&!.!^""""""""+"H"`"e%Êàÿïýðõøûÿÿ   ’¼ÆÉØ„ˆŒŽ£brŠ€ò HPY[]_€¶ÆÖÝòö    & 0 9 D p t € ¬ ® ´ ¹!!!"!&!.!S""""""""+"H"`"d%Êàÿïýðõøûÿÿÿùÿõÿäÿãþ¢þ—ÿ HHþÀþ¿þ±þâæâzäæäääâäàäÞäÝäÜäÛäÚäØä×äÖäÔäÓäÑäÐà@à:á*àÿàüàöß¶âìâåä1àmâßTàxàSߘߕßߋ߈߅ßyß]ßFßCÛß#ìï ˆ ±”îîööFJNRR:J88{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ     !"#$%'()*+,-./my0123456789:;kw<=>?@ABCDEFGHIJKLMNOPQzRSTUVWXæçèéêëìíîïðñòóôõö÷døùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|YZ[\}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—]˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯i_abcdueãåÏÕ×ÝžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µÓÖØÙÚÛá¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÜßÞàâst˜nocpqeghrlx‚ƒˆ‰Š‹Œ„…†‡Ÿí«­ª¬®¯°@?XUTSRQPONMLKJIHGFEDCBA@?>=<;:98765/.-,(&%$#" ,E#F` °&`°&#HH-,E#F#a °&a°&#HH-,E#F`° a °F`°&#HH-,E#F#a° ` °&a° a°&#HH-,E#F`°@a °f`°&#HH-,E#F#a°@` °&a°@a°&#HH-, <<-, E# °ÍD# ¸ZQX# °D#Y °íQX# °MD#Y °&QX# ° D#Y!!-, EhD °` E°FvhŠE`D-,± C#Ce -,± C#C -,°(#p±(>°(#p±(E:± -, E°%Ead°PQXED!!Y-, E°C`D-,°C°Ce -, i°@a°‹ ±,ÀŠŒ¸b`+ d#da\X°aY-,ŠEŠŠ‡°+°)#D°)zä-,Ee°,#DE°+#D-,KRXED!!Y-,°%# Šõ°`#íì-,°%# Šõ°a#íì-,°%õíì-, °` <<-, °a <<-,°C°C -,!! d#d‹¸@b-,!°€QX d#d‹¸ b²@/+Y°`-,!°ÀQX d#d‹¸Ub²€/+Y°`-, d#d‹¸@b`#!-,E#E`#E`#E`#vh°€b -,°&°&°%°%E#E °&`bch °&aeŠ#DD-, E°TX°@D E°@aD!!Y-,E±0/E#Ea`°`iD-,KQX°/#p°#B!!Y-,KQX °%EiSXD!!Y!!Y-,E°C°`c°`iD-,°/ED-,E# EŠ`D-,E#E`D-,K#QX¹3ÿà±4 ³34YDD-,°CX°&EŠXdf°`d° `f X!°@Y°aY#XeY°)#D#°)à!!!!!Y-,°CX°%Ed° `f X!°@Y°a#XeY°)#D°%°% XY°%°% F°%#B<°%°% F°%°`#B< XY°%°%°)à°%°%°)à°%°% XY°%°%CH°%°%°`CH!Y!!!!!!!-,°CX°%Ed° `f X!°@Y°a#XeY°)#D°%°% XY°%°% F°%#B<°%°%°%°% F°%°`#B< XY°%°%°)à°) EeD°%°%°)à°%°% XY°%°%CH°%°%°%°%°`CH!Y!!!!!!!-,°% F°%#B°%°%EH!!!!-,°% °%°%CH!!!-,E# E °P X#e#Y#h °@PX!°@Y#XeYŠ`D-,KS#KQZX EŠ`D!!Y-,KTX EŠ`D!!Y-,KS#KQZX8!!Y-,KTX8!!Y-,°CTX°F+!!!!Y-,°CTX°G+!!!Y-,°CTX°H+!!!!Y-,°CTX°I+!!!Y-, Š#KSŠKQZX#8!!Y-, ŠI°QX°@# Š84!!Y-,F#F`#Fa#  FŠa¸ÿ€bб@@ŠpE`h:-, Š#IdŠ#SX<!Y-,KRX}zY-,°KKTB-,±B±#ˆQ±@ˆSZX¹ ˆTX±BYY-,Eh#KQX# E d°@PX|YhŠ`YD-,°°%°%°#>°#>± ° #eB° #B°#?°#?± °#eB°#B°-¸ÿÀ³ÿ(F¸ÿÀ@ÿFß³ï³ÿ³¯²¿²@°° °¯®¸ÿÀ@²­ F¬ ¬@«P«`«`ª ª§¤¦¤¥¤¤£¢ž¡ž  žŸžœ™È›™š˜}™˜G—2–‘•‘}”“¦“’‘ŽHŽdOŽoŽŽ¯Ž@Ž8;FŽ‹Œ‹}‹Š…>‰‡"ˆ‡d‡ ‡0‡P‡`‡¸ÿÀ@ʇ69F‡†¯…¿…Ï……„€ƒÉ‚¦È€ ~y3}{7|yd{-z_yoyyxtwu~vsdu}t`spss sÀssr~oUq~pUh[[Ug[_Uf[]Ud[ZUc[\Ub[YUXCVUWCUUSMURKUQJUPIUONU/N¿IßIÿIG[CUF[BUE[AUoATS¸³¸K¸çRK°P[°ˆ°%S°ˆ°@QZ°ˆ°UZ[X±ŽY…BK°SX° YK°HSX°@YK°€SX°±BY++s+++ss++++++++++++++++tu++++++t++++++t++++++s+++tu++++++++stu+++++++++++++++++++++++++stts+ssss++EEµÿGâÿñÿþGÿGÿoâ ÿõÿþÿþ©µÿñÿGµbñHõNÿóÿgÿïÿCDhÞ;½ÿøaœIfN°O :TCn]ÄD`L°EÞTPk=\`3LQuY2EH]µO>…Bn†²œ /rRÄ…n=*X<R5¢æNPÄH>bDDDD°È$´X˜0È  t Ø p ´ ô xà@ô0Œ`´à ”ètˆhœÈ$  l ¼""l"¬#h$œ$Ø&¤'|(ø)¨+D,D-ð.P.ô01Ì33Ð4d4¤4è5(5À5ô6H7¼8¬9È:à<<<Ä>8>ø?d@ A`AÌCtD0EEøGG„IDIðJˆKˆOÈPÀR R SlSœTlU,V„VìW¬WÄWäXdY Yp[L[x[Ä\À]@] ]¸]Ð^$^P^€_4`X`€`ÈbbPbPb¼c˜d”eÀfÐgii|k$lLldl l°nÄnüoÈp`q,rrlrôstsˆtttu0uHuhuˆu¨vŒv¼vèww@wty0z{à||<|l| |Ð|ü}(}\~H~t~¤~Ð~ü(\€ƒƒLƒxƒ¤ƒØ„„°†D†p†˜†À†è‡‡<‰8Š”ŠÀŠè‹‹@‹l‹”‹¼‹ìtœÈðŽŽ@Žp,ô‘ ‘H‘p‘ ‘È’¤’Ô““(“T“|”ô–€–¬–Ô——(—T—|—¨—И˜@˜P™T™„™¬™Üšš4š\›œ œÐœø$Lx ÌôžžDžpžˆŸ< ( T | Ô¡,¡X¡€¢ ¢Ð¢ü£4£D£\£t£ £È£ð¤¤P¥X¥ˆ¥ ¥È¥ð¦H¦t¦˜¦È§`§ô¨ ¨H¨p¨˜¨Ä¨ì©©0ª ªø«$«L«x« «Ô¬¬8¬`¬ˆ¬°¬à­­4­\­ˆ­°¯¸±|²h³h³”³Ð´Pµµ,µTµ€µ¨µÔµü¶$¶H¶|¶¬·Ì¸Ä¸ð¹¹H¹p¹œ¹Ä¹ðººHºtºà»»0»X»€»è¼P¼¨¼¸½0½x¾L¾Ì¿L¿|¿¬¿ØÀÀ8ÀlÀœÀÈÁÁ¬Â4ÂôÃÜÄXŠƈƜưÆÄÆØÆìÇÇÇ(Ç<ÇPÈdÉ<É|ɼÊ,ÊœË Ë|˼ËüÌ<Ì|ÌÔÍ,ÍlͬÍìÎ,ÎlάÏÏ\Ï´Ð ÐdмÑüÒøÓDÓøÔÔ4ÔDÔXÕÖ× ×8×ä×üØØôÙ ÙüÚ ÚðÛÛÛ0Û@ÛPÛ`ÛpÛ€ÛÛ Û°ÛÀÛÐÛàÛðÜÜÜ Ü0Ü@ÜPÜ`Üp܄ܘܬÜÀÜÔÜèÜüÝÝ$Ý8ÝlÝÜÞ<ÞtÞ„Þ”Þ¤Þ´ÞÄÞÔÞäÞôßßß$ß4ßDßTßdßxßߨ߼à¸ââ´ã„ädå(æXçÌè¼èÌéØê„ëdí íxïðñòpóàõHõ°ö ÷|øÄùLúäûØüÌýdþì X˜ˆœx  Ü à ° €  Ôt8 àà8ØØÜÜ€”˜d|,<TÄÔô  4 L d | ” ¬ Ä ð!!D!l!˜!À!ì""L"„"¼"ô#,#d#œ#Ô$¸$ð%(%\%Œ%¸%è'(\(ˆ(°(à) *ì,,H,p,œ,È,ð-- -8-d-Œ.@.ä//@1D1l1˜1Ä1ð22L2€2°2Ø3 3@3p3˜3Ì44,4T4ˆ4¼4è55D5x5¨5Ð6686d6Œ7à99D9p9ü;h<¬=´>€?L?x? @”BTBŒBÄBøC(CTC|C°CàD D4EF|GpHÀIôKˆMN\NÄO°QtRXS\T`U´V V°W¸YPZZÔ\X]H^@^Ì`0aØbìcdcÔd¤e<e¤fègðhÐi°iüjXj°kxl4mmLm€n”nÀppp€ppÄpÔqÔr¨sps sÐsütXthtxtˆtÄudutwxxy„y°yÀz\zlz|zŒzÜzìzü{ |P|`|p|Ð}l~<~Є€D€à‚Pƒ˜„¬„¼…à†à‡‡Ä‡Ô‰dŠŒ‹L‹d‹tŒ(ŒœìüŽ Ž`Žpœ¬ ¨‘Œ’ ’ô“Ü”œ•l–X—D—\—t˜œ˜´™€™™ ™Ð™àšô›Ì›Ü›ôœ œ$œˆžžôŸü¡l¢€£p¤P¥ü§P¨,©ª «D«Œ«Ø¬<¬ ­˜®`°0±ð³Ôµ ¶”·¨¸üºT» ¼à¾¿<¿¼À8À¨Á ÂÔÄ”Æ Æ0Æ@Æ´ÇÇ,ÈÈÐÉØËÌÐÍLÍÄÎ|Ï8ÐÐÔÑhÑxÒðÔ\Õô×€×ר×ÀÙ`ÚpÛHÜ$ÜÐÝ|Þ,ÞÌßxà(âãhãxãã¨ãÀãØãèãøää(倿|æ”æ¬æÄæÜæôç çç,çDç\çtçŒç¤ç¼çÌè¬èÄèÜèôé é$é<éTélé„éœé´éÌêêlê„êœëüì í€î`îÄï´ð ð0ð@ðPð`ðpð€ðñèñøòòÄòÔòäóPó`ópó€óó ó°ôøõöP÷døPùˆú<û¼üìþ(þ¼ÿ¤ p€ìü èÌœ0°˜¨P ì  P „ ¸ ì $ x ¬ è  8 ` Œ À ü $ T | ´ à8|(T€´èP„¸4ÔÜ<¨Àà(T„¸è0H`x¨Ðü,`”Äô$<Tl„œ´Ìä<p¤Ô<pˆ ¸Ðè0X„´èLd|”¬ÄÜ0`”Èø(Xpˆ ¸äH|°ä  L d | ” ¬ Ä Ü ô! !8!`!Œ!´!à""4"`"Œ"´"à##8#d#¤#à$($p$¸%%H%%°%Ð%ð&&0&P&p&&È''D'„'Ä((D(„(¤(Ä(ä))$)D)d)„)À**D*Œ*Ð++X+œ+¼+Ü+ü,,<,\,|,œ,È,ô-4-\-˜-Ä...4.L.d.|.Œ.ì/X/Ð0¨0Ü11<1d1œ1´1Ì1ä1ü22´3d404\4ˆ4Ä55,5h5”5À5Ø5ð67,7ì88<8t8¬8Ø99,9d99¼9Ô9ð::¼:Ì;;H;l;¨;Ô<<(<@><>\>|>œ>¼>Ü>ü??<?\?|?œ?¼?Ü?ü@@<@T@l@„AüCLC€KH2Âî@  /Í/ÍÞÍÞÍ103!'!22þÔîý2ŠývGÿó͵ #@   c[??ÝÎ9/3Äý2Ä10#.=3#"&54632¼ : d$$$$ùT‰DD‰T¼ý((((ÿÿHõZø&  ±1jµû@¦              ?        /!0 yA y B BA???Þ]ÀýÀ?ÞÀýÀÖ]ÀÀÀÖ]Ä]Á‡+Á‡}ÄÖ]ÀÀÀÖÔ]Á‡+Á‡}Ä10]]3733#3##7##7#537#537337#¢#T#Xg"‰—#T#¢#T#Xf"ˆ—#TT¢#¢þ··J³J····J³J·þL³=ÿ“ô3ù@Ÿ4))(W%%˜h Y  +)¨ ™`'‡+‡- $ $s  $ 0'--0˜‚§'•''''5‚ 104š‹jw — & f   1ˆ0,*ˆ-˜-g-w--Jxˆ?O†–/]3Í]3í]2?]]3Í3í299]]]]]]Þ2ÖíÖ^]]]í]9/99Á‡+Á‡}Äí2/íÄ]2]10]]]]]]]]]]]%2654.'.546753.#"#5.'7M>-;;.UQS,LH6,GW ~ K2ÿñ(Ä3?C•@fCA@A®BCBCB@B@*  )  ®:¬ 44)44®?***&**E  &  ®¬&® )DCABBAB@A%}7­=}/F}­}E?ýþí?ýþí????Þ^]ý]þí]Ö]]ý]þí]99//‡+‡}Ä104>32#".74&#"3264>32#".74&#"326#2+:"":++:"":+ð*''**''*È+:"":++:"":+ð*''**''*<þy[‡ -D//D--D//D-6==66==þÓ-D//D--D//D-6==66==BýKµ.ÿ÷Å+9F|@ö˜*&`f”Bª?›? ) B AC5!6 A6!C96C6C6|CC64!3$!% A% A33%|33Jd˜%f%˜‹y[%w "!!A A!!A:‚i '  H@‚w,,‚G3%%%'D…y f1v11| ''F!B By==|7  ¸ÿð´ H E?+]í].???]í]9/9]]]]99]]..Þí]Ô^]í3/Ò]]À/]íÁ‡+‡}ćÄÂ/í9]]]]]]]]‡+‡}ÄÁ‡+Á‡}Ä]10]]]]]]]]]]]]74>7&54>3267#.'#".73267'4&#">.)6J/A'(?+'2¢" M!#;b #)lFAV5] 3&1S Ã%ó-',/D'¸'=1%JO(@,(8#8.&¥?M )a0&J#*)3%9D!*#$!Å #0Q"/5'A> ")Hõ©ø @   Z?Í9/í10#.=© 7 ø21k55k21NÿG= a@B *  ™ é ù ‹   ð ´   Ž  m }   W‚ db?3?3Ö]ý]Æ]]]]]]q2Å]]qq210.5467«JHBN__NBHJ+€Ú]-_÷ŽŽ÷_-]ÚÿGö a@B %–æö„ ÿ»¯€brX‚ bd?3?3Ö]ý]Æ]]]]]]q2Å]]qq2104&'7'>™JHBN__NBHJ+€Ú]-_÷ŽŽ÷_-]Ú%7»µ,¼@y‰v†xi#¸ÿà@]H#""t„™@Ÿ{‹– H,,**' .- 7' !š'##+de+[?Å2/2]3]9/93í233]339/33333/3/3/3+3/]3]]3/]]3]]3/3+10]]]]>?'.''7>7./7.=3$F)(P*!:I##I:!*P()F$Z­*M)&T 5#3$G&&G$3#5 T&)M*55ÿ! 1@°¯° °¯°¯P  /]íí3/ýí9/ìÀý2í103533##5#5½P½½P½SÎÎOÏÏ&ÿa³r .¹ÿà@ H‚  ? O  /3/]9/Î3í22+107'>54&'²% Hr?{83i.  W-@@€¯¿Ï@ $H—/í+]ÞÝÎ10^]3#÷÷WW8ÿó¾y "³ ¸ÿÀ@ H  c?ÍqÞÍ+q107#"&54632¾$$$$6((((ÿèÿG˜'@®ddbb????/Ö‡+‡}Ä10#3G_S]¹È2ÿñÅ ݵM¸ÿð³M¸ÿð@ MM ¸ÿà@M M M¸ÿà³M¸ÿà³M¸ÿà@*M M M Œ@M@ML L!Œ¸ÿÀ³M¸ÿÀ³M¸ÿð´L¸ÿð¶ L ¸ÿðµM ¸ÿð@M WMMX?+í+?+í+Þ++++íÖ++++í10++++++++++++4632#"&%4.#"32>2{mm{{mm{n 4&&4 4&&4 [®¼¼®®¼¼®9fL--Lf99fL--Lf]qµ P@5‹ _oŽ 0 P ` p  UV??9/]í3]]9/^]Î]3í910>73#]9l-B] #)-&E4ýK4 8êÅ,å@/‹Œ @M@ L.$%k {  Œ-$¸ÿð³M$¸ÿà³M$¸ÿÈ@M$ML L¸ÿè´L¸ÿè¶M %¸ÿà´L%¸ÿø´ M%*¸ÿð´L*¸ÿè³M*¸ÿø´ L*¸ÿð@ M*X Ž U?í?++++3++99+++í++2+++ÞíqÆ2Ö++Äí99//Á‡+Á‡}Ä10!!&454>7>54.#"'>32Ó0<-(?þ\2>-# +0&. $2>$mm$CA?.2.O /QH@//2* B e7ÿñéÅ8Ã@§!–!‡!MM6M4M¸ÿð@bMYiŒ#Ÿ#¯###+{&]&m& & &5jIYŒ‡++++:659&& Ž65M50L0W LX?+3í2?+3+í29/í9=/Þ2Æ2Ö^]]]í]]99//]]Ô]]í]10+++++]]]72654.+532>54.#"'>32#".'7âYM 4E$!5,!+0C$ %.57P4>,2%AbC70$ODF;&4 L -"( G 1C'6M.<%-M8  Q( µk@?(+(8  ‹ ;_o‹Ž Ž  UŽV?3í?9/í3/í2Î2ír^]ÖÝ2í2/^]]q210^]]7>733##5!3(BS_0YRRZþÊ6=:3Üð,u|x0þHL±±– OVZ+Aÿñëµ'¦@ M M M¸ÿð@;MM"jŒ)##‹    (#"Ž ŽLMM¸ÿà@ M M V M LW?+3+í2?9/+++++íí2Þ2Ö9‡+}ÄÖ^]í]Ä10+++++#".'732>54.#>7!#Ç—?`B6.$M8-=&BnTNýªxg.N8  Q"-&;(1VRQ-O374?ÿñ¸-˜µ-M$¸ÿð³M¸ÿø³M ¸ÿø@9MMW0Y++Œw/† –  !ŒGW. &¸ÿð@ L&W¸ÿð´MX?+í?í+9/3í2Þ]í2]2Ö]í]9/]]310]+++++4>7>32#"&7"32>54&?8g“\;aL4 A#;R45R8rwà#< 4(!. Ae›j7N4S= $;M*&PB*œÐ  ,N;#,3DH<õµ%@‹‹U ŽV?í2?ÎÖí9/í103>7!5!£-BO&þ¯¹!PG3P±§-QM&…¥»]7ÿñýÅ!3E¹2ÿè³M2¸ÿð@ M.M ¸ÿð³M¸ÿø´LE¸ÿð³M@¸ÿðµM4Œ¸ÿø@!LCA A1//M/A / A‹//A¸ÿà@7MP M_   ,ŒvG>ŒL"Œ M F 9¸ÿð¶ LX'¸ÿðµM'¸ÿø@ M LW?++í+?+í9/3/Þ+íÔ+íÖ]]í99//]+]+Á‡+Á‡}Ä+‡Ä‡ÄÔ+í10+++++++%#".54>7&54>3232>54.'4.#">ý9V8AW4)b7N08P3%vþš 2&"3 -?(-1ú , - "7&*2´*G5%8C5.%8m&E4"5@3," 8'!( 0$ J0$%,& C3ÿþõÅ-Î@ $ M M¸ÿà³M¸ÿð³M¸ÿø³M¸ÿð³M¸ÿè³M¸ÿø@) M ! L!Œ›«wOh/+¸ÿð³M+¸ÿø@M+ŒM. ¸ÿÀ@ M &M&XMW?+í?í+9/+3í2Þ+í++Æ^]]9/]]]3í+2210++++++++'2>7#".54>322676454.#"õÍÊ?eL3 B#;R45R89W;à#> 4(!. A ÎÓN5T= #;M*%PB*(Lm‰  +O;#+3DGÿÿ8ÿó¾&@  PO++4ÿÿ&ÿa¾&@ PO++45Lÿ `@&¯¯ M¸ÿð@ MP€/]Í+Í+//Á‡+Á‡}Ä/Á‡+Á‡}Ä10%5%œcþP°+’M·P·M5™ÿ½.@ ¯?O¯¯0@/]íÞ]í9/33/3107!!!!5Êþ6Êþ6èO$O5Lÿ d@"¯¯¸ÿð@ M MP€/]Í+Í+///Á‡+Á‡}ÄÁ‡+Á‡}Ä107'%5°þPc½M·P·M’ÿóyÅ!-’¹ ÿà³ M¸ÿà³ M¸ÿø³M¸ÿø@6L"‚(@8H((Xhx ' 7  ///. ++%c¸ÿð¶Mˆ¸ÿð¶Lh?3+í2+?ÝqÎÎ2]Ö]í]9/^]í3/+í10++++"'>32#&54>54&#"&54632®B?"U09I,&.&N$($6 $$$$w"H0;"5.*-5!  4-'(,*5ý¿((((AÿguÅEU÷@­¦D‰C™Cg?U?X5–)—#§#Ši ¨IM.//ï–¦ˆV™©xYA A‡AAAAWSÐ à ð y ‰ ™  v&†&–&'&7&W&&à7Ÿ77VMP‡<‡!`IF‡/2‡.+iy‰K[:  H/33+]]]Þ2í2í22?3Þíí2Þ]qý]]Þ]qíÖ^]]]ý]]]Î]]]q2/3í29]10]]]]]]]]]]%"&'#".54>3232>54.#"3267#".54>32'267.=.#"² *>0O: ;U63U' ,RuIIzX14]L;M Y3YžvEDs—TR’n@4Hð+"GFD+ ;V90U?$þÎ $:I&?oT01[„TX…Y-J3i£pl¢k65eZDhG$Q  ëXCGTµܹÿø@4 M     L s  ¸ÿð@C M s  @p Ðy_o B A AB????99//]3í2Æ^]]]qÆ9/Á‡+‡}Ä+‡ÄÄÄÄÄÄÁ‡+‡}Ä+‡ÄÄÄćÄÄÄćÄÄÄÄ10+!.'!#>73.'%þÆ?e(FCB$Y$BCF(Å ?"#?-W-±n»¨™KK™¨»nW£KK£WVÿúP¼)8‡µW0v¸ÿð´M¸ÿð´L¸ÿð@ M$v@ L¸ÿø@L@ M0M::¸ÿÀ@ M8s¨985| *y)) E|F?2í2?39/í9í2öí2+Þ++++íÔ++2+í10]".'>3232>54.#'32>54.#"11001032.#"3267€IxV/5ZxD+E3  "+37X>!:W:CX$6H0\‡WW‡\0 P &Hg@>fI( P Vÿú¼‚@L M MMv@ M¸ÿø³M¸ÿð@L@ M©s¨ M| ¸ÿø¶M E¸ÿø@ M|MF?+3í+2?+3í+2öíö++++í++++10#"&'>322654&#"8fŽU*e))e*UŽf8þ‡ŠˆˆŠ)- -[Z…W+   +W…þšýîVµ 5@   s¨ y y ByA?í?í9/íþí2Þ^]ÆÎ103!!!!!V§þº"þÞ_µSÎQðSVøµ (@ s¨ y ByA?í?9/íþí2ÖÎ103!!!!V¢þ¿þãµSÑRþÁ:ÿò^Å'ѵ M¸ÿø@,M M's@M@M¨))@M)@ M)¸ÿø³M¸ÿð@ Mv @M M ¸ÿø@ M @M ©(¸ÿð@M M|¸ÿè@ LME'$¸ÿø³M$¸ÿð· M$|F?3í++2?+3+9/í+2+ö++++í++]++ö]++íÆ210+++3#".54>32.#"3267ýa -;F$IxV/5ZyE/I4!`25W=";W;*; Uþ¼ 0\†WW‡\0 Q&Hg@>fI( Vkµ 7@ s¨  s¨ yABBA????9/íþí2þ^]ýÀ103#!#3! aaþ­aaSµýK@þÀµþßV·µ$¹ÿÀ@M¨s¨BA??öýæ]+103#VaaµýKÿñ£µy¹ÿð@ Mgs@ M¨¸ÿÀ@ M @ M @ M  A ¸ÿø@M|  L MMMF?+++3+í+2?Æ^]++2+ö]+í10]+%#".'732653£5YC"9." &C2HBaß2VA%  M!IYÍVoµÛ@`MYy Mˆ Ø Ø§ M H  (  s MÀÊs)9 ¸ÿè@/M0 P `  s¨AÀ{ÀÏAB BA????9/]q9qíq?þí22Ö]+Æ]]‡+‡}Ä]q+‡ÄÄÄćÄÄ3í^]++10]]]]+]+#.'#3>7WNUT%+`\QrNWY*aa#TRIµ"SWT$Xdh//_WJþ·µþÎ!STMV÷µ@ s¨AyB?í?öíÆ10%!3÷þ_aTTµýŸC%µ)J¹%ÿð³M$¸ÿð³M!¸ÿø@Hf!¦!÷ §f¸ÿè¶MW¸ÿð@9M ˆøi÷ ùØè™©ˆiW–¦‡s+¸ÿÀµ M+©¸ÿð¶ Ls¸ÿÀ@$ H"™s¦…•O)vO‰™©¸ÿÀ@& H  L s  ©*@H|))BAAA"¸ÿà´ M"¸ÿÀ·L°¸ÿÀ@ H¤|A B??í]+]+2+????9/í+ö^]í+Õ+]Ô]ýÔ]]]í]2Õ+í+æ+í]]210]]]]]]q]]]]+]+]]]]+++%.'#>73>73#&' !&+&! _  U>>::>>U"_ !&+&! `JV[Q@vþíŒZ·±¨K,xƒƒ66ƒƒx,þ±þšŒv@Q[VJV‚µ–@ ‡ w  s  s@ L¨¸ÿÀ@C M„s ¨B‹›zkZI„”br@P4A A ABB?????99]]_]]]]]]]?öí^]+ö+ý‡+‡}Ä_]10]]!.'#3319BGFB_M/ki] _%\cf_T ýãµ2…ˆ5ýK:ÿñÐÅ'µ M ¸ÿà³M¸ÿà@M MMM M M¸ÿø³M¸ÿø³M¸ÿø³M¸ÿø@MM Mv @ M ¸ÿø³M ¸ÿø@M @ M ©)ð)¸ÿø³M¸ÿð@ Mv@MMM@M©(¸ÿø³M¸ÿø³ M¸ÿð@ M|F#M# M# M#|E?í+++?í+++ö++++í++]ö++++í++10++++++++++++4>32#".732>54.#":5[yDCwZ55ZwCDy[5f ;U55T; ;T55U; [Yˆ[..[ˆYYˆ[..[ˆY?gH''Hg??gH''HgV=¼R¹ÿð³ M¸ÿè³ M¸ÿðµ Mv¸ÿø@L s ¨y B| E?2í2?9/íöí2Ö+í10+++2+#>"32>54.’+QtIMa)e2>!I2P75F¼on32.'.732>54.#":5[yDCwZ5(G_6'32"32>54.©143j/0/ Wa)e*’™IÚ>!E2P73E"AOV(&NG>þñ« nmEb-þû 3*'4 !ÿñõÅ0@9'  &—"¨™ˆ%!‰!!s!!v%¸ÿð´L%¸ÿÀ´ L%¸ÿð@a Mp%%2v M M M  M .-@H-1˜y=M tBG..g|-MX--(Fw—V|¸ÿð@M†–wVE?3]]]+í2]]?3]+í]2]99//]]^]]]]Ö+2Ö++++íÖ]+++í99Á‡+Á‡}Ä]]Ä]]]210]]]]]]7254.'.54632.#"#".'7÷˜.;!&D2|m?gS70$(5 -K7…y)E6' ^Eh -! !->,[fO  %& $2E1[b P %µ:@$ sByA?ýÀ?Ö^]Ö]]ýÖ]]Æ10###5%ÚaÚµTýŸaTQÿñ_µY@. M M M Ms¨Ÿs¨AA |¸ÿø³ M¸ÿð´ MF?++í??öí]ö^]í10++++".5332>53XDd@a\J%=,aAc*Id:³þXh^0K4¨þM:dI* †µÇ@*ˆxg7 G ‡ w ¸ ‡ x 8HÕ寏ÿð@0 L s  L  s  Ï L¸ÿÀµHs¸ÿà@LÏ   A A ABBA??????Ö^]Õ]+ý++Õ]Ƈ+Á‡}Ä+‡+}Ä+]]10]]]]]]]]]#.'367†&EBA"["ACF%k6h77h5µn»¨™KK™¨»nžþÜ€%ž…µ ^@$8 è M8x7çw ‡‡›¸ÿð@ Mt´¸ÿð@U Ls ""7 6‰s Ð{»™ L s–¸ÿð@`M6š)IY sp à   !BBA M™xf— ` D T  AAABB?????ÖÀ99]]]]]]+3???Ö^]]Õ]qÕ‡+‡}Ä]]]q+]‡+‡}Ä+]]qÅ]q‡+‡}Ä]]q]]ÕÆ]‡+‡}Ä+]q+10]]]]]q]q+]q#&'3>73>73#.Ñ*V+a5Q#f (Z'T'\( c$Q4a,TÖ†äl™TÈNœ“†9iû††ûi8†“NÈþ¬™läcµã³ ¸ÿÀ@, HŠM†        L ¸ÿø´L¸ÿð@ L  s  ¸ÿð@H LM Ls@P`€ /   BAAAA B BB????????Ö^]Æ]]Æ]‡+‡}Ä+++‡ÄÖ‡+‡}Ä+++‡Ä10]+]+]!.'#>733ö*2661+k-wCÞp«©oÚDx.IOO##OOIX¶`Gþþþ½a¸YPµ‹¹ ÿð@R L  s  o Ÿ ¯  s LsoŸ¯ B A AAAB??????9/3/Ö^]Æ]2‡+Á‡}Ä+ýÖ]Æ3‡+}Ä+103.'3>73ûEz6r&^21^'l6zDkÐdR©NN©RdÏjþè!µM@*   s yA y B?ý2Å?ýÅ3ÞÆÞ^]Ö‡+‡}ććÄÄ10!!5>7!5!=DHE>†þ 9AFEAþœÛhIYced-SA(`df^RS`ÿGA@  ‡‡/í/íÞíÖÀ103#3#`ኊáIüÊIÿèÿG˜)@®bbdd????/Ƈ+‡}Ä103#]S_ü8ÿGé@  ‡‡/í/íÖÀÞí10#53#53éኊá¹I6I/;µl@B‰™8hx«»¤´†–7gwJZŸ/Å]Í23/3/3/Å2/Å2/10]]]]]]] 'CÂJ¡¡Jµþ¬&þæ&TÿüÿGðÿ–@ ‡K?í3/3/10!!ôþ jO=Dù7²¸ÿÀ@ L¸ÿÀ³M¸ÿÀµ M/ÍÝ++ÍÞÅ+ÝÅ10'y€/š*‰+ÿõÀ5Ø@ ! M,M"¸ÿà³M¸ÿà@M M)M)@ L¸ÿø@ M8 Lª7723¸ÿÀ@ L3 ‚@ L¸ÿè³M¸ÿð@MP L@M6)$ˆ@M¸ÿÀ@ M@L¸ÿÀ@MˆQ2/ˆ3P?3í2?3í29/++++3í2Ö+++++íÄ+2]ö+++ý+À10+++++%2675.#"2#".54>3254.#"'>!3 - /'@/8M/ +6?,J6#&-# MPÿô!ˆµ M¸ÿà@+ MM‚MM L«#!ª"Nˆ ¸ÿø´L ¸ÿðµM Q!¸ÿà·L!ˆ¸ÿà@ LMP?+3+í2+?++3í2?öí22ö+++í+10++>32#"&'732654.#"­E-8W<%D`32.#"32672?_A #@]9#F 7NS)@.%< &+ (Hc<32 @&(9$ZK&3] dA<`D%32!3267#".%6&#"3(BV-ipþœRW1C U6Dc@eA9 1"EgD"ƒ†QTN )Hcn?Q(4P‹D@!  ªJ ‡ ILˆ¸ÿø´MO?+2í+2?í?öí2ÖÆ10]^]2.#"3##46);  , A4ÈÈ]b P G<-NþF7dm3ÿDò-ê¹(ÿà³ M'¸ÿð³ M#¸ÿس M¸ÿð³M¸ÿè³M ¸ÿð³ M ¸ÿð@ M-@ L@ Lª/%¸ÿø³M%¸ÿð³ M%¸ÿø@ M%‚@ L¸ÿð´L¸ÿè@M@ MHM«.ˆ¸ÿð@!LR"ˆ P- L-*ˆ L/^]3+í2+?3í2?+3í2ö+++++í+++Ä2ö++ýÄ210+++++++%#".54>32#"&'73265.#"3267– E./S>$"A^;Aa!|~1W Q,SI/(KQ'3%>4?^A9_E'þ0xl Q BH˜bQ-@*Pôn¹ ÿð¶MK ¸ÿø´L¸ÿø@,M  @ L @ L ªïO¿ªJ Jˆ¸ÿø¶MPN??+í2??öí2]qö++í10++]+37>32#4.#"P];>R1] 2% øþö #?X5þÜ0D*þPBºà3@ª ª¸ÿÀ@ H‰ SIJ???í+ö2ý2æ^]103#3'"&54632­]]/####^!!!!ÿ¼ÿEºàO¹ÿè´ L¸ÿØ@Mª  ª¸ÿÀ@ H‰S IˆR?2í2??í+öÄ3ý2æ^]10++"&'732653"&54632 &  0)][,####»L;9ÿþda!!!!!Püÿ@M MM M ¸ÿð@ M  M  M MM¸ÿð³M¸ÿà´L¸ÿà´M¸ÿà³M¸ÿð@LM M LL¸ÿà@MMM¸ÿà³M¸ÿÀ@" H ªI LIN J JJJ??????9/+?öýÀÖ+++Æ+Á‡+‡}Ä+++++++2++10++++++++++#.'#7>73 CA:m7<>]]:82m6:;DOQ##IC8úøþ&:<7<==Nÿöù =@ ML  L ¸ÿÀ@ H €ª N ˆQ?í?öýÞ+Æ10+++.57ìVH] FJpý P-!@# ML M¸ÿð´L¸ÿà³M¸ÿгM ¸ÿð´L ¸ÿè³M ¸ÿسM ¸ÿà³M ¸ÿð@M M ML¸ÿø³M¸ÿà´L¸ÿè³M¸ÿгM¸ÿè³M/¸ÿÀ´ L/¸ÿÀ@7 M/ª@M O+-ª.,JJJ+&&Mˆ ¸ÿð´M ¸ÿøµ L P?+3+3/3í2+2/3???öíÜ^]q2ý9Ü]+íæ++10+++++++++++++++++++>32>32#4.#"#4.#"#P iE2D,6"þÜ.B,þIPôn¹ÿð@M M M¸ÿð³M¸ÿø³M¸ÿè@M ª¿ªJ Jˆ¸ÿø´MP?+3í2??öí]ö^]í10++++++>32#4.#"#P jE>R1] 2% ]ù#?X5þÜ0D*þI3ÿó¹ÿس M¸ÿØ@ M( M( MM‚«!!¸ÿð@#M‚ @ L @ L « MMˆP¸ÿø³M¸ÿø¶MˆQ?í++?í++ö++í+]öí+10++++#".54>324&#"326$AZ55ZA$$AZ55ZA$aODDOODDO>dH''Hd>=eH''He=XggXXggPÿG!z@X  M MM0 MMMMMM L«#ª"ˆPK L ˆ LQ?3+í2+??3í2öí2ö++++í++10++++4&#"32>7#"&'#>32¹ZK*/@&(9$a32#5#".”$9(&@/*KZa%D`  3(3]!bQ þKò (ÿô—-:¹%ÿس M%¸ÿÈ@M 0 M @M M+¸ÿð@M& L%M"¸ÿø³M"¸ÿà³M"¸ÿø@ M!M!¸ÿð³M!¸ÿð³ M ¸ÿè´ L ¸ÿà@ M M M¸ÿø@BMMLM L!!!Ÿ$«/?/ *.M¸ÿø¶M+¸ÿð³M+¸ÿø@M+ˆ*'QˆMP?+3í2?3í2++99++ÞÖí]öÄ]í99Á‡+Á‡}Ä10+++++++++++++++++++++++72654&'.54632.#"#"&'7É976>7(fX,&@-': (%:)kcENFC!"( "0#EQP! $3%HJPJÿõ€©^@/? M  ¸ÿÀ@ H Oª ¸ÿø@L ˆ  L MQ‡I?íÍ?++3í+2öí2]Ö+Æ310+]3#3267#".57§ÅÅ $*3 F-5E*]Nð'3 M6O4ÐJÿõîP@!MT ª¿ ªI I¸ÿð@ LˆLQ?+3í+2??öí]ö^]í10]+%#".5332>73î iE7æ'i1T1i'd !%&&%! ’þôjj ’1omf((fmo1÷$Ê@ @&M¸ÿð³M¸ÿø³M ¸ÿø³M¸ÿø³M¸ÿð@M(MM#M¸ÿð@ MM$¸ÿð³ M$¸ÿð´L$¸ÿè´ L$¸ÿè@ M@$4$$¸ÿÀ³&*H$¸ÿà@ %Hr$@$P$`$$¸ÿà@H$  !$!$&!¸ÿÀ³M!¸ÿÀµM!¸ÿè³M¸ÿð@J M ML M M[ (+HýëÙ»š‹}_oJ»ËÛM¸ÿð@M(M M¸ÿð@ M LM¸ÿø³M¸ÿð@ MM¸ÿð@M M M¸ÿð@† M6öä—·vdRFù¶?OïM MLM M MO;@&*H %H}O_o H    ¸ÿè³M¸ÿø@ MM¸ÿà´L¸ÿð´L¸ÿà³M¸ÿè¶ MT¸ÿà@'+HÖ„vDd¸ÿà@HMM M¸ÿð³ M¸ÿà@¦MM ML M M6 ù´Ä–gVJùËÛë¹?O_¿Ïï@Ð`ð@    %$J!I II$dt+œk{I I IJJJ??????99]]]q]q3????Ö^]qÕ]qÕ]q‡+‡}Ä]]]qqqqqqrr+++++++++++qqqq+r+++++++‡+‡}Ä+qq++rr++++++Å]q‡+‡}Ä]]qqqqqqqrr++++++++++++++]qqqqqqqqq+r++++++Õ++Ƈ+‡}Ä+qq++rr++++10+++++++++++q!.'#&'3>73>73ù?>Q.X'd "! M !!  `'X.H¹dd¹Hg™/nnf&/ikg--gki/&fnn/™þøgí©@$F  I      L¸ÿð@ L    ¸ÿð@0 L L   JIIII J JJ????????Ö^]ÆƇ+‡}Ä++‡ÄÖ‡+‡}Ä++‡Äqq10!.'#>7'373‡ &((% `#a0¬i|}c¨0e#698996D@÷¶¶ñA‘EÿDß õ¹ÿø³M¸ÿè¶M¸ÿø@ˆ MMM  M "@L@ M M@ M    &M '*H       !Ðàðˆ RII I I?????3í29qÖ^]Å2‡+‡}Ä++‡ÄćÄÄÕ++++Ƈ+Á‡}ÄćÄÄÄÆ210+]++]+]++3267&'3>73#".' #7>?m$d &,&8`$X3+4A) a 17x Š-hnn3iÎm“þñv-A*$±A@%  ‡I ‡J?ýÁÅ?ýÅÁÞÆ^]Þ]Ö‡+‡}Ä10!!5>7!5!©EOOþsFMIþÿwÂTfp3N>,ji] N(ÿGE(Z@   ¸ÿð@( H‰(™(b(r(( "" H")(ˆ ˆ ˆ /í/í9/3/íÞ+]2Î]]ý+2Î210^]]2>=4>;"3#".=4.#(" ,I691# #196I, "O#´)@+I):šBHHBš:)I,@)´#`ÿG··®//9/í103#`WWü8ÿG%(^@$g    H"†–m}¯¸ÿð@ H*ˆ(( ˆ ˆ /í/í9/3/íÞ+]Î]]3ý+2Î210^]]]"+526=467.=4Ȕ3%" ,I691# #196I, "#´)@,I):šBHHBš:)I+@)´#*Ù~!X@:¦ y‰©!¯Pp$¯ )"!¯ ¯ /ÜíÄ2ýÄ23/]íÔ]]í10^]]]]]#"&'.#"'>3232>7 1#32 @1#32 e0+ 1+ -ÿó'Â3Å@y™'X&.!"53*G§1+(¦.˜...F.†..4›!«!!ˆ%…11((+…‹"›""—%%Q„” ˆ“„˜T?]]3]]í2]?]3]99//í23/33/í^]2í2]Ü]]]2222í]2222]Î2Ö2Æ299//3310]]>32.#"3#3#3267#"&'#53&45<7#5‰ˆj,:9&9)éåÑ»YC*=T3u€ZRRØuu P (9#H   HYF O qH   H!ÿ‚¯r 4¹ÿà@ H‚  ? O   /]3/]9/Î3í22+107'>54&'¯&Hr  4f,,Z'  ÿ¼ÿE‹_@  M(M¸ÿà´ L¸ÿè@$M M ˆR‡ IˆO?2í2?í?3í2Þý2ÜÆÆ2Ì210+++++2.#"3##"'7326546';  -D4ÈÈ[Q)  /(a P F=-NþPda L;9.dmÿÿ!ÿ‚er&cc¶ÿÿbÿó‚y&*'wÄ'ÿoµµF@* ¿€O_   ‡ ‡ L?/ýÆ/í9///^]]]]Àí210#.=#53533 . ŸŸPŸÿT‰DD‰TÿMÙÙM'ÿoµµx@L ¿€O_¿€O_   ‡‡ ‡ ‡L?/í/ýÆ/í/í9/////^]]]]]]]]ÐÀ2í23310%#.5#535#53533#3 . ŸŸŸŸPŸŸŸ†QƒCCƒQM¼MÙÙM¼M4FD.@P_Ÿ/3ÝÍ]3/2/]2/]10''¼ˆ'aa',XX,2ÿñ™Ä3?CWcÄ@ˆCA@A®BCBCB@B@*  )  ®:¬ 44)44®?***$** DD)DD®^¬ XX)XX®&NNNNe  &  ®¬&® )dCABBAB@AI%}[7­a=}S/F}­}E?ýþí?3ý2þ2í2????Þ^]ý]þí]Þ]]]ý]þý]Þ]]ý]þí]99//‡+‡}Ä104>32#".74&#"3264>32#".74&#"326# 4>32#".74&#"3262+:"":++:"":+ð*''**''*È+:"":++:"":+ð*''**''*<þy[‡+:"":++:"":+ð*''**''* -D//D--D//D-6==66==þÓ-D//D--D//D-6==66==BýKµýô-D//D--D//D-6==66==ÿÿ!ÿñõ¡&6_Xœ@  15-$P6O++4?ûù+´¸ÿÀ@ H/3Í2Í2ÖÅ+Õ2Å2107œAooAÝ#ºº#:ÿù¼¼-o@H#'s &")/vx˜¨f. (y*$y&& *B "y AXh|EWg|F?í^]?í]?í2?9/íí2Þ]]í]ÖÆÆ9/í210326767.#"".54>32!!!!!!¡&Gf?! ,?fG&QŠe9:eŠQ8‡þÉþíPþ`9[@dE%%Edþ_,X…YY„X,QÑOóQ<Êø K¹ÿð³M¸ÿø@&M: +‚ @  /?o/]]3/]Þ2í2^]]310++<7>7<&H  4f,,Z'  !þ¯î )@ ‚  / ? o  @/]3/]]Ôí3Î210'>54&'¯&Hî  4e--Y'  ÿÿ<€ø&nn¶ÿÿ!þeî&oo¶4â4à¶ /Í9/Í10#".54>324!//!!//!a.""./""/ÿþòSµ/ÍÆÄ10!!ôþ SOÿþæSµ/ÍÆÄ1010!!èüSOg`ßU@7iy‰/  ° À  4D¯¿Ï9I/]3/3Ý]Ü]Í]3/3Ö2Ì^]210]#"&'.#"'>323267`## 0## Ç  hƵ0’µD0¸ÿÀ@SH0  ° À  “p  p++"K&@H&%¯!¿!Ï!!“"¯¿Ï“10[%[+t++˜˜[" /33?íí229/3]]??ÖÖý]ÕÖå]ÕÅ+9/]Ô]Ô]å]ÕÅ+9/]10###5!#.'#.'#>73>7.iEi“ F 1 E B µ=þð=3Ÿ{99832, ,23899{Ÿ308::80ÿÿ(ÿô—&V_#@ .2*#P 3O++4(?ù(@@H/3Í2Í2ÞÍ+Ý2Í2107'7'7iAooAœ?#ºº#Ý3ÿó}'3< @hw‡$%§<V.f..‚  «=<…gP7I+Y++ˆP$!!F1V11ˆQ%hQ?]22?í]23?í]2?]39/íþ^]í]þ]í]99//]]í]]2]99310]"&'#".54>32>32!32674&#"326%6&#"½Oi b?5ZA$$AZ5?c!e6hqþœSV1C UþÇODDOODDObA9 1! :368'Hd>=eH';386„…  PUN XggXXggŠ?Q(4ÿÿPz&<ƒoœ@% POO+++44GÿGÍ #@   PK??ÝÎ9/3Äý2Ä1074673#4632#"&X : d$$$$T‰DD‰T»~((((Vÿ“àµ$l@C@H ¯&&V‚%FVˆ  J IYˆ P?^]3Å3í]2?]3Å3í]2Þí]]Ö]2Æ29/+3í2104>753.#"3267#5.V1H-S:47NS)@.%< D$S0H0#1VD. ‹M ^Z(C0L‹ -CV<Â"•¹ÿè³M¸ÿð@TMMM M M$"s L 0#|y gEy B?í?]39/^]3/í2í2Ö]]ÝÌ+Àý2ÅÆ9/Æ210]++++++3#!!>=#5354>32&#"ö½½!þv ]]9P0,<5<,uK2n2PGGKSJa9 P&@0,mI2’@`4/4O4 ‡ e u    ˆ˜jz¯))3ˆ˜jz ‡—eu $°$À$$¯.¿.Ï../Í]ÜÍ]3]]3Î2Î23]]3ÞÍ]3]]3Î2ÜÍ]Î23]]310^]47'76327'#"&''7&%4.#"32>YI:J/;;.K:JJ:K096J:I7 ++  ++ [=-J:KK:J5 4J:JJ:I->.!!.-!!-$µµ@n s oŸ¯s  s  oŸ¯   yyBAA A AB??????9/3/í2Þ2í2Ö^]Ô]2Î2]3]‡+Á‡}Äý2Ô]Æ3]‡+}ÄÎ2]1035#535#53.'3>733#3#í¢¢¢ˆ6a+g$T-,Q%e,a6‰¢¢¢jGfGX­RNœHHœNS­WGfGj`ÿG·@ ® ZY??Æ9/Àí21073#3#`WWWWÆþÈþ+ÿ“ÂÅ;Q @³%67+§+(¨WE7 7¤4†3¨2¨/e+© ˆ JM‚-‚58 6* *¤27227--S?B‚;#‚ª8R ˆw?˜2 22J”*v*†*k*V*ˆ?z?m?—J™ z Š i Z  J?*–S™;;8ˆQ?3í2]?3]9]]]]]]]]]]]]3^]]3]]í2/Þ]2]ÔíÄ2í2Ö]2]]99]]Ä2Ôíí210]]]]]]]]]]]]]]]]32654&'.54>7.54632.#"#"&'.'>54.DH8896@$A1 aX3XE4'9 ($A1$jbCW¯ $)8! $(4 !$#' (8(-% 4"EQM !! (8(,$ 8%KM ã3# 2##hUÞ )¹ÿÀ@ H@ H  /Í/Í3/Í+ÞÍ+10"&546323"&54632]####§####h!!!!!!!!AÿñíÅ'IÛ@ž7 EE°ÀЙhwXh( K¿>Ï>ß>¦>>w--¿Ïß–gwW g   &  JÈ88;}7p2a22 °À‰}gHXEDA}E(n((¯#¿#Ï#†##}hGWF?]]]ý]]Ö]]2í2?]]]ý]]Ö]]2í2]Þ^]]ý]]]Þ]í]]Ö_]]_]ý]]]Æ]210#".54>324.#"32>".54>32.#"3267í8^|DD|^88^|DD|^8I(Gc;;cG((Gc;;cG(þÿ+F34F'+  5#3D><'3"+[U‡]11]‡UU‡]11]‡UBmN**NmBBmN**Nm4M21L5 <GD>O< &IPÂ1–@*HXHW°%À%Ð%%“Wg&6F3/¸ÿÀ@ H/¿ Ï ß  ”IYi¸ÿÀ@$ H2.+š%"""š Ðàš/h?3Ôí9/]í^]2í2Þ+]í]Ä+Ö]]ý]À10]]]]]2675.#"2#".54>3254.#"'>Ä, "#/")8#R)!7(,: " 7 =‡d ;$3 à , , ? ÿÿ?Ëù&llÐ55ÿŠ@ ¯¯//í99//í10#!5ÿPþ†Šþ«OÿÿWAÿñíÅ'=HE@îV757E754E4U4Ç ÇÈw4((´BÄBÔBBw5Ù+ù++88==—5j5'5W55´ÄÔ˜w(Xh J,¿HÏHßHHuÀ.Y.i.™.@.)..¿Ïß–w  & V f  IÐ>à>>{8 +0+++-E}†2a2U22F22 °À‰}gIYE=‰-n--I-Y--¯#¿#Ï#†##}hFVF?]]ý]]Î]]]2?]]ý]]Þ]]]]í9/]3í]Þ^]ý]]Þ]]]]í]2Ö_]]ý]]Î]]]2}/23]í]2}/10_]]]]]]]#".54>324.#"32>.'##>32'32654&#"í8^|DD|^88^|DD|^8I(Gc;;cG((Gc;;cG(ª9CG<VZ'$  õ&-<9(  [U‡]11]‡UU‡]11]‡UBmN**NmBBmN**Nm…-Q–„@A%7 $,0Ð'%.JÇ@¯¿0/]Í]3/2/10!!.þäÇHò2i@H¿Ïß”¿Ïß” À  @ H  ! ÏšÀF=&hÏš H/+í]?]]]]í]99//+^]]í]í]10#".54>324&#"3262&33&&33&C++++} 4$$4 4$$4 #))##))5ÿl `@: ¯ ¯  €/P   ¯\¯ @¯O¯  _?]Å]ýÆ]3/í?í9///]]]3]Àí23103533##5#!!5½P½½P½Êþ6£ÉÉOÉÉþûO;8Å!_@; # 3 ²gwV ²   #"³³I  ±fv†UFq?]3]]ô]íí299//33/í3/]]í10]3!&>7>54&#"'>32( *!ºþö&"+!$E-EBV(''! ?!3*#1 1#: 36Å-g@$$7g²v" *²"¸ÿð@H"/+`**. ³+³*'±³q?3í2ô2í29/í9Ö]2Æ2Ö+í9/Ô]í310]^]]2654.+532>54&#"'>32#"&'75((%.C"I=7#)(?,@1q!9 7 ;.1 3#+! < D;8@@L@¸ÿÀ³M¸ÿÀ¶ M€/ÍÝ++ÍÞÅ+ÝÅ10'7;/€͉*šPÿGô8@    IK0 HˆQ I??í3+??99//íí2í1032>73#"&'#­>E ] e<7A\þê_L·þ9gÁ+ÿG!¼1@uu C¿ÏEC??Í]?9///íí10"#.54>32#.‚No|-TxJ*`)N*oüÚ¿ hf7R8 üœ#ÿÿ8ã¾iðEÿCþ2@¢¡  ¦¦ij??íí29/9/íí310#"&'73254&/>73Ç (+ $ @%! 9   "2;î½ .@  ² Š{ ³±p?íÞí2]]9/íÎ]210>73#2&J1F9m )þ~&+H“ÄZ@>¿Ïß”¿Ïß–¦” °ÀЙ©    ! šhšg?í?í99//^]]]]í]]í]10#".54>324&#"326“0B''B00B''B0J73287337+F22F++G11G+8CC87DDÿÿ(?Õù&xxÐÿÿ2R½&”'nkpþÈÿÿ2;½&”'nVþÈÿÿ RÅ&Ž'nzpþÈÿD!-a@>‡f "‚((p€/@ H.+%Pˆy‰™  )  R?]3]í2?ÝÎÖ+íÆ]29/í3/í^]10]]327#".54>5<'34632#"&~71B?"U06H-&+&N!(!%$$$$&1"H,7!4/*/4!  4-((*Ä((((ÿÿ¤&$C–œ¹ÿç@ P O++4ÿÿ¤&$Žœ@ P O++4ÿÿ&$iœ@ P O++4ÿÿ{&$uœ@ (P 'O++4ÿÿz&$ƒœ@-P %O O+++44G '3"¹ÿø³ M ¸ÿÀ@H .@H..1@H(¸ÿÀ@RH((11 !"#$$$s'&%$$s$$5@5p5 554¸ÿð¶HW¸ÿè@- H+1 y'@!€!!’$ƒ$z$Y$i$!$!$1ABB???Å2/99//]]]]]3í2ÞÍ+]+Æ^]]]Æ9/Á‡+‡}ÄÄÄÄćÄÄÄÄÁ‡+‡}ćÄÄÄćÄÄÄÄÄÄ33/+Í+3/+Í+10+7#>7.54>32#./.'4&#"326¬?e%B?=!%%!>?B&j ?"#?·²²f±ŸG*%%)G‘Ÿ±g-X-OW£KK¢Xà‚µƒ@F Hs syy   yAyB?í3/3/?í299//3í2íÆÖÆÆ9/3í2‡+‡}Ä+‡ÄÄćÄÄÄÄ10!!!!!5!#>7!3iþÓ þ÷FþZþï/h9mhe2¾þs5r=ädÑOóQ²,Y-l¿ª™GLH¶j:ÿCSÅ@@LB@ Hd.S.B.#.3...U*#*3*C***h)9j/z/Š/š.s*ƒ*“*b*E*U*¸ÿø@~H*>:>>4,::"#Bvh˜W©A18>)J"Z"j""Wg|J#Z#j##h&x&˜&W&&FEUeXh|‡—EUeˆ g X  E?]]]3]]í]2]?]]33]í]2]ÖÝÞÍþ]]í]]Æ22/39/ÍÌÎ]10+]]]]]]]^]]]]]]]]]]+.54>32.#"3267#"&'73254&/>J>dG'5ZxD+E3  "+37X>!:W:CXkR (+ $ 7[}OW‡\0 P &Hg@>fI( P  ! 9  ÿÿV¤&(C‹œ¹ÿò@  PO++4ÿÿV¤&(~œ@ # P O++4ÿÿV&(imœ¹ÿó@  PO++4ÿÿVz&(ƒmœ±¸ÿó@  PO O+++44ÿÿˤ&,CÿÒœ¹ÿè@ PO++4ÿÿD¤&,ÿÅœ@ PO++4ÿÿÿÿ&,iÿËœ@  PO++4ÿÿÿî z&,ƒÿËœ@POO+++44ÿúœ¼%w@M)iy v—Vf©''p'°'# s ¨& y !!| WE#|XF?]3í]2?]3í]29/3í2öÎ3ýÎ3]ö]]]í^]]]10#"&'#53>322654&#"3#œ8fŽU*e)PP)e*UŽf8þ‡ŠˆˆŠ)- ‚‚ -[Z…W+ 9K +W…þšÕKòÿÿV‚{&1u±œ@ # P "O++4ÿÿ:ÿñФ&2CМ¹ÿè@ +) P*O++4ÿÿ:ÿñФ&2Ü@ *( P)O++4ÿÿ:ÿñÐ&2iÉœ@ -) P*O++4ÿÿ:ÿñÐ{&2uÊœ@ 7( P6O++4ÿÿ:ÿñÐz&2ƒÉœ@*< P4O(O+++44Paäõ ‰@X ` ° –  ™É ¶ Æ –  ƹə °– ™É¶Æ–ƹə /3]qr33]qr3/]23/]r39/3]qr3]qr3/]33/]r310%''7'77¬’’8’’8’’8’’a’’8’’8’’8’’:ÿÜÐÚ$/l@&E.e.6-f-‰,xh9(Jddf¸ÿà¶MY  ¸ÿø@TMF † j l My.™.Z-Z,f)U(H#–VEƒTW–ejYš j w)9¸ÿð´ L¸ÿè@ MMMM¸ÿà@ M % M M-¸ÿè³ M ¸ÿð@ M.-  ¸ÿð@ L ¸ÿà@ M*M*M* M*v ¸ÿø³M ¸ÿø@M @ M ©1ð1¸ÿø³M¸ÿð@ MvM¸ÿø@MM@M©0¸ÿð·L..%¸ÿø³M%¸ÿø³ M%¸ÿðµ M%|¸ÿð@=L MMMF-L- M  M  M | L  ¸ÿè¶ M ¸ÿø³M¸ÿø´ME?++33+Æ2+í+++23+?++33+Æ2+í+++23+ö++++í++]ö+++í+++99//+992+}‡ÄÄÄÄ++++333++++‡ÄÄÄÄ++]10]]]]]]]]]]]]]]]]]]]+]]]+]+]]]]]]]]]]]4>327#"&''7.7&#"2>54&':5[yDjR;>@'-5ZwC5_):>>(.f,?7O5U; å5T; þÂ5[Yˆ[.8M.S-RYˆ[.K.P-€TmF+'Hgþ¬'Hg?5W#þe)ÿÿQÿñ_¤&8C£œ¹ÿè@ PO++4ÿÿQÿñ_¤&8–œ@ PO++4ÿÿQÿñ_&8iœœ@ PO++4ÿÿQÿñ_z&8ƒœœ@,P$OO+++44ÿÿP¤&<jœ@  PO++4V=µR¹ÿè³M¸ÿè@#Mvs | y  AB??99//íí299//í223í10++732>54.#*5>3 +#·I2P78N/')7+QtIMaÞ 6*(5 ÄqÝ54&#"#4>32ò  /#af*$!'20.9!+ ,  44C=]6P46N1h'! ! '5%NT Q ,%'2(6 ,1LCýØ*2R: +;ÿÿ+ÿõÀ&DCR¹ÿù@ 97P8O++4ÿÿ+ÿõÀ&DE@ +86P7O++4ÿÿ+ÿõÀ&DiK@ ;7P8O++4ÿÿ+ÿõÀß&DuL@ E6PDO++4ÿÿ+ÿõÀÞ&DƒK@8JPBO6O+++44ÿÿ+ÿõÀ &DcK ·?6P+44,ÿô%;LU @®VRc4T4w+¥%H y˜, M‚9-—'§'ˆfUG%'—U§UfUUF22‚B?§JJ‚! w-‡--{;   - -WV0WU…111ˆBEEEPˆ'w*h***P ˆ!$P?<ˆQ85ˆ9Q?2í2?3í2?3í2?^]]]3í9/]3í23/]í]9///]_]]]]_]Äí]33í]2]]99]]]]]]Äí_]10]]]]]_]]]]]"&'#".54>3254.#"'>32>32!3267%267.'.#"%6&#"e9U !.9"2O8#&-# M/*-,„…  PUN O @$!3&ó?Q(43ÿC½:²@ O<_<<<@H¸ÿà@ H –¦&`6€66<<W--‚¸ÿè@DMW«;'X*I**ˆ&#P5W2F22ˆ  H 6M )iyQ?2^]+2ÖÝÞ2Í+2í]]2?3í]]2ö]]+í]]Ö]Æ9/ÅÍ]ÄÎ10++]#"&'73254&/>7.54>32.#"3267>  (+ $3M4#@]9#F 7NS)@.%< "' ! 9  "-F[632&''7&'774&5.#"32>4k ,8_H;Y;!327&#"4'326à$AZ5O:156$AZ5'E15þ}Ô$1EO(Ó"3EO½#]9>dH')@(F#^9=eH'@(ÿA-gY>/þîgÿÿJÿõî&XCg¹ÿè@ P O++4ÿÿJÿõî&XZ@ P O++4ÿÿJÿõî&Xi`@ P O++4ÿÿJÿõîÞ&Xƒ`@*P "O O+++44ÿÿÿDß&\C@ .#! P "O++4PÿG%h@E™#š‰ZI¨™X)9I«'ª&ˆ!PNK‹ ›  ˆ‹›Q?3]í2]???3í2öí22ö]]]]í]]]10]]4&#"32>7#"&'#7>32¹ZK @&(9$a733267#"&5467>.'&þÆ?e(FCB$Y$BBF( (  #86 W ?"#?-Y-±n»¨™KK™§»m=)#+ W£KK£W+ÿEÀK´@u(7&0 H˜B8)&˜ Ÿ'¯''!!¨??'ªM/MH I0I@II ‚¥5—55,555L!$ 0?:ˆŸ¯ˆ-0QHEˆIP?3í2?33í29/^]]3í2Ü2Í2Ö]_]]_]íÄ]2]ö]]ý]ÐÕÌ]Í]10]]]]]+]%2675.#"23267#"&5467>7#".54>3254.#"'>!3 - /'@/8M/ (  #861,J6#&-# Mÿÿ:ÿñS¤&&­œ@ B*(#P )O++4ÿÿ3ÿô½&F]@ @$"P #O++4ÿÿ:ÿñS&&i³œ@ (-)#P *O++4ÿÿ3ÿô½&Fic@ ''#P $O++4ÿÿ:ÿñS|&&b³œ@ (*0#P (O++4ÿÿ3ÿô½à&Fbc@ '$*P "O++4ÿÿ:ÿñS¡&&_³œ@ ((,#P -O++4ÿÿ3ÿô½&F_c@ '"&P 'O++4ÿÿVÿú¡&'_œ¹ÿÚ@ "P #O++4ÿÿ3ÿôœ&GÏ­#@"@H"@H"@H"@ H"@H+++++10ÿÿÿúœ¼«3ÿôG)‰@^  7 G '%ª+Vf‚Vf–¦«*¿(Ï(ß(('”¤ˆ”%¤%%"""P–  ˆQN??3í]2?^]3]í2]Þ2Í]2ö]]í]ô]Î3ýÀ3Î10]]].#"326773##".54>325#53 @&(9$ZK&3]JJ dA<`D%7V§þº"þÞ_ (  #86 µSÎQðQ=)#+ 3ÿEù09Ûµ%0H¸ÿð@M.M% M¸ÿÀ´L¸ÿø@ M)Ÿ&¯&&  @M1‚«;_;9¸ÿøµM9‚ ¸ÿøµM ‚¸ÿø³M¸ÿð@ L«:#ˆ,9‡  °  ),¸ÿø@MG,,Q4M4 M4ˆP?í++?]+339/]íí2ÜÍö^]++í+í+]öíÔ+2ÞÌ]2Í]210++++++4>32!32673267#"&5467#".%6&#"3(BV-ipþœRW1C "  &3;!Dc@eA9 1"EgD"ƒ†QTN   =$(4)Hcn?Q(4ÿÿV¡&(_dœ¹ÿê@  PO++4ÿÿ3ÿôù&H_b@ $(P*O++4ÿÿ:ÿò^&*i»œ@ +-) P*O++4ÿÿ3ÿDò&Jis@ 3/P 0O++4ÿÿ:ÿò^‰&*a¸œ@ +,: P(O++4ÿÿ3ÿDòí&Jap@ 2@P .O++4ÿÿ:ÿò^|&*b»œ@ +*0 P(O++4ÿÿ3ÿDòà&Jbs@ 06P .O++4ÿÿ:ÿD^Å&*Ðù ¶4* P+4ÿÿ3ÿDò &JÑÁ@ 708P .O++4ÿÿVk&+i¤œ@  PO++4ÿÿ5ôÂ6K»ôȵf@>s   ¨P€°s¨ y yB BAA????9/^]ýÞ22í22ö]Í3í22]ö]2Íí2210]353!533##!##)!PaSaPPaþ­aPþ­SRccccGýõ@þÀ wô!Œ³¸ÿø@DL@ª##ÿ#_#Ï# € Àª"!JJ ˆ¿ÏßÀ  ¸ÿø@LPN??^]+Þ]2Í]2í2??öÎ]3ý2Ì3]qö]í10]]+]3#53573#>32#4.#"PJJ]±±;>R1] 2% fEM]El #?X5þà 0D*þTÿÿÿã,{&,uÿÌœ@ PO++4ÿÿÿÛ$ß& uÄ@ PO++4ÿÿÿùc&,ŠÿËœ>¹ÿÀ³M¸ÿÀ@&M@ L@ L@ L@ LPO++4++++++ÿÿÿñ Ç& ŠÃ>¹ÿÀ³M¸ÿÀ@&M@ L@ L@ L@ LPO++4++++++ÿÿ ‰&,aÿÈœ@ PO++4ÿÿÿùí& aÀ@ PO++4ÿEÁµ7@!0HŸ¨s¨ BA??3ÞÍöýæ]ÜÌ]Í]10+33267#"&5467>7Va  ( *95 µýK = )#+  ÿEºà$S@ 0HŸ¯  &&&ª"ª%¸ÿÀ@ H‰SI J?2Þ2Í2??í+ö2ý2æ^]ÜÌ]Í]10+33267#"&5467>73'"&54632­( *95]/####= )#* ^!!!!ÿÿKÃ|&,bÿËœ@  PO++4P­@ªªIJ??öýæ^]103#3­]]ÿÿBºàLÿÿVÿñ´µ&,-ÿÿBÿE»à&LMÿÿÿñú&-i¶œ@ PO++4ÿÿÿ¼ÿG&]iÃ@ J P O++4ÿÿVÿDoµ&.ÐÌ ¹ÿË´' P+4ÿÿPÿDü&NД ¹ÿд' P+4ÿÿV÷ø&.n-@@H@H@H@ H++++10P µ@%Èz øWi 6 ) i ( ù h¸ÿà@RH$¶+Ûëû¹Évt”f ªIe)9II J JJJ??????9/]3]?öýÀÖ]]Ƈ+‡}Ä]]]q]q2+10q]]]]]]]]]]]#.'#3>73HE<n;@B]]>?6l;?>CNQ#"GB8öß=?9=@?ÿÿV÷¤&/ÿÝœ¹ÿ’@ PO++4ÿÿ;ÿöù¸6OºÞÿÿVÿD÷µ&/Ш ¹ÿã´P+4ÿÿ'ÿDù&OÐ ¹ÿÑ´ P+4ÿÿV÷¶&/Ï{®?µ@H¸ÿÀ@H@H@H¸ÿÀ@H@!"H@%%HP+4+++++++10ÿÿNÿöJ&OÏ[¹ ÿÀ·H @ H++10ÿÿV÷µ&/bÏþÈ ¶dP+4ÿÿNÿös&Ob{þȹ ÿÀ·H @ H++10ÿþ µ `@;j {i s¨v † –  ‰™™ ˆ )  A yB?í?99]]]]3]3]ö2Î2ý2Ì2Æ10]]]%!'737 þ_I!jat ”TT%B6Dþî-VþÊ&>6í ÿÿV‚¤&1ªœ@  P O++4ÿÿPô&Q`@ PO++4ÿÿVÿD‚µ&1Ðî ¹ÿä´  P+4ÿÿPÿDô&QФ ¹ÿä´$P+4ÿÿV‚¡&1_°œ@  P O++4ÿÿPô&Q_f@ PO++4ÿÿò&1p^“ÿÿô&Q^“¹ÿ&@ #PO++4VÿE‚µ ‰¹ÿÐ@/ Hg  s  s¨"s¨!@H]K€¸ÿ¸@ I@P`4A AA™B?3]3Þ2Í2???99]]+]]]+öíöý2Á‡+‡}Ä]Ì210+%.'#33#"&'73265##]db(_M/ki] _ :-% %9ŽŽƒ-ýãµ2…ˆ5ýK.F/I1-PÿEô%f³h ¸ÿж H¸ÿø@'Lª'¿'#%ª&$JR J#ˆ¸ÿøµLP?+3í2??3Í2?öí]ö^]ýÌ210+]+]>32#"&'732654.#"#P jE>R1 !:-% % 2% ]ù#?X5þÜ.F/I1-!0D*þIÿÿ:ÿñÐc&2ŠÉœ@ () P*O++4ÿÿ3ÿóÇ&RŠk@  ! P"O++4ÿÿ:ÿñЉ&2aÆœ@ ,: P(O++4ÿÿ3ÿóí&Rah@ $2 P O++4ÿÿ:ÿñФ&2eãœ@**, P-O)O+++44ÿÿ3ÿó&Re…@*"$ P%O!O+++44ÿÿVc¤&5dœ¹ÿã@ +)P*O++4ÿÿPx&U$@ PO++4ÿÿVÿDc¼&5ÐÉ ¹ÿδ5+P+4ÿÿÿDx&UÐþ ¹ÿ|´P+4ÿÿVc¡&5_jœ¹ÿÊ@ )-P.O++4ÿÿPx&U_)@ PO++4ÿÿ!ÿñõ¤&6Rœ@ "31-$P2O++4ÿÿ(ÿô—&V!@ 0.*#P /O++4ÿÿ!ÿñõ&6iXœ@  62-$P3O++4ÿÿ(ÿô—&Vi'@ 3/*#P 0O++4!ÿCõÅI8¹.ÿÐ@DH —"54>,†)–)¦))(A (%:: ¨™ˆ%!‰!!s!!v%¸ÿð@ M†%–%%¸ÿÀ@_ H%%Kv Mš  ‰  GF@HFJ18>A˜y=M„RGGGg|FMXFF(AFw—V|¸ÿð@M†–wVE?3]]]+í2]]?33]+í]2]99//^]]]]]]ÝÞÍÖ+2Ö]]+íÖ]+]+í99Á‡+Á‡}Ä]]Ä]]]29/993]ÍÎÌ210]]+7254.'.54632.#"#"&'73254&/>7.'7÷˜.;!&D2|m?gS70$(5 -K7kd  (+ $ &?2$ ^Eh -! !->,[fO  %& $2E1Q` ! 9   P (ÿC—Hö¹/ÿÐ@˜H%%  š ¦F&*&:&v"¸!r!% 5  z§˜h)956?-g*w**'BE'$;;E$!!!!$«J EI29?‹›z˜ÈÆF·FFˆE'BQˆ¨P?]3í2?33í2]]99]]]ÝÞÍÞÖíöÄí99Á‡+Á‡}Ä9/993]ÍÎÎ210]]]]]]]]]]]]]^]]]]+72654&'.54632.#"#"&'73254&/>7.'7É976>7(fX,&@-': ($:*PK (+ $ ?G FC!"( "0#EQP! $3%>H ! 9  PÿC%µ#@OM L( Lª!! % s$   ByyAB??íí?ÜÞ2Í2Ö^]Ý]]ÀýÕÍÎ2Ý]]ÆÀ993310]+++#"&'73254&/>7##5!##& (+ $ÚÚ %! 9 (aTTýŸ JÿC€©2l@O4†– H00 ",-¸ÿÀ@H-4#ª3,)ˆ0  -0Q"‡ I?Íí?33ÝÞ2Í2í2öí2Ö+2Æ9/ÅÆ2333310+]]#"&'73254&/>7.573#3267 (+ $ (5 ]ÅÅ $*3  9&%! 9  ! 4I/СNð'3 M ÿÿ%¡&7_^œ@  P O++4ÿÿJÿõ€&WÒ^!¹ÿÀ@H@ H@ H@ H++++10%µJ@,s B  yA?ýÀÞ2Í2?Ö^]Ô]]Ì3ý2ÌÔ]]Æ10#3###535#5%Ú‚‚a‚‚ÚµTØKþÂ>KØTJÿõ€©]@ @ H ¸ÿÀ@)Hª‡‡ —  ˆ( Q‡I?Íí?]]3í]29/íöí22Ö+2Æ210^]+3#3#3267#".57§ÅÅÅÅ $*3 F-5E*]NˆF"'3 M6O4ÐÿÿQÿñ_{&8uœ@ 'P&O++4ÿÿJÿõîß&Xuc@ %P $O++4ÿÿQÿñ_c&8Šœœ@ PO++4ÿÿJÿõîÇ&XŠ`@ P O++4ÿÿQÿñ_‰&8a™œ@ *PO++4ÿÿJÿõîí&Xa]@ (P O++4ÿÿQÿñ_§&8cœœ ·!P+44ÿÿJÿõî &Xc` ·P+44ÿÿQÿñ_¤&8e¶œ@*POO+++44ÿÿJÿõî&Xez@*P O O+++44QÿE_µ+žµ'0H¸ÿȳM¸ÿð@LMI';'ˆ+˜+i+y++Ÿ(¯((!"" ` s¨-s¨,AA"%! | M¸ÿø³ M¸ÿð´ MF?+++íÜ2Í2??öíö^]í9/]993Ì]2Í]2]]10]]+++".5332>533267#"&5467XDd@a\J%=,a;?%(  #86%*Id:³þXh^0K4¨þMQ~$=)#3JÿEî-p@J  )0H  Ÿ¯+---ª/" ª.,I!I+F&V&&ˆ  „”iyQ?]3]3Ü2Í2í]2??öíö^]ýÕÍ]Ì]210+]]%3267#"&5467>7#".5332>73î (  #86154&'ö"C  3U&&I& 4JD4@_Pp€/Å]Å23/3/]3/]310774'aa'ˆÙ,XX,ÿÿ.JÇŠ9bEí.@Ðà @H (/^]Ý+Î]2ÖÝÞÍ10".7332>73¿1%<<%1b#4!  !4#€føà @ @ H /Í9/Í+10"&54632¼####f!!!!U?# t@'@H @H  ¯  °   ! ¿§¸ÿð@&H§°/Ÿm¯§˜Hk?+]íq?^]qqí+]q99//]]í+í+10#".54>324&#"326#%%%%2¥%%%%GÿE÷/@0 H Ÿ  B/2Å2?9/3Í]2Ä210+"&5467>733267µ86 ] (  #»)#+ =$DtT@+”›”›ŸŸ€@€DT/3Í]2Ý2Í2ÖÅÝÅ]ÖÅÝÅ]10]]]]'7'7Ï{0sÝ{0sÐŒ$ 8Œ$ ÿÿ…¤&:Cœ¹ÿç@ $"P#O++4ÿÿ÷&ZCϹÿç@ (& !P 'O++4ÿÿ…¤&:œ@ #!P"O++4ÿÿ÷&ZÂ@ '% !P &O++4ÿÿ…z&:ƒœ@#5P-O!O+++44ÿÿ÷Þ&ZƒÈ@'9 !P 1O %O+++44ÿÿP¤&<Cvœ¹ÿè@  PO++4ÿÿÿDß&\CP¹ÿü@ $" P %O++4ÿY7µ'@®ABBA????/Ô‡+‡}Ä10 #7þyW‡µýKµ3IÅ <@& ²€!²   ³ ±³q?íôíÖ^]]]íÖ]]í104632#"&74.#"32>PFFPPFFPâüahhaahha3&&32&&2;O½F@(²p¯¯¿ ³±Ÿp?Í]ýÎ2/í22Ö]Í]Ö]Ý2í22103##5#5>7322DÁ,4:@v½ê;]].@DAS Q&(3>½_@  ²¸ÿð@+ H#3²0³ ³±³p?íü2í29/íÖ]2ÖÆýÄÖ^]_]+íÄ10]_]#"&'732654.#>73#>PT A35))D4 Øœ^V­5E <# 2f/?(A%3I¿(l@J&&²p6FV *6 F V –  ²) &³!³)±9IY™³q?í]ô]í9/3í]2Öí2]Ö]]]Äí10]]4>7>32#"&7"32>54&%$D_<!=2#%&6!#5$KM’'$0$×7V;= $#,.%Wk7C  "%;C½D@+²M™zŠiO_o  ³±p?äí2ÆÆ]]2]]]+9/í10>7#5!_'/Æ2-";*[VKA7GYd2 3FÅ+7¢@a75,²·¦&²o 9)2²¸ ©  ²O_8¦5¶55¹))§„ ” k { 4 D T  #³ H0 H±/³¸ÿø³ H¸ÿè´ Hq?++íô++í9/]]]3]3]3]Ö]íÔ2]]í2Ö]]íÔ2]]í210]#".5467.54>3232654&'74&#">FLH*8"$$2$4!$Þ)#93%%*/¤2? '1/(%-.#  "¦ &  9CÅ#z@O ™:JZ²4kZK$%"²L\9$³*  –³±³&q?]íôí]9/]3íÖ]_]íÆ]]]]9/]3í2_]]10]#'>7#".54>322676&#"CŠ‚Ih%&6!#5$KM’'$0!px=0/#,-&Wj7D  AÿÿÿùI‹oþÆÿÿ2þÆÿÿ8‹þÆÿÿ ÿù6‹ŽþÆÿÿOƒpþÆÿÿ(ÿù>ƒqþÆÿÿ%ÿùI…rþÆÿÿ%CƒsþÆÿÿ ÿùF‹tþÆÿÿÿÿC‹uþÆÿñ«#1…@X   7GW% 'w?  3"# $1s!P  2H™!"!#$|,E‡—|F?3í]2?í9]+Ö]2Ðí22Ä2Ö]íÆ210^]]]]]]]]]74>323267#".='7>54.#"l.;!*5 6M//3 +%H02B)B$Â?I ÿ!EZ4 1=5aYS',EA E2B$/5’:ˆU! !;0AÿócÄ!3G@&" 5-54*$$'0…!!Šš'y'‰''T ŠQ?í22/?]]í9/í339/Å2ÖÄÅ10"32673#".54>32'4'.#"3!25Ù 0|IO„09ER\0S’l??l’SS“m?” 0|HG~/òQÅ 38A6 3$9aƒKKƒb99bƒK ß 06:0 Áÿÿ2ÿú9½&”'nVŽþǹÿÀ³ H¸ÿÀ·H@ H+++10ÿÿÿú9Å&'nkŽþǹ&ÿÀ³ H&¸ÿÀ·H&@ H+++10ÿÿ2ÿúI½&”'nVtþÇM¹;ÿÀ³ H-¸ÿÀ³ H¸ÿÀ³ H;¸ÿÀ³H-¸ÿÀ³H¸ÿÀ@H;@ H-@ H@ H+++++++++10ÿÿ ÿúIÅ&Ž'nktþÇM¹^ÿÀ³ HP¸ÿÀ³ H2¸ÿÀ³ H^¸ÿÀ³HP¸ÿÀ³H2¸ÿÀ@H^@ HP@ H2@ H+++++++++10ÿÿ(ÿúI½&q'nktþÇM¹NÿÀ³ H@¸ÿÀ³ H"¸ÿÀ³ HN¸ÿÀ³H@¸ÿÀ³H"¸ÿÀ@HN@ H@@ H"@ H+++++++++10ÿÿ%ÿúI½&s'nBtþÇM¹?ÿÀ³ H1¸ÿÀ³ H¸ÿÀ³ H?¸ÿÀ³H1¸ÿÀ³H¸ÿÀ@H?@ H1@ H@ H+++++++++10ÿÿ2ÿúA½&”'nVqþǹÿÀ³ H¸ÿÀ·H@ H+++10ÿÿÿúAÅ&'nzqþǹ&ÿÀ³ H&¸ÿÀ·H&@ H+++10ÿÿ ÿúAÅ&Ž'nkqþǹ2ÿÀ³ H2¸ÿÀ·H2@ H+++10ÿÿÿúA½&p'nuqþǹÿÀ³ H¸ÿÀ·H@ H+++10ÿÿ2ÿúL½&”'nkrþÇ5¹*ÿÀ³ H¸ÿÀ³ H*¸ÿÀ³H¸ÿÀ@ H*@ H@ H++++++10ÿÿ(ÿúL½&q'nvrþÇ5¹=ÿÀ³ H"¸ÿÀ³ H=¸ÿÀ³H"¸ÿÀ@ H=@ H"@ H++++++10ÿÿ2F½&”'nNsþǹÿÀ³ H¸ÿÀ·H@ H+++10ÿÿFÅ&'nksþǹ&ÿÀ³ H&¸ÿÀ·H&@ H+++10ÿÿ FÅ&Ž'ncsþǹ2ÿÀ³ H2¸ÿÀ·H2@ H+++10ÿÿF½&p'ncsþǹÿÀ³ H¸ÿÀ·H@ H+++10ÿÿ(F½&q'ncsþǹ"ÿÀ³ H"¸ÿÀ·H"@ H+++10ÿÿ%F¿&r'ncsþǹ-ÿÀ³ H-¸ÿÀ·H-@ H+++10ÿÿ2F½&”'nVuþÇ5¹&ÿÀ³ H¸ÿÀ³ H&¸ÿÀ³H¸ÿÀ@ H&@ H@ H++++++10ÿÿFÅ&'nsuþÇ5¹=ÿÀ³ H&¸ÿÀ³ H=¸ÿÀ³H&¸ÿÀ@ H=@ H&@ H++++++10ÿÿF½&p'nsuþÇ5¹/ÿÀ³ H¸ÿÀ³ H/¸ÿÀ³H¸ÿÀ@ H/@ H@ H++++++10ÿÿ(F½&q'nkuþÇ5¹9ÿÀ³ H"¸ÿÀ³ H9¸ÿÀ³H"¸ÿÀ@ H9@ H"@ H++++++10ÿÿ%F½&s'nBuþÇ5¹*ÿÀ³ H¸ÿÀ³ H*¸ÿÀ³H¸ÿÀ@ H*@ H@ H++++++10ÿÿ FÅ&t'nkuþÇ5¹SÿÀ³ H<¸ÿÀ³ HS¸ÿÀ³H<¸ÿÀ@ HS@ H<@ H++++++10)ÿó"2­@uŒ.y.u*‡)H%­!œ!K!ª › y hYLJ E•¥y‰© š « ‰ 0‚   «4(‚«3†ˆ0##v++ˆQˆT?2í2?í]9/3í2]ö^]Äíö]í210]]]]]]]]]]]]]]]]]]]]]]]"'>32#".54>32."32>7.á@ P#WqBAkO/N9 #B_=2H2N/@(I74C'G¶ O @jŒKFtJ:T6@jK)!7Y?#þí#9H&MG;Yi-ƒµ ´@~H X”†uds›‰zks û  ‹Iiy*s 0 ` p    „&Ffvsy B ï ÿ } l D #  AAB???Í]]]]]q?í2Æ2í]]Æ]2í]]]9/]í]]]]í]]]]10]]3>73!."ABE'Y'EBA"þÀdFFdl¶¥œRRœ¥¶lF-óÔÔóVÿ“cµ%@  ‡/ÅÆí9/í9/í10#!#caþµaµüÞÎý2"ÿ“òµc¹ÿð³M¸ÿè³M¸ÿè@&M v‡vv‡ A‡/í2?9/3í2ÖíÆ2í]9/íÖÀ10+++!!5>7.'5!!d>v-oþ!({B@<4Ûþž09?0T¥QSCN²\-ZUK?TGRWÿÿ4Üŵ5ÿÿN¶¯/í3/Í10!!5Êþ6NOÿÿÿY7µnÿÿ8ã¾ið ÿñ@‡@Cx ˆ            //9/3/ÆÆ99//Á‡+Á‡}ÄÁ‡+Á‡}ć+Á‡}Ä10]73#.' ¢ ÃRêT D$YZ4'EFJ,©üâU N˜.´ 3?Â@ ¦==¯„¸ÿÀ@3H¨ 7¯**D*t*„*´**$*D*T*´*Ä*Ô*ä*»*t*”**¸ÿð@D H*A ¯k{\8H, @Æ4Ö44¯= = %///°//¹:É::¯%/3í]2/^]393í]2Ö]_]]]]íÖ+]]]qrí9/]+qí]9=/3107267.#"7#".54>32>32#".72654&#"­,,++•  &0++0&   &0++0& p++,,Ù#**#'&&'  !7))7!   !7))7! '&&'#**#ÿGiH@. ‡© Ry‰™'§O?^]]Í]?]]]í9///í10463:#"#*'53265Šbi ?7bi ?77dmPE9ýßdmPE9ÿÿ*oê6ala–5ÿ:i@Ay‰šª– v†•¥˜   ¯ ¯ /3ýÎ3Þ2ý2Ì9/33/399=//^]]10]]]]]]737#5!73#3!'7#5™DÝBB0q™DÝþûBB0qâ†Oƒ$_O†Oƒ$_ÿÿ5ÿN6DŸÿÿÿ5ÿN6!DŸÿÿï Ç#n@GŸ¯O  !O€ $Ÿ@ H p!€!!Q!0!@!!/Í]]]Ý222ÝÍ+]Ö^]]Í]Ý]222Ý]Í]10>7.%.'>#@<::<@##@<::<@i&$$$$&*F&&F[7aXS))SXa77aXS))SXa7"<7447<"Dk44kÿÿP&II†P@#@1w‡f €!ª%`%p% %%%/% ª$¸ÿÀ@ H‰SIJJ ‡ Ihxˆ‡O?]2í]2?í????í+öí2^]]ö2ý2Ö]2Æ10]]]]2.#"3##46#3'"&54632#2 &A4ÈÈ]b]]/#### P G<-NþF7dmüø^!!!!ÿÿP@«Pÿö{@w‡f  H @ª !¸ÿÀ@. H€ pPNˆQJ ‡ Ihxˆ‡O?]2í]2?í??í?/]]ýÖ]ÆÞ+Æöí210^]+]]]2.#"3##46.57#2 &A4ÈÈ]bÀVH] P G<-NþF7dmüîFJpý ÿÿPÿö­ÿÿPÆ&I«†ÿÿPÿö&I­†ÿÿ2ÿñÅÿÿ#µ²ÿÿËÅáÿÿÿñËÅâÿÿûµñÿÿÿñĵÙÿÿ3ÿñõ¸ôÿÿȵÓÿÿ1ÿñ÷Åúÿÿ/ÿþñÅüÿÿ«I=oxÿÿ2³î5”xÿÿ³8=xÿÿ «6=Žxÿÿ³O5pxÿÿ(«>5qxÿÿ%«I7rxÿÿ%³C5sxÿÿ «F=txÿÿ±C=uxÿÿÿIoþNÿÿ2ÿ‰î ”þNÿÿÿ‰8þNÿÿ ÿ6ŽþNÿÿÿ‰O pþNÿÿ(ÿ> qþNÿÿ%ÿI rþNÿÿ%ÿ‰C sþNÿÿ ÿFtþNÿÿÿ‡CuþN–)ï@ N?Í9/í210#5ï>ßßÿD¯ÿÎ4¹ÿÐ@H   Š@ €/^]Üí9/Í]Ì10+3#"&'52>5UY +  2  , 8 @aÒ &@Y €@ €/Ì2/Ý]Î2Æ10]#&454>7šY!(! a $5$- #Fè@¯¿Ï‘Z?Í9/í]10#5è>ÂÂÿÿNÿv=> /ÿÿÿvö> /ÿÿ/†/ÿÿÿèÿv˜>/ÿÿAÿ«u #Dÿÿ`ÿvA>>/ÿÿÿèÿv˜>?/ÿÿÿvé>@/ÿÿ(ÿvE>^/ÿÿÿv%>`/ÿÿ}û7l>ÿÿ4â4àrÿÿÿþ3ò‚s/ÿÿÿþ3æ‚t/ÿÿ(}7x>ÿÿGÍÁ|¹ÿÿ}Ë7&l>lÐ>ÿÿ(}Õ7&x>xÐ>ÿÿÿýÁš¹ÿô)„@Wh!!‚©h9IY«+)ª*Nˆ— § V f  Q”)¤))&ˆŠ”¤hYP?^]]]3]Þ2í2í2]?]]3í2?öÎ3ý22Ì3ö]]]]í]10>32#"&'#53573#32654.#"­E-8W<%D`|3y22E#(|F?2í2?9/í9ýÄÌ3Þ]Þíí2]Þ^]]]íÔ]_]]2]í10]_]]".'.54>32232>54.#'32>54.#"+v110[M:c‚H54.+2·VIsP* ’110¬é'G6 6O2R  $b°5S32#"&'!32654.#"­E-8W<%D`32#"&''>732654.#"­E-8W<%D`>3 #"&''>7á 9O0'  #'H7!þÚ);£’*e)F$U.Ù*8 þë 5 ãpp !L$ ÿñ2Å%¿· Mv¸ÿø@LM@ M©' @ L &¸ÿð@ LM L|¸ÿð³M¸ÿè´ M!¸ÿø³M!¸ÿð@ M!E  L ¸ÿø³M¸ÿð@ L| M  M MMF?++3++í++2+?++3++í++2+Ö+2Æ2ö+++í+10#".'732>54.#"'>322/VwI*H7$WB:W;:X;BU#6G*IxV/[U‡]1 P (If>>fI( M 1]†:ÿñË3ßµ—'§'¸ÿà@˜ Hw x¯  .//?/o/Ÿ//5W&&&&vh˜W©4—†EUe!!X!h!!| |W– „ U u F  ˆ g X  EJ.Z.j..++W+g++|J/Z/j//hx˜F?]2]í]2]?]]]3]]]]Ü]2í2í]2]]]þ]]í]]]Æ^]22/323/]10]]+]".54>3>32.#".#"3267€IxV/5ZxD)8??&    ",37X>!:W:CX$6H0\‡WW‡\0 4.G$- &Hg@>fI( P 3ÿô0u0e@?6$F$%$$$"(/o2‚F«1),ˆ@(%€Iˆ" PF  ˆQ?3í]2?3í]2Ü2í2þ]íÖ^]ÆÖí10]]]].#"3267#".54>32>32.#"¢"NS)@.%< &+?_A #@]9>;$ ®b^*F2N (Hc<322654&#"#2ô8fŽU*e)\M;bGUŽf8þ‡ŠˆˆŠ-1  #[Z…W+ VH ;@+W…þšýì.ÿùµ#?@$s¨%FvY  ©$y|FyA?í?3í29/íö]Äí]ö]í2105!#"&54>;5:767#"o¬020’ *PsIVb$  R2O6 6GdQýUon325 @&(9$ZK&3þÌ‘ dA<`D%32>54.#"+<$!,5D$2,!J404*7ES8_H;X:þÏ" 6'#5#.;! "#E?42&$2  L&lT*YH.*DWÇ  )3:!;-1;,$%åµ @@ s   y y y A B??í9/íí9/9/9/9/Ðí1035!5!5!5!5!%_þÞ"þº§SðQÎSýK8ÿñ‡Å)¹"ÿø@MM M M¸ÿȳM¸ÿè³ M¸ÿø³M¸ÿø´L!¸ÿð³M ¸ÿø@'M)MLM M Lv@ M¸ÿð@L@ M©+ +*¸ÿø³M¸ÿð@Mv@MM¸ÿø@M M M@M©*y))$|¸ÿð@ MF| ¸ÿð³M ¸ÿøµM E?3++í2?+í9/íö++++++í++9/ö+++ý+++++Å10++++++++++.#"'>32#"&546732>7" wz 5* $4D'W€T)0TqBƒ•c-C,3K2r} P 6`„M\ˆ\-®­O1R;!(?P(3ÿñÄ8âµ"M4¸ÿø³ M$¸ÿø³M#¸ÿø³M#¸ÿð´L#¸ÿè³M¸ÿð@$MM M88+:2v!vMM¸ÿø@ M MPM©9,¸ÿø@M,/|&7y+¸ÿø´M+&¸ÿø@L&E |MM¸ÿø´ MF?++3+í2?+3+9/í9í2+ö+++++íÔ2íÖÆ9/10+++++++++#"32>7#".54>7.54>32.#";«>-M9!_U8.%  (6D&?hI))7;=$@X4=3) X7@M$8D!4F 3(D9 P 2O7(<-T0/E- O 9-#. ÿäÿEøµ8@s| y  H GyA?í?+39/íí2ÞÌí2ÖÄ10!!!!#"&'73265V¢þ¿þã !:-% %µQÔOþ¿.F/I1-:ÿòÐ5½@}‰ ¨ x !‹Œ#o##W###_5s¨7?7o7Ÿ7g-&--vx g   ©6‡#—#u#T#E##((||FgXE5W222|hF?]3í]]2?]]3]9/Ü2í2í]2]]]]ö^]]]í]]]ö]íÄ]23/]]]3]310]]]3#".54>32>32.#".#"3267ýa -;F$IxV/4YxE-:??&    #.75VfI( ÿH‚µ'3Ú@€91s+s""$(2* * )* *%&' $ ¦   $2 $* $ s * *322s22$  54*$2$t$„$?$O$$.y) C A A?.??^]]í9]]333ÆÆ]99Á‡+‡}ćÄćÄÄÄć+‡}Ä]‡ÄÄÄćÄÄ3/í3/í10]%.'3>73#".54>732654'!@@B%e5i;;h6c%C@?!  "8))8"?'ž:z‚QrÝttÜsQ‚x:1,*1((1*,15@ '' Pÿõ1)ï@…'&ˆ)ª++$+T+d+„+¤+Ä+:Ô+ô+«++4+T+t+”+ë+´+Ô+‹+›++@+`+/++à+ð+Ï+ +@+p+€+ +°++! ª*!Mˆ$¸ÿð´L$¸ÿð@  L$P NJ¸ÿð@MˆMM LQI??+++í+???++í+3öí22]]]]qqq_qqqqrrr^]öí9/í10^]]_]]%32653#".=4.#"#7>32ê9<<9].RAAR. 1%: ]]6?Q/êXIIXþÕ,TA''AT,30D* þPøþö #?X5Vÿñpµ0@   s¨|  H FA??+3í2öíÆ210^]33267#"&5Va/0#  9"`Rµþ>6 P ak7µ 0@s  y BA??9/3/í29/3Îý2Í10333###daddad&þÚKþ¼DV‡Ã$ý@dy '§$#"! +;M$4Ú„Ks  I :  (  /OŸM H(s¸ÿè@BMD0& s ¨% |”…tE;   {6 A BB???9/]]9]í]]?33]]]ýÆ3þí22Æ]]+2í^]++Æ]2Ò]]]‡+‡}Ä]]]q+q‡ÄćÄÄÄÄ10]]]#.'#3>7>32.#"+c`SrPY\*aa59<7-*:,%9UtYdi//_WJþ·µþÊAED #E:fPü(Ð@Ø#Š F 9 8  x¸ÿàµL#¸ÿà³M#¸ÿð@]L M LLt#$##$¤*€ ª)$I9I#I…&6O J JJJ?????^]]3í2?9/]?öýÌ]2ÀÖ]ÆÁ‡+‡}Ä]+++++2+10q]q]]]q]]#.'#4>32.#">73 CA:m7<>] !:-% %:82m6:;DOQ##IC8úM.F/I1-þÐ:<7<==ÿöG@ 8  H ¸ÿÀ@ H€ ª … NˆQ?í?9/3í2öÄ3ý2Ü+ÆÆ10+].=#5373#úVHNN]\\ FJçFCþ­FØ ì'@¨‡Vf‰3 $ ˜ ¨  “ #!$$ $% %     %  ' %%$%$$$  W0  ?$$)0(%J$J  ‡OJJ???39í2333]??ÆqÆq9/9q]3Á‡+Á‡}ć+Á‡}ćÄÄć+‡}Ä]‡ÄćÄÄ^]‡ÄÄ10]]]]]]]]]#>7''7.#"'>327#./' _,6? jd' %5$?"K;0+?)R£œ?^ÞVÿñyµ/j@Dª/‹/›/|/x1¨)s''s s ¨0(AA A*--'"V"f""Vf|F?^]3í]22]333???öíÜ]íÜ]ýæ10]]]]%#".5332>7.5332>73#"&ô %1<"EW1a 5*+$ a 5)$"a%zE3P- )Jf<¯þj9R5  M'¯þj9R5cýW ÿäÿE‚µ!Ž@1wss@ ¨#€s¨"@Hm[ ¸ÿ¸@*IP`pD!BAAA|  H   GB??^]+3í2????99]]+]]]+öíÌ]2öý‡+‡}Ä]10!.'#"&'732653319BGFB :-% %M/ki] _%\cf_T ýã.F/I1-Æ2…ˆ5ýKPÿGôL³¸ÿø@ L ªªJ KXˆ¸ÿøµLP?+3í]2??öíö^]í10+]>32#4.#"#P jE>R1] 2% ]ù#?X5þ#É0D*þI:ÿñÐÅ%¹ÿð@LMM M ¸ÿà³M¸ÿà@ M M¸ÿø³M¸ÿø@M!M!MM Mv ¸ÿø@M @ M  ©'' ¸ÿð´M ¸ÿø³M¸ÿð³M¸ÿð@" MvM@M©&! yŸ¸ÿð³M¸ÿð@ M|MFM|¸ÿø´ME?+í+?+í++9/]í2ö^]++í+++2+qö]++í+++2+10+++++++++4>32#".2>7!"!.:5[yDCwZ55ZwCDy[5K1P:#þ: wddv Æ#;O[Yˆ[..[ˆYYˆ[..[ˆ¼"?Y8p‚*~o7W>!:ÿñÑ!5Š@\))$/h )  v,hw§©77g&vx$¨$$$©63,X |g)—))EW|h˜F?]í]]?]í]]33Ìö^]]í]]qö]]22]2í]]29331032>54.#"#".54>32>54&'3  ;U54U; ;U45U; 1)&$*5ZwCDy[55[yD7d*^[?gH''Hg??gH''Hgc0V$-|OYˆ[..[ˆYYˆ[. 5#  3ÿóEt ,x± ¸ÿÀ@= M Y'i''‚*«.V!f!!‚«-G$W$—$$ˆQH*X*˜**ˆ¸ÿà@ L[P?3]+Ì3í]?í]ö^]í]öÄ3933ý]Ä+2104>32>54&'3#".732654&#"3$AZ5.P\R$AZ55ZA$aNEENNEEN=eH'3#  eI P.>dH''Hd>XggXXgg9ÿòªÄ'; @nˆ y yˆv † v-Ÿ-)-i---=< s ¨=Ÿ=&7f77v##©<((|x)iF BIY|—fv†22|w&fE?]]í]3/]]3í]2??]]í]ö^]í]]öí9/]]3í210]]]]]2>32#4.#"#".54>2>54.#"w3_'U:ES-a 0" 1!'2WsAAsW33Wt@3P77P33P88PÄ(&Ec<þF¡9N1 -yMY‡[..[‡YY‡[.ýƒ'Hf??fH''Hf??fH'3ÿGë'3¬@J'%‚ H Y(i( (((54ª5/5?55V.f..‚   «4K%"ˆ†t¸ÿð@+ H–¦xˆPI+Y++ˆPF1V11ˆhQ?]í]?í]?^]]]3+]]í2?ö]í]]ö]í9/]]3]+í210]]#".54>32>32#4.#"4&#"326$?W33W@$$@W3'EI,dH''Hd>=eH'#@X4þ#É.B, "T2XggXXgg£¼(u@K( ™GW$vGWg*0** s s‡ Ÿ P p  )y B |@€E?Ì2ýÄ3?9/íÞ]]Þ]2í2í2]]Ö]í10]]^]]2+#.54>"#32>54.t’+QtIMa\M;bO..I2P75F¼on7#"&'#4>32.#">32¹ZK @&(9$a54.¦8AFhHz'aa%2’™MÖ ,E2P73E$Mh€G’¾.þïRkmDa+þû 3*'4 ÿñóÅ0¹-ÿø³M)¸ÿè³M(¸ÿè³M(¸ÿè³ M¸ÿø@M M  M M M¸ÿð@L(L(,,(s(,M¸ÿø@ M, Mv%¸ÿø³M%¸ÿð³M%¸ÿè³M%¸ÿøµ L%¸ÿÀµ H2/¸ÿðµM/v¸ÿø³M¸ÿð³M¸ÿø@M M L @ L HM 1¸ÿè·M|"¸ÿà³M¸ÿø³ M¸ÿð@M,M,, ¸ÿø³M¸ÿø³M¸ÿðµL"¸ÿø³M"¸ÿø@M"E|L M F?+3+í2?++3+++99//++++í2+Ö++++Ä+++í+Ö+Ö++++í+99++Á‡+Á‡}Ä++10+++++++++%267#"&54>7>54.#"'>32D^ '6E)y…7K-6($07Sg?m|2D&!;.E P b[1E2$ &%  Of[,>-! !- h'ÿô–+»@wv'v&‰ 8'$ 6F%'   :J+ ‚!$' $ '$'$ '˜'†''  0-)‚   «,ˆ8''PˆQ?3í2?399]í2ö^]íÄ2Æ]299]]Á‡+Á‡}ÄÖí10]]]]]]]]]]]]]]7267#"&54>7>54&#"'>32õ:FNEbl*:$75:'-@&+Xf(7>67CPJH%3$$#!PQE#0" ("!! µ¯@aWV    s   s   z Š  †–¦wy AyB?í2?9/í2Ö^]Æ]]ÖÆ9]Á‡+}ć+Á‡}ććÄćÄÄÄćÄÄÄÄ10]]!!5>7.'5!!t7|/yþ5=@=91Ûþ¥-5:iH‹CSIDIL'&LG>=S9AGÿ¤ÿE(V¹ÿà@. H (( @ € ) ˆ@%€ˆOgw‡HR?+í]?ýÞí2ÞýÎÜí3/310^]+.5#".54>32'4&#"3267Î VH!+"1 !7*UF]"" !  NFJ9%0/*`U(+)  JÿE|©,R@1  H$  .,*ª- ‡ —  ˆ$ '')''QˆR,‡I?íÍ?3í2?]3í]2öí2ÖÄ3ý2Ì210+3#3267#"&'732654&=#"&57§ÅÅ $+:  6,$ & "UI]Nð'3 +E1D2-giÐ@µ9@!  * su@   B€yA?ý2Ì2?Ö^]íÔýÖÆ10]".54>3!##¿*2P 1=…Úad+% -;"QýœdJÿõ…#j@D v†  %#ª$h  ‡‡—vO ‡ —  ˆ ( Q‡I?í?]]3í]2?^]]]3í]2öí2ÖÆ3Æ10]]]3#3267#".54632.#"§ËË $+2 F-5E*aj*:  , A4Nð'3 L6O4ndm P G<ÿE%µZ@;  ( O_syA|  H G?+3í2?í2Ö^]Ô]]ýÌ]2Ô]]Æ10]3267#".5#5!#K% %-:! ÚÚ-1I/F.dQQQÿñÞ!(K@.s% s @   **s@¨)(€{!AA|I'7F?]]í??íÎöí]Þ^]]]íÜí10#".5332>532654&'Ý 1$AcDDd@a,=%%=,I#! .'þ:dI**Id:³þX4K00K4¨"$ Jÿõkt$f@1 M"!@M@M@ L& &@ª%"€…II¸ÿð@ Lˆ L Q?+3í+2??íÌöí]Þ+++íÜ2í210+#".5332>732654&'3k 1$ iE7#5!32>54.'5!#ˆAuY5$. 6( :R22R: (7 .$5Yv+U~S/VJ=RD=JY6;^A""A^;6YJ=DR=JV/S~U+Qÿñt¸#[@;e V IJsŠ(8€Hvh©% s ¨$|A A'7|F?í]??íöíö]]ý]Ì10]]]]]]]#".5332654&#"'>32tCpUEa>a*9!aaAM @V4dB„kB*Id:³þX4K0‡…„Q3[}¬¿ –@[MsK[k«8$ "ss!(H B|EAAB????3í22?9]3Ö^]Ň+Á‡}ÄýÔ2ÆÖ]]]]Á‡+}Ä10+3.'3>7>32.#"ûEz6r'^1 ')#4/,:0+.,jÐdR©NKLA +,!BLVSþèÿG8/Ç@ g&&.-7"G"""'((¸ÿø@YH""((¥–hW6F%10.(‡-*P II‡ K?3í2??99?3ýÂ33Ö^]ÆÖ]9]]]]]]]‡+}Ä]‡+Á‡}Ä+‡ÄÄ]Ä210]]]]"#".'732>7&'3>7>32&õA&*4A)  #*! ?m$d &,  :>)ÇvËY-@)K 'w‰-hno3'LMQ,7>H !µy@?   s      yy A y B?ý2Å?9/3í22333ýÅ3ÞÆÆÞ^]ÖÆ‡+‡}ćÄÄćÄÄÄÄ103#!!5>7#53>7!5! \1™Î,O„þ S/w¬-T#þšÛh$qDK?|8QA7‡EK?n(Q$±y@A         ‡… I ‡ J?ýÁÅ?9/3í22333ýÅÁÞÆÆ^]Þ]ÖÆ‡+‡}ćÄÄćÄÄÄ103#!!5>7#53>7!5!©A%p¢9"þs=#X‰8þûwÃK0B*T'L:)^0B)FLÿñµ,~@OX sx ˆ  H&X&&vw‡i.-{Y+++#|XIF yA?í2?3]]í29/]í2Ö^]ÆÖ]]í]9/Ä]‡+‡}Ä10]]>7!5!#".'732654.+¸74.þ¿¼.8<-Q<#)Ih?&D6(  %.8U_!9M-‡<<8Q::?@1J16O3 P :D(5 2ÿñµ,‚@P'''#s,',,',&.#viyV7-'#&y%,{YH%A |IYF?3]í2?9/]]í2í22Þ]]]íÄÖÆ9/3‡+‡}Ä^]]]]10]#"32>7#".54>7.'5!!-M9!_U8.%  (6D&?hI)#7.'5!!_&H8!VQ/R]7;`E% 7K*50)„þï )/2Ÿ 1'AG P 6Q61E-AA;6N7=<ÿC«-@¶&  ,Z7H W | #"! $  <Ÿ ï  $ $ $ $$¨ ‰ x  ‚h˜ //*‚.…§‰wfx$ˆ$5$$$$+™ ˆ  0  +‡I?í2/9/]]]99]]]^]]]]]í2Ö]Äí]Ö]]í]]]9Á‡+Á‡}Äqr^]‡ÄćÄÄÄÄ^]‡+‡}Ä^]10]]^]]]]]]]]4>7>54&'5>7!5!.'2$B3Xk3Sþîƒ W60H/%AW2"I r!) ' -/>-SN9)[0&8'0;'  $(ßÅ*—@]¨ !™)X))$v7###,,!v%%*$+%!y#y))#B›y ‰  h  |›&—E?]3]]í]]2]?9/3/í2í2ÞÄÄ23í]Ö^]ÄÔ]í99]]9910]]3>54.#"'>323#!!&>7#U½#1)!4(.'2?&gq) Wš8*<?þW*9ti#I,* Da\*O&I9+K Q.OF?ÿñúµ+…@hX%vc¸ÿ¸@B I@--'s" ###,yH)9&y"y$A|h  HHF?+]3]í2?íí9/]]+íÖ^]Æ2Ý2í2]Ö]+_]íÄ10]_]#".'732>54.#>7#5!!Ř CfE;3&!+5/A)GtUaÄþöªwg.N8  R "-&:(&D@> QQ274ÿôÄ)U@2(‚+$ *…$…HI ˆQ?3í2?9/+íí2Ö^]2ÖÝ2í2Ö]íÄ10]%#".'732654.+>7#5!#32Äup91$+3GC2T@2Q’ð9]B$–KW N +)' 8Z0JJ !# +B/ÿô¨©%©@f$#x 9" "" " " "" ¦ — e  %‚'—'%&ˆJ ;  *: Q‡I?ýÄ?399]^]]]í2ÖÆí2Ö]]Äí99]]]Á‡+Á‡}ÄćÄ10]]]]]]]73##"&'732654&'.5J^ÅÅ %$:*qbESL:9<6>4%™¡M& $2%HJP!") &9,PÿG  T@4 g{‚  «ªˆWgwPvGˆiK?Ý]í]]?]3í2öí22ö^]í10]]]4&#">7#>32¨NF*/,ZH-a8`~F] dA9Z?",EO þr(>W3232>7ù(BV-hqdSV1C U6Dc@þ›A9 1!EgD"„…PUN )Hdm?Q(4ÿÿÂ&$´ @-P,3O %O O++++444ÿÿ+ÿõÀ"&D´K@8JPHPOBO6O++++444ÿÿÂ&$µ @%&P'O O+++44ÿÿ+ÿõÀ"&DµK@BCP32.#"32675#53ýaPP -;F$IxV/4YxE/J5"b45VfI( pI3ÿG@"5»¹ÿð³M¸ÿø@sM†M"44#1 ª7W)g)F)7))‚–¦UeHI«6ˆfvR#&ˆ 4…3 P›1«11.ˆ›«/^]3]í2]?39/3í2í2?]3í2ö+]]]í]]]Ä2ô]]Î3ý2Ì]Ä210+]]++%#".54>323##"&'73265.#"32675#53– E./S>$"A^;Aa!NN|~1W Q,SI/(KQ'3%>pp4?^A9_E'ÄDÅxl Q BH•bQ-@*jDÿÿ:ÿò^¡&*_¼œ@ ,(, P-O++4ÿÿ3ÿDò&J_e@ .2P 3O++4ÿÿVo¡&._ƒœ¹ÿÝ@  P O++4ÿÿ5üÂ&N¼ô¹ÿŠ@  P O++4:ÿEÐÅ,@*@*M. >   I:i ¸ÿÀ@ L€!@L!'¸ÿø@M 7M7 M7v ¸ÿø³M ¸ÿø@M @ M ©BðB-¸ÿø³M-¸ÿð@+ M-vMM@M©AL LM2¸ÿø³M2¸ÿø³ M2¸ÿð@$ M2|(M(M(F<M< M< M<|¸ÿø³M¸ÿø´ME?++í+++?++3í+++Ü+Í++ö+++í++]ö+++í++9/9+9Í+Ì+210]]]^]]+4>323267#"&5467>7#".732>54.#":5[yDCwZ52D)&(  #86Dy[5f ;U55T; ;T55U; [Yˆ[..[ˆY@iT< =)#+.[ˆY?gH''Hg??gH''Hg3ÿE(4—@i(‹›«<L\ +ˆŸ¯@ €Y)i))‚«6V/f//‚«5H,X,˜,,ˆ$PYi G2W2—22ˆQ?3í]Ü2Í]2?í]ö^]í]öí]9/9Ì2Í]2]10]]]]3267#"&5467>7.54>324&#"326F<+(  #86 2S<"$AZ55ZA$aODDOODDOV =)#+ *Ga;=eH''He=XggXXggÿÿ:ÿEÐc&OŠÉœ@ AB PCO++4ÿÿ3ÿEÇ&PŠk@ 56P#7O++4ÿÿÿñ¡&_[œ@ -1P2O++4ÿÿÿýÿG¯&°_¹ÿô@ )-P.O++4ÿÿÿ¼ÿG &]_Å@ L P O++4ÿÿVÿúå¼&'=ÍÿÿVÿú~¼&']Íÿÿ3ÿô&G]Qÿÿ:ÿò^¤&*»œ@ L*( P)O++4ÿÿ3ÿDò&Jd@ .0.P /O++4Vÿñ×µX@4s ss  yBu f U F  |ˆF IAA????]í]]]]?9/í9///í2Ðíí103!332653#".=!#VaSa=II=`4YEDY5þ­aµþÞ"þNb[[bþç7]D&&D]7Sþ¾VÿGS¼M@-† –   vsI|B9I|EC??3í]2?í99//]]í22í10]]#>325>54&#"·a19@!‰—@o–WAqS0cU0<¹G ƒ~W‡jQ![=QmKQWÿÿV‚¤&1C·œ¹ÿæ@  P O++4ÿÿPô&QCm¹ÿæ@ PO++4Â#/3e¹ÿø@ M20Hwew e Ð$122 ¸ÿÀ@zH ï*ÿ***-300¿Ï@H@à$ð$$$--   s#"!  s 5@5p5 5540H03€211 ¸ÿð¶HW  ¸ÿè@- H '-y#@€’ ƒ z Y i   -ABB???Å2/99//]]]]]3í2ÞÍ+]+2/ÅÝÅ+Æ^]]]Æ9/Á‡+‡}ÄÄÄÄćÄÄÄÄÁ‡+‡}ćÄÄÄćÄÄÄÄÄÄ33/]Í+]2/33/]Í+2/3]10]]]]+]+7#>7.54632#./.'4&#"3267'7¬?e%C?>!7&%8!>?C&j ?"#?²-ž—²²g²Ÿ’G $+11+# G’ ³g-X-OX¢KK¢XØ·<7Nÿÿ+ÿõÀŽ&D³K@ ?6P+444ÿÿ‚¤&¡wœ@ PO++4ÿÿ,ÿô%&Áå@ XV ,P#WO++4ÿÿ:ÿÜФ&³Ü@ 20 P1O++4ÿÿ3ÿÜ&Óe@ -+P,O++4ÿÿ¤&$²jœ±¸ÿÛ@ P O O+++44ÿÿ+ÿõÀ&D²!±¸ÿè@ =7P54.+532>54&#"'>32#"&'7O9lT4-BN!&(I8!ME7Sh?6ZA%!2LUCoN & d,I92A&N%9&BH O6S:60( rHPlBT ÿG‰3§@lK:©¦Uw – –wvw„ „†™((w‚¦5t  ""54./4g  #ˆ!!ˆ†wR.+ˆ/P?2í2?]]í9/í2]Ö^]2À29/9]Ö]íÔ]í]10]]]]]]]]]]]]]]]]2#'>54.+52>54&#"'>£,L7 ) 2"Dl†A>?=/'7> =/;6-J *.,C0+' *1F\6O "1"&,M , 05P ÿÿVk¡&+_¤œ@  PO++4ÿÿ5ôÂ&K¼ô¹ÿŽ@  PO++4VÿGSÄ?@&WDEs s  | 7GE BC???]3í2ÖíÖ^]í10]]]#4&#"#>32SbRZ(&" b7AH&Hb>¹Orgý £ )Jf<3ÿDÜ(7D§³§3¸ÿà@e H4'$G3iX&(# ###77;B‚GF711‚«E%$?ˆ KO¦)),ˆ¦f W  Pˆ8874ˆQ?3í2Ô^]í?]]3]í2]??íÆ2ö]í]Õ]íÔ2í223]]310]]]]]]]]+]%#".54>327>32#"&''7&4.#"3267"32654&¡8<`D%54.7#".54>7.5467332654&'3O)C23C%%C32DÈ-03%†—MlF &20- ^ ELLE ^ O 1"#22#"1 Ì9T +9#bq7N1$8+ T90D&#F#CGGC#F#&D4ÿó 9e@>63‚7 ‚;*-‚)#&‚:#v0†0D0T00ˆRI6N)NF V  ˆQ?í]??9/]]í]]99Ö^]íÔ22í2ÖíÔ22í210%4&#"326#".54>7.5467332654&'3»ODDOODDO>0',!$AY55ZA$!,'0 [;:9;[ ëMZZMMZZÅ9X )7C'8[A$$A[8'C7) X9*Q*#G#QHHQ#G#*Q!ÿEµ#a@7€v   s%!$ !y"Ay  H GyB?3ý2Å?+í?ýÅ3ÞÆÞ^]Ö‡+‡}ÄÄÄýÌ]10!#"&'7326=!5>7!5!#cje$ƒ :-% %þf9AFEAþ›Ûh&~”œCQ.F/I1-A(`ef^SQ$ÿE±!e@:€##"‡ I  H R‡J?3ýÁÅ?+3Í2?ýÅÁÞÆ^]Þ]Ö‡+‡}ÄýÌ_]210!#"&'7326=!5>7!5!©EOO 6,$ &þÇFMIþÿwÂTfp3N+E1D2->,ji] Nÿÿ|&$bœ@ !P O++4ÿÿ+ÿõÀà&DbK@ 8>P6O++4VÿCµ'|@K H  @$''@ H€    )s¨( H$@ H$ y y ByA?í?3í9/íÔ+ÖÅ^]+þí2Þ]ÆÎ9/ÅÌ+23/ÅÝÆ]10+3!!!!!##"&'73254&/>7V§þº"þÞ_¶  (+ $µSÎQðS ! 9 (3ÿCù6?¹ ÿè@  HcD¸ÿð@M4M944*4 4  H¸ÿÀ´L¸ÿø@"M2Ÿ//&%++ @M7‚ «A?¸ÿøµM?‚ ¸ÿøµM ‚¸ÿø³M¸ÿð@- L«@%"H"&)/@ H/ˆ?‡  °  2¸ÿø@MQ:M:ˆP?í+?+339/]íí2Ý+Þ2Í+2ö^]++í+í+öíÄ+29/Æ]3/ÍÌ2Õ]Å10+++]]]++]]+4>32!3267#"&'73254&/>7.%6&#"3(BV-hqþœSV1C K1 (+ $8P5eA9 1!EgD"„…  PUN ! 9  "-G\h?Q(4ÿÿ:ÿñÐÂ&2´É @*< P:BO4O(O++++444ÿÿ3ÿó"&R´k@"4 P2:O,O O++++444ÿÿ:ÿñÐÂ&2¹Ê @7( P32#"&''7&457"32654&À,1#$8'9HK0h]L"(##%$H'43*/)[*~ìý$,+*PÿDÓ,9¾@€fv—†dtœ  v†v†D117ƒ;p;O;+ª:+J{ %5   Š---4ˆ K*X%%ˆP?3í]2?]]33ýÞ]í]3]3]]?öí]]ÕýÞ]2í222]310^]]]]]]]]]]]]>32>32#"&''7&454.#"#%"32654&P jE>R1,1#$8'9HK0h 2% ]ð"(##%$ù#?X5Ü'43*/)[*~0D*þI$,+*ÿüÿDŸ©)x@J  ''‚++  *‡IS&ˆ J$ˆ    R?]33/í?Ô^]]2í]]]2??íÖÖ2]2í2/3]ÕÄí10]]]7>32#"&''7&4573#"32654&À,1#$8'9HK0h]¶¶L"(##%$H'43*/)[*~¡Nþe$,+*3ÿôj@–@=B433!BBª<‚ P11 P‚)ªA4117  L ˆ.7¸ÿø@L7P3N!$$¸ÿð· LˆQ?í+23333??+3í+22333öýÎ]2/ýÞ]ýæ]93/310^]%32654.#"#.#"3267"&'#".54>327>32ý3&KZ$9(&@]@&(9$ZK&3Å-NM-<`D%32>32>54&#"”$9(&@/*KZÑ<`D%73737.'Ð-[6e’hD__?c(FCB$V/FEæ#CaSV  .îjï•-X-þéþ²n»¨™Kfº¥NªXßß=z:ÿ›a %0ñ@˜ *–)h)W•#$ $k{‹9Y)* $% %$ $ %$ @ H2a202$‡&&&&vh˜V©1))IY|$#i[IkW!!F*V,|FV XE?]3Î33]í2]22?]3]3]]]3Îí22]2]þ]]ý]]À]]Ö+ÀÁ‡+Á‡}ÄÄÄÄÄ]]‡ÄÄÄÄÆ210]]]]]]7.54>327.'3267#"''&#"ÇBK4ZvB/ G Ø'5B[%8I*@4+G&&Î3T327#"’   u"%@ (,%#>==#@]9  >þênNSN þ“N PQ!}S¥ '"',,("+'(‡)I"•…!J‡™ZjI:K?]]]]í>á]2?ýÅÁÞÆ^]Ú]2Â/‡+‡}Ä10]3267#".'.+5>7!5!©EOQ!(  !#' & !1($ !*6 FKIþÿwÂRgs7 "O$ >,ji] N¿Å'‘@T  iy‰JDsi y ‰  v§–)(yH"6"("""|¸ÿð@ HEBB???3+í29/]]]íÆ^]2Ö]]í]9/]í]10]]]]]]]3#54>7>54.#"'>32Ýa!1!!&27X )5<sy#/% Ñ);/% !%  P _S&7*! * ‡%—@eJ;J%%2™ ©  ‚'&–¦‡vE… h 7    ‡wVfPJJ???3]]í29]]]í^]]]]]Æ]2Öí]9/]í10]]]]]]]]3#54>7>54&#"'>32ÇY*.@/,)"  '27bg&  €!0'+&  M MD.#  ÿú]¼1Bš@bH*g8vg‡—§sf,vgw‡ D DPD€D" Bs ¨CB=|2y1y    1 1 E"'|F?2í2?399//^]3í2í9í2öÌ3ý2Ì3]Þ]]]íÔ]_]]2]í10_]]".'5#53>323#232>54.#'32>54.#"110PP011=!KaLaKKAcDDd@KR%=,þ´\ þëþëKS:dI**Id:Sþò0K4HHh^ÿÿ„µ¨VÿŠ3ú²@d()  )8H* s9(¨ y y ByA?3Îí?3Î339/3í22233í23öÅ]]í2ÖÆÔ^]]]Á‡+Á‡}Ä]‡ÄÄÄćÄÄÄÄÄÄ10]]3'7#!73#!37#37#þ1E&XzFŒFgfþ—ŸYøfv\µEþ²MõP’Ôýêõ3ÿ¬g%,15î@uˆ# '&54#" ""… &   10 ! ?!! ! -‚«7?72‚,‚VfG6«6"!G4—44†–Wˆ1&,…5 °# ¸ÿð@ HQ0Y''ˆ v e  IP?]33]]Î2í]2?+3339/]33í22í]]222]Î2ö^]]]]íí]öí99//]3}‡ÄÄÄÄÄÄ]]]3‡ÄÄÄÄÄÄÆ210]]4>327#3267#"''7.?&!4&'73)DX0  >|Ô3'2GY62*>>9Ó0%:)*·/)EgD"TP4 Ÿ$  SU#{}—+91>ƒDT,€ÿñðµe@= swh yyA |  L  M MF?+3++í2?99//íí9////Ð]]í210^]%#".'7326=#5333# 5YC"9." &C2HB‘‘aPPß2VA%  M!IY\K&þÚKÿÖÿEà#e@)!   %$ … …  ¸ÿÀ@ H‰SIˆˆR?íí??í+99//íí9///Ä^]3Ðí2310]"&'7326=#53533#"&54632 &  0)\\]NNZ+####»L;9çFÒÒFæda!!!!!:ÿE?Å$8ä@  L  L€$¸ÿø@L$M$ M$s%¸ÿð³M%¸ÿø³ M%¸ÿð¶ M%v/¸ÿø@L/M/ LL¸ÿø@ M//:94M4|¸ÿø@ L ME*¸ÿð@M*|LL¸ÿø@ MFy G?í2?++3+í+?++í+9///+++++í+++3í+++Ì210++3267#".=#".54>32!32>54.#"Í% %-:! 3>D!Dy[55[yDCvY4ýÓ ;U54U; ;U45U; -1I/F.c*.[ˆYYˆ[..[ˆY?gH''Hg??gH''Hg3ÿEs/a@<  H€/‚'''''10( 8 ˜  ˆG,W,,Pˆ" H"QˆR?í2?+í3?]í]99//^]í3ÐíÌ210+3267.#"3267#".=#".54>32”$9(&@/*KZi% %-:! E-8W<%D`32"#32>54.´243j/0/aPP)e*’™L×#  X.H33E$BOV(&OH?þíKM nmDa+þú 3('4 €:@ ª…J  ˆP?22í22?9/3í2öÎ3ýÌ3Æ2102.#"3##5#535>  3(3’’]JJ!bQ ¢FÍÍFß Zµ$í@"!   $ s     s  s  & &P&€&&%By B A AAA?????9/9í23/3?Ö^]À2/]]ÖÀ2/9/í2‡+Á‡}ÄÄÄÄÄ3‡ÄÄÄ+}ćÄćÄÄÄ103.'33>733##.'#>7#S)n&Ü'h*T~:a ;}($# &J%%J&&J%%J&I0`0þé1a0w: :ÿGô*/³y%¸ÿà³M¸ÿð@§M.+*- &*)&* *   +++ &  &+&+&&&&& &   “£v†U7G 101@1p1€11 *0 #ˆ*Š&6@ K I III?????39/]9]í23í2Ö^]2ÖÄÆ2]]Ö2Ö9]]]]‡+Á‡}ć+Á‡}ćÄćÄÄ10]++]3&'33>733##".'73267.'#67#K&a ¡ ]BX0*4@*  #6? ;eu;jc-i73e56d3DHƒ<-@)K .7<C›LOTÿýÿG¯(ž@e— ˆ    H( 8 X   "‚v†i 0**)g((ˆK ‡I?í2?3í29/Å]Ö^]Æ3]Ö]]]íÄ]]+9Á‡+}Ä]]10]]]]]]7>7!5!#"&'732654.+x2/(þï„)05*K7 %E`;7]R/QV"7H&Ü<=7N6;AA-E16Q6 P GA'1 6bBí.@@H'À Ð  /3Þ]Í^]+ÖÝÞÍ102#.#"#&>¼1%<<%1í#4!  !4#DdG@#€DT”›/3Ý2Í]2Í]2ÖÅ]ÝÅÖÅ]ÝÅ10/'ñs0{ms0{ $Œ8 $Œ_?Žt@ Hi¸ÿÀ·H€@¸ÿÀ@H  i€H ¸ÿðµH ¸ÿð@ HH/+Ý+ÞÝ+Ö+Í]Æ2/ÅÝ+ÞÍ+2/Å]10+'7#"&546324&#"326ž—8%&77&%8-E<7Nó+11++11+!KW" A´Ÿ¸ÿÀ@H @H  @H/ÝÞÍ+/Í3/Ý+Ä]ÞÝ+Ä]10"&546323"&54632'3#W³ úþþK×@=K;" 1@ @H@  ¸ÿÀ·H €/ÝÞÍ+9/Ý+ÌÌ10"&54632'3#¼  –þþK×@K\V è@,tE4%Dt6$T1A"¸ÿ¸@; IKkt„”cT@›wV€”v‹›~o ¸ÿÀ@.H@H  ‹›@O¯€d„”@H/ÝÔ+Í]Ý]Í]/Í3/Í+ÞÍ+9/]]]Ý]]Ý]]]Í]]]10]^]+]]]]]]]]]]]]]"&546323"&54632'R½ µ`-oK &K\V ¯@L—v†  H†–uv†– ©v@ H„™{‹o” ¸ÿÀ@%H@H  @O¯€”@H/ÝÔ+Í]Ý]Í/Í3/Í+ÞÍ+9/]ÝÝÍ10]]]]_^]+]]]]]]+]_]"&546323"&54632'R ½L323267'3#U " - " ìþþ¤     j@]3¸0@ZzŠšM@€/ÍÝÍÞÅÝÅ10+]'7¨¡o<7NA67Â:@  @€/Í]3339/Í^]2Í]210]''¼{^^Â_-==-A67Â5@ @€‡—/]Í]9/3Í2Í210^]]77A^^{•-==-_ÿþëzÂp@yjy €¸ÿÀ@"H@H  @€/3ÜÍÝÍÍ29/3/Í2/2/Í+ÞÍ+10]]^]]]]]'"&546323"&54632`-o ù Â&£ÿþëzÂb@­Ue@H ¸ÿÀ@H  @€/3ÜÍÝÍÅ29/3/Í2/2/Í+ÞÍ+10]^]]'7"&54632!"&54632$o-`\þÙ Ž&×ÿþëz ‡@š‰•†€¸ÿÀ@6H@`@H@ ` xH~xI]N0 H/ÝÔ+]]+_]+ÝÝÅ3/Í3/3ÞÍ+ÞÍ+ÝÅÝÅ10]]]]"&546323"&54632%774 ùþå^^{ëª-==-_ÿÿV¤&(C‹œ¹ÿò@  PO++4ÿÿVz&(ƒmœ±¸ÿó@  PO O+++44ÿþɵ' ¹ÿà³M¸ÿø³M¸ÿð@%MM L „`pvs¸ÿð@0M@`)(#| MyyAB |F?3í2??íí9/+í29////^]]+í22íÌ]]]10+++++%#"&'732654&#"##5!#>32É3K1 <;^T#CaËð $&DeB!Ð,M9 MJ9LF þ­aTT¾ 32.#"!!3267IxU//VxI*G6#UB5R:!0þÎ!;S6BW$7H1]†VU‡]1 M !&v (ssI Y   21 I Y  1) ,||%% FyA?í?339/í2í223/]39///]íí22í10^]]#'>7>5!>3 #"&'%4.#*32> É )=S8 FM‰)4*NpF*`*|8M.'/%F5 bpÅZ-O;$THJUë‘üã8T8 Ï*8 þë 5Vÿùݵ)T@/v&ssIY+*y|##AAB| F?í???9/í23/í9///]í2Àí22í10>32#"&'!#3!32>54.#"\)šš*NpF*`*þ¼aaDa[%F5 8M.'/´ls8T8 Mþ©µþõ ý™ 5**6 þðªµt@Jf  ss€|w‡VfHyyABB???íí9/]]]í^]29////]]]]]í22í10]#>32#54&#"##5,ð $&D[7`DS#Ca˵T¾ 7!3#5!l\I37ˆW\þÜ,(=¹ :¨Výžþô¹bB‰‡‚;ÿÿVµ(rµ1 @›§,¨$$sˆsЀ r$$% %3€ '', && ,''s--'  sߟ¯} s€% %%°----2-B,B&B %BBBAA A AAA?????????9/3???Ö^]]ÆÔ]í2]]q‡+Á‡}ÄÁ‡+}Ä3/}ÄÄÔ]ÆÆ3/99}ÄÄ3]]q‡+}Ä]‡+}Ä10]].'33>73#.'##>6IIEq=EG ]GE>pEIH(PKBnDHI!]!JHCmBKQp#UWT"LSU%5þË%UTK"TWT#$Y`d0.]WLþµKLW].0d`Xÿñ Ä8Ë@!‡!fgO8_888) Mv¸ÿø@ M0L2v¸ÿø³M¸ÿð@L«: *)))9y77*¸ÿø@ M*/|)M)$F | ¸ÿø´L ¸ÿð´L ¸ÿø´M ¸ÿø´ME?+3+++í2?3+í2+9/í2Ö^]2Æ2ö++íÔ++í+39/]10]]]]]32>54&#"'>32#".'732654.+‘4!D8$M@7X )3< 4X@$=;7))Ih?&D6(  %.8U_!9M->• .#-9 O -E/0T-<(7O2 P 9D(3 V‚µÌ@‰ ™¨ ‰ §v§   s s   ¨@P€s¨ B B; ¯  H9 *    AAA$”r‚c@P2#B?2]]]]]_]]]q2???33^]_]]+]q??öí]qö]í‡+‡}ćÄćÄÄÄ10]]]]]]]33>73#V_ ]ik/M_BFGB9µýÿ5ˆ…2ýK T_fc\%ÿÿV‚„&Ø­œ@  PO++4ÿÿVoµ. ÿömµO@2(s sª    ByA… • F  y F?í]]?í?Æ^]2ö]í9/]í10]'>7>5!#C)=S8 FM‰ab8ic^--O;$THJTíýKbÿÿC%µ0ÿÿVkµ+ÿÿ:ÿñÐÅ2Veµ*@s¨ s¨BByA?í??öíö^]í10#!#eaþ³aµýKbýžµÿÿV=¼3ÿÿ:ÿñSÅ&ÿÿ%µ7ÿ÷Cµ$Ó@€–sXs $!  ’csƒ4DT' &&o& &P&&& % AXˆAAA | F?3í2.???9]?Æ^]2/3]]]]Ö9]]]]]]]}‡ÄÄÄ+}Ä]‡ÄÄÄ+Á‡}ćÄÔ‡ÄÄ10]%#".'732>7.'3>73Š+;S=  %-$ ,NB6n!g?(I i...Ô.Q<"R 'G„w2WÖu[ÛlHuoÿÿ8(â²ÿÿcµ;VÿG¼µ 1@s s s¨ AAyBC??í2??öí9/í2/í10%3#5!3!3eW\ýöaMaSþô¹µýžb:!µL@, s s|y‰ A B A???9/^]]í399//]]í3Ðí1032>73##".=3š%?0'$ aaO-L`7`í*?)_ýK #A]9ÈVµ Ÿ@w s s s o ¯    Ï  ¿  0 P p ° À à 90 P €   À à   0 p À ð   0 P ` € À à yy AA A B????íí]qr^]^]qr_]q9/í9/í9/í1033!3!3VaaaµýžbýžbýKVÿGص]@9 s sss¿p_ @ yyB C AAA?????íí2^]]]]]9///ííí2/í1033!3!33#5VaaaW\µýžbýžbýžþô¹ÿù±µ M@-v sYi"! |y A|F?í?í9/í29///^]]]í22í10%#"&'#5!>3 4.#*32>±¢“*d*´);f 9O0'- 'H7!Ùpp XSüã*8 þë 5Vÿùµ $O@-"s$VvsI$$&%&|!#B!AA |F?í???9/í2]9///]í22í]í10%4.#*232>7#"&'3>3 73#Ò8M.'""%F5 f*NpF*`*a)4iaaÙ*8 þë 5*8T8 «üùýKVÿùCµ <@ v sVI  |A|F?í?9/í299//]]í22í10%#"&'3>3 4.#*32>C¢“*d*a);f 9O0'- 'H7!Ùpp «üã*8 þë 5ÿñ2Å(õ@$v&W gy )v©h˜)v¸ÿø³M¸ÿø@MM©*    )¸ÿð@ L|$yŸ¸ÿø³M¸ÿðµ L$¸ÿø³M$¸ÿø@ M$E  L ¸ÿø³M¸ÿø@!M| M M  M MMF?++3+++í++2+?++3++9/]íí2+Ö^]2Æ2ö+++í]]]í]9/10]]]]#".'732>7!5!.#"'>322/VwI*H7$WB6S;!þÎ0!:R5BU#6G*IxV/[U‡]1 P #@Y7R4T2>54.#"@sW32WsA?pU5›aaž8Tk;3P77P33P88PÄ.[‡YY‡[.+T}Sþ¿µþßKrL'ýƒ'Hf??fH''Hf??fH'$%¼/…@3§ s ¨1¤1vx&&+0 M+@Hl+/+?+O+++ s!¸ÿÀ@! H!!!0H&&y BB | ||E?ííí??9/í33]Ö^]+í3/]_]++3]í2]ö]ýÀ10_]";"'.'2##"&'#>7.54>c&E6 __d  #010aS**)f,/+2**Opg 4'J9UýU@HN%'TLA.E06R7ÿÿ+ÿõÀD>ÿó"7„@WV&—%f¨-Y-i--‚«95§#f##‚g§«8¨ˆg OW(F((ˆ Q5I22ˆP?3í]2?í]]?^]]í]ö]]í]]22öí]]9/310]]]]>32#".54>7>732>54.#"¤S&ps;Z>G^7Bu\) -$cj !8,&6" "9+*M̉z4`J,4ZxCW–rK T bþø/T@%2C&"@2$ (Pÿ÷ü6b@<4&*/‚',7,, ‚™2x2ˆ22 22©8#ª7ˆ'/‡ $'Pˆ# Q?3í2?39/í2í2öí2ö]]]]íÔ]í310]^]732>54.+72>54.#""&'>32«5'$1oc-!'1/a;dd;)N<%& +3%AXF!!E“þÄ ú !9*&6;5/>&P’@ ª‡IJ??íöíÆ10##!’å]BºþFÿoFX@4  GW L‡ J L‡I?í??í22?]9///]í3í2]í2/í1073>7!3#5!#%#8!'UFXþzX“£!L0fmwBþDÝ‘‘Ýn/_]Y*ÿÿ3ÿôùHí- @–'$$##¯#g#w##*-- *)*)© ˜    4 ”))–¦;¯›(hx '('(/ (.-I)I(I$I#IJJJJ J JI??????????9/3??Ö^]Ôí2/ÔÆ99}ÄÄÆ]3]]q‡+}Ä]3/3]]qÁ‡+}Ä]]9Äć+}ÄÖ]]‡+}Ä10#.'#5#>7.'353>7Ñ267@=8h7;;Y;;7g7=@762g$^?Y?^$;?>DIM$!ID;üü;DI!$LID>?;-nHããHn-,ÿô¸6޹ÿà@ M%  ¸ÿà³ M¸ÿà@< M& 87'‚ G‚©  «8127 !ˆ ˆQ1,ˆ2P?2í2?3í29/]í2Ö^]2Æ2ö]íÔ]2í9/10]]++]]]+2#"&'732654.+532>54.#"'>Ô-N8  .5xg?[S:?B&,WT'! +*( "+0$6$&G6JH O''#J  P P@8šªy‰ª   ªŸ‹ZjI I I J ¸ÿ¸@I€ a q R 4 D  JJJI????3]]]]+????3]]]öí2/2]ö^]í22/]]10##3>7ZHHBSZBGGýøŒ&fmj)þŠ+ge]"ÿÿPè6økÿÿP  ÿöN@'8H‚  ª    J‡I ¸ÿð¶H ‡ Q?í+?í?Æ^]2ö]í9/]í10]'>7>5!# !0@+ 19Z]º!KKI 8+N 6'"V]^*ýøºC˜$¡@K)9I +&&&   & 6 F   $%JJII0@¸ÿÀ@&+H| I? O  @&+H |  IJJ???9/í+q?í+q2????Þí2/^]3]]3Ü22ÜÎ]í2/]33]]10#>73>73#.'#.³ Y U V88V V \ *)$ N %)*cÅW=…‡ƒ<4µvvµ4<ƒ‡…=WÅcWZRR[WPú ;@"    ª ª ‡ IIJJ????9/íöí2]ö^]í210!#5##3353ú]ð]]ð]ææÔÔÿÿ3ÿóRPò*@ª ª‡IJJ???íöíö^]í10!###!ò]è]¢ºþFÿÿPÿGSÿÿ3ÿô½F¿.@ J‡I?ýÀ?Ö^]Ö]ýÖ]Æ10###5¿©]©NþFºNÿÿÿDß\2ÿGÌ /œ@/1«˜¨‚**% /$"##—§‚«0 ¸ÿø@3M—&6‡‡/—/v//J)9™‡"y%‰%™%%I#$OKK???3?]3í]2?]]3í]]+2ö^]í]Ü]À}ÄÄÄÄýÀ}ÄÄÄÄÜ]í]æ10>54.'#5.54>757‘4G))G4)G44G)Z;hO..Oh;Z:iO..Oi:,D/r/Dä/D,+D/ýж$Ca>>aC$íý$Ca>>aC$ÿÿí[Pÿo5 1@  ª II‡JL??í2??öí9/í2/í10%3#5!333ïFXþs]å]MÞ‘þE».ÅT@3) ˜     ªªˆ ‰™ I JI???9/]3í2öí]ö^]ýÀ310]]]]326753#5#".=‹<4&3]]!$+G3™;/öýøÊ*E4šPç µ@s    ? O   Hï   ¿ Ï  ¯ ¿  0 @ ` Ð : P p   ° Ð  P p €   À   @ ` p €   ð  ¸ÿÀ@BEH‡‡ II I J????íí+^]qr^]^]qr^]_^]r9/í9/í9/í10333333P]À]À]þE»þE»ýøPÿo-_@;  »¯0`p ‡‡J L III?????íí2]]]_]]9///ííí2/í103333333#5P]À]À]FXþE»þE»þEÞ‘ÿõ8'b@> ‰‚§&–«)"@ €( ˆ"#ˆQ‡I?í?3í29/3í2Ö^]Þ]í22ö]]í]10]#53>32#"&'72654.#"–†ã"+L9" 32#"&'#33 =B#,×]A)J8! :R1/`-V]]³.3$ Ç)A-/B* Pÿõò%P@0‰‚–¦©'' ª&ˆ  ˆ#QI??3í29/3í2öí22]ö^]]]í]10]%2654.#"3>32#"&;D#.9·]"+L9" 32¿@`@8V %(QQÔÒ MK)> !'*?_@!32#".'##34&#"326­r)>P.3W@$$@W30S>'q]]ëMAAMMAAM14T< 'He=>dH'#?Z7æþüXggXXggÔ'u@L ) ª)‚¬ š  •¥‡##‚šª(&‡ JJ ‡PJJ???3í2??9/^]33íÖ]í]Ö]2]]í2ö]í210]]%"&'#>7.54>32#=.#";' ;^ !"$ !:O/B\\ 3!9FH9]Ê0m/=:4 $),B+ ýÿÊù/32&ÿÿ3ÿôù6HCiÿÿ3ÿôùÞ6HƒbÿEô/¢@  H ¸ÿø@IL#@ª11ÿ1_1 €.Àª0/J …R.h))ˆ¿Ïß ¸ÿø@LPN??^]+3Þ2Í]2í]2?3í2?öÎ]3ý2Ì3]qö]ýÌ210]]+]+]3#53573#>32#"&'732654.#"PJJ]±±;>R1 !:-% % 2% fEM]Ek #?X5þß.F/I1-0D*þSÿÿP’6óJ3ÿôÐ$]@ &P&W—§¸ÿð@ H‚«%ˆ … Q ˆ P?3í2?39/íí2ö^]í+2]]Ö2Æ29/104>32.#"3#32>7#".3!@_?+'! =*KM ÒÔQQ)% U9A_@9bJ* K OCKKU O )Idÿÿ(ÿô—VÿÿBºàLÿÿÿçÞ6 ƒÄ@POO+++44ÿÿÿ¼ÿEºàM ÿõA7r@F8+)+7"#66"6"6. ‚†–«9-..8ˆ"‡7I•.f.v.†.. ˆ-!Q?33í22]]?í9/3í2Æ]2ö]í99//]íí210]]"32654.'>32#"&'#'>7>5!g3 =B#,zA)J8! :R1/_-¤ !0@+ 19Y³.3$ @)A-/B* ¯!KKI 8+N 6'"V]^*Pÿõ5+Z@7  '‚&–¦«-ª,‡ˆ IIJ$ˆ Q?í???9/í3/íöí2ö^]í9/]3í210]2#"&'5##3353>"32654.i)J8! :R1/_-ð]]ð\A3 =B#,M)A-/B* ÝèÒÒÇL³.3$ ÿÿôÿÿP 6[ÿÿP6øCxÿÿÿDßè6\FPÿoï 8@     ª ª IIJ‡J?í?Ì??öíö^]í9/í10!##5#333ï£X¤]å]‘‘þE»3ÿó(8Ý@&''* š0WE4%$#"&"›.«.i.W.,¦&—&&",&,"&"&"", i))‚/«:hf11‚   «9v"†"–"7"G"g"",‡NF6V6–66ˆQ?í]?3í299]]ö^]í]Ô]íöÌ]í]99Á‡+Á‡}Ä]]‡ÄÄ]]]‡ÄÄÄ10]]]]]]]]]#".54>7.5463267#"4.'326;\A=[<*9" -]NAKI-0:  .T@%`.5AL#8'HK3bK.)G]3-OB5;+EKO# 1AY@1F1 sJ"@1hÿù±â)r@D$s+Yivw«+*y### y€D%| B?3í2?Ý]2í2/9/^]íÆ]ö]]í]99//]Ðí2310#32#".'#535332>54.+2òÍVIsP* ’110´´aÍk'G6 6O2R  $B5S32#"&'#2654.#"†]±±"+L9" 32#".%267.#">32".#"3267:5[yDCwZ55ZwCDy[5Ö-#:Q23R;"<-$<99$<99!&<t\^t.[Yˆ[..[ˆYYˆ[..[ˆT9]A#$C`;L%bowf 3ÿó$5s@0¦!8Hx¨(Y"i""‚«7.Vf‚   «61@H1¸ÿÀ@H%%Y++ˆPFV†–ˆQ?í]?í]9/Í+ÕÍ+ö^]í]2öí]210]]#".54>32".#"3267'267.#">32$AZ55ZA$$AZ55ZA$¥&$#& L<>M ! LdH''Hd>=eH''HerEOVK B FPVK  ÿ¿”@V(‡7hs   ‡vG  s    sˆ  A B B |E?2í22???Ö^]Õ]ýÖ]Ì2Á‡+Á‡}Ä]]]Á‡+}ÄÆ10]]]]2.#"#.'3>‘!9+  Ò["ACF%k6h7§ $2¿F &0ýíK™¨»nžþÜ€¾ 4&:‹@R(ˆx     Ÿ¯‡PIIJJ?????3í22Ö^]Õ]]í‡+Á‡}ÄÖ]Á‡+}ÄÜ2Æ10]]]!#&'3>32&#"%T1i'd !%&f *)! j ’1omf(3+H VÿCß„-!@¿/xˆ˜-, ™¨‰§v§+*#$$ ss ¦ s  ¨/@/P/€//s¨. yBG;¯ H9* A#+$Ä*Ô*ä**«'»'Ë'' AA$”r‚c@P2#B?2]]]]]_]]]q2??ÞÝ]Þ]2Å2?33^]_]]+]q?3?íöí]qä]2/íÎ2]í‡+‡}ćÄćÄÄÄ9/ÍÞÍ10]]]]]]]]]]]33>733'>7#"&'73267V_ ]ik/M\!-C TBFGB9Æ>PG&!!&FOµýÿ5ˆ…2ýž#JHA* ', T_fc\%ø@9 (( 9@PÿZ^è+Ë@f-‰ ™ © )(!""šªy‰ °ª-P--ª,Ÿ‹ZjI!)"À(Ð(à((¯%¿%Ï%%IIJ¸ÿ¸@I€aqR4DJ—JKI??3?í?3]]]]+???ÞÝ]Þ]2Å2?3]]]öí2/2]ô^]]ÕíÎ2í22/]]9/ÍÞÍ10]]3'>7##3>7'"&'73267X'@RHHBSZBGGˆ>PG&!!&FOþE#E?7("'Œ&fmj)þŠ+ge]"T@9 (( 9@ÿùPµ(d@3 #"&'#535334.#*232>F‚);£’*e)PPa‚¤ 9O0'  #'H7!fãpp IMMþq*8 þë 5ÿõó"+k@ '‚•¸ÿð@4 H«-‚€,$ˆˆ … 0  QPP???39/]3Þ2í2í2í2ÞÍ]3ý2Í]3ö+]í10]3533#>32#"&'#"32654.J\˜˜A)K9"!;S1/_-J3 =E#.ÝEEAa'?-/A( ‘¡®+3# V=¼$˜@\H"6F  s0 vGWg& s¨%6v–y 6–  B|E?2í2?9/9933]3í22]3öí2Ö]í99]‡+‡}ÄÄćÄÄ10^]]]2'+#>"3:7'7>54.’FA@@K3Ma)e2>!I.?:&(5F¼onN_o%‚þÿ« UþðP&e:1(4 PÿG'¥@eeuš     ‰ZI¨™X)9I«)ª(ˆ #PK ‹› ˆ‹›Q?3Î33]ý2]2Ì3??3í2öí2ö]]]]í]]]99Á‡+Á‡}ćÄćÄÄ10]]4&#"327'7>7'#"&'#>32¹ZK*/@&;==a416>9 $-E]!cA<`D%[bþ¸g%kO0Mx#\$b  б&FeVí9#@s s¨yABB???ÎíöíÖí1053!#•XþÊaµ„ØýŸµPœŠ)@  ª‡IJJ???Îíöí^]Öí1053##HTï]‚ÐþFúµ 0@s ¨ y y AB??í9/3í2öÌ3ýÎ3Æ10!3###53úþÊ››aPPµTØKþÂ>K,š 6@  ª … ‡ IJ??í9/^]3í2öÌ3ýÌ3Æ10#3##5#535!šå’’]JJBº§FÍÍFõVÿGJµ'@V¥¨››¨/Iiy‰v8ˆ˜)©)s¨(8˜|##yABB7 &  yC?í]]???í9/3í]2öí2ö]]Ä^]í]Ä]10]]]]]%#"&'732>54&#"#!!>32J$Ec@ (D1gQ#FaþÄ $&DgE"AqU1O;V8rp þ¯µSÁ,PsPÿFü"a@=vg%/?‚  gV«$ª#…‡IJJ…R?í???í9/3í2öí2ö]]Ä^]íÄ]10]]]]2#"&'732654&#"#!!> si6P4   ?EEK6]bþû"@ƒx6]E'JW]_PèM‹ÿG“µ39@º§¨ +&&s% % %ˆ3.33s .-.- sЀ r--s  ß  Ÿ ¯ }  , 55  +,+,   s€  ,s€ °43A-A ,A&A%ABBBBy B CA???í???????9/3??Ö^]]Ô]í2/Ô]]]í]]99}ÄÄ3/]Ä]Æ]3]]q‡+}Ä3/3]]qÁ‡+}Ä9Äć+}Ä]Ö‡+}Ä10]]3#5#.'##>7.'33>7bFJG>{3S\3DHI!]!JHCmCJP'GJGq?EF]FE>µ"SWT$:–Nþô¹.]WLþµKLW].0c`Y$$TWT"KSU&5þË&USKÿo/5@·Ÿ1¯1)&&% % ¯%g%w%%,// ,+,+©  H x ˜   4 ”++–¦  ; ¯ ›  * Ÿ ¯  HH)*)*1 W*0/I+I *I&I%IJJJJ‡ J LI???í???????9/3??Ö^]Ôí2/Ô]]Ä99}ÄÄÆ]+Õ]í3]]q‡+}Ä]3/3]]q‡+Á‡}Ä]]9Äć+}ÄÖ]]‡+}Ä10]3#5#.'#5#>7.'353>7Ñ267-_)GX$7;;Y;;7g7=@762g$^?Y?^$;?>+k8Þ‘!ID;üü;DI!$LID>?;-nHããHn-ÿC ÄSþ@==&<<3-,¸ÿØ@– H6''%''‡!›-«-Š-{-\-l-K-fg32*8OS_SS8S8DXv§Mv‡fv«U EDDDTyRRGEEJ|?2/36'54&#"'>32#"&'73254&/>7".'732654.+‘4!D8$M@7X )3< 4X@$=;7)9Q1 (+ $ &C6'  %.8U_!9M->• .#-9 O -E/0T-<(0H2 ! 9   P 9D(3 ,ÿC¸Qê@H%)5)))5('¥2#”¤sƒRbC5#%5SE¸ÿè@Q H  4&$;$;SRB‚ G5‚©  «SLM/...R <ˆ :::/2ˆ+"(.+QLGˆMP?2í2?33ÝÞ2Í2í29/]í2Ö^]2Æ2ö]íÔ]2í99//ÍÌ210]]]]]+]]]]]]]]]]]]]]]]]]]2#"&'73254&/>7.'732654.+532>54.#"'>Ô-N8  .5[Q (+ $ 9US:?B&,WT'! +*( "+0$6$&G6@G! 9   O''#J  P VÿGе•@)˜ss  s ¸ÿÀ@$HT  s¨CAA AABByB?í?????9/??öý2}ÄÄ3]+ć+}ÄÖí2‡+}ćÄÄćÄÄ10]!.'#3>733#5ýNWY*aa#TRIuNUT%"JKGR\/_WJþ·µþÎ!STM"SWT$AKR(þô¹Pÿo¹@`      ¹    p € d  ªIIJ J‡JII???í?9/???öí2]]299}ÄÄ^]ć+}Ä]‡ÄÄćÄÄÄÄÖí2/}‡ÄÄ+}Ä]‡ÄÄ10>733#5#.'#3­>?6l;?>453EX%;AB]])=?9=@?/6<Þ‘"GB8öV¬µ"ì@ƒ    À/Ï""  À s   Às    $o !s¨#AAB"! BBBAA?????9/3/ÝÎ2Î2???öý2Þ2Ý2Ô]Æ}‡ÄÄÁ‡+}ÄqÖ‡+Á‡}Äq‡ÄÄÄÄ3ÄÄqq‡ÄÄÄćÄÄ10^]]>73#.'#5##3353?B@8pEIH(PKBm?DDH@aa@H“$PNF"TWT#$Y`d0-YRI”—þÀµþÖ˜P] õ@‹;4  4    »4   "« !9 é   t „ ” + ;    IIJ JJJII?????9/3/ÌÝÍ???/_^]]]]]qÞý2Ü2ÝÔ]Æ}‡ÄÄÁ‡+}ÄqÖ]‡+Á‡}Äq‡ÄÄÄÄ3ÄÔqq‡Ä‡ÄÄ10_]>73#.'#5##335.9R"f267@=8h146D=]]=£lAf*;?>DIM$D@:srðØs{µ"å@\Yy Mˆ ¨ Ø Ø—§ M H  (  s !"""MÊ""s"")9 ¸ÿè@8M0 P `  $s¨#"A °À¿{AB BA????9/]9íÜ]2Í]2?þÎ3ý2Ì3Ö]+Æ]]‡+‡}Ä]+‡ÄÄÄćÄÄ3í^]++10]]]]+]#.'##53533#>7cNUT%+`\QrNWY*`PP`aa#TRIµ"SWT$Xdh//_WJþ·"FMMFŸ!STM""Ý@€È !"  $¶+ +Ûëû¹É+;6t”f$€$    ª#III J JJJ?????Þ2Í2?9/3/?ô2ÌýÌ39}ÄÄ]Ö]]Æ]‡+‡}Ä]]]q]]]q‡ÄÄ+}ćÄćÄÄćÄÄÄÄ10]#.'##53533#>73!HE<l;CG"]JJ]NNC@6l;?>CNQ#"HC;þ@EE@B@:=@?ݵá@”xYyÉ ˆ Ø Ø—¦º  H (   s ÐÚ¸ Ës)9Yµ 0 P `  sAÀ{ÀyAB BA????í9/]9qíq?ÖÞí22]Ö]]Æ]]‡+‡}Äq^]]]q‡ÄÄÄćÄÄ3í]]+]10]]]]]]]]#.'##5!>7ÅNUT%+`\QrNWY*a´#TRIµ"SWT$Xdh//_WJþ·bSþÎ!STMQÉ@*Èz øWi 6 ) i ( ù h¸ÿà@\H$¶+Ûëû¹Évt”f Ie)9I‡I J JJJ?????í?9/]3]]]?ÖÝýÀÖ]]Ƈ+‡}Ä]]]q]q2+10q]]]]]]]]]]]]#.'##53>73THE<l;AB]†ã>?6l;?>CNQ#"GB8öºNß=?9=@?VÿGµE@'ss¨ s ¨ A A B ByyBCAA????í9/í????öí2öÕíí21033#5#!#3! aW\\þ­aaSµýžþô¹@þÀµþßPÿo@H@*ª  ª ‡I IJ‡JL??í???9/íöí2]ö^]Õíí210%3#5#5##3353úFXKð]]ð]MÞ‘ææÔÔVµ ;@! s s ¨ y ABByA?í???9/íþí2ÖÞ^]ýÀ10!##!#3! ´aþ­aaSµTýŸ@þÀµþßP€ ?@$     ª‡ ‡ IIJJ????í9/íöí2]Ö^]Ýí210!#5##3353#ú]ð]]ðã†ææÔÔNVÿGäµ)}@R–¦vY#i#y#(#8##v‡—(8©+s¨*&6yC)&y‡ —  yABB???í9/]3í2?í]öíö]]]í]]9/í3Ä^]210]!#!#!>32#"&'732>54&#"QaþÇaû $&DgE"$Ec@ (D1gQ#Fbýžµþì,PsFAqU1O;V8rp PÿF>"`@9"!i‚«$!ª#ˆv†‡!IJJVˆ R?3í]2???í9/^]]3í2öíö]í]Ä29/í310>32#"&'732654&#"###!òBsi6P4   ?EEK4]è]¢1 ƒx6]E'JW]_PèºþF:ÿHÚÅ5Eú@Mˆ*vDvC‰+ˆ*y*w‡—v6A¦—†>v¦(( gv-f-"65--56"GFG¸ÿø@\H|§;;;;;# |§55§22Eg  wA‡A—A&A6AFAAyw‡¦(g(‡(—((FW""y¨#W###G?^]]]í]?]]3]í]]2]?]3]í]]29/]]í]+]]9/////]í]33]í2]]]2í10]]]]]]].#".54>32.'.54>324.#">C"9^C%cX 1O:6M0"A[9:@; 'WRGExX37^~G/ZB (96 *F2Y $FgDpŒ&Z47bJ+(DZ12]L6 % N)@.2ZƒVW‡\0 þo!:,]d9V##7I3ÿp3 AÑ@d< 6'!fv$‚ A#))‚%44V‚9/9.A99A.CB ˜Iˆ>&6ˆ  ° À ™  ¸ÿÀ@% H 4A>PFf–ˆw)—))4Q.…w///L?]]í?3]í]2?39/+]]í]]í]]29/////^]]í]33]í22]3í10]]]]]]%>54&#"7.#".54>32.'.54>32L :F('%*&"=-?< &=+(;&.B*+-* C@85YA$)E[24¹&>V<->>¼1I1Pe>$+J61A%'G:* D 2#'EcABdC# ÿÿ:ÿCSÅ¢ÿÿ3ÿC½ÂÿG%µ G@,s s   yBC yA?ýÀ??íÖ^]Ö]]ýÕ]]ÆÕí10#3#5##5%ÚY\^ÚµTýòþô¹aTÿo¿ ;@"    ‡JL ‡I?ýÀ??íÖ^]Ö]ýÕ]ÆÕí10#3#5##5¿©FXK©Nþ“Þ‘ºNÿÿPµ<ÿGæŠ@RG(       _Ÿ¯_Ÿ¯    IKI??9/3/?Ö^]Ý]]ýÕ]]ÆÁ‡+Á‡}Ä]Á‡+}Ä]10]#5&'3>7æ&g0]0f&d !%&&%! þþjÅÇj1omf((fmo1Pµ†@O  soŸ¯s  soŸ¯yBAAAAB??????9/3/í2Ö^]Ô]Ì3‡+Á‡}ÄýÌÔ]Æ3‡+}Ä1035#53.'3>733#ûˆCx5r&^21^'l6xB‰ÔJiËcR©NN©RcËiJÔÿGæ´@q›y‰D3:J(Ÿ¯x_ 5E     _ Ÿ ¯   IK … JI??3/í2??Ö^]Ü]]ÍÁ‡+Á‡}Ä]]ýÍÔ]]]]ÆÁ‡+}Ä]]]]]]103##5#53.'3>7æ"X,r‰]‰s,Y!d !%&&%! ~äbD¹¹Dbã1nme((emn1ÿG‡µZ@@M‡M7Š'W ¸ÿø³M¸ÿð³M¸ÿø@8MMMx†        s  ¸ÿø@ŽM‰{m\K=+ Gg‡§M™sM…tbZC: )s €o‡   CAAAA B ByB?í???????Ö^]Æ]]]_]ÖýÕ]_]]]]]]+‡+‡}Ä]+]‡ÄÖ]]]]]]]]+‡+‡}ćÄ]10]]+++++]]]+]+]!.'#>7333#5ö*2661+k-wCÞp«©oÚ4_)R\IOO##OOIX¶`Gþþþ½KEþô¹ÿoæ@LF  I        ‹›| H–¦‡v¸ÿø@N H¢”‹z\l+;K Ÿ   LIIII J J‡J?í???????Ö^]Æ]ÖýÕ]]]]]]]]‡+‡}Ä+]]]‡ÄÖ]+]]‡+‡}ćÄqq10]!.'#>7'3733#5‡ &((% `#a0¬i|}c¨#I FX698996D@÷¶¶ñ0f4Þ‘ÿG<µB@%ss s  A yyA yBC??ýÀ?íí?9/////ííí10%3#5!#5!#!3åW\ýöÆèÁMaSþô¹aTTýòbÿo€B@%   I ‡‡I ‡JL??ýÀ?íí?9/////ííí10%3#5!#5!#33:FXþs‹n†å]MÞ‘ºNNþ“»:ÿGxµ\@8s s s|y‰A yB A??í?9/^]]í399//]]í3ÐýÕí10]32>733#5##".=3š%?0'$ aW\\O-L`7`í*?)_ýžþô¹ #A]9È.ÿo l@D) ˜   Ÿ ¯  @/ªˆ‰™I ‡J LI???í?9/]3í2öí^]]Þ]ÕíýÀ310]]]]]3267533#5#5#".=‹<4&3]FXK!$+G3™;/öþEÞ‘Ê*E4š:(µo@B  s us/f|y‰AB A???9/^]]3Í3ý2]Í]9///]]í3í23Ðí10]53>73##5.=3š ,!K&;aa;&K@R.`í$9({~ _ýK'@X6È'Å|@L)© š    ª+;ª wˆp‰™ I J I???9/]33Í]ý2]Í3öí_]]ö^]ýÀ39/3Í210_]]]]53>753#5#5.=„*&E%]] )E'?.™23_`ùýøÊ ^\*C1šVEµI@(fs s  |VHAB B???9/]]3í299//í22í10^]]>32#54.#"#3·Q-Mb8`'@1'Maa¼ $B^;ÌÌ+A* þ˜µÿÿPôKÿñ Å/:Î@:g)8£*”*u*ƒ)u)7) Hxˆ& 0v/',‡,,©<:¸ÿø@LMv"W;""0y@€X55|''7'g'w'‡''EY&|Z  hxW(F?]]]3]í2]]?]í]9/3/Ì]2í2/Ö2Ý2Ü]2í+2ö]2íÄ210^]]]+]]]]]]]]32>7#".'.5467>32'4.#"! wz 5* $4D'T~T+&?.M,36Qi32!3267#".%6&#"¢!8'IM,?M)hqþœSV1C U6A`A!bA9 1!ï#5& F 7R6„…  PUN &C\}?Q(4ÿG Å2=æ@Cg);£-”-u-ƒ,u,7, Hxˆs/3v 2'/‡//©?=¸ÿø@RMv%W">%%3y@€X88|'*7*g*w*‡**ECY&|Z  hxW(F?]]]3]3í]2]]??]í]9/3/Ì]2í2/Ö2Ý2Ü]2í+2ö]2Ä2í9/]]í10^]]]+]]]]]]]]32>7#5.'.5467>32'4.#"! wz 5* "2@%[@_@"&?.M,36Qi32!3267#5.%6&#"¢!8'IM,?M)hqþœSV1C I0X/G/cA9 1!ï#5& F 7R6„…  PUN†Œ ,?Qv?Q(4ÿÿV·µ,ÿÿr„6Öœÿÿíè6ö¾VÿGLµ+!@ #LM¸ÿø³ M¸ÿø³M¸ÿð@ M7ML¸ÿè³M¸ÿà³M¸ÿð@2M  s   L( M L  M v¸ÿð³M¸ÿø³M¸ÿø@ L@ M©- ¸ÿð@,L M ()s+¨,*B(%y )By‰™CAAA????]í?9/í2?öý2}ÄÄ3++3/]3ö++++í++Ö++‡+}ćÄÄÄćÄÄÄ10+++++]+++++>73#"&'732654.#"#·!QPHrEJM#;gL,!Aa@ Oa2KU$aµþÃ"VWQ!MPP#"BgI73#"&'732654&#"#3­??9m7;:gv7Q4   ?Ia[#]]%=?;797ƒr0WC'JUQ_Xé ÿCʵ!l@C H(«s ss##€#    "yBG!yA… • F  y F?í]]?í?3?íÆ^]2]ÖýÕí9/í3]]310]+'>7>5!3'>7#C)=S8 FM‰\!-C Vb8ic^--O;$THJTíýž#JHA* ',b ÿZ^#k@8H8H!‚  "!%`%%    $—!JY#‡I ¸ÿð¶H ‡ Q?í+?í?3?íÆ^]2]]ÖýÕí9/]í3310]+'>7>5!3'>7# !0@+ 19ZX&@Uº!KKI 8+N 6'"V]^*þE#GA6("'ºVÿEkµU¹ÿè@/ H €s¨s¨yAB y GA??3í2??9/íþí2þ^]ýÐÌ210]]+3#"&'73265!#3! a !:-% %þ­aaSµýK.F/I1-QþÀµþßPÿEú]¹ÿè@5 H&  ªª‡IIJ ˆR?3í2???9/íöí2]ö^]ý2Ì210]]+!#"&'7326=##3353ú !:-% %ð]]ð].F/I1-÷æÔÔVÿCȵ`@; Hss «s €s¨yAByB GA??3?í??9/íþí2^]]Ö]ý2]]3ýíÀ10+33'>7#!#3! a\!-C Vþ­aaSµýž#JHA* ',@þÀµþßPÿZSW@5 H  0€ ª‡IIJ— JK?3?í???9/íöí2^]]Öý23Õí210+%3'>7#5##3353úX'@Uð]]ð]M#E?7("'ææÔÔAÿG(µT@2s s ss |y‰ ACy B A??í??9/^]]í3]99//]ííÕýí1032>73##35#".=3¡%?0'$ a\\WO-L`7`í*?)_ýK¹ ¯ #A]9È.ÿoÅ_@;) ˜     ªªˆ‰™ I L‡ JI??í??9/]3í2öí]ö^]ííýí10]]]]326753##535#".=‹<4&3]KXF!$+G3™;/öýø‘Þ}*E4šCÿC~µ6D¹.ÿø@cHf.¦.÷-j)š)­(§fW ˆøi÷ ùØè™©ˆiW–¦‡s&%%%8,s s+§+¸ÿÀ@* LO+_++/™s@ M¦…•W6v@ M¸ÿÀ@6 L‰™©X 0 s  ©7@H|66 y,B&%GAAA/¸ÿÀ·L°¸ÿÀ@ H¤|A B??í]+]+2????3?í9/í+ö^]íÕ]]]+Ô+ýÔ]]]+í]2Å]+2/]ííÌ3]3í]]210]]]]]]q]]]]]]]]]]]+%.'#>73>733'>7#&' !&+&! _  U>>::>>U\!-C P !&+&! `JV[Q@vþíŒZ·±¨K,xƒƒ66ƒƒx,•þÑž#JHA* ',Œv@Q[VJCÿZî0Ä@b0H)9I &&+&&&#2p2€22"Ÿ"",+  & 6 F   $1#J—"JKII&0@¸ÿÀ@&+H| I? O  @&+H |,, IJJ???9/í+q?í+q2???3?í?Þí2/^]3]]3Ü22Ì]2/íÌ]33í2/]33]]10+#>73>733'>7#.'#.³ Y U V88V V X'@Q *)$ N %)*cÅW=…‡ƒ<4µvvµ43nrr6#E?7("'WÅcWZRR[WÿÿV·µ,ÿÿ„6$œÿÿ+ÿõÀè6DHÿÿz6$ƒœÿÿ+ÿõÀÞ6DƒKÿÿ‚µ¡ÿÿ,ÿô%ÁÿÿV„6(aœÿÿ3ÿôùè6H[8ÿñ‡Å)Ü@*& M&M(MM0M8L0 M M¸ÿø´L¸ÿø³M¸ÿø@ MMM) M)v @ M¸ÿø@:L@ M©+v@ML@M©*y))$|L MF| ¸ÿøµLE?+3í2?++í9/íô+++íæ+++9/3í+2+10++++++++++++.#"'>32#"&546732>7" wz 5* $4D'W€T)0TqBƒ•c-C,3K2r} P 6`„M\ˆ\-®­O1R;!(?P(6ÿôü#‰@Y¨!xˆ e!j x ˜#I#Y##‚«%‚xˆ«$ˆ…¯ ¿  gXPˆhWQ?]]í?]]39/]íí2ö^]]íæ9/3í]]210]]]]]]]#"&=47!.#"'>3232>7ü(BV-hqdSV1C U6Dc@þ›A9 1!EgD"„…PUN )Hdm?Q(4ÿÿ8ÿñ‡z6uƒ˜œÿÿ6ÿôüÞ6vƒUÿÿrz6ÖƒœÿÿíÞ6öƒÁÿÿÿñ z6׃Cœÿÿ,ÿô¸Þ6÷ƒ+ÿÿÿñµÿÿÿýÿG¯°ÿÿV‚c6ØаœÿÿPÇ6øŠqÿÿV‚z6؃°œÿÿPÞ6øƒqÿÿ:ÿñÐz62ƒÉœÿÿ3ÿóÞ6Rƒkÿÿ:ÿñÐÅ3ÿó!o@MXh8H‚«#Wg7G‚   «"‡P`@P€IY™ˆPFVˆQ?í]?í]9|/]qíö^]ý]Å]öý]Å]10#".54>32267!"!.$AZ55ZA$$AZ55ZA$ô?MþÜM?dH''Hd>=eH''HeüXLLX~QFFQÿÿ:ÿñÐz6ƒÉœÿÿ3ÿóÞ6†ƒjÿÿÿñ2z6íƒ>œÿÿ"ÿô¿Þ6 ƒÿÿÿ÷Cc6ãŠvœÿÿÿDßÇ6\ŠIÿÿÿ÷Cz6ãƒvœÿÿÿDßÞ6\ƒIÿÿÿ÷C¤6ãeœÿÿÿDß6\ecÿÿ:!z6çƒxœÿÿ.ÅÞ6ƒ=VÿGíµ &@ ss ¨ y AyBC??í?íöýíÅÆ10!3#5#íþÊW\\µTýòþô¹µPÿo’ &@ ª ‡I‡JL??í?íöýÕíÆ10#3#5#!’åFXKBºþ“Þ‘ÿÿVÿùz6ëƒðœÿÿPÿõ¦Þ6 ƒ¿V2Ä'37»@uGg H5°(À((9?97¿.Ï..o    sxˆs s 8°775 )1 ++)++##&##EA ABB?????^]Ý]ÞÝ]ÞÍ]Þí2Õí2]Á‡+Á‡}ćÄÄćÄÄÞ]Í]Ä]Ö]Í]Ä10]]]!.'#33#".54>324&#"326!!6+g&w&&|/ 7{8{@,˜/‡//F ˆ  |—  —ˆE?]]3]í]2?]]39|/]3í2Þ2í2í]2Ö+ÀÄ+2ÖíÖ]ÀÔíÆ210]]]]]^]]]]]]]5!654.#"'>323#!!32>7#".547#53>?%U"+3E*O);Q1 4[A&,þ®?H/'#.e0BV4 5]H-%‘C'  Q !4C!C)C!/6 J0>"&C)( µ‘@U''   s       ¯ ByA?ýÀ?9/333Í]222Þ222Í]222Ö^]Ô]]22ý22Ô]]ÆÎ222Ì22310]]#77#5'75'75#5 Åt’t’[t’t’ŵP™7?Es7?E¿™6?Ds6?D¿P0µ 1@s  y y AB??ýÞí29/////í10###5%!5½[½Õþ+NþFºN­NN º)x@JH#x#ˆ"Y"i"Œ%‹‹ % H%   %+*X Ž `Ž_U?Î]2/ý2Î]2/í2?í9/////+íÐÀí2í^]10]]]%!#5#535#53>32+"32>54.Äþø[RRRR'_)…‹)MoE:[&,50L5.=±GjjGfHJ ji9O2f¸þù5'&2 *\Uè 6@     À Ð à  ¯¿Ïi?Ý]Þ]2Å2ÖÝÞÍ10^]"&'73267À?OG&!!&FN\@9 (( 9@ÿÿµ$ÿÿVÿúP¼%ÿÿVíµÓÿÿƒµ›ÿÿVµ(ÿÿ!µ=ÿÿVkµ+:ÿñÐÅ'+×@ )h)v ¸ÿø³M ¸ÿø@M @ M  ©-(¸ÿø³M¸ÿð@, MvMM@M©,+y))?)O)¿)))¸ÿø³M¸ÿø³ M¸ÿð@# M|MMF#M# M# M#|¸ÿø³M¸ÿø´ME?++í+++?++í+++9/^]íö]+++ý++Îö]+++ý]]Î104>32#".732>54.#"!!:5[yDCwZ55ZwCDy[5f ;U54U; ;U45U; Q'þÙ[Yˆ[..[ˆYYˆ[..[ˆY?gH''Hg??gH''HgPÿÿV·µ,ÿÿVoµ.„µy@I7w8 x w  s   s @p  BIYAB??33]?Æ^]]]Æ9/Á‡+‡}ÄÁ‡+‡}Ä10]]]3>73#&'%FBA"["ACE&k6h77h5n»¨™KK™¨»nž$€þÛžÿÿC%µ0ÿÿV‚µ1%µ 3@     y yByA?í?í9/íÖÆÎÖÆÎ10^]!5!!!!!ùþ6Êþ,Þþ"6rþŽaTýŸT•Tÿÿ:ÿñÐÅ2ÿÿVeµßÿÿV=¼3ÿÿ! µÿÿ%µ7ÿÿPµ<8(â $/½@@ /%$" #1«x9s‰0s‰0w*6**v†«0$B/¸ÿø·L| "¸ÿÀ³M"¸ÿð´L"¸ÿø@ M"#BD %L%|LMD?Ý++2í+2??Ý+++2í+2?ö^]]í]]Ü]]ýÜ]]í]]æ3}ÄÄÄÄ3ÄÄÄÄ10%2>54.#".54>753##"3ß0S=$$=S0^@w[77[w@^@v\77\v@^0S=$$=S0¤5M22M5þ&IkEEjI&PP&IjEEkI&TB5M22M5ÿÿcµ;Aîµ÷@‡Mss s @H  ÄÔä«d”K$48ëÏß$4T„”´$DT„¤´Ääô ûïÐ@/ ¸ÿð´L ¸ÿø³M ¸ÿð@ L |MMAAAB????9/+3/+í+++2^]]]]_]]qrrr^]]]]]q9///+^]íÐí2í10+!#5".=33326=3#Ç_QpG^k^_^k^GpQ±+Kh<êÝqa¯þQaqÝê54.#"!53.54>ˆ@vY5$.þõ7( :R22R: (6 þõ.$5YuÅ+U~S/VJ=RD>JY6;^A""A^;6YJ>DR=JV/S~U+3ÿõI,a@: YJ! o.P.(«- ˆ Q"™%(%8%%ˆP?2í]]2?3/3í22þí]Þ]Îí2210]]]^]2"&'#".54>267&5.#";92)  -=N6;Y<%Eb*)?5P[$9 þ±# N!(Hc;?eF&þ3 !  b[(E3PÿG08ž¹5ÿø³M5¸ÿð@ M" M ¸ÿø@M))0M0‚ ¸ÿø@.L %M%‚«::8ª9 ˆ(…**J3M3ˆ¸ÿø³M¸ÿø¶MOK??++í+?39/3/íí2öí2]öí+Ô+í+9/10++++#4>32#"&'532>54&+532>54&#"­]5T;.M863);%%E`;)A=3!<-]c5';:#0¹Ø2U?#1H0-U +8@!:W: V $7%LYL-1B*9!ÿGÞ^@+‚H8H ‚ ‚IKK¸ÿÀ@ HQ I II????Í+???Ö^]íÖí9/]]+í9310>73#.'z "" +% ] #3E-X%'%$eru3+ioo12~‹’FVX:ƒuf'3ÿó>Ñ@ˆ*F*WC40€4*,,**,:Y i  ‚0«@(‚ fW‚:::«?Vf¦ˆ5Q#ˆ¦O§,v,–, ,,¨7W‡—I?^]]]3]]]?3]í2?í]ö]í]]Ô]íöí]99Á‡+Á‡}Äqq‡ÄÄ210]]]]]]]]32>54.'.54632.#"#".54>-HR$8'$7%)2`&/eW1( ", #3-'K:#;\A=[=/AÉmK$C30A&-C0#=>+FF J  +7DX=/[I-*H`6.P@07ÿôà9’@` +&7710 0ö0×0ç0+)+"#;‚5‚---«:ˆ?¿Ïÿ00—""w‡—ˆ#(Qˆ ˜  ˆP?2í]2?3í]2]9/3/]qíö^]íÔíÖ2Æ210]]]qqq]]]2.#";#"32>7#".5467.54>$0)&,6J&Y[,"‰6-! &4C'$N@*2) 9QO #&I !S M  ">1(F$%8&4ÿDÉ(Ä@25(E(#((('I :I: h‰x)¥¸ÿà@T H§U‚ ¯0 H9I W!w!§!!‚xˆg  *)*‡NW&&ˆ R?3/í]?í2]9/////^]]]í]3]]+]í10]]+]]]]]]]]]]]]]]]'>54&'.54>7#5!ÉP 9A3H/32#4.#"#P jE>R1] 2% ]ù#?X5þ#É0D*þI7ÿð#)f@C§§x%‚«+w$‚«*$‡'7gˆ– H  Q(8ˆ™GO?]]í]?]]í]9/íö^]í2]öýÀ]10]]2#".54>2>7!"!.-=]==]=>\==\>'8$þÓ$8('7$-$77g“[\’g77g’\[“g7ý:(JhAAhJ(t&Ec==cE&Nÿöù ;@    @ ¸ÿÀ@ H €ª I ˆ HQ?+í?öýÞ+Î^]10].53ìVH] FJ€þ ÿÿP ì"á@ ! L L¸ÿð³ M¸ÿس M¸ÿð³ M¸ÿð@2 M  !"    ¸ÿè´L¸ÿسM¸ÿè@" M$# JJO JJ??/?3Í2??9Ö^]Æ2Æ9/+++‡+}ć+Á‡}ćÄÄćÄÄćÄćÄ10++++++#>7.#"'>32#./' _,7> $ %"5( Jp$aAª6sog+:„‰‰>*A,K$1­þ²†^ÝÿÿPÿGôÿÿæY2ÿDÏ>®@sW>¦:W: ©j FV5$v g  ‚5&‡—fv@@v//‚ihˆV<G<<‚«?'*ˆ#7‡55&#OˆJ R?3?í?39/3/íí2ö^]í]]Ô]2]í]]Ö2]]ÄÄí2]]10]]]]]]]]]]]%'>54&'.54>7.54>32.#";#").@'P 8Bdd.5+"<ÿÿ3ÿóRÿÿPòÿJÿG !w@Oif hXI‚«#!ª"XIˆ PK‰™ziFVˆš‰zi—Q?]2]]]]í]2]]]??í]]öí2öí]]10]]]^]"&'#4>32'32>54&#"1,I]9R6w =YÃB(:&DQ?D  ÒÜ6X?#‹…;cH)z3F([bR[3ÿDº)h@EEU$4‡fvT‚f T  +7%G%%‚Xh«*"ˆPˆJ R?3?í?ýÆö^]]í]Æ9/3]]í2]]]10]]%'>54&'.54>32.#"1&4!P (->R2 @_?#C6RT+9Q +&G  +>R58dL, O iW4?&3ÿóU']@;¬šˆYh‚)) ‚W    «(H‡‡I—%F%%ˆQ?í]]?íí]2ö^]]í]ÖÜ2í210]]]]]%#".54>3!#4&'#"326#@Y52XA&-Kd6 _.&!<5#'5DNî:]A#$D`;JhBN.5:>l"*M>)B.[ÿø¦J@,   €@€    ‡ ‡ Iˆ HQ?+3í2?ííÖ^]Þ]ýÝ]ÆÄ210]%#".=#5!#3267‘)5B'Š–¯ !! 4O4ðNNï'3 Jÿõö:@%ªªIIW g  ˆy‰Q?^]]í]??öíö]í10".5332653 AS0]=<<=]0S 'AT,+þâXIIXþÕ,TA'3ÿGÏ$q@&«L‚ L"¸ÿð´L¸ÿð@ L‚«%K!ˆ¸ÿð@LQ"ˆ L P?+ýÅ?+ÀýÀ?ö^]í++Ü2ý2Ü+í+æ105.54>324.'>%TBkK)/W|LQ|U,•ŒÂ0I3f\þ"aaaa¹°)E_;?fF&&Ff?v °½(C3 þ} fPPe ‚ iÿÿí[JÿG¾R@ª ªIIˆ ¸ÿð´L¸ÿð@ LQ KI???++ÀýÀ??öíÜÐý2Üíæ^]10>=3#5.53±S]]BfFZGeB]\Tþ?^jõþþ9bI+®®+Ib9õj^Á9ÿö 8ÿ@6˜+¨+—§–.¸ÿð´L.¸ÿà³M.¸ÿð@M.)M) M)‚:«/¸ÿà´L/¸ÿгM/¸ÿà@!M/Ÿ44 ŸL MM¸ÿð³M¸ÿø@G M‚ L0M M   «9./PP&ˆ MM MLMQ?++À3+++ýÀ?3Ì?3ö^]2+++í++2+++Ü]ý9Ü]2+++æí++2+++10]]]]"&'#".54>732>=332654.'7=7SS7-L8"S:9(+\+(9:S #8L 1,,1?cH0WH7 /AQ-Sa.@E‘‘E@.aS-QA/ 7HW0Hd>ÿÿÅ6$äǹÿÀ³H¸ÿÀ² H++10ÿÿÿãUÅ&(?äÿl@ @H @H @ H+++10ÿÿÿã¯Å&+Däÿl@ @H @H @ H+++10ÿÿÿãûÅ&,Däÿl@@H@H@ H+++10ÿÿÿî z&,ƒÿËœ@POO+++44ÿÿÿãÿñéÅ&2äÿlµ(@H(¸ÿÀ³ H(¸ÿÀ² H+++10ÿÿÿãÎÅ&<~äÿl9µ@H¸ÿÀ@ H@H¸ÿÀ@ H@H@H¸ÿÀ² H+++++++10ÿÿPz&<ƒoœ@% POO+++44ÿÿÿãòÅ&µäÿl¹0ÿÀ³H0¸ÿÀ³ H0¸ÿÀ² H+++10ÿÿ3ÿõI&¶ã[@ /- P.O++4ÿÿ7ÿôà&ºã7@ <:,#P;O++4ÿÿPÿGô&¼ãJ@ PO++4ÿÿ9ÿöù&¾ã«¹ÿò@   P O++4ÿÿÿæÿöÞ&¾ƒÃ±¸ÿÜ@   PO O+++44ÿÿÿ¹ÿöE &¾åÃ!²¸ÿÜ@ POO O++++444ÿÿ3ÿó&RãS@ " P!O++4ÿÿJÿõöÞ&ʃd@*P"OO+++44ÿÿJÿõö&ÊãL@ PO++4ÿÿJÿõö &Êåd@("P&OOO++++444ÿÿ9ÿö &ÎãÏ@ ;9 3P:O++4Ž?F;@"BR’¢@H‡—@€/ÍÝÍÞ]Å+Ý^]]Å10'7F‚6qÝž&ªwìÿÅ)@ßﯿϑA`?]?9/í]q10'7ÿDD.®ÂÉÿöB‚ Q¹ ÿÀ@,H @H@H /O/ÆÀÝ]Æ^]ÀÔÅ+ÞÅÕ]Å+ÞÅ+10'7"&54632!"&54632 h4Y…þÉ áŸ«Ÿÿÿ3ÿõI &¶–u¹ÿø@ -8 P>O++4ÿÿ3ÿõI &¶Îp¹ÿê@ 1> P-O++4ÿÿ3ÿõI&¶£x±¸ÿö@ -? P@O=O+++44ÿÿ3ÿõI&¶°Y±¸ÿ×@ 1? P@O-O+++44ÿÿ3ÿõI&¶¤˜@-> P?O=O+++44ÿÿ3ÿõI&¶±x±¸ÿö@ 1> P?O-O+++44ÿÿ3ÿõIq&¶¥s±¸ÿñ@ LB P5DO=O+++44ÿÿ3ÿõIq&¶²s±¸ÿñ@ LB P5DO-O+++44ÿÿÆ&$–À¹cµ@$%H¸ÿÀ³H¸ÿÀ³H¸ÿÀ@ H@ H¸ÿÀ³&'H¸ÿÀ³&'H¸ÿÀ³H¸ÿÀ³H¸ÿÀ³H¸ÿÀ² H+++++++++++10ÿÿÆ&$Π¹…µ@$%H¸ÿÀ³H¸ÿÀ³H¸ÿÀ@ H@ H¸ÿÀ@ ''H@%%H¸ÿÀ³H¸ÿÀ³H¸ÿÀ³H¸ÿÀ³H¸ÿÀ³H¸ÿÀ³ H¸ÿÀ³ H¸ÿÀ² H+++++++++++++++10ÿÿÿ×È&$v£Ç¹íµ*@$%H*¸ÿÀ³H*¸ÿÀ³H*¸ÿÀ@H*@ H@$%H¸ÿÀ³H¸ÿÀ³H¸ÿÀ@H@ H/@H/@H/¸ÿÀ³H/¸ÿÀ³H/¸ÿÀ@ H/@ H/¸ÿÀ@ H/@H*¸ÿÀ³$&H¸ÿÀ³$&H*¸ÿÀ³H¸ÿÀ³H*¸ÿÀ³H¸ÿÀ³H*¸ÿÀ³H¸ÿÀ³H*¸ÿÀ³ H¸ÿÀ² H++++++++++++++++++++++++++++10ÿÿÿÖöÈ&$g°¼¹Hµ*@$%H*¸ÿÀ³H*¸ÿÀ³H*¸ÿÀ@H*@ H@$%H¸ÿÀ³H¸ÿÀ³H¸ÿÀ@H@ H/@""H/¸ÿÀ@ H/@H/¸ÿÀ³H/¸ÿÀ³H/¸ÿÀ@ H/@H/¸ÿÀ³H/¸ÿÀ@ H/@H*¸ÿÀ³03H¸ÿÀ³03H*¸ÿÀ³''H¸ÿÀ³''H*¸ÿÀ³ !H¸ÿÀ³ !H*¸ÿÀ³H¸ÿÀ³H*¸ÿÀ³H¸ÿÀ³H*¸ÿÀ³H¸ÿÀ³H*¸ÿÀ³H¸ÿÀ³H*¸ÿÀ³H¸ÿÀ³H*¸ÿÀ³ H¸ÿÀ² H++++++++++++++++++++++++++++++++++++++10ÿÿÿ×ÍÈ&$>¤¼¹Tµ*@$%H*¸ÿÀ³H*¸ÿÀ³H*¸ÿÀ@H*@ H@$%H¸ÿÀ³H¸ÿÀ³H¸ÿÀ·H@ H++++++++++10ÿÿÿÜèÈ&$Y±Ì¹ÿÿÿÔ6$¥•³!1O+ÿÿÿÔ™&$ ²•³!1O+ÿÿ7ÿôà &º–U@  :E,#PKO++4ÿÿ7ÿôà &ºÎP¹ÿü@ >K,#P:O++4ÿÿ7ÿôà&º£X@:L,#PMOJO+++44ÿÿ7ÿôà&º°9±¸ÿê@ >L,#PMO:O+++44ÿÿ7ÿôà&º¤x@(:K,#PLOJO+++44ÿÿ7ÿôà&º±X@>K,#PLO:O+++44ÿÿÿ×UÆ&(?–ÿ_ÿ¹ÿÿÿÜUÆ&(?Îÿmÿ¹ÿÿÿ×È'(ý£Ç¹ÿÿÿÜÈ'(î°Â¹ÿÿÿ×ýÈ'(礼¹ÿÿÿÜÈ'(±Ì¹ÿÿPÿGô &¼–h@ #P)O++4ÿÿPÿGô &¼Îc¹ÿù@ )PO++4ÿÿPÿGô&¼£k@*P+O(O+++44ÿÿPÿGô&¼°L±¸ÿæ@ *P+OO+++44ÿÿPÿGô&¼¤‹@%)P*O(O+++44ÿÿPÿGô&¼±k@)P*OO+++44ÿÿPÿGôq&¼¥f@7-P /O(O+++44ÿÿPÿGôq&¼²f@7-P /OO+++44ÿÿÿתÆ&+?–ÿ_ÿ¹ÿÿÿܪÆ&+?Îÿmÿ¹ÿÿÿ×hÈ'+ý£Ç¹ÿÿÿÜYÈ'+î°Â¹ÿÿÿ×RÈ'+礼¹ÿÿÿÜmÈ'+±Ì¹ÿÿÿÔ'+°¥•ÿÿÿÔ'+°²•ÿÿ>ÿöù &¾–ƹÿã@  PO++4ÿÿ/ÿöù &¾ÎÀ¹ÿÔ@  P O++4ÿÿÿØÿö0&¾£È±¸ÿá@  POO+++44ÿÿÿÃÿö&¾°©±¸ÿÂ@  PO O+++44ÿÿÿöE&¾¤è@  POO+++44ÿÿÿØÿö0&¾±È±¸ÿá@  PO O+++44ÿÿÿúÿöq&¾¥Ã±¸ÿÜ@ +! P#OO+++44ÿÿÿúÿöq&¾²Ã±¸ÿÜ@ +! P#O O+++44ÿÿÿ×öÆ&,?–ÿ_ÿ¹ÿÿÿÜöÆ&,?Îÿmÿ¹ÿÿÿ×´È',ý£Ç¹ÿÿÿÜ¥È',î°Â¹ÿÿÿמÈ',礼¹ÿÿÿܹÈ',±Ì¹ÿÿÿÔg',°¥•ÿÿÿÔg',°²•ÿÿ3ÿó &R–m@  + P1O++4ÿÿ3ÿó &RÎi¹ÿú@ $1 P O++4ÿÿ3ÿó&R£p@ 2 P3O0O+++44ÿÿ3ÿó&R°R±¸ÿç@ $2 P3O O+++44ÿÿ3ÿó&R¤@% 1 P2O0O+++44ÿÿ3ÿó&R±x@ $1 P2O O+++44ÿÿÿ×ÿñÚÆ&2 –ÿ_ÿ¹ÿÿÿÜÿñþÆ&2.Îÿmÿ¹ÿÿÿ×ÿñ¼È'2ì£Ç¹ÿÿÿÜÿñ­È'2ݰ¹ÿÿÿ×ÿñsÈ'2£¤¼¹ÿÿÿÜÿñŽÈ'2¾±Ì¹ÿÿJÿõö &Ê–f@ !P'O++4ÿÿJÿõö &ÊÎa¹ÿù@ 'PO++4ÿÿJÿõö&Ê£i@(P)O&O+++44ÿÿJÿõö&ʰJ±¸ÿæ@ (P)OO+++44ÿÿJÿõö&ʤ‰@%'P(O&O+++44ÿÿJÿõö&ʱi@'P(OO+++44ÿÿJÿõöq&Ê¥d@5+P-O&O+++44ÿÿJÿõöq&ʲd@5+P-OO+++44ÿÿÿܹÆ&O¸ÿîµNQ P¸ÿø´-8 P+4+4+ÿÿ3ÿDI &¶&Îp•¨´-O¸ÿî@ NQ P1> P+4+4+ÿÿ3ÿDI&¶&£x•¨&@ @O=O¸ÿî´PT P¸ÿö´-? P++444++ÿÿ3ÿDI&¶&°Y•¨&@ @O-O¸ÿî¶PT P¸ÿ×´1? P+44+4++ÿÿ3ÿDI&¶'¤˜•¨&@ ?O=O¸ÿî¶PT P¸ÿ×´-> P+44+4++ÿÿ3ÿDI&¶&±x•¨&@ ?O-O¸ÿî¶PT P¸ÿö´1> P+44+4++ÿÿ3ÿDIq&¶&¥s•¨&¹ÿî¶ad P¸ÿö@ LB P5DO=O+++44+4ÿÿ3ÿDIq&¶&²q•¨&¹ÿî¶ad P¸ÿï@ LB P5DO-O+++44+4ÿÿÿö”Æ&$&–À¹¾›ÿÿÿö”Æ&$&δ¹¾›ÿÿÿ×ÿö È&$v&£Ç¹¾ÿÿÿÜÿöûÈ&$g&°Â¹¾ÿÿÿ×ÿöÒÈ&$>&¤¼¹¾ÙÿÿÿÜÿöíÈ&$Y&±Ì¹¾ôÿÿÿÔÿö”&$&¥•¾›ÿÿÿÔÿöž&$ &²•¾¥ÿÿPÿDô &¼&–h•ú@9<P #P)O++4+4ÿÿPÿDô &¼&Îc•ú·9<P¸ÿö@ )PO++4+4ÿÿPÿDô&¼&£k•ú @ÿÿÿ×ÿöõÈ'µè&£Ç¹¾üÿÿÿÜÿöæÈ'µÙ&°Â¹¾íÿÿÿ×ÿö¬È'µŸ&¤¼¹¾³ÿÿÿÜÿöÇÈ'µº&±Ì¹¾ÎÿÿÿÔÿöb&µU&¥•¾iÿÿÿÔÿö&µr&²•¾†ÿÿ3ÿõIí&¶ap¹ÿñ@ 1? P-O++4ÿÿ3ÿõIÇ&¶Šs¹ÿñ@ -. P/O++4ÿÿ3ÿDI&¶&Ây•¨¹ÿöµ?C P¸ÿØ@ 0. P/O++4+4ÿÿ3ÿDI&¶•¨ ¹ÿö´:? P+4ÿÿ3ÿDI&¶&Ím•¨±¸ÿö@@C P /- P.O+++44ÿÿ3ÿõIí&¶—s¹ÿñ@ ?1 P2O++4ÿÿ3ÿDIí&¶&—s•¨¹ÿöµRU P¸ÿñ@ ?1 P2O++4+4ÿÿ‰6$aœÿÿc6$ŠœÿÿÿçÁ6$Cª¹ÿÿÁ6$¹ÿÿÿö”µ&$¾›ÿÿx?  –ZÿDõÿÎ!@ H@€ ÞÜÍÞÌí10+3#".5<73´  + Y? 8 ,  x?  .@ Ïßï ¸ÿÀ³H ¸ÿÀ· H  /ÌÜÍ++ÞÎ]10>7.54632x !$'a &&$6bBí1@@H& ¸ÿÀµH /ÀÜ+Í^]+ÖÝÞÍ102#.#"#&>¼2$<<$2í#4!  !4#!KWa +W¹ÿÀ@ Hp %p&&&@H ,@H"¸ÿÀ@ H"%O /ÀÝ]ÀÞÀÞ+Í+ÔÍ+2/]ÝÞÍÞ]Í+10"&546323"&546322#.#"#54>W³ {0%5&((&5%0K.)).ÿÿPÿDô&¼&Âl•ú·+.P¸ÿç´P+4+4ÿÿPÿDô&¼•ú¶'*P¸ÿ€´%P+4+ÿÿPÿDô&¼&•úÍ`·'*P¸ÿÝ´%+P+4+4ÿÿPÿGôí&¼—f@ *PO++4ÿÿPÿDôí&¼&—f•ú@=@P*PO++4+4ÿÿÿÞÁ&(yC¡¹ÿÿÿáÁ'ÿbÿ¹(yÿÿÿÞäÁ&+yC¡¹ÿÿÿáäÁ'ÿbÿ¹+yÿÿVÿö¾µ&+¾Å?hT³€¸ÿÀ@ HÐ à ð  ¸ÿÀ@H /Ì2/3/3/3/ÜÞÎÝ+]ÞÅ+ÝÅ10>7&546327' $"%Çm4~a% &&$Ъ&ž?]f¹ÿÀ@ Hd$4DÐ à ð  ¸ÿÀ@H /Ì2/3/3/3/ÜÞÎÝ+]ÞÕ^]]]Õ]Å+10>7&54632%'7 $"%~4ma% &&$žž&ª7?Aq$Z@/  ¸ÿÀ@H %@H¸ÿÀ@ H/Ü^]ÞÀÞ+Í]+ÜÍ+qÞÎq3/]ÍÞÍ1067.546322#.#"#54>l) '40%5&((&5%0a " 2.)).ÿÿÿùÿöí&¾aÀ¹ÿÜ@  P O++4ÿÿÿñÿö Ç&¾ŠÃ¹ÿÜ@  PO++4ÿÿÿ¹ÿöE &¾ÀÃ!²¸ÿÜ@$ POOO++++444ÿÿÿ¹ÿöE &¾åÃ!²¸ÿÜ@ POO O++++444ÿÿÿùÿöí&¾—ùÿÜ@  PO++4ÿÿÿäÿöa&¾˜Ã!²¸ÿÜ@  P*OO O++++444ÿÿ‰&,aÿÊœ@ PO++4ÿÿÿüc&,ŠÿΜ@ PO++4ÿÿÿÞ0Á&,yC¡¹ÿÿÿá0Á'ÿbÿ¹,y?^V@0FV@€Æ«» ßïÿ@H /Ì2/3/3/3/ÜÍ+]ÞÎÞÍ]]ÝÍ10].546327'&"$ Lm4~?$&& %®ª&ž?hT@/ʤ´JZ@€ ßïÿ@H /Ì2/3/3/3/ÜÍ+]ÞÎÞÍÝÍ10]]].546327'7w&"$ Í~4m?$&& %|ž&ª7?Aq$R@# @H &@H¸ÿÀ@ H/Ü^]ÞÀÞ+Í]+ÜÍ+qÞÎq3/ÍÞÍ10.546322#.#"#54>ð' )P0%5&((&5%0? " .)).ÿÿJÿõöí&Êaa@ (PO++4ÿÿJÿõöÇ&ÊŠd@ PO++4ÿÿJÿõö &ÊÀd@.P&OOO++++444ÿÿJÿõö &Êåd@("P&OOO++++444ÿÿJÿG  &Æ–s¹ÿÿ@ "- P 3O++4ÿÿJÿG  &ÆÎn¹ÿñ@ &3 P "O++4ÿÿJÿõöí&Ê—d@ (PO++4ÿÿJÿõöa&ʘd@*P4O"OO++++444ÿÿP‰&<alœ@ # PO++4ÿÿPc&<Šoœ@  PO++4ÿÿÿÞÞÁ'<ŽC¡¹ÿÿÿáÁ'ÿbÿ¹<¸ÿÿÿÜ|Æ&3?Îÿmÿ¹ÿöB‚ Y·@H ¸ÿÀ@ H¸ÿÀ@H/O  /ÆÀÝ]Æ^]ÀÔ]Í+ÞÅÕ]Å+ÞÍ+10'"&54632!"&54632±Y4hB   «ŸtÿÿÿöB‚ å/D @ </ÍÝÍÞÅÝÅ10]'d¦(³4ÿÿ9ÿD &Î'Âí•·LO P¸ÿç@ <: 3P;O++4+4ÿÿ9ÿD &Ε ¶HK P+4ÿÿ9ÿD &Î'Íá•@LO P;9 3P:O++4+4ÿÿ9ÿö í&Ηç@ K= 3P>O++4ÿÿ9ÿD í&Î'—ç•@^a PK= 3P>O++4+4ÿÿÿÞÿñ7Å&2gC¡¹ÿÿÿáÿñÅ'ÿbÿ¹28ÿÿÿÞ?Å&µcC¡¹ÿÿÿáÅ'ÿbÿ¹µ5ÿÿ4ÿö Å&µ¾nDI-@3 H‡@€/ÍÝÍÞ]Å+ÝÅ]10'7I³(¦Ã4o? (@ÀÐà@H@ H /ÌÜÍ++ÞÎ]10.54632Ü'$! ?$&& ÿÿÿDÆ6$&–À¹•ÃÿÿÿDÆ6$&δ¹•Ãÿÿÿ×ÿDÈ&$v&£Ç¹•9ÿÿÿÜÿDöÈ&$g&°Â¹•*ÿÿÿ×ÿDÍÈ&$>&¤¼¹•ÿÿÿÜÿDèÈ&$Y&±Ì¹•ÿÿÿÔÿD6$&¥••ÃÿÿÿÔÿD™&$ &²••Íÿÿÿ×ÿDªÆ&+?'–ÿ_ÿ¹•ÿÿÿÜÿDªÆ&+?'Îÿmÿ¹•ÿÿÿ×ÿDhÈ'+ý&£Ç¹•ÖÿÿÿÜÿDYÈ'+î&°Â¹•Çÿÿÿ×ÿDRÈ'+ç&¤¼¹•ÀÿÿÿÜÿDmÈ'+&±Ì¹•ÛÿÿÿÔÿD'+°&¥••‰ÿÿÿÔÿD'+°&²••‰ÿÿÿ×ÿDãÆ&µ'–ÿ_ÿ¹•ÿÿÿÜÿDÆ&µ*'Îÿmÿ¹•*ÿÿÿ×ÿDÄÈ'µè&£Ç¹•èÿÿÿÜÿDµÈ'µÙ&°Â¹•Ùÿÿÿ×ÿD{È'µŸ&¤¼¹•ŸÿÿÿÜÿD–È'µº&±Ì¹•ºÿÿÿÔÿD1&µU&¥••UÿÿÿÔÿDN&µr&²••rÿÿÿDµ6$•ÃÿÿVÿDkµ6+•Ùÿÿ4ÿDÜÅ6µ•C&µ)ý¹ÿø³M¸ÿð³M¸ÿà´L¸ÿè³M¸ÿð³M¸ÿð³M¸ÿð@M s+#¸ÿø³M¸ÿð³M¸ÿð³M¸ÿø@# M"s$)*y))y 0@Ðà¸ÿÀ@314HÏ€ 0`p°ÀÐ_$B#ByA?í2??9/]]]qqqqq+qrí2/9/3í2ÖÀÐÖýÅ++++3Ö2Æ2Ü2í210+++++++32>7!5!.+5!#3##.'C]=6) þá!%/•ãŽE:1HY/?C@mAB@d %H&HH2H,=&BMR&'OI? Y¹+=Pco#".54>32"32654&7>'.'467'7.727&'"'.'&#"6"'327>76267'7676&'&¹":O--N:"":N--O:"þ–  Á  šT"/)#    #)/  0-N:"":N--O:"":O  ƒ  `$ $%  $$ $j- /!  #©#  !/ -»  ÿÿÿóŒ'oþÇ'g'o]þÇ'sÄþÇ”+þÇI‡µ #'+/37ù@Š&6Ff†= &6Ff†= &f&fIYIY i i6f 6 f  9  9=š1ª1i1y1‰11@ H 11/€4;H/(((¸À³,/H(¸€@#(+Hš(ª(i(y(‰((@ H (($€4;H$$$¸À@!+/H $$ý$š$ª$i$y$‰$$@ H $$6¸ÿ€@ 4;H6652¸ÿ€@ H2'2722+¸þ@-1H1+ +++ñ++¸ÿ€@ H+'+7++'¸þ³-1H'¸þ@³(,H'¸ÿ€@ÿ H'''7''  "/ ;Ÿÿ^½íý[Lªºy  ; ? o =O ¿ ï  ­ í { L  ª Ú 9 i   /_ ;é¿í{LªÚ8 f†3`=P€ðáñ²SDµv¦ 0`=€°àAár¢DÔ@=¥f7  0 = À ! ñ ‚ T ä µ F   9æ¸ÿ€@ 4EH",585¸þ@91;Ha5@5P5!51555á5ñ5²5Â5Ò5“5£5‚5c5s5T5C5•55¸ÿ€@ H55'55"¸ÿ@Hµ"Å"Õ"¦""3Ý,,¸@@ &HK,[,<,,¸@Hª,º,Ê,,€H,@ H,¸·2EH11&4¸³0;H4¸À³,/H4¸€@-#+H|4Œ4k4\4K44€H4@ H4#+#;##ÀH#)+B-¸þ€³$'H-¸þÀ³#H-¸ÿ³H-¸ÿ@³H-¸ÿ€@ H- -¸þ@ª2EH$&A @P`€ ;Àà±`€ !Aá¢Âƒrc$D¥ÅÕå6Ff†'  <Ö€wáC¥ i™3/?<¯ïžO ¸`@ÿ*IL\l¬ì ˪º)i AØŸýîL\»ª  /O_o¯;¿Ïï®Oo.­ÍíLl| +Û늪ÊIi8) >ÙŽxíKª f  3 B `=€ àAáñ¢ScDe¥µÅ@:' Aàð§PA²£`p¯ A?Ír2_]_q_qqrrrr^]2^]]]qqqqrr^]?Í^]]2^]]qqrrr^]2^]]]]]]qqqrrrr^]9/]3^]]]qqqrr^]3^]]]]qq+rrrr^]]Í^]]2^]]qqrrr^]]2^]]]qqqqqqrrrr^]]]?Í2+2^]+++++?Í2+q2++qqqq+++9/3+3++]+qq+qÍ2]]+2]+]qqqqqqqrrrrr+Þ2Ü2+Þ2Ü2rÎÍ22]]]]qqqrr^]2^]]]]qqqrr^]2^]]]qqqqr^]Í^]]2^]]qqqrrr^]]2^]]]qqqqrr^]2^]2^]]]qqqqrr^]]Í^]22]+++2]+qrrr+2]+Í]+2]+]]qr+r+2]+]]++r2+2]+]]10^]]]]]]]]]]]]^]^]^]^]335!5!35!3335!5!35!3jþ¯4þÌ4þ¯4þ¯›þ®5þË5þ®5þ®k*þÖþ´*þÖyýhk*þÖþÓ*þÖL*þÖþ´*þÖyýhk*þÖþÓ*þÖ{n` `´ÿð $ÿ± &ÿç *ÿç -ÿ… 2ÿç 4ÿç 9 : =ÿô ¡ÿz Èÿ Ðÿ± Ôÿº Ûÿ· Þÿç áÿç äÿç Eÿä uÿÞ }ÿõ žÿ± ¡ÿ± £ÿô ¨ÿ± ¬ÿç ²ÿç P &ÿâ *ÿâ 2ÿâ 4ÿâ 6ÿî 7 8ÿö 9 < Åÿó Ô Þÿâ áÿâ â äÿâ EÿÒ K Yÿó uÿë ¬ÿâ ° ± ²ÿâ $ÿì &ÿô *ÿô -ÿó 2ÿô 4ÿô 6ÿô 7ÿä 9ÿÞ :ÿî ;ÿä <ÿÕ =ÿê ¡ÿì Åÿð Ðÿì Öÿê ×ÿí Þÿô áÿô âÿä ãÿæ äÿô åÿä çÿí íÿî ïÿî Eÿò KÿÕ uÿó }ÿï žÿì ¡ÿì £ÿê ¨ÿì ¬ÿô °ÿä ±ÿÕ ²ÿô ³ÿä $ÿÀ &ÿö *ÿö -ÿ† ;ÿç ¡ÿŸ Èÿ ÐÿÀ Ôÿ· Öÿâ ×ÿñ Ûÿ¶ áÿö åÿç uÿï }ÿî žÿÀ ¡ÿÀ ¨ÿÀ ³ÿç-ÿä7ÿÎ9ÿô;ÿá<ÿÎ=ÿð¡ÿòÅÿõÈÿêÔÿêÖÿØ×ÿñÛÿÞÞáâÿÎãÿ×åÿáíÿïEKÿÎu}ÿé£ÿð°ÿαÿγÿá$&ÿã*ÿã-2ÿß4ÿß67ÿº8ÿé9ÿ³:ÿØ; <ÿ°=¡ÐÔÞÿßáÿãâÿºäÿßå çÿ‹EÿÕKÿ°Yÿ›uÿâž¡£¨¬ÿß°ÿº±ÿ°²ÿß³ $ÿÎ&ÿå*ÿå-ÿ¹2ÿæ4ÿæ79 :;<"= ¡ÿ³ÈÿÂÐÿÎÔÿÅÖÛÿÅÞÿæáÿåâãäÿæåíEÿëK"žÿΡÿΣ ¨ÿάÿæ°±"²ÿæ³&ÿõ*ÿõ2ÿõ4ÿõ7ÿ«8ÿô9ÿë:ÿó<ÿØÞÿõáÿõâÿ«äÿõKÿØuÿê¬ÿõ°ÿ«±ÿزÿõ#$ÿæ#&ÿö#*ÿö#-ÿæ#2ÿö#4ÿö#6ÿî#7ÿÔ#8ÿô#9ÿÜ#:ÿé#;ÿÙ#<ÿÊ#=ÿÞ#¡ÿÚ#Åÿò#Èÿê#Ðÿæ#Ôÿì#ÖÿÒ#×ÿã#Ûÿé#Þÿö#áÿö#âÿÔ#ãÿØ#äÿö#åÿÙ#çÿó#íÿä#ïÿñ#KÿÊ#}ÿå#žÿæ#¡ÿæ#£ÿÞ#¨ÿæ#¬ÿö#°ÿÔ#±ÿÊ#²ÿö#³ÿÙ$ ÿ²$ ÿí$ ÿÁ$$$#ÿñ$$!$&ÿí$*ÿí$-$2ÿí$4ÿí$6$7ÿÀ$8ÿö$9ÿÂ$:ÿî$;$<ÿ±$=$@ÿå$Fÿó$Gÿó$Hÿó$Jÿð$Rÿó$Tÿó$V $Xÿñ$Yÿë$Zÿí$[$\ÿñ$]$^ÿì$`ÿö$c$lÿí$nÿ¹$oÿ¼$¡"$Ëÿó$Óÿò$Ô $Ö!$×ÿñ$ÙÿØ$Úÿò$Ýÿî$õÿð$ÿî$ÿå$ÿí$}ÿÌ$¤ÿí% ÿõ% ÿõ% ÿç% ÿõ%ÿö%ÿë%ÿõ%"ÿì%9ÿí%:ÿó%;ÿë%<ÿç%@ÿÞ%]ÿó%`ÿê%¡ÿô%Ôÿô%Ùÿó%Úÿë%}ÿò& ÿé&ÿâ&&"&#ÿï&$&&ÿì&*ÿì&-&2ÿì&4ÿì&6 &7&9&; &<&= &>ÿö&Fÿñ&Gÿñ&Hÿñ&Jÿñ&Rÿñ&Tÿñ&Xÿì&Yÿð&Zÿï&[&\ÿð&^ÿä&c&lÿÓ&o &¡&Ëÿñ&Óÿð&ÕÿÒ&Ö&×ÿî&Ù&Úÿé&Ûÿð&ÝÿÒ&õÿô'ÿò' ÿæ' ÿô' ÿß'ÿß'ÿÕ'"ÿÙ'#ÿõ'$ÿí'-ÿç'6ÿõ'7ÿå'9ÿï':ÿï';ÿè'<ÿ×'=ÿñ'>ÿõ'@ÿÖ'Dÿò'`ÿã'cÿÞ'nÿì'oÿô'¡ÿÖ'Ôÿì'Õ'Öÿë'Ùÿë'Úÿã'Üÿï'ìÿá'ôÿê'ÿç'ÿâ' ÿô'!ÿñ'}ÿâ'•ÿò'žÿç( ÿð( ÿë( ÿó( (#ÿð($(&ÿä(*ÿä(-(2ÿä(4ÿä(8ÿê(>ÿï(@ÿÕ(Fÿð(Gÿï(Hÿð(Jÿé(Rÿï(Tÿñ(Wÿò(Xÿí(Yÿç(Zÿç([ (\ÿç(^ÿí(`ÿê(lÿé(nÿó(¡(Ëÿñ(Óÿô(Ö(×ÿð(Úÿã(Üÿõ(áÿê(õÿí(ûÿô(ÿî(ÿï(•ÿò)ÿö) ÿè)ÿ¿)ÿÄ)ÿî)" )#ÿî)$ÿÒ)&ÿó)*ÿó)-ÿ°)2ÿó)4ÿó)7)9)<)>ÿñ)@ÿ×)DÿÍ)Fÿò)Gÿò)Hÿò)Jÿò)Qÿä)Rÿò)Sÿä)Tÿò)Uÿä)Xÿç)[ÿÜ)]ÿæ)cÿ™)xÿë)¡ÿ´)Ëÿñ))ÿç)Óÿõ)ÖÿÜ)Ù)Úÿæ)áÿô)ñÿô)Bÿî)•ÿô* ÿö* ÿç*@ÿö*Yÿî*\ÿî*`ÿö*Õ*Úÿì+Õ+Úÿí,Õ,Úÿí- ÿö-ÿö-ÿÜ-$ÿö--ÿñ-=ÿï-@ÿÞ-]ÿî-`ÿí-cÿó-¡ÿç-Õ-Öÿó-Úÿì-ôÿð-ÿñ. ÿî. ÿß.ÿÑ..." .#ÿí.$".&ÿÝ.*ÿÝ.-.2ÿÝ.4ÿÝ.7.9.: .;.<.=.@ÿæ.Fÿë.Gÿë.Hÿë.Jÿë.Rÿë.Tÿë.V.Xÿó.Yÿò.ZÿÐ.[.\ÿö.].^ÿí.c.lÿÃ.¡#.Ê.Ëÿç. . .Óÿð.Ô .ÕÿÈ.Ö".×ÿä.Ù.Úÿó.ÝÿÈ.áÿö.ñÿó.òÿò.õÿî.Bÿó/ ÿ‚/ ÿö/ ÿu/ÿ»// /$/&ÿÓ/*ÿÓ/-/2ÿÓ/4ÿÓ/6/7ÿ/8ÿî/9ÿœ/:ÿÓ/;/<ÿ/=/@ÿà/Fÿô/Gÿô/Hÿô/Jÿô/Rÿô/Tÿô/YÿØ/ZÿÛ/[/\ÿì/] /^ÿè/`ÿñ/c/lÿÙ/nÿˆ/oÿŠ/x /¡/Õÿ°/Ö/ÙÿÄ/Úÿî/Ûÿõ/Ýÿ¦/áÿß/ÿä/ÿô/}ÿ¬/¤ÿí09ÿú0<ÿø0Úÿð1Õ1Úÿí2ÿò2 ÿé2 ÿô2 ÿä2ÿß2ÿÖ2"ÿÞ2#ÿõ2$ÿí2-ÿç26ÿö27ÿå29ÿï2:ÿð2;ÿè2<ÿ×2=ÿñ2>ÿö2@ÿÖ2Dÿó2`ÿã2cÿâ2nÿð2oÿö2¡ÿØ2Ôÿð2Õ2Öÿë2Ùÿì2Úÿä2Üÿô2ìÿå2ôÿê2ÿè2ÿå2!ÿò2}ÿæ2žÿì3ÿõ3 ÿô3 ÿè3ÿ¦3ÿÂ3$ÿÎ3-ÿ¡3;ÿî3>ÿñ3@ÿ×3Dÿí3Fÿë3Gÿë3Hÿà3Jÿë3Rÿë3Tÿõ3Y 3Z 3\ 3`ÿè3cÿ3lÿî3o 3¡ÿ¬3Ëÿð3Ôÿí3Õ 3ÖÿÙ3Úÿå3Üÿõ3ñÿî3 ÿï3ÿî3•ÿô4ÿò4 ÿé4 ÿô4ÿß4"ÿÞ4#ÿõ4$ÿí4-ÿç46ÿö47ÿå49ÿï4:ÿð4;ÿè4<ÿ×4=ÿñ4>ÿö4Dÿò4M4cÿì4nÿð4oÿö4¡ÿØ4Õ4Ùÿì4ìÿå4ôÿê4ÿè4ÿå4!ÿò4žÿì5 ÿô55 5"ÿó5#ÿñ5$5&ÿõ5*ÿõ5-52ÿõ54ÿõ59ÿö5;5<ÿí5=5@ÿß5[5] 5^ÿï5`ÿð5c5lÿì5¡5Ëÿñ5Ö5Úÿí5ñÿò5òÿò6Úÿè6á 7 ÿå7 7ÿÏ7ÿµ7ÿª7ÿ¬7"7#ÿÍ7$ÿÀ7&ÿå7*ÿå7-ÿ¦72ÿå74ÿå77797:7;7<7@ÿà7DÿÓ7FÿÉ7GÿÉ7HÿÉ7JÿÉ7QÿØ7RÿÉ7SÿØ7TÿÉ7UÿØ7VÿÓ7XÿÞ7Yÿê7Zÿ¯7[ÿî7\ÿê7]ÿâ7^ÿè7cÿ½7lÿ«7xÿ´7¡ÿ¸7É7Ê7Ëÿ±7377 7)ÿ¸7ÕÿÏ7ÖÿÄ7Ù7Úÿî7Ûÿõ7Ýÿ¼7áÿÃ7Bÿ¾8 ÿö8ÿö8ÿ×8ÿö8$ÿö8-ÿñ8=ÿð8@ÿÛ8Dÿð8]ÿî8^ÿö8`ÿê8cÿë8¡ÿÞ8Õ8Öÿð8Úÿì8ôÿï8ÿò9 9 ÿß9 9ÿö9ÿµ9ÿ½9ÿì9"9#ÿÚ9$ÿÂ9&ÿï9*ÿï9-ÿ¡90ÿú92ÿï94ÿï97999:9;9<!9@ÿä9Dÿç9FÿÓ9GÿÓ9HÿÓ9JÿÓ9Qÿâ9RÿÓ9Sÿâ9TÿÓ9Uÿâ9Vÿñ9Xÿè9]ÿþ9^ÿè9cÿ¶9lÿÕ9n9o9xÿõ9¡ÿ®9Ç 9Ê 9ËÿÍ9)99 9)ÿæ9Óÿñ9Öÿ×9×ÿñ9Ù9Úÿñ9Ýÿï9Bÿè: : ÿð:ÿÛ:ÿÑ:ÿõ:":#ÿí:$ÿî:&ÿð:*ÿð:-ÿÄ:2ÿð:4ÿð:7:9:: :; :<:@ÿÛ:Dÿã:Fÿê:Gÿê:Hÿê:Jÿæ:Qÿë:Rÿê:Sÿë:Tÿê:Uÿë:Vÿï:Xÿí:^ÿï:cÿÚ:lÿì:n:o:¡ÿÏ:Ê:Ëÿæ: :)ÿò:Öÿç:Ù:Úÿè:ñÿò:òÿô; ÿç; ÿæ;ÿä; ; ;#ÿæ;$;&ÿè;*ÿè;-;2ÿè;4ÿè;7 ;9;;;<;= ;@ÿÞ;Fÿî;Gÿî;Hÿî;Jÿî;Rÿî;Tÿî;Xÿö;Yÿõ;ZÿÛ;[;\ÿù;^ÿæ;c ;lÿÑ;¡;Ëÿã;Óÿï;ÕÿÛ;Ö;×ÿê;Ù;Úÿì;Ûÿó;ÝÿÚ;ñÿð;òÿï;õÿí;öÿô;ÿó;Bÿï< ÿÖ< <ÿÏ<ÿ¿<ÿ®<ÿÚ<"<#ÿÆ<$ÿ±<&ÿ×<*ÿ×<-ÿ<0ÿø<2ÿ×<4ÿ×<7<9!<:<;<<#<= <@ÿæ<Dÿ×<FÿÏ<GÿÏ<HÿÏ<JÿÏ<QÿØ<RÿÏ<SÿØ<TÿÏ<UÿØ<Vÿì<XÿÞ<[ÿñ<]ÿä<^ÿê<cÿ²<lÿ´<n <o<xÿà<¡ÿ°<Ê)<Ëÿ²<(< <)ÿÕ<Óÿð<Ô <ÕÿÝ<ÖÿÉ<×ÿæ<Ù"<Úÿó<ÝÿÒ<öÿï<BÿÙ= ÿë=ÿÄ= =#ÿð=$=&ÿÜ=*ÿÜ=-=2ÿÜ=4ÿÜ=8ÿò=9 =< =>ÿï=@ÿÕ=Fÿð=Gÿï=Hÿð=Jÿé=Rÿï=Tÿñ=Wÿó=Xÿí=Yÿé=Zÿè=[ =\ÿé=^ÿÝ=`ÿñ=lÿÎ=¡=Ê =Ëÿñ= =Óÿò=ÕÿÉ=Ö=×ÿî=Ù =Úÿä=Ûÿë=Üÿö=ÝÿÈ=õÿí=ûÿô=ÿô=•ÿò=ÿò=¤ÿð>$ÿä>&ÿÕ>*ÿÕ>-ÿä>2ÿÕ>4ÿÕ>6ÿæ>7ÿß>8ÿÚ>9ÿã>:ÿÛ>;ÿÜ><ÿå>=ÿ×>@P>¡ÿå>Åÿí>Èÿê>Ðÿä>Ô>Öÿá>Ûÿç>ÞÿÕ>áÿÕ>âÿß>ãÿã>äÿÕ>åÿÜ>çÿÑ>ïÿÛ>EÿÑ>Kÿå>Yÿæ>uÿð>}ÿá>žÿä>¡ÿä>£ÿ×>¨ÿä>¬ÿÕ>°ÿß>±ÿå>²ÿÕ>³ÿÜ@&ÿö@*ÿö@2ÿö@4ÿö@:ÿö@;ÿö@=ÿð@Åÿö@Þÿö@áÿö@äÿö@åÿö@çÿì@ïÿô@Eÿê@uÿí@£ÿð@¬ÿö@²ÿö@³ÿöD ÿåD ÿèD ÿìD"ÿäD@ÿâDYÿñDZÿôD\ÿñD`ÿëDoÿèE ÿÛE ÿåEÿêE"ÿäE@ÿâEYÿóEZÿôE[ÿïE\ÿóE]ÿìE`ÿëEnÿßEoÿßEÿóE#ÿóE•ÿòFÿàF F@ÿåFGÿôFJÿðFRÿóFY FZ F[F\ F^ÿëFlÿãFóÿôI 'I IÿÝIÿÌIÿÖI"I@'IYIZI[I\I`'IcÿËIlÿíIoIx IÇIÊ(IËÿïI(II(K ÿÛK ÿèK ÿëK"ÿåK@ÿãKYÿñKZÿóK\ÿïK`ÿëKnÿâKoÿâL•ÿôMM NÿåN N#ÿìN@ÿçNFÿæNGÿæNHÿæNJÿãNRÿãNTÿæN[N^ÿíNlÿÞNËÿåNòÿêNóÿãOóÿñQ ÿáQ ÿçQ ÿêQ"ÿäQ@ÿâQYÿðQZÿòQ\ÿîQ`ÿëQnÿêQoÿæR ÿàR ÿåR ÿìRÿéR"ÿâR@ÿâRYÿòRZÿóR[ÿïR\ÿòR]ÿìR`ÿëRnÿêRoÿåRÿóR#ÿóR•ÿòS ÿàS ÿåS ÿìSÿêS"ÿäS@ÿâSYÿòSZÿôS[ÿïS\ÿòS]ÿîS`ÿëSnÿêSoÿåSÿóS#ÿóS•ÿòTMU UÿàUÿÉUÿÒU"ÿÕU@ÿèUTÿôUYUZU[U\UcÿÌUlÿëUoUËÿíWÿÙW W@ÿåWFÿóWGÿòWHÿöWJÿöWRÿòWTÿôW[W^ÿëWlÿäWËÿôY YÿÝYÿàY"ÿÙY@ÿæYFÿñYGÿòYHÿòYJÿóYRÿòYTÿòYYYZY[Y\YcÿÜYo YËÿïYÿôZ ZÿàZÿäZ"ÿÝZ@ÿæZFÿóZRÿôZYZZZ[Z\ZcÿâZo ZËÿòZÿô[@ÿå[Fÿë[Gÿë[Hÿë[Jÿë[Rÿë[Tÿë[[[^ÿë[lÿã[Ëÿè[òÿî[óÿë]@ÿÞ]Fÿí]Gÿì]Hÿí]Iÿô]Jÿê]Rÿì]Tÿî]Wÿó]Xÿó]^ÿä]`ÿë]lÿß]Ëÿî]òÿï]óÿð]ÿô]•ÿï^$ÿô^&ÿæ^*ÿâ^-ÿô^2ÿâ^4ÿâ^6ÿë^8ÿé^=ÿî^`P^¡ÿõ^Åÿî^Ðÿô^Ô^Þÿâ^áÿæ^äÿâ^çÿõ^ïÿì^Eÿß^Yÿö^uÿñ^}ÿö^žÿô^¡ÿô^£ÿî^¨ÿô^¬ÿâ^²ÿâ`$ÿë`-ÿë`6ÿî`7ÿç`8ÿõ`9ÿç`:ÿí`;ÿã`<ÿè`=ÿÞ`¡ÿì`Åÿí`Èÿð`Ðÿë`Ôÿí`Öÿé`×ÿæ`Ûÿî`âÿç`ãÿè`åÿã`íÿé`ïÿð`Kÿè`}ÿé`žÿë`¡ÿë`£ÿÞ`¨ÿë`°ÿç`±ÿè`³ÿãb³b´b¶b¸c$c&ÿçc*ÿçc-c2ÿäc4ÿác6c7ÿ½c8ÿíc9ÿ¶c:ÿÞc; c<ÿ³c=c¡cÐcÞÿäcáÿçcâÿ½cäÿäcå cKÿ³cžc¡c£c¨c¬ÿäc°ÿ½c±ÿ³c²ÿäc³ l7ÿ³l9ÿôl<ÿßlâÿ³lKÿßl°ÿ³l±ÿßn$ÿµn&ÿën*ÿën-ÿn2ÿën4ÿën9n:n< n¡ÿ|nÐÿµnÞÿënáÿënäÿënK nžÿµn¡ÿµn¨ÿµn¬ÿën± n²ÿëx$ÿìx-ÿÖx6ÿëx7ÿªx9ÿÔx:ÿëx;ÿÍx<ÿ²x=ÿÕx¡ÿÔxÅÿçxÈÿÜxÐÿìxÔÿßxÖÿÆx×ÿÚxÛÿÝxâÿªxãÿÊxåÿÍxçÿðxíÿ×xïÿéxKÿ²xYÿöx}ÿØxžÿìx¡ÿìx£ÿÕx¨ÿìx°ÿªx±ÿ²x³ÿÍ|7ÿ­|8ÿõ|9ÿã|:ÿë|<ÿÑ|=ÿõ~±ÿä~²ÿÞ~´~µÿÝ~¶~·ÿ×~¹ÿè~ºÿõ€¸š$ÿÒš&ÿÛš*ÿÛš-ÿš2ÿÛš4ÿÛš6ÿáš7ÿ‘š8ÿÔš9ÿÑš:ÿÙš;ÿ»š<ÿ¾š=ÿ¼š¡ÿ¹¹ÿò¹ ÿß¹ ÿÙ¹ÿĹÿ×¹"ÿÞ¹$ÿå¹-ÿȹ7ÿÔ¹9ÿë¹;ÿÕ¹<ÿÖ¹=ÿѹ>ÿð¹@ÿÖ¹Dÿñ¹`ÿå¹cÿǹnÿç¹oÿð¹¡ÿϹÔÿæ¹Õ#¹Öÿí¹Ùÿó¹Úÿä¹Üÿî¹Ý ¹ìÿܹôÿô¹ÿà¹ÿ×¹!ÿò¹}ÿ鹕ÿó¹žÿܺ ÿغ ÿåº ÿߺ"ÿìº@ÿëºYÿäºZÿçº\ÿäº`ÿëºnÿáºoÿâºÿÞº~ÿ뺕ÿîËÿëË"Ë@ Ë` Ù ÿØÙ ÿåÙ ÿìÙÿêÙ"ÿäÙ@ÿâÙYÿòÙZÿôÙ[ÿïÙ\ÿòÙ]ÿîÙ`ÿëÙnÿÜÙoÿÜÙÿóÙ#ÿóÙ•ÿòê ê <êÿõêÿõêÿõê"-ê?Zê@FêDÿõêEêFÿõêGÿõêHÿõêJÿõêKêLêMêNêOêQÿõêRÿõêSÿõêTÿõêUÿõêVÿõêW êXÿõê`FêoêÇ>êÉVêÊfêfêfêN(M(]ÿó) ÿÖ) ÿì)"ÿè)Yÿò)Zÿô)nÿÞ)oÿÞ±}ÿó²ÿô²}ÿì³}ÿÙ³µÿð´}ÿïµÿêµ ÿóµµ µºÿð¶ ÿñ¶}ÿð¶ºÿð·ÿë· ÿæ·}ÿñ·²ÿê·ºÿê¸}ÿ¸³¸´ ¸µÿ̸·ÿḸ¹}ÿîº}ÿﺴÿïÓ$Ó&ÿðÓ*ÿðÓ2ÿðÓ4ÿðÓ< Ó¡ÓÔPÓÐÓÑÿõÓÒÿôÓÔ#ÓÞÿçÓáÿçÓäÿÛÓEÿÞÓK ÓYÿõÓqÓuÿæÓžÓŸÿôÓ¡Ó¥ÿçÓ¨Ó¬ÿçÓ± Ó²ÿÛÔ$ÿòÔ9ÿñÔ;ÿîÔ<ÿðÔ=ÿñÔ¡ÿðÔÐÿòÔÖÿçÔ×ÿîÔãÿêÔåÿèÔíÿðÔKÿðÔ`ÿóÔqÿðÔ}ÿðÔžÿòÔ¡ÿóÔ£ÿñÔ¨ÿòÔ«ÿñÔ¯ÿòÔ±ÿðÔ³ÿèÔ´ÿöÕ%Õ&Õ'Õ(Õ)Õ*Õ+Õ,Õ-ÿØÕ.Õ/Õ0 Õ1Õ2Õ3Õ4Õ5Õ7ÿÏÕ8Õ;ÿÞÕ<ÿÝÕ=ÿâÕ¡ÿâÕ¹ÕÈÿØÕÔÿØÕÖÿÉÕ×ÿëÕÛÿÕÕÞÕáÕâÿÅÕãÿãÕäÕåÿÔÕíÿæÕEÕKÿÛÕYÕqÿßÕuÕ}ÿØÕ£ÿáÕ¥Õ¬Õ¯ÿÖÕ°ÿÅÕ±ÿÛÕ²Õ³ÿÔÖ$ÿØÖ&ÿìÖ*ÿìÖ-ÿÁÖ2ÿìÖ4ÿìÖ7Ö9Ö:Ö;Ö<!Ö= Ö¡ÿ¼ÖÈÿÁÖÐÿÎÖÔÿÅÖÖÖÛÿÄÖÞÿìÖáÿìÖâÖãÖäÿìÖåÖíÖEÿëÖK!Öqÿ¼ÖžÿÎÖ¡ÿÓÖ£ Ö¥ÿìÖ¨ÿÎÖ« Ö¬ÿìÖ¯ Ö°Ö±!Ö²ÿìÖ³Öµÿê×$ÿå×-ÿ××9ÿõ×;ÿå×<ÿë×=ÿëסÿÕ×Èÿ××Ðÿå×ÔÿÖ×ÖÿÔ××ÿá×ÛÿÓ×Üÿó×ãÿê×åÿÛ×íÿñ×Kÿë×`ÿó×qÿÕ×}ÿåמÿåסÿé×£ÿëרÿçשÿó׫ÿñׯÿæ×±ÿë׳ÿÛØ$ÿòØ%ÿíØ&ÿçØ'ÿíØ(ÿíØ)ÿíØ*ÿçØ+ÿíØ,ÿíØ-ÿòØ.ÿíØ/ÿíØ0ÿïØ1ÿíØ2ÿçØ3ÿíØ4ÿçØ5ÿíØ6ÿëØ7ÿîØ8ÿìØ9ÿñØ:ÿéØ;ÿêØ<ÿóØ=ÿ娡ÿóعÿíØÚPØÅÿåØÈÿòØÐÿòØÑÿäØÒÿäØÓÿäØÔ#ØÕÿäØÖÿêØ×ÿçØØÿäØÚÿäØÛÿïØÜÿåØÝÿäØÞÿÚØáÿÚØâÿîØãÿìØäÿÚØåÿêØçÿÙØíÿéØïÿäØEÿÙØKÿóØWÿäØYÿîØqÿóØuÿÚØ}ÿéØžÿòØŸÿ䨠ÿ䨡ÿòØ¢ÿ䨣ÿ娤ÿ䨥ÿÚØ¦ÿãØ§ÿ䨍ÿòØ©ÿåØªÿ䨫ÿãØ¬ÿÚØ­ÿ䨮ÿ䨝ÿ娰ÿîØ±ÿóزÿÚØ³ÿêØ´ÿÕØµÿáÙ$"Ù&ÿìÙ*ÿìÙ-Ù2ÿëÙ4ÿëÙ6Ù7ÿÄÙ8ÿðÙ9ÿ×Ù:ÿçÙ;Ù<ÿÈÙ=Ù¡#ÙÅÙÈÙÐ"ÙÔ4ÙÖÙ×ÙÛÙÞÿëÙáÿìÙâÿÄÙãÙäÿãÙåÙçÿÒÙíÙïÙEÿëÙKÿ¿ÙYÿâÙq#ÙuÿòÙ}Ùž"Ù¡"٣٥ÿëÙ¨"٫٬ÿëٯٰÿÄÙ±ÿ¿Ù²ÿãٳٴÿÒÙµ ÚäÿóÚçÿôÚEÿòÚ²ÿóÚ´ÿõÛ&ÿôÛ*ÿôÛ2ÿôÛ4ÿôÛÜPÛÅÿöÛÑÿòÛÒÿòÛÓÿòÛÔ#ÛÕÿòÛØÿòÛÚÿòÛÜÿñÛÝÿòÛÞÿçÛáÿçÛäÿæÛçÿëÛEÿäÛWÿòÛuÿçÛŸÿòÛ ÿòÛ¢ÿòÛ¤ÿòÛ¥ÿçÛ¦ÿñÛ§ÿòÛ©ÿñÛªÿòÛ¬ÿçÛ­ÿòÛ®ÿòÛ²ÿæÛ´ÿèÛµÿðÜ7ÿõÜ;ÿñÜ=ÿíÜÔÿõÜÖÿñÜ×ÿïÜâÿõÜãÿòÜåÿñÜíÿñÜY Ü}ÿñÜ£ÿíܯÿíܰÿõܳÿñÝ7ÿÄÝÖÿôÝÛÿéÝâÿËÝYÝ«ÿåݰÿËá$ÿîá-ÿÎá7ÿ¼á9ÿðá;ÿØá<ÿÒá=ÿÓá¡ÿÒáÈÿÎáÐÿîáÔÿÎáÖÿÀá×ÿçáÛÿÈáâÿ¼áãÿØáåÿÎáíÿäáKÿÏáqÿÒá}ÿÔážÿîá¡ÿòá£ÿÐá¨ÿðá¯ÿÒá°ÿ¼á±ÿÏá³ÿÎå$å&ÿòå*ÿòå-"å2ÿòå4ÿòå6å;å=å¡è:ÿòè;ÿðé[ÿòé]ÿïó[ÿìó]ÿïóÿòóÿîó#ÿôó•ÿòö&ÿéö*ÿéö2ÿéö4ÿéö8ÿóöFÿòöGÿñöHÿòöJÿîöRÿñöTÿòöWÿôöXÿîöYÿÜöZÿàö\ÿÜöËÿóöóÿæöûÿñöÿðöÿóö~ÿÜö¤ÿíú$ÿôú7ÿäú9ÿðú:ÿôú;ÿçú<ÿáú=ÿóú¡ÿïû&ÿéû*ÿèû2ÿæû4ÿæû7ÿÐû8ÿîû9ÿÓû:ÿÚû<ÿÔûJÿóûYÿÖûZÿÝû\ÿÓûóÿèûÿòûÿÞûÿïû}ÿÐû~ÿÖû¤ÿèYÿîZÿð\ÿìóÿó~ÿæ9ÿï<ÿë Fÿô Gÿô Hÿô Jÿñ Rÿô Tÿô Ëÿñ óÿî •ÿô&ÿâ*ÿâ2ÿà4ÿàFÿòGÿñHÿóJÿíRÿñTÿóXÿïYÿÐZÿ×\ÿÍËÿóóÿá~ÿЕÿñÿñ¤ÿó$ÿå-ÿäDÿò[ÿô]ÿô¡ÿÚ ÿóÿî•ÿî$ÿé-ÿë9ÿî;ÿå<ÿç=ÿæDÿó¡ÿßÿòÿåÿôÿåÿô ÿï!ÿñ#ÿò}ÿî•ÿîËÿñMÿòYÿéZÿì[ÿò\ÿéÿòÿà~ÿè•ÿî&ÿæ*ÿå2ÿå4ÿå8ÿñFÿôGÿóHÿôJÿðRÿóTÿôXÿïYÿÖZÿÚ\ÿÔóÿèûÿóÿïÿñ~ÿפÿìËÿï>•ÿð 9ÿó <ÿî Mÿó Oÿô Wÿô Xÿò öÿò ûÿñ ÿï ÿñ ÿñ ÿò }ÿô •ÿî!Yÿñ!Zÿô!\ÿð!ÿä!~ÿð#•ÿñ$[ÿð$]ÿñ$ÿó$ÿí$•ÿí\$ÿÝ\-ÿÁ\;ÿá\<ÿò\=ÿð\Dÿê\Eÿô\Iÿô\Kÿô\Lÿô\Mÿô\Nÿô\Qÿô\Sÿô\Uÿô\¡ÿÆ\ºÿô\Ùÿô\(ÿô\öÿô\ûÿô\ÿì\ÿô\ÿî\ÿî\ÿï\ ÿò\\ÿô\ÿô\•ÿî}9ÿð}<ÿë}(ÿó}óÿó}ÿó}ÿí}ÿó}}ÿñ}ÿó}•ÿô9ÿí<ÿæÿò•&ÿÝ•*ÿÝ•2ÿÛ•4ÿÛ•7ÿÆ•8ÿå•9ÿÇ•:ÿÙ•<ÿÊ•Fÿï•Gÿî•Hÿï•Rÿî•Tÿñ•Xÿï•YÿÓ•ZÿÛ•Ëÿñ•ÿí•ÿÓ•ÿç•?•¤ÿß—Ëÿò—?—•?&ÿî*ÿí2ÿë4ÿë7ÿ¾8ÿó9ÿ»:ÿÝ<ÿ¶YÿÛZÿâ\ÿØóÿíÿäÿô}ÿ¬~ÿÛ¤ÿíž$ÿ´ž&ÿÓž*ÿÓž-ÿ§ž2ÿÔž4ÿÔžDÿÇžFÿ®žGÿ°žHÿ¯žJÿ¯žQÿÌžRÿ®žSÿËžTÿ®žUÿËžVÿÅžXÿÒžYÿìžZÿëž[ÿèž\ÿìž]ÿÜž¡ÿ¨žËÿ½ž)ÿÏžóÿ¶žöÿéž ÿמÿÙžÿìž"ÿéž$ÿËž~ÿð Dÿî Fÿì Gÿî Hÿí Rÿí Tÿì Ëÿä¤$ÿí¤-ÿé¤=ÿî¤Dÿò¤¡ÿÞ¤ÿð¤ÿìÅ ÿôÅ ÿîÅÚÿçÅÜÿöÅá ÅÿÓÅÿðÅ ÿßÅ"ÿèÅLÿñÅ~ÿìÈÖÿóÈÚÿãÈÜÿîËÿñË ÿ¶Ë ÿíË ÿêË ÿÜË"ÿáË#ÿôË>ÿíË@ÿÌË`ÿÜËÓÿóËØÿõËÙÿÔËÚÿÔËÜÿçËÞÿôËáÿôËâÿÎËäÿòËçÿâËñÿôËÿÛËÿéË ÿÝËÿðËÿíËÿíËÿðË"ÿÛË*ÿõËEÿôËLÿëËXÿôËYÿìËuÿöË~ÿÚÐ ÿ²Ð ÿíÐ ÿÁÐÐÐ#ÿñÐ@ÿåÐ^ÿìÐ`ÿöÐcÐlÿíÐnÿ¹Ðoÿ¼ÐÓÿòÐÔ ÐÖ!Ð×ÿñÐÙÿÎÐÚÿòÐÝÿîÐÅÐÈÐÐ!ÐÔÐÖÐ×ÐÛÐÞÿíÐáÿíÐâÿÀÐäÿíÐåÐçÿÍÐíÐïÐñÿòÐôÐõÿóÐöÐûÐþÿóÐÿóÐÿÚÐÿñÐÿóÐÐÿäÐ ÿèÐ ÐÐÐ"ÿèÐEÿéÐKÿ±ÐLÿëÐYÿÜÐZÿîÐuÿðÐ}Ð~ÿÝÑÿóÑ ÿÛÑ ÿîÑ ÿáÑÑÿóÑÿñÑÿóÑ"ÿõÑ>ÿïÑ@ÿ×Ñ`ÿæÑÔÿëÑÚÿâÑÜÿòÑÖÿíÑãÿõÑåÿïÑçÿêÑïÿíÑöÿïÑ÷ÿöÑÿÞÑÿñÑÿòÑ ÿÞÑ"ÿßÑ*ÿöÑLÿñÑYÿïÑ~ÿãÒ ÿõÒ ÿõÒ ÿçÒ ÿõÒÿöÒÿëÒÿõÒ"ÿìÒ>ÿóÒ@ÿÞÒ`ÿêÒÔÿêÒÙÿóÒÚÿâÒÜÿîÒÖÿíÒãÿóÒäÿöÒåÿëÒçÿîÒïÿðÒ÷ÿõÒÿöÒKÿçÓ ÿåÓ ÓÿÏÓÿµÓÿªÓÿ¬Ó"Ó#ÿÍÓ@ÿàÓ^ÿèÓcÿ½Ólÿ«Óxÿ´ÓÕÿ›ÓÖÿÅÓÙÓÚÿîÓÛÿõÓÝÿ”ÓáÿËÓÈÿ’ÓÐÿÀÓÔÿÀÓÛÿ¿ÓÞÿåÓáÿåÓâÓãÓäÿåÓåÓíÓðÿŸÓòÿ§ÓôÿŽÓõÿŽÓöÿ¶Ó÷ÿ¯Óøÿ£Óúÿ£ÓûÿÓüÿ˜Óýÿ£ÓþÿŽÓÿÿ£Óÿ£ÓÿŽÓÿÂÓÿÂÓÿ±Óÿ¾Óÿ´Óÿ£Ó ÿ£Ó ÿÂÓ ÿ³Óÿ§Óÿ’ÓÓÿŽÓÿ˜Ó*ÓÓÿ£Ó*ÿ¶ÓEÿêÓFÿˆÓLÿÂÓZÿ£ÓrÿŸÓvÿŸÓ|ÿÍÓ~ÿÀÓŠÿáÔ ÿôÔ Ô ÿïÔÔ*Ô@Ô^ÿðÔ`ÔlÿòÔÔ"ÔÖ3ÔÚ"ÔÜ"ÔÈÔÐÔÔÔÖÔ×ÔÛÔÞÿîÔáÿîÔäÿæÔåÔçÿåÔíÔôÔöÔûÔÔÔÿíÔÔAÔEÿèÔuÿöÔ}Ô~Õ ÿðÕ ÿëÕ ÿóÕ Õ#ÿðÕ>ÿïÕ@ÿÕÕ^ÿíÕ`ÿêÕlÿéÕnÿóÕÓÿñÕÖÕ×ÿîÕÚÿãÕÜÿõÕáÿáÕÈÕÐÕÞÿäÕáÿäÕäÿäÕñÿðÕõÿðÕþÿïÕÿðÕÿðÕÿçÕÿïÕ ÕÿîÕ ÿðÕ"ÿðÕEÿéÕFÿõÕLÿçÕuÿíÕ~ÿîÖÓÿèÖÕÿÊÖÖÖ×ÿÝÖÙÖÚÿëÖÛÿòÖÝÿÁÖáÿó× ÿô× ÿô× ÿæ×ÿò×ÿõ×"ÿô×>ÿô×@ÿÚ×`ÿå×Ôÿî×Ùÿö×Úÿá×Üÿí×Öÿð×ãÿö×äÿô×åÿò×çÿð×ïÿò×ÿöØÔÿõØÚÿäØÜÿòÚ ÿîÚ ÿßÚÿÑÚÚÚ" Ú#ÿíÚ@ÿæÚ^ÿíÚcÚlÿÃÚÓÿðÚÔ ÚÕÿÈÚÖ"Ú×ÿäÚÙÚÚÿóÚÝÿ¾ÚáÿöÚÈÚÐ"ÚÔÚÖÚ×ÚÛÚÞÿÝÚáÿÝÚâÚäÿÝÚåÚíÚïÚñÿèÚôÚõÿíÚöÚûÚþÿíÚÿíÚÿØÚÿÐÚÿåÚÚÿÃÚ ÿéÚ ÚÚÚÿíÚÚÚ"ÿéÚEÿÕÚFÿìÚLÿÑÚYÿÚÚZÿÅÚuÿíÚvÿòÚ}Ú~ÿÎÛÚÿäÛÜÿñÜ ÿñÜ ÿòÜ ÿìÜ ÿòÜ"ÿôÜ#ÿóÜ>ÿõÜ@ÿÞÜ`ÿéÜÚÿæÜÜÿñÜãÿúÜÿöÜÿôÜKÿøÝÔÿõÝÚÿäÝÜÿòÞÿòÞ ÿéÞ ÿôÞ ÿäÞÞÿßÞÿÖÞ"ÿÞÞ#ÿõÞ>ÿöÞ@ÿÖÞ`ÿãÞcÿâÞnÿðÞoÿöÞÔÿãÞÕÞÖÿëÞÙÿìÞÚÿÚÞÜÿçÞÈÿéÞÐÿíÞÔÿëÞÖÿÑÞ×ÿáÞÛÿéÞâÿåÞãÿÝÞåÿèÞíÿãÞðÿóÞôÿçÞöÿöÞ÷ÿôÞûÿäÞÿõÞÿôÞÿñÞKÿ×Þ}ÿäàÿõà ÿôà ÿèàÿ¦àÿÂà>ÿñà@ÿ×à`ÿèàcÿàlÿîào àÔÿíàÕ àÖÿÙàÚÿåàÜÿõàÈÿ¤àÐÿÎàÔÿºàÖÿäà×ÿòàÛÿ¸àåÿîàðÿíàôÿÒàûÿÐàüÿôà à*àL àYàrÿôá ÿéáÿâáá"á#ÿïá>ÿöá^ÿäácálÿÓáo áÓÿðáÕÿÒáÖá×ÿîáÙáÚÿéáÛÿðáÝÿÉáÈáÐáÔáÛáÞÿìááÿìáâáäÿìáå áñÿðáôáõÿñáöáûáþÿñáÿñáÿßáÿðáÿñááÿÑá ÿßáááEÿááFÿöáKáLÿðáZÿÎáuÿóá~ÿÝâ ÿåâ âÿÏâÿµâÿªâÿ¬â"â#ÿÍâ@ÿàâ^ÿèâcÿ½âlÿ«âxÿ´âÕÿÅâÖÿÄâÙâÚÿîâÛÿõâÝÿ¼âáÿËâÈÿ¿âÐÿÀâÔÿÀâÛÿ¿âÞÿåâáÿåâââãâäÿåâåâíâðÿÓâòÿ¶âôÿ»âõÿÉâöÿ»â÷ÿ®âøÿ¶âúÿ¶âûÿ¼âüÿ´âýÿ¶âþÿÉâÿÿ¶âÿØâÿÉâÿÂâÿêâÿÉâÿîâÿ´âÿ¶â ÿ¶â ÿÂâ ÿ²âÿ¶âÿ¶ââÿ²âÿ²â*ââÿ¶â*ÿ¼âEÿêâFÿ²âKâLÿêâZÿ½ârÿ°âvÿ°â|ÿÌâ~ÿÀâŠÿáã ã ÿßã ãÿöãÿµãÿ½ãÿìã"ã#ÿÚã@ÿäã^ÿèãcÿ¶ãlÿÕãnãoãxÿõãÓÿóãÔ ãÖÿÉã×ÿóãÙ ãÚÿòãÝÿðãÈÿ¯ãÐÿÂãÔÿÃãÖãÛÿÂãÜÿúãÞÿïãáÿïãâãããäÿïãåãíãðÿæãñÿïãòÿîãôÿÁãõÿÚãøÿíãúÿíãûÿÁãüÿáãýÿíãþÿÚãÿÿíãÿíãÿÚãÿØãÿíã ÿíãÿîãÿáã ãÿÚãÿíã)ã ãÿíãEÿëãFÿÚãrÿæãvÿèäÿòä ÿéä ÿôä ÿääÿßäÿÖä"ÿÞä#ÿõä>ÿöä@ÿÖä`ÿãäcÿâänÿðäoÿöäÔÿØäÕäÖÿãäØÿóäÙÿìäÚÿÚäÜÿæäÈÿÉäÐÿíäÔÿÉäÖÿÃä×ÿÓäÛÿÇäâÿåäãÿÛäåÿèäíÿØäðÿïäòÿòäôÿØäöÿõä÷ÿöäøÿôäúÿôäûÿÕäüÿîäýÿôäÿÿôäÿòäÿôä ÿôäÿòäÿòäÿòäÿòäÿòäÿôäXÿòärÿîä}ÿÇå ÿçå ÿæåÿäå å å#ÿæå@ÿÞå^ÿæåc ålÿÑåÓÿéåÕÿÕåÖå×ÿáåÙåÚÿìåÛÿóåÝÿÐåÐåÞÿèåáÿèåâ åäÿèåååñÿäåôåõÿîåöåûåþÿîåÿîåÿâåÿùåÿîååÿÔå ÿâååÿëåå"ÿååFÿéåKåLÿõåZÿÑåvÿîå~ÿàæ ÿôæ æ ÿïææ*æ@æ^ÿðæ`ælÿòæÔ"æÖ3æÚ"æÜ"æÈæÐæÔæÖæ×æÛæÞÿîæáÿîæäÿææåæçÿåæíæôæöæûæææÿíææFæEÿèæuÿöæ}æ~çÔÿõçÚÿäçÜÿòìÔÿëìÕ ìÙÿÙìÚÿãìÜÿóíÿòí ÿéí ÿôí ÿäííÿßíÿÖí"ÿÞí#ÿõí>ÿöí@ÿÖí`ÿãícÿâínÿðíoÿöíÔÿçíÕíÖÿìíÙÿííÚÿÚíÜÿêíÈÿêíÐÿííÔÿííÖÿÓí×ÿãíÛÿëíâÿåíãÿÞíåÿèííÿäíôÿéí÷ÿõíûÿæíÿóíÿòí}ÿåïÔÿõïÚÿäïÜÿñð ÿåð ÿèð ÿìð"ÿäð@ÿâð`ÿëðoÿèðÿñðLÿññÿôñ ÿéñ ÿõñ ÿíññÿíñÿëñÿïñ>ÿïñöÿêñ÷ÿññÿóò ÿÜò ÿéò ÿòò"ÿëò@ÿäò`ÿïó ÿòóÿÈóÿ±óÿÒó"ÿÎó@ÿæó^ÿîó`ÿõólÿìóôÿÔóûÿÛóóóó ó*óLóZó~ô ÿáô ô"ô@ô`ôôôöôûôôÿõôôÿôô~õ ÿæõ ÿäõ ÿïõõÿôõÿõõÿóõ"ÿâõ>ÿõõ@ÿáõ`ÿêõoÿèõ÷ÿôõÿôõLÿôö ÿõö ÿïöÿåö ö#ÿìö@ÿçö^ÿíölÿÞöôöõÿæöööûöþÿãöÿæöÿãöööÿêöFÿéövÿõ÷ ÿÛ÷ ÿè÷ ÿî÷"ÿè÷@ÿß÷`ÿêú ÿñúÿåú ú#ÿìú@ÿçú^ÿíúlÿÞúôúõÿæúöúûúþÿãúÿæúÿãúúúÿéúFÿèþ ÿàþ ÿåþ ÿìþþÿìþÿéþÿïþ"ÿâþ@ÿâþ`ÿëþnÿêþoÿåþöÿéþ÷ÿïþÿòþÿïþ ÿõþLÿò ÿà ÿõ ÿå ÿìÿíÿêÿï"ÿä>ÿí@ÿâ`ÿënÿêoÿåöÿê÷ÿñÿòÿïÿõLÿòÿà @ÿå^ÿë`ÿôlÿãôöûþÿó ÿó L  ÿóÿâÿÍÿÒ"ÿÏ@ÿç^ÿî`ÿõlÿíôÿÝûÿÛ *LZ~ ÿòÿêÿã"ÿà@ÿå`ÿõcÿâo ôÿçõÿôûÿäþÿôÿôÿô  *L~ÿì ÿà ÿå ÿìÿçÿéÿê"ÿâ>ÿî@ÿâ`ÿënÿêoÿåöÿä÷ÿêûÿôÿòÿï ÿðÿõ~ÿõ ÿòÿñ"ÿõ#ÿó@ÿå^ÿë`ÿõlÿãôõÿëöûþÿëÿëÿëÿðFÿð ÿá "@`ôöûÿõÿôT~ ÿ¯ ÿç ÿÌ "ÿî @ÿà `ÿï ÿÑ ÿí  ÿÞ Lÿî ~ÿì ÿà ÿå ÿì  ÿí ÿé ÿð "ÿâ @ÿâ `ÿë nÿê oÿå öÿê ÷ÿð ÿò ÿï  ÿõ ÿà ÿå ÿìÿìÿéÿï"ÿâ@ÿâ`ÿënÿêoÿåöÿé÷ÿïÿòÿï ÿõ ÿÆ ÿí ÿç"ÿá#ÿó>ÿôñÿõÿï ÿó ÿíÿð"ÿò#ÿó>ÿõ@ÿÞ^ÿé`ÿílÿãõÿõþÿõÿõÿðÿõFÿõ ÿé ÿæ"ÿí@ÿÜ^ÿõ`ÿê ÿÆ ÿï ÿé ÿç"ÿá#ÿó>ÿô@ÿÕ`ÿàñÿõÿõ" ÿ¶" ÿç" ÿÎ""ÿî"@ÿà"`ÿï"ÿØ"ÿí" ÿá"Lÿî"~ÿì% ÿî% %ÿ½%ÿ»%ÿÐ%"%%#ÿÙ%@%`%lÿ§%xÿÔ%Ô%ÕÿÄ%ÖÿË%Ù(%Ýÿ½%áÿö%Ðÿ¼%ÔÿÎ%Ö%×%ÛÿÍ%Þÿí%áÿí%â&%ã!%äÿâ%å%ç%í!%ðÿÉ%òÿÒ%ôÿ˜%õÿ©%öÿà%÷ÿÙ%øÿÍ%úÿÍ%ûÿ¡%üÿÂ%ýÿÍ%þÿ¨%ÿÿÍ%ÿÍ%ÿ§%ÿí%ÿí%ÿ³%ÿé%ÿÝ%ÿÍ% ÿÍ% ÿí% ÿÜ%ÿÒ%ÿµ%,%ÿ¨%ÿÂ%,%ÿÍ%*ÿà%Eÿë%Fÿ§%Lÿí%ZÿÍ%rÿÉ%vÿÈ%}%~ÿê& &ÿì&ÿ²&ÿÔ&"ÿÝ&@ÿñ&lÿð&x&ôÿå&ö&ûÿå&!&!&&& !& &*&L!&Z&~2 ÿÖ2 ÿõ2 ÿî2"ÿò2ÿíD ÿ¡D ÿ¾D"ÿôDûDÿÍDÿðD ÿÞDLÿäDZÿñEÿîE ÿÆE ÿóE ÿíEEÿÞEÿðE"ÿÞE>ÿëEÕ EÖEØÿóEÙÿÞEÅÿíEÈÿðEÐÿðEÖÿÙE×ÿêEÛÿïEâÿÂEãÿÞEåÿÛEçÿóEíÿëEïÿïEöÿãE÷ÿëEûÿìEÿöEÿíE ÿòE ÿíEÿòEÿòEEÿòEÿòEXÿòE}ÿìF ÿ¾F ÿâFÿóFÿóF"ÿãF>ÿòFöÿðFÿÞFÿòF ÿÞFLÿòK ÿÖK KÿÏKÿ¿Kÿ®KÿÚK"K#ÿÆK@ÿæK^ÿêKcÿ²Klÿ´Kn KoKxÿàKÓÿðKÔ KÕÿÛKÖÿ¿K×ÿæKÙ"KÚÿóKÝÿÏKÐÿ±KÜÿøKÞÿ×Káÿ×KâKåKðÿ×KñÿæKòÿÞKôÿ´KõÿÏKöÿîK÷ÿçKøÿÛKúÿÛKûÿµKüÿÐKýÿÛKþÿÏKÿÿÛKÿØKÿÏKÿºKÿñKÿìKÿÛK ÿÛK ÿëKÿÞKÿÉK!Kÿ¿KÿÖK!KÿÛK*ÿóKFÿ¿KK#KZÿæKrÿÖKvÿ×L ÿóL LÿÝLÿàL"ÿÙL@ÿæL`ÿõLcÿÜLo LôÿäLõÿòLûÿÝLþÿòLÿñLLLL L*LLL~WÿõW ÿ¨W ÿñW ÿîW ÿäW"ÿæW>ÿïW@ÿÑW`ÿàWÙÿÓWÚÿÙWÜÿëWâÿ®WçÿêWYÿõX ÿÇX ÿïX ÿéX ÿçX"ÿáX#ÿóX>ÿòX@ÿÒX`ÿÝXñÿõXÿõY ÿïY ÿóY ÿßYÿíYÿìY"ÿíY>ÿîY@ÿÓY`ÿáYÔÿçYÕ YÙÿóYÚÿÛYÜÿçYÖÿóY×ÿôYãÿìYåÿóYíÿöYðÿíYüÿôYÿòYÿòYrÿíYvÿðY}ÿöZ ÿÔZ ÿáZ ÿîZZÿôZÿõZÿóZ"ÿàZ>ÿõZ@ÿÙZ`ÿåZ÷ÿô`Ù`Ýÿña ÿõa"ÿóa^ÿîalÿðe ÿçe ÿôe"ÿçeÿõeFÿõqÓÿòqÖq×ÿîqÚÿäqÜÿöqáÿár ÿÕr ÿár ÿïrrÿñrÿõrÿór"ÿár>ÿõr@ÿÚr`ÿår÷ÿôuÿòu ÿéu ÿôu ÿäuuÿßuÿÖu"ÿÞu#ÿõu>ÿöu@ÿÖu`ÿãucÿâunÿðuoÿöuÔÿçuÕuÖÿíuÙÿíuÚÿÚuÜÿêuÐÿíuâÿåuåÿèuðÿóuôÿêu÷ÿõuûÿèuÿôuÿóuKÿ×v ÿàv ÿåv ÿìvvÿívÿévÿðv"ÿâv@ÿâv`ÿëvnÿêvoÿåvöÿêv÷ÿïvÿòvÿïv ÿõvLÿò} ÿõ} ÿí}ÿõ}ÿò}ÿõ}>ÿñ}@ÿÖ}`ÿò}ÚÿÞ}Üÿí}äÿõ}ïÿî}öÿò}ÿß}ÿë}ÿõ} ÿß}ÿó}ÿõ}ÿõ}"ÿæ}*ÿõ}Lÿë}Yÿç}~ÿâ~ ÿì~ ÿí~"ÿð~#ÿó~^ÿê~lÿé~þÿõ~ÿó~Fÿõž ÿ²ž ÿíž ÿÁžžž#ÿñž@ÿåž^ÿìž`ÿöžcžlÿížnÿ¹žoÿ¼žÓÿòžÔ žÖ!ž×ÿñžÙÿΞÚÿòžÝÿîžž!ž¡!ž£ž¨!ž«ž¬ÿ힯ž°ÿÀž±ÿ±ž²ÿíž³ž´ÿΞ¸ÿêž½ÿîžÀžÂÿëžÄÿóžÇÿóžÈÿóžÉÿÚžÊÿñžËÿóžÌžÍÿîŸ ÿõŸ ÿõŸ ÿçŸ ÿõŸÿöŸÿëŸÿõŸ"ÿìŸ>ÿóŸ@ÿÞŸ`ÿêŸÔÿêŸÙÿóŸÚÿâŸÜÿÿ矲ÿöŸ³ÿ럴ÿì  ÿå   ÿÏ ÿµ ÿª ÿ¬ " #ÿÍ @ÿà ^ÿè cÿ½ lÿ« xÿ´ Õÿ› ÖÿÅ Ù Úÿî Ûÿõ Ýÿ” áÿË žÿÀ ¡ÿÀ ¨ÿÀ ¬ÿå ° ± ²ÿå ³ ¶ÿÓ ¸ÿÁ ¹ÿè ºÿŒ ¼ÿ£ ¾ÿ¤ ¿ÿ£ Áÿ£ Âÿê ÄÿÉ Åÿ£ ÆÿŽ ÇÿÉ ÈÿÉ Éÿ ÊÿÞ ËÿÉ Ìÿî Íÿ¦ ÎÿŒ Ü4 Ýh øÿÁ ùÿË ûÿÒ ÿË ÿÖ ÿÑ ? O  /     P  Qÿá ¦ §* ¨^ ©^ ª  «4¡ ÿ²¡ ÿí¡ ÿÁ¡¡¡#ÿñ¡@ÿå¡^ÿì¡`ÿö¡c¡lÿí¡nÿ¹¡oÿ¼¡Óÿó¡Ô ¡Ö!¡×ÿô¡ÙÿÏ¡Úÿò¡Ýÿò¡ž!¡¡!¡£¡¨!¡«¡¬ÿí¡¯¡°ÿÀ¡±ÿ±¡²ÿí¡³¡´ÿÓ¡¸ÿí¡½ÿñ¡À¡Âÿë¡Äÿó¡Çÿó¡Èÿó¡ÉÿÞ¡Êÿñ¡Ëÿó¡Ì¡Íÿò¢ ÿð¢ ÿë¢ ÿó¢ ¢#ÿð¢>ÿï¢@ÿÕ¢^ÿí¢`ÿê¢lÿé¢nÿó¢Óÿñ¢Ö¢×ÿî¢Úÿã¢Üÿõ¢áÿᢞ¢¡¢¨¢¬ÿ䢲ÿ䢸ÿꢽÿî¢Âÿç¢Äÿï¢Çÿï¢Èÿï¢Éÿò¢Êÿí¢Ëÿï¢Ì ¢Íÿë¢Ý4£ ÿë£ÿÄ£ £#ÿð£>ÿï£@ÿÕ£^ÿÝ£`ÿñ£lÿΣÓÿò£ÕÿÆ£Ö£×ÿî£Ù £Úÿä£Ûÿë£Üÿö£Ýÿ¿£ž£¡£¨£¬ÿÜ£± £²ÿÜ£¸ÿí£½ÿô£Âÿé£Äÿï£Çÿï£Èÿï£Éÿó£Êÿí£Ëÿï£Ì £Íÿë£Ü£ÝI¤Ôÿõ¤Úÿä¤Üÿò¤Ý¥Ôÿã¥Õ¥Öÿë¥Ùÿì¥ÚÿÚ¥Üÿç¦Ôÿõ¦Úÿã¦Üÿñ§ ÿî§ ÿß§ÿѧ§§" §#ÿí§@ÿæ§^ÿí§c§lÿçÓÿð§Ô §ÕÿȧÖ"§×ÿä§Ù§Úÿó§Ýÿ¾§áÿö§ž"§¡"§£§¨"§«§¬ÿݧ¯§°§±§²ÿݧ³§¶ÿÿݧ¹ÿî§½ÿí§À§Âÿò§Ãÿò§Äÿë§Çÿë§Èÿë§ÉÿѧÊÿó§Ëÿë§Ì§Íÿà§Îÿñ§Ü§Ý?§)§?§4§§ §¨>§©I¨Óÿò¨Ô ¨Ö!¨×ÿò¨ÙÿΨÚÿò¨Ýÿð© ÿñ© ÿò© ÿì© ÿò©"ÿô©#ÿó©>ÿõ©@ÿÞ©`ÿé©Úÿæ©Üÿñ©¬ÿñ©±ÿø©²ÿï©´ÿ驹ÿö©»ÿöªÔÿõªÚÿäªÜÿò« ÿð« ÿë« ÿó« «#ÿð«>ÿï«@ÿÕ«^ÿí«`ÿê«lÿé«nÿó«Óÿñ«Ö«×ÿñ«Ù «Úÿã«Üÿõ«áÿ䫞«¡«¨«¬ÿ䫱«²ÿ䫳«¸ÿõ«À«Âÿç«Äÿï«Çÿï«Èÿï«Éÿò«Êÿí«Ëÿï«Ì «Íÿñ«Ü«ÝI¬ÿò¬ ÿé¬ ÿô¬ ÿä¬ÿ߬ÿÖ¬"ÿÞ¬#ÿõ¬>ÿö¬@ÿÖ¬`ÿã¬cÿâ¬nÿð¬oÿö¬Ôÿã¬Õ¬Öÿë¬Ùÿì¬ÚÿÚ¬Üÿ笞ÿí¬¡ÿí¬£ÿñ¬¨ÿí¬©ÿñ¬«ÿ䬯ÿᬰÿ嬱ÿ׬³ÿ謶ÿó¬ºÿô¬Àÿë¬Æÿö­Ôÿõ­Úÿä­Üÿñ®ÿõ® ÿô® ÿè®ÿ¦®ÿ®>ÿñ®@ÿ×®`ÿè®cÿ®lÿî®o ®Ôÿí®Õ ®ÖÿÙ®Úÿå®Üÿõ®žÿή¡ÿή¨ÿή©ÿö®³ÿî®¶ÿí®¹ÿö®»ÿö®Àÿ×® ®Æÿô® ¯ ÿï¯ÿͯ#ÿô¯>ÿò¯@ÿÚ¯^ÿá¯lÿÔ¯Óÿð¯ÕÿÓ¯Ö¯×ÿì¯Ù¯Úÿâ¯Ûÿé¯Üÿõ¯ÝÿѯáÿÔ¯¬ÿ௲ÿÔ¯¶ÿö¯¸ÿׯÂÿÒ¯Äÿõ¯Çÿõ¯Èÿö¯ÉÿÒ¯Êÿô¯Ëÿï¯Íÿê¯Ü*¯ÝS¯¨?¯©I¯«° ÿå° °ÿϰÿµ°ÿª°ÿ¬°"°#ÿͰ@ÿà°^ÿè°cÿ½°lÿ«°xÿ´°ÕÿŰÖÿİٰÚÿî°Ûÿõ°Ýÿ¼°áÿ˰žÿÀ°¡ÿÀ°¨ÿÀ°¬ÿå°°°±°²ÿå°³°¶ÿÓ°¸ÿÁ°¹ÿç°ºÿ°°¼ÿ¶°¾ÿ³°¿ÿ¶°Áÿ¶°Âÿê°ÄÿɰÅÿ¶°Æÿ°°ÇÿɰÈÿɰÉÿ°ÊÿÞ°ËÿɰÌÿî°Íÿ°°Îÿ´°Ü*°ÝS°ùÿ̰ÿ×°ÿë°I°I°°>°ÿì°ÿì°P°Qÿë°¦°§)°¨^°©^°ª°«4± ÿÖ± ±ÿϱÿ¿±ÿ®±ÿÚ±"±#ÿƱ@ÿæ±^ÿê±cÿ²±lÿ´±n ±o±xÿà±Óÿð±Ô ±ÕÿÛ±Öÿ¿±×ÿæ±Ù"±Úÿó±Ýÿϱžÿ±±¡ÿ±±£ ±¨ÿ±±©ÿø±¬ÿ×±°±±#±²ÿ×±³±¶ÿ×±¹ÿ걺ÿȱ¼ÿÛ±¾ÿܱ¿ÿÛ±ÁÿÛ±ÄÿϱÅÿÛ±Æÿ¿±ÇÿϱÈÿϱÊÿÞ±ËÿϱÌÿñ±ÍÿÞ±Îÿ±Ü*±ÝS±)±T± ±4±±±P±¦±§)±¨^±©^±ª±«*²ÿò² ÿé² ÿô² ÿä²ÿß²ÿÖ²"ÿÞ²#ÿõ²>ÿö²@ÿÖ²`ÿã²cÿâ²nÿð²oÿö²ÔÿزղÖÿã²Øÿó²Ùÿì²ÚÿÚ²Üÿ沞ÿí²¡ÿí²£ÿñ²¨ÿí²©ÿﲫÿí²¯ÿϲ°ÿå²±ÿײ³ÿè²¶ÿó²·ÿò²ºÿõ²¼ÿò²¾ÿó²¿ÿô²Àÿá²Åÿô²Æÿô²Êÿõ²Íÿõ³ ÿç³ ÿæ³ÿä³ ³ ³#ÿæ³@ÿÞ³^ÿæ³c ³lÿѳÓÿé³ÕÿÕ³Ö³×ÿá³Ù³Úÿì³Ûÿó³Ýÿгž³¡³£ ³¨³¬ÿè³° ³±³²ÿè³³³¶ÿ본ÿá³¹ÿì³½ÿê³¾ÿô³À³Âÿõ³Ãÿï³Äÿî³Çÿî³Èÿî³Éÿâ³Êÿö³Ëÿî³Ì³ÍÿݳÎÿí³Ü ³Ý>³¦ÿþ³§ÿþ³¨>³©>³ªÿþ³«´ ÿì´ÿ•´ÿô#ÿï´>ÿí´@ÿδ`ÿò´lÿö´Óÿö´ÖÿÒ´Øÿõ´ÚÿÖ´Üÿè´žÿÏ´¡ÿÓ´¨ÿÍ´©ÿé´´ÿõ´¶ÿò´·ÿð´¹ÿï´ºÿð´»ÿî´¼ÿî´¾ÿï´¿ÿî´Áÿî´Ãÿì´Äÿò´Åÿî´Æÿë´Çÿò´Èÿñ´Êÿñ´Ëÿñ´Íÿñ´Îÿï´Üÿþ´Ý*´¨´©´«ÿùµ ÿäµ ÿîµ ÿñµ"ÿéµ#ÿòµ>ÿôµ@ÿÙµ`ÿåµnÿíµoÿöµÓÿöµÖ µÙÿêµÚÿáµÜÿîµ°ÿëµ±ÿÛµ´ÿóµ»ÿöµÃÿô¶ ÿå¶ ÿõ¶ ÿè¶ ÿì¶"ÿä¶@ÿâ¶^ÿò¶`ÿë¶lÿô¶nÿå¶oÿè¶À¶Âÿñ¶Ëÿó¶Ì¶Íÿô¸ ÿö¸ ÿí¸ÿê¸ÿã¸"ÿà¸@ÿå¸`ÿñ¸cÿâ¸o ¸¸¸¹ÿô¸»ÿó¸Àÿç¸Â¸Äÿô¸Æÿð¸Çÿô¸Èÿô¸É¸Ëÿô¸Ì ¸Îÿô¹ÿð¹ ÿ๠ÿõ¹ ÿê¹¹ÿí¹ÿì¹ÿí¹"ÿò¹>ÿí¹cÿî¹nÿÔ¹oÿß¹·ÿô¹¸ÿï¹Âÿö¹Éÿó¹Ìÿïº ÿíº ÿïºÿñº#ÿôº@ÿâº^ÿëº`ÿòºlÿåºÀºÄÿöºÊÿôºËÿòºÌºÍÿó» #» ÿè»ÿ×»,»"»@&»`&»c»lÿÍ»¶ÿñ»¸ÿ仹ÿñ»½ÿö»À#»ÂÿÙ»Äÿî»Çÿí»Èÿð»ÉÿÙ»Êÿñ»Ëÿæ»Ì#»Íÿâ»Îÿö»Ü4»Ý^¼ ÿͼ ÿò¼ ÿè¼"ÿæ¼#ÿõ¼nÿÙ¼oÿÓ¼¸ÿð¼Âÿõ¼Íÿí½ ÿõ½ ÿé½ÿá½ÿß½@ÿñ½`ÿñ½cÿã½Àÿï¾ ÿÚ¾ ÿô¾ ÿñ¾@ÿâ¾^ÿñ¾`ÿñ¾lÿô¾nÿæ¾oÿï¾Çÿö¾Ëÿò¾Íÿó¿ ÿð¿ÿå¿ ¿#ÿì¿@ÿç¿^ÿí¿`ÿö¿lÿÞ¿¶ÿ꿹ÿê¿»ÿì¿À¿Ãÿõ¿Äÿã¿Çÿã¿Èÿã¿Ëÿã¿Ì¿ÎÿíÀ ÿ¿À ÿïÀ ÿÎÀ#ÿôÀ@ÿåÀ^ÿôÀ`ÿõÀnÿÅÀoÿÈÀ¸ÿíÀ½ÿïÀÀÀÂÿîÀÉÿâÀÌÀÍÿñÁ ÿæÁ ÿíÁ ÿãÁ"ÿæÁ#ÿòÁ>ÿóÁ@ÿÛÁ`ÿæÁnÿðÁ»ÿôÁÃÿõÁÇÿõÁËÿõÁÍÿí ÿò ÂÿÝÂÿàÂ"ÿÙÂ@ÿæÂ`ÿõÂcÿÜÂo ¶ÿô¸¹ÿö»ÿõÂÀÿëÂÂÂÄÿòÂÆÿòÂÇÿòÂÈÿòÂÉÂËÿòÂÌÂÎÿöÄ ÿàÄ ÿåÄ ÿìÄÄÿìÄÿéÄÿîÄ"ÿâÄ>ÿöÄ@ÿâÄ`ÿëÄcÿíÄnÿêÄoÿåĸÿóÄÂÿòÄÌÿïÅ ÿæÅ ÿæÅ"ÿæÅ>ÿöÅ@ÿÞÅ`ÿìÅnÿðÆ ÿàÆ ÿõÆ ÿåÆ ÿìÆÆÿíÆÿêÆÿñÆ"ÿäÆ>ÿíÆ@ÿâÆ`ÿëÆcÿëÆnÿêÆoÿ寷ÿôƸÿõƼÿôÆÁÿôÆÂÿòÆÌÿïÇ ÇÿÞÇ"Ç@Ç^ÿñÇ`ÇcÇlÿíÈ ÿòÈÿàÈÿàÈ"ÿâÈ@ÿæÈ`ÿõÈcÿãȸȹÿôÈÀÿîÈÂÈÉÈÌÉ ÿõÉÿÙÉ É"ÿìÉ@ÿåÉ^ÿëÉ`ÿòÉlÿäɸɹÿðÉ»ÿöÉÂÉÄÿòÉÇÿòÉÈÿòÉÉÉËÿòÉÌÊ ÿéÊ ÿâÊÿìÊÿæÊÿõÊ"ÿåÊ@ÿÚÊ`ÿéÊcÿìÊnÿóÊÀÿõË ÿàË ÿõË ÿåË ÿìËËÿèËÿéËÿìË"ÿâË>ÿíË@ÿâË`ÿëËcÿçËnÿêËoÿåË·ÿô˸ÿò˼ÿôËÁÿôËÂÿòËÌÿïÌ ÿñÌÿðÌ"ÿõÌ#ÿòÌ@ÿåÌ^ÿëÌ`ÿôÌlÿã̶ÿï̹ÿïÌ»ÿîÌÀÌÃÿöÌÄÿëÌÇÿëÌÈÿëÌËÿëÌÌÌÎÿòÍ ÿéÍ ÿëÍ ÿÖÍÿßÍÿÞÍÿõÍ"ÿâÍ#ÿñÍ>ÿêÍ@ÿÊÍ`ÿÚÍcÿÞÍnÿóÍ·ÿñͺÿöͼÿíÍÀÿîÍÁÿñÍÆÿíÍÍÿíÎ ÿÒÎ ÿãÎ ÿíÎÿïÎÿìÎÿñÎ"ÿãÎ@ÿÚÎ`ÿæÎcÿñÎnÿÛÎoÿÜθÿòÎÂÿöÎÌÿó>I8t"^8 c8@ #O O £€  o  o ’  d Ü D°  d º  d €: ’ ’ Fô 4Ò 4ÒCopyright 2010 Canonical Ltd. Licensed under the Ubuntu Font Licence 1.0Dalton Maag LtdDaltonMaagLtd: Ubuntu Regular 0.71The Ubuntu Font Family are libre fonts funded by Canonical Ltd on behalf of the Ubuntu project. The font design work and technical implementation is being undertaken by Dalton Maag. The typeface is sans-serif, uses OpenType features and is manually hinted for clarity on desktop and mobile computing screens. The scope of the Ubuntu Font Family includes all the languages used by the various Ubuntu users around the world in tune with Ubuntu's philosophy which states that every user should be able to use their software in the language of their choice. The project is ongoing, and we expect the family will be extended to cover many written languages in the coming years.Ubuntu and Canonical are registered trademarks of Canonical Ltd.Version 0.71http://www.daltonmaag.com/Copyright 2010 Canonical Ltd. Licensed under the Ubuntu Font Licence 1.0Dalton Maag LtdDaltonMaagLtd: Ubuntu Regular 0.71The Ubuntu Font Family are libre fonts funded by Canonical Ltd on behalf of the Ubuntu project. The font design work and technical implementation is being undertaken by Dalton Maag. The typeface is sans-serif, uses OpenType features and is manually hinted for clarity on desktop and mobile computing screens. The scope of the Ubuntu Font Family includes all the languages used by the various Ubuntu users around the world in tune with Ubuntu's philosophy which states that every user should be able to use their software in the language of their choice. The project is ongoing, and we expect the family will be extended to cover many written languages in the coming years.Ubuntu and Canonical are registered trademarks of Canonical Ltd.Version 0.71http://www.daltonmaag.com/ÿ…Oî  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`aĦū‚ÂØÆä¾°¶·´µ‡²³ÙŒå¿±»£„…½–膎‹©¤Šƒ“òó—ˆÞñžªõôö¢­ÉÇ®bcdËeÈÊÏÌÍÎéfÓÐѯgð‘ÖÔÕhëí‰jikmln oqprsutvwêxzy{}|¸¡~€ìîº     ýþÿ !øù"#$%&'()*+,-./012×3456789:;<=>?@ABCâãDEFGHIJKLMNOPQRSTUVWXYZ[\]ûü^_`abcdefghijklmnopqrstuvwæçxyz{|}~áÛÜÝà߀‚ƒ„…†‡¼ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²˜³š™´ïµ¶¥’œ§”•¹·À¸Á¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ŸÀÁÂÃÄÅÆÇÈÉÊËÌÍΛÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö.nullEurouni00A0uni00ADmacronperiodcenteredAmacronamacronAbreveabreveAogonekaogonek Ccircumflex ccircumflex Cdotaccent cdotaccentDcarondcaronDcroatdcroatEmacronemacronEbreveebreve Edotaccent edotaccentEogonekeogonekEcaronecaron Gcircumflex gcircumflex Gdotaccent gdotaccent Gcommaaccent gcommaaccent Hcircumflex hcircumflexHbarhbarItildeitildeImacronimacronIbreveibreveIogonekiogonek Idotaccenti.loclIJij Jcircumflex jcircumflex Kcommaaccent kcommaaccentkgreenlandic.case kgreenlandicLacutelacute Lcommaaccent lcommaaccentLcaronlcaronLdotldotNacutenacute Ncommaaccent ncommaaccentNcaronncaronnapostrophe.case napostropheEngengOmacronomacronObreveobreve Ohungarumlaut ohungarumlautRacuteracute Rcommaaccent rcommaaccentRcaronrcaronSacutesacute Scircumflex scircumflexuni0162uni0163TcarontcaronTbartbarUtildeutildeUmacronumacronUbreveubreveUringuring Uhungarumlaut uhungarumlautUogonekuogonek Wcircumflex wcircumflex Ycircumflex ycircumflexZacutezacute Zdotaccent zdotaccentlongs Scommaaccent scommaaccentuni021Auni021Bdotlessj apostropheuni02C9WgravewgraveWacutewacute Wdieresis wdieresisYgraveygrave zerosuperior foursuperior fivesuperior sixsuperior sevensuperior eightsuperior ninesuperior zeroinferior oneinferior twoinferior threeinferior fourinferior fiveinferior sixinferior seveninferior eightinferior nineinferior afii61289 estimatedonethird twothirds oneeighth threeeighths fiveeighths seveneighthsonefifth twofifths threefifths fourfifthsonesixth fivesixths oneseventh twosevenths threesevenths foursevenths fivesevenths sixseventhsoneninth twoninths fourninths fiveninths sevenninths eightninthsDeltauni2126uni2215uni2219f_ff_if_lf_f_if_f_lzero.altone.alttwo.alt three.altfour.altfive.altsix.alt seven.alt eight.altnine.alt zero.supsone.supstwo.sups three.sups four.sups five.supssix.sups seven.sups eight.sups nine.sups zero.sinfone.sinftwo.sinf three.sinf four.sinf five.sinfsix.sinf seven.sinf eight.sinf nine.sinf caron.alt commaaccentrevcommaaccentcaron.alt.short Parenleft ParenrightHyphenSlashAt Bracketleft Backslash Bracketright Braceleft Braceright GuilsinglleftBulletEndashEmdashGuilsinglright Exclamdown GuillemotleftGuillemotright Questiondownuni0180uni0181uni0182uni0183uni0184uni0185uni0186uni0187uni0188uni0189uni018Auni018Buni018Cuni018Duni018Euni018Funi0190uni0191uni0193uni0194uni0195uni0196uni0197uni0198uni0199uni019Auni019Buni019Cuni019Duni019Euni019FOhornohornuni01A2uni01A3uni01A4uni01A5uni01A6uni01A7uni01A8uni01A9uni01AAuni01ABuni01ACuni01ADuni01AEUhornuhornuni01B1uni01B2uni01B3uni01B4uni01B5uni01B6uni01B7uni01B8uni01B9uni01BAuni01BBuni01BCuni01BDuni01BEuni01BFuni01C0uni01C1uni01C2uni01C3uni01C4uni01C5uni01C6uni01C7uni01C8uni01C9uni01CAuni01CBuni01CCuni01CDuni01CEuni01CFuni01D0uni01D1uni01D2uni01D3uni01D4uni01D5uni01D6uni01D7uni01D8uni01D9uni01DAuni01DBuni01DCuni01DDuni01DEuni01DFuni01E0uni01E1uni01E2uni01E3uni01E4uni01E5Gcarongcaronuni01E8uni01E9uni01EAuni01EBuni01ECuni01EDuni01EEuni01EFuni01F0uni01F1uni01F2uni01F3uni01F4uni01F5uni01F6uni01F7uni01F8uni01F9 Aringacute aringacuteAEacuteaeacute Oslashacute oslashacuteuni0200uni0201uni0202uni0203uni0204uni0205uni0206uni0207uni0208uni0209uni020Auni020Buni020Cuni020Duni020Euni020Funi0210uni0211uni0212uni0213uni0214uni0215uni0216uni0217uni021Cuni021Duni021Euni021Funi0220uni0221uni0222uni0223uni0224uni0225uni0226uni0227uni0228uni0229uni022Auni022Buni022Cuni022Duni022Euni022Funi0230uni0231uni0232uni0233uni0234uni0235uni0236uni0238uni0239uni023Auni023Buni023Cuni023Duni023Euni023Funi0240uni0241uni0242uni0243uni0244uni0245uni0246uni0247uni0248uni0249uni024Auni024Buni024Cuni024Duni024Euni024Funi0292breve_inverted double_grave ring_acutedieresis_macron dot_macrondieresis_gravedieresis_acutedieresis_breve tilde_macron acute.asccircumflex.asc caron.ascdieresis_grave.capdieresis_acute.capdieresis_breve.capuni0400 afii10023 afii10051 afii10052 afii10053 afii10054 afii10055 afii10056 afii10057 afii10058 afii10059 afii10060 afii10061uni040D afii10062 afii10145 afii10017 afii10018 afii10019 afii10020 afii10021 afii10022 afii10024 afii10025 afii10026 afii10027 afii10028 afii10029 afii10030 afii10031 afii10032 afii10033 afii10034 afii10035 afii10036 afii10037 afii10038 afii10039 afii10040 afii10041 afii10042 afii10043 afii10044 afii10045 afii10046 afii10047 afii10048 afii10049 afii10065 afii10066 afii10067 afii10068 afii10069 afii10070 afii10072 afii10073 afii10074 afii10075 afii10076 afii10077 afii10078 afii10079 afii10080 afii10081 afii10082 afii10083 afii10084 afii10085 afii10086 afii10087 afii10088 afii10089 afii10090 afii10091 afii10092 afii10093 afii10094 afii10095 afii10096 afii10097uni0450 afii10071 afii10099 afii10100 afii10101 afii10102 afii10103 afii10104 afii10105 afii10106 afii10107 afii10108 afii10109uni045D afii10110 afii10193afii10066.locluni0462uni0463uni0472uni0473uni0474uni0475uni048Auni048Buni048Cuni048Duni048Euni048F afii10050 afii10098uni0492uni0493uni0494uni0495uni0496uni0497uni0498uni0499uni049Auni049Buni049Cuni049Duni049Euni049Funi04A0uni04A1uni04A2uni04A3uni04A4uni04A5uni04A6uni04A7uni04A8uni04A9uni04AAuni04ABuni04ACuni04ADuni04AEuni04AFuni04B0uni04B1uni04B2uni04B3uni04B4uni04B5uni04B6uni04B7uni04B8uni04B9uni04BAuni04BBuni04BCuni04BDuni04BEuni04BFuni04C0uni04C1uni04C2uni04C3uni04C4uni04C5uni04C6uni04C7uni04C8uni04C9uni04CAuni04CBuni04CCuni04CDuni04CEuni04CFuni04D0uni04D1uni04D2uni04D3uni04D4uni04D5uni04D6uni04D7uni04D8uni04D9uni04DAuni04DBuni04DCuni04DDuni04DEuni04DFuni04E0uni04E1uni04E2uni04E3uni04E4uni04E5uni04E6uni04E7uni04E8uni04E9uni04EAuni04EBuni04ECuni04EDuni04EEuni04EFuni04F0uni04F1uni04F2uni04F3uni04F4uni04F5uni04F6uni04F7uni04F8uni04F9 afii61352 afii00208uni20B4uni20AEtengeroublekratkaAlphaBetaGammauni0394EpsilonZetaEtaThetaIotaKappaLambdaMuNuXiOmicronPiRhoSigmaTauUpsilonPhiChiPsialphabetagammadeltaepsilonzetaetathetaiotakappalambdauni03BCnuxiomicronrhosigma1sigmatauupsilonphichipsiomega Alphatonos EpsilontonosEtatonos Iotatonos Iotadieresis Omicrontonos UpsilontonosUpsilondieresis Omegatonos alphatonos epsilontonosetatonos iotatonos iotadieresisiotadieresistonos omicrontonosupsilondieresis upsilontonosupsilondieresistonos omegatonostonos tonos.cap dieresistonosuni1F00uni1F01uni1F02uni1F03uni1F04uni1F05uni1F06uni1F07uni1F08uni1F09uni1F0Auni1F0Buni1F0Cuni1F0Duni1F0Euni1F0Funi1F10uni1F11uni1F12uni1F13uni1F14uni1F15uni1F18uni1F19uni1F1Auni1F1Buni1F1Cuni1F1Duni1F20uni1F21uni1F22uni1F23uni1F24uni1F25uni1F26uni1F27uni1F28uni1F29uni1F2Auni1F2Buni1F2Cuni1F2Duni1F2Euni1F2Funi1F30uni1F31uni1F32uni1F33uni1F34uni1F35uni1F36uni1F37uni1F38uni1F39uni1F3Auni1F3Buni1F3Cuni1F3Duni1F3Euni1F3Funi1F40uni1F41uni1F42uni1F43uni1F44uni1F45uni1F48uni1F49uni1F4Auni1F4Buni1F4Cuni1F4Duni1F50uni1F51uni1F52uni1F53uni1F54uni1F55uni1F56uni1F57uni1F59uni1F5Buni1F5Duni1F5Funi1F60uni1F61uni1F62uni1F63uni1F64uni1F65uni1F66uni1F67uni1F68uni1F69uni1F6Auni1F6Buni1F6Cuni1F6Duni1F6Euni1F6Funi1F70uni1F71uni1F72uni1F73uni1F74uni1F75uni1F76uni1F77uni1F78uni1F79uni1F7Auni1F7Buni1F7Cuni1F7Duni1F80uni1F81uni1F82uni1F83uni1F84uni1F85uni1F86uni1F87uni1F88uni1F89uni1F8Auni1F8Buni1F8Cuni1F8Duni1F8Euni1F8Funi1F90uni1F91uni1F92uni1F93uni1F94uni1F95uni1F96uni1F97uni1F98uni1F99uni1F9Auni1F9Buni1F9Cuni1F9Duni1F9Euni1F9Funi1FA0uni1FA1uni1FA2uni1FA3uni1FA4uni1FA5uni1FA6uni1FA7uni1FA8uni1FA9uni1FAAuni1FABuni1FACuni1FADuni1FAEuni1FAFuni1FB0uni1FB1uni1FB2uni1FB3uni1FB4uni1FB6uni1FB7uni1FB8uni1FB9uni1FBAuni1FBBuni1FBCuni1FBDuni1FBEuni1FBFuni1FC0uni1FC1uni1FC2uni1FC3uni1FC4uni1FC6uni1FC7uni1FC8uni1FC9uni1FCAuni1FCBuni1FCCuni1FCDuni1FCEuni1FCFuni1FD0uni1FD1uni1FD2uni1FD3uni1FD6uni1FD7uni1FD8uni1FD9uni1FDAuni1FDBuni1FDDuni1FDEuni1FDFuni1FE0uni1FE1uni1FE2uni1FE3uni1FE4uni1FE5uni1FE6uni1FE7uni1FE8uni1FE9uni1FEAuni1FEBuni1FECuni1FEDuni1FEEuni1FEFuni1FF2uni1FF3uni1FF4uni1FF6uni1FF7uni1FF8uni1FF9uni1FFAuni1FFBuni1FFCuni1FFDuni1FFE uni1F88.alt uni1F89.alt uni1F8A.alt uni1F8B.alt uni1F8C.alt uni1F8D.alt uni1F8E.alt uni1F8F.alt uni1F98.alt uni1F99.alt uni1F9A.alt uni1F9B.alt uni1F9C.alt uni1F9D.alt uni1F9E.alt uni1F9F.alt uni1FA8.alt uni1FA9.alt uni1FAA.alt uni1FAB.alt uni1FAC.alt uni1FAD.alt uni1FAE.alt uni1FAF.alt uni1FBC.alt uni1FCC.alt uni1FFC.altuni20B9uniE0FFuniEFFDuniF000ÿÿ BŽcyrlgrek latn,ÿÿÿÿÿÿkernkern&kern6  $,4<DLTHÊ-Ö€^€£|«ôÒð¼÷iÜê .8Ndr€š¨¶Ðæü*4>H^t~ˆ’ ¶ÌÚð,6@N\jp~Œ’ ®¼ÊÐÖÜêDJTZ|†Œ¢ð.Pfpv|ºøþ "(.4:@FLŠÈDJPV\šØTZ`flrx~„Ê  ÉÊ3 Ç Ê ) Ê Ê)( Ê  ÇÊ(((ÇÊ(((Ê)( Ê)( Ç>ÉVÊfffNÊ  Ê  Ç>ÉVÊfffNÉÊ3 ÉÊ3 ÉÊ3 Ê Ê)( Ê  Ê  Ê  ÇÊ(((ÉÊ3 Ê Ê Ê Ê)( ÇÊ(((Ç Ê ) Ê  ÉÊ3 ÉÊ3 Ê)( Ê  Ê  Ê  Ê  Ê)( Ê)( *|ÿÍŠÿá)*|ÿÍŠÿá*|ÿÌŠÿá)*|ÿÍŠÿá*|ÿÍŠÿá*|ÿÌŠÿá*|ÿÌŠÿá)))*|ÿÍŠÿáÜ4ÝhøÿÁùÿËûÿÒÿËÿÖÿÑ?O/  P Qÿᦧ*¨^©^ª «4Ý4ÜÝIÝÜÝ?)?4§ ¨>©IÜÝI Ü*ÝS¨?©I«Ü*ÝSùÿÌÿ×ÿëII>ÿìÿìPQÿ릧)¨^©^ª«4Ü*ÝS)T 4P¦§)¨^©^ª«*Ü Ý>¦ÿþ§ÿþ¨>©>ªÿþ«ÜÿþÝ*¨©«ÿùÜ4Ý^Ý4ÝÜ*ÝS)T 4P¦§)¨^©^ª«*Ü*ÝS)T 4P¦§)¨^©^ª«*Ý4Ý4Ý4Ý4Ý4Ý4ÝÝÝÝÝÝÝÝÜ*ÝS)T 4P¦§)¨^©^ª«*Ü*ÝS)T 4P¦§)¨^©^ª«*Ü*ÝS)T 4P¦§)¨^©^ª«*Ü*ÝS)T 4P¦§)¨^©^ª«*Ý4Ý4ÝÝÜ*ÝS)T 4P¦§)¨^©^ª«*Ü*ÝS)T 4P¦§)¨^©^ª«*Ü*ÝS)T 4P¦§)¨^©^ª«*Ü*ÝS)T 4P¦§)¨^©^ª«* ÝÝÝÝÝÝÝÝïLõpúˆ.gÿñÿôÿñÿåÿèÿìÿäÿâÿëÿèÿóÿôÿóÿÛÿåÿäÿâÿëÿßÿêÿßÿïÿìÿóÿóÿò ÿåÿàÿëÿãÿôÿðÿó ÿô' ''ÿÖÿÝÿíÿÌÿïÿË ÿñÿóÿïÿÛÿèÿëÿåÿãÿëÿâÿâÿô ÿç ÿåÿíÿÞÿæÿãÿãÿãÿåÿæÿæÿæÿìÿêÿñÿðÿòÿîÿáÿçÿêÿäÿâÿëÿæÿêÿòÿóÿòÿàÿåÿìÿâÿâÿëÿåÿéÿêÿïÿìÿóÿóÿòÿòÿôÿòÿàÿåÿìÿäÿâÿëÿåÿêÿêÿïÿîÿóÿóÿò ÿÕÿèÿÒÿàÿëÿÉÿíÿÌÿôÿåÿÙÿëÿäÿòÿöÿò ÿôÿóÿöÿô ÿÙÿæ ÿàÿòÿóÿòÿÝÿïÿÜÿñÿòÿòÿô ÿÝÿæ ÿäÿôÿàÿòÿâÿóÿôÿåÿëÿãÿëÿëÿëÿëÿèÿëÿëÿëÿîÿÞÿëÿïÿäÿßÿìÿêÿìÿðÿîÿíÿíÿîÿïÿôÿóÿóÿôÿäÿçÿäÿØÿåÿßÿìÿëÿëÿâÿáÿîÿÞÿë ÿëÿòÿôÿòÿØÿåÿìÿäÿâÿëÿÜÿêÿÜÿïÿîÿóÿóÿòÿòÿôÿÖÿìÿèÿÞÿÞ<-FFÿõÿõÿõÿõÿõÿõÿõÿõ ÿõZÿõÿõÿõÿõÿõÿõÿëÿíÿñÿ²ÿÁÿåÿöÿ¼ÿ¹ÿìÿíÿóÿðÿóÿóÿóÿóÿóÿñÿñ ÿíÿíÿíÿíÿÀÿöÿÂÿîÿ±ÿí!"ÿîÿåÿíÿÌÿíÿð !ÿñÿîÿòÿØÿòÿõÿçÿõÿìÿÞÿêÿëÿóÿöÿõÿíÿóÿçÿõÿëÿôÿòÿôÿóÿëÿðÿïÿð ÿâÿäÿÓÿñÿñÿñÿñÿñÿñÿñÿïÿìÿìÿìÿìÿìÿé ÿôÿîÿÒÿðÿéÿöÿÒÿðÿæÿßÿÙÿÖÿãÿôÿÕÿìÿòÿßÿÞÿõÿòÿåÿïÿïÿ×ÿôÿíÿçÿõÿèÿñÿÖÿâÿìÿëÿëÿãÿõÿòÿçÿâÿôÿñÿçÿáÿêÿïÿçÿçÿçÿðÿóÿÕÿêÿó ÿòÿíÿéÿïÿéÿï ÿñÿðÿðÿñÿðÿòÿíÿäÿäÿäÿäÿêÿëÿîÿïÿíÿðÿôÿãÿïÿõÿôÿê ÿ×ÿÄÿÜÿæÿôÿòÿòÿòÿ¿ÿñÿ™ÿëÿòÿòÿòÿîÿçÿîÿäÿäÿäÿÍÿóÿóÿóÿóÿèÿÒÿ°ÿ´ÿÜÿõÿæÿñÿöÿôÿçÿîÿôÿîÿîÿöÿçÿöÿöÿìÿíÿíÿöÿÞÿíÿÜÿîÿöÿóÿöÿñÿïÿçÿóÿìÿñÿðÿòÿÐÿöÿß ÿæÿÑÿíÿÃÿëÿëÿëÿçÿëÿëÿëÿíÿòÿóÿÝÿÝÿÝÿÝ ÿî"#ÿî "ÿäÿÈÿðÿóÿÈÿöÿóÿóÿØÿÛÿìÿ‚ÿuÿàÿñÿŠ ÿˆ ÿ»ÿèÿÙÿôÿôÿô ÿôÿôÿôÿÓÿÓÿÓÿÓÿÿîÿœÿÓÿÿöÿäÿôÿ¬ÿíÿ¦ÿÄÿîÿ°ÿõÿßÿúÿøÿðÿíÿéÿäÿÞÿÖÿãÿöÿÖÿðÿßÿâÿõÿóÿåÿïÿðÿ×ÿôÿíÿçÿöÿèÿñÿØÿæÿðÿëÿìÿäÿöÿòÿèÿåÿòÿìÿåÿêÿô ÿèÿ×ÿè ÿÂÿôÿîÿëÿëÿëÿ¦ÿðÿÿëÿàÿõÿíÿôÿÎÿ¡ÿîÿ¬ÿíÿÙÿåÿñ ÿõÿõÿîÿïÿîÿéÿÞÿöÿðÿßÿìÿõÿòÿåÿïÿðÿ×ÿôÿíÿçÿöÿèÿñÿØÿìÿöÿòÿèÿåÿòÿìÿåÿêÿóÿßÿð  ÿïÿìÿñÿñÿòÿõÿõÿõÿõÿöÿíÿôÿíÿòÿè ÿêÿ¯ÿê ÿàÿªÿîÿâÿÏÿèÿ«ÿÉÿÉÿÉÿµÿ±ÿ½ÿ´ÿÉÿÉÿÉÿÍÿÞÿ¬ÿØÿÓÿØÿØÿÓÿåÿåÿåÿåÿåÿÀÿ¦ÿ¸ÿÄÿ¼ÿîÿÏÿõÿÃÿ¸ÿ¾ÿÛÿêÿ×ÿîÿöÿöÿëÿöÿðÿöÿöÿñÿðÿÞÿðÿìÿòÿïÿÓÿÓÿÓÿµÿÓÿÓÿÓÿâÿñÿâÿâÿçÿïÿïÿïÿïÿÂÿ¡ÿúÌÚÔÝlP„ÿèÿþÿ®ÿßÿöÿ½ÿìÿÚÿäÿèÿ¶ÿÕÿõÿÍÿæ!ÿèÿñÿïÿñÿ×ÿñÿíÿÏÿðÿÑÿõÿíÿÛÿïÿÚÿìÿæÿò  ÿçÿèÿîÿÄÿðÿðÿðÿðÿÛÿãÿêÿêÿêÿæÿëÿêÿëÿêÿëÿïÿôÿòÿöÿçÿä ÿæÿÞÿæ ÿÑÿã ÿïÿêÿÚÿïÿìÿèÿèÿèÿè ÿîÿîÿîÿîÿîÿîÿïÿðÿõÿùÿæÿÛ ÿôÿóÿíÿÛÿóÿÞÿäÿ°ÿÖÿÏÿ®ÿÚÿÆÿæÿêÿ²ÿ´ÿàÿ²ÿÕ !#ÿÙÿæÿÒÿðÿÉÿó"ÿ±ÿÿ×ÿ×ÿ×ÿ×ÿ¿ÿ×ÿÏÿÏÿÏÿÏÿØÿÏÿØÿÏÿØÿìÿñ ÿïÿÝÿø ÿíÿëÿÄÿðÿÕÿÝÿÎÿñ ÿîÿÈÿòÿä ÿÜÿÜÿÜÿÜ ÿðÿïÿðÿéÿïÿñÿéÿéÿè ÿíÿÉÿëÿòÿñÿïÿóÿôÿôÿòÿòÿðÿöÿÏÿ×ÿÖÿÇÿßÿÙÿÞÿçÿðÿÔÿëÿÕÿÖ ÿíÿäÿóÿåÿÈÿÄÿñÿÑ#ÿæÿåÿðÿóÿîÿòÿàÿ×ÿòÿéÿÜÿÜÿôÿóP ÿâÿâÿâÿâÿöÿîÿìÿäÿÞÿîÿäÿÕÿìÿóÿôÿôÿôÿôÿêÿôÿåPÿßÿãÿÛÿÜÿåÿäÿäÿÕÿÕÿÕÿÕÿ×ÿÚÿæÿöÿöÿöÿöÿöÿöÿðÿõÿôÿôÿæÿâÿâÿâÿîÿéPÿëÿìÿçÿçÿíÿãÿèÿëÿëÿÞÿõÿîÿŸÿçÿÀÿ†ÿöÿöÿz ÿ±ÿ…ÿçÿçÿçÿçÿôÿ| ÿµÿÿëÿëÿëÿëÿ½ÿ¶ÿÞ ÿ³ÿçÿçÿäÿáÿíÿ³ÿôÿßÿÔÿªÿÔÿëÿÍÿ²ÿìÿÖÿÕÿëÿòÿÎÿôÿáÿÎÿäÿðÿºÿ³ÿØ ÿ°ÿãÿãÿßÿßÿéÿ«ÿëÿóÿØÿõÿõÿõÿõÿôÿ³ "ÿÎÿ¹ÿåÿåÿæÿæ ÿ­ÿãÿëÿÑÿõÿõÿ¹ÿ‘ÿÑÿÙÿ»ÿ¾ÿÒÿÂÿÛÿÛÿÛÿÛÿ¼ÿÔÿáÿÚÿÔÿÜÿéÿÙÿÊÿæÿæÿöÿöÿöÿöÿÞÿôÿîÿðÿäÿÞÿÝÿèÿ×ÿõ ÿðÿðÿðÿðPÿðÿñÿîÿðÿòÿñÿâÿÏÿÞÿÝÿØÿâ ÿ¼!ÿØÿÁÿìÿìÿìÿì ÿÕÿõÿåÿëÿåÿ×ÿëÿóÿîÿñÿéÿêÿóPÿòÿòÿçÿçÿçÿçÿåÿïÿìÿëÿíÿíÿíÿíÿíÿíÿíÿíÿíÿíÿíÿí#ÿÄÿ×ÿçÿÈ"ÿìÿìÿëÿëÿðÿôÿôÿôÿôPÿõÿñÿíÿÄÿÒÿ¼ÿðÿØÿÒÿîÿÎÿÓ"ÿòÿòÿòÿòÿóÿìÿôÿðÿÙÿïÿó ÿðÿêÿñÿðÿðÿæÿêÿêÿñÿë ÿÌÿáÿÂÿîÿïÿïÿòÿðÿïÿòÿïÿäÿðÿôÿçÿáÿôÿóÿïÿëÿñÿäÿîÿìÿîÿíÿíÿìÿïÿñÿÆÿÇÿÙÿÊÿÝÿÝÿÛÿÛÿïÿîÿïÿîÿñÿÓÿÛÿåÿíÿßÿÓÿç?ÿò??ÿïÿìÿòÿòÿîÿôÿîÿóÿéÿéÿéÿéÿòÿñÿòÿîÿñÿòÿÜÿÜÿàÿóÿôÿñÿðÿíÿóÿæÿÜÿÐÿÓÿÚÿÔÿéÿèÿæÿæÿóÿÖÿÓÿÝÿîÿòÿèÿÐÿÞÿïÿèÿÖÿîÿìÿðÿóÿæÿñÿôÿôÿôÿñÿôÿôÿôÿîÿïÿóÿâÿâÿàÿàÿòÿñÿóÿíÿñÿóÿÐÿÍÿ×ÿñÿñÿóÿáÿÐÿôÿÚÿåÿäÿòÿôÿîÿîÿóÿßÿîÿåÿçÿéÿëÿóÿæÿîÿåÿåÿñÿîÿôÿòÿôÿòÿïÿéÿéÿìÿòÿòÿîÿòÿàÿèÿïÿæÿåÿåÿåÿôÿóÿôÿðÿóÿôÿÖÿÔÿÚÿñÿóÿïÿìÿñÿèÿ×ÿï>ÿðÿòÿóÿîÿòÿôÿñÿïÿîÿôÿóÿñÿñÿôÿòÿñÿðÿôÿäÿðÿñÿñÿðÿíÿóÿíÿÆÿáÿòÿÝÿÁÿêÿôÿôÿôÿðÿôÿôÿôÿîÿîÿîÿôÿìÿòÿïÿôÿôÿôÿôÿôÿôÿôÿôÿôÿôÿðÿëÿóÿôÿñÿíÿóÿóÿóÿóÿíÿæÿòÿÛÿØÿâÿízx@NPRTVX[fhjlªùý)MV…“®ÃÎÓâã-/AI‹“ ¢£¤§«®¯°±³´»ÐÑÕÖüýþÿ    6789žŸ ¡»¼½¾¿×ØÙÚÛÜÝÞP$9DFIIKUWW%Y[&]])dd*kk+mm,›±-³·DºÀIÂÂPÇÑQÓÓ\ÙÙ]Ûë^ííoïïpññqóórõõs÷÷tùùuûûvýýwÿ'x)6¡88¯::°<B±DD¸FF¹HHºJJ»LL¼OO½SS¾UU¿WYÀ[]ÃggÆiiÇkkȪ°ÉççÐììÑïðÒõõÔ÷÷ÕùùÖýþ×Ù  Üßã*8ä::ó<<ô>>õ@@öBG÷IIýKKþMRÿUUWY]a cikkmy{{#€$†‰&‹’*˜œ2££7¥¦8¬¬:t #9:;<=>@^`bceflnpstxz|~€†–š¸¹(NPRTVfhjl±²³´µ¶·¸¹ºÓÔÕÖרÙÛÜÝßàáãäåèéóöùúû  !#$)STV\}…“•–— ®°ž¤%  ## >> @@ ^^``ccefllnnppstxx††––ÓÝßá&ãä)žµ+Ï×CîõLüT Z!b(-j69pBIt’|ž¡€¬¯„»¿ˆÈËÏæ‘é驵¶¸ÂÄÎ ×âæí$öû, 2:"'B.5H:ŽP““¥™¦¢¢«¦«¬³º²ÃǺÊÌ¿ßæÂééÊi #>@^`ceflnpstx†–ÓÔÕÖרÙÚÛÜÝßàáãäÀÁÂÃÄÆÇÌÍÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâèëî!#-/13579;=AGI]^blmosy{ƒ…‡“•qÅÈÉÊËÎâãäåæçéêìíïðñòóôõö÷úþ     $%'()*,.0468:<>?@ABCEHIJKMOPQRSTUWY[_`cdfghjknpqtuwz|}„†ˆ‰Š‹ŒŽ‘” "&2DFLNXZ\aervx~$‰ !"#$%&'()*+,- * %&&&&&&,,,,      !!""#####% % % % & & & ) ) ) ***+++,,,,,,*+&&-"% &' )++!! & ,,,,, "& & % &   & & ) ) ,,& & & &  )­V? ++!@67Af89B:;<=C>DS*50$/.-,334 12%&  B8 2>@@@@@@E6888888;;;;>5555555....3&&&&@5@5@566667777//.......A-,,,,,3333a888111B2B2B2:%:%:%;&;&;&;&;&;&=>DDD$B2:% ===>$$$$$$$PLTMNQRU^OTT`O`000\6c"]K8<_-#F3888dW%':;&GH>DXe(YZ,3@5.8;&;&;&;&;&b@5@5E577-88X(73@5E58@5@5..8811;&;&I)/D@58888>3 @6[2J@>(n    ##::;;<<==>> @@ ^^ `` bbcceeffllnnppstxxzz||~~€€††––šš¸¸¹¹((NNPPRRTTVVffhhjjll±±*²²+³³,´´-µµ.¶¶/··0¸¸1¹¹2ºº3ÓÓÔÔÕÕ ÖÖ!××"ØØ#ÙÙ$ÛÛ%ÜÜ&ÝÝ'ßà áá(ãã'ää(åå)èè4éé5óó<öö=úú6ûû>?7  @ABC8DEFG  H!!I##J$$K))SSDTTGVV\\L}}MN……““•–:——;O  9®®°°G­Lm7''!`#abc$de"fg@h%i&jUB:D (z)*+{,|}T~x--./012E5896 C T 'mU %2 .l !!!!!!#bbbbeeeeah%%%%%%BBBBk((((((()++++}}}}-......6€6!(!(!(#)#)#)#)a**b+b+b+b+b+$,$,$,$,d|d|e}e}e}e}e}}e}"Tf~fgxgxgxgxgxh-h-h-h-ƒ%.%.%.j1j1j1U2U2U2EEEBBBBBB86:::{U2ET8886{{{{{{{XY_VZW\^[]A> ?K>>zzzR#)43tS=;c%Ff~qGh-%%.%.vME<Bno6:NyrpwOsaa*ggxgg-!(e}%.BBBBB!(!(($,$,f~%.%.NpTaa*$,h-!((%.!(!(b+b+e}e}%.%.j1j1BBPud|‚*:!(b+%.%.%.%.6H-H*0!#)IQ2J!b+6pžž¤¤$)* .))))))+  )))*!       ...   "( #, .-$%&')     ))+-%)+))  .)))%Y      ##>>@@^^``cc ee ff ll nnppst xx †† –– ÓÓÔÔÕÕÖÖ×רØÙÙÚÚÛÛÜÜÝÝßàááããääžžŸŸ  ¡¡ ¢¢!££"¤¤#¥¥$¦¦%§§&¨¨'©©(ªª)««*¬¬+­­,®®-¯¯.°°/±±0²²1³³2´´3µµ4ÏÏÐÐ!ÑÑ#ÒÓ%ÔÔ+ÕÖ0××4îõü! #!%(-+690BI4’žŸ! ¡#¬¯%»¾0¿¿-ÈÉ+ÊË4ÏÖ×Þ#ßæ4éé4†O( ( " : #@#+9"";##>><@@^^``cc'ee'ff#llnn%oo&pp%qq&st@xx?††––?^^&ÓÓ4ÔÔ7ÕÕKÖÖ8××2ØØQÙÙ5ÚÚ6ÛÛLÜÜ=ÝÝ3ßàKááJãã3ääJžžŸŸ   ¡¡¢¢££ ¤¤¥¥ ¦¦§§¨¨©©ªª«« ¬¬­­®®¯¯ °°±±²²³³´´µµ¶¶>··P¸¸.¹¹AººB»»N¼¼C½½/¾¾D¿¿EÀÀ-ÁÁF ÃÃMÄÄ!ÅÅGÆÆHÇÇ*ÈÈ)ÉÉ0ÊÊ,ËË$ÌÌÍÍ1ÎÎIÓÓÖÖØØ>ÙÙBÚÚCÛÝDÞÞ!ßá,ââIæí>öûB CD"'!.5,:AIJK>LMBNOCPQDRS!TU,VWIX_>hoCxIˆŽ>™C¦«D¬­³¶,·¸H¹º,½¾¿¿ÃÇIççèèéé<¶¶¸¸¹¹ºº»»¼¼½½¾¾¿¿ ÀÀ ÁÁ  ÄÄ ÅÅÆÆÇÇÈÈÉÉÊÊËËÌÌÍÍÎÎØØÙÙÚÚÛÝÞÞ ßáââæíöû "' .5:AJKLMNOPQRS TUVWX_`ghopwx€‡ˆŽ““™¢¢¦«³¶·¸¹ºÃÇÌÌP"    #"" ##&>>$@@^^``cceeffllnnoo ppqq st ††^^ ÖÖÚÚÜܶ¶'··!¸¸¹¹ºº,»»¼¼*½½(ÀÀ ÁÁ+ÂÂÃÃ)ÄÄÆÆÇÇÈÈÉÉÊÊ%ËËÌÌ ÍÍÎÎØØ'ÙÙ,ÚÚ*ÞÞßá%ââæí'öû, *"'.5%:AJK'LM,NO*RSTU%VWX_'ho*xˆŽ'™*³¶%·¸¹º%ÃÇb      ##>>@@^^``cc ee ff ll nnppst xx †† –– ÓÓÔÔÕÕÖÖ×רØÙÙÚÚÛÛÜÜÝÝßàááããääÀÁ"ÂÂÃà ÄÄ,ÆÇ)ÌÌ&ÍÍ%ÏÏ)ÐÐÑÑÒÒÓÓ ÔÔ!ÕÕ"ÖÖ#××$ØÙ%ÚÚ&ÛÛ'ÜÜ(ÝÝ)ÞÞ*ßß)àà+áá,ââ-èè)ëë)îî*!!##*-- // 1133#55$77&99&;;&==&AA-GG,II-]])^^#bb'll)mmooss"yy#{{$%%ƒƒ*……*‡‡*““ ••)òL, , ' M !(I(-N""O##">>P@@%^^#``$cc+ee+ff(ll&nn)oo*pp)qq*stIxxS††&––S^^*ÓÓEÔÔCÕÕgÖÖH××BÙÙFÚÚGÛÛhÜÜQÝÝDßàgááfããDääfÀÁÂÂÃÃÄÄÅÅ ÆÇÈÈÉÉÊÊËËÌÌ ÍÍÎÎÐÐ ÑÑÒÒÓÓÔÔÕÕÖÖ ×רÙÚÚ ÛÛÜÜÝÝÞÞßàááââããääåå ççèéêêëìííîîïïððVññ;òòWóó[ôô5õõ.öö6÷÷JøùXúúYûû7üüZýý[þþ/ÿÿ\]0<123[=^  _  >  [  8`9.T[a:iR7[UYX1b  ;!!""?##$$/%%&&1((X**K,,]--..[//00[1122[33 4465566J77 88Y99 ::Y;; <<Y== >>Y??@@[AABB[CCDD[EEFFcGGHH0IIJJ<KKLL4MMNN4OO PP3QQRR<SSTT=UUVV=WWYYZZ@[[\\@]]^^ __6``aa[bbcc7ddee[ffgg[hhii=kkZllmm nnVoo ppVqqrrdsstt.uu vveww xxeyy zz6{{||J}}~~A€€X‚‚Xƒƒ„„/……††/‡‡ˆˆ/‰‰ŠŠJ‹‹ŒŒ1ŽŽ11‘‘’’=““””[••––[ÅÐ   !"#$%%&&'&&"%&% ! $%%% %%"""ÍM6 6 / 0 W1.17+""2##(>>L@@*^^)``Kcc5ee5ff1ll,nn3oo4pp3qq4st.xx-††,––-^^4ÓÓJÔÔHÕÕÖÖ××IØØUÙÙÚÚÛÛ ÜÜVÝÝßàááããääÂÂ%ÄÄ$ÅÅaÈÈÉÉËË%ÎÎÐÐ!ÔÔÖÖG××SÛÛÜÜ"ÞÞ#áá$ââ%ããää&åå'çç]êê%ííïï`ðð:ññ;òò<óóôô=õõ>ööN÷÷Oøù?úú@ûûAüüBýýþþCÿÿDEXFY          >8  PQA9@?X   ;!!%""\###$$C%%&&X((?**,,D..002233G44N55S66O88@::@<<@>>@@@BBDDEEFFGG$HHEII%JJKKZLL[MMZNN[OO'PPYQQ%RRSS]TTUU]VVXXRYY_ZZ[[_\\^^G__NaabbccAeegghh]iikkBmm!nn:oo!pp:rrtt>uu^vvww^xxyyGzzN{{S||O}}T~~€€?‚‚?ƒƒ#„„C……#††C‡‡#ˆˆC‰‰ŠŠO‹‹ŒŒXŽŽXX‘‘]’’””––""&&22DD FF LL NN XX ZZ \\ aaeerrvvxx~~Q   "" ##>>@@ ^^``cc)ee)ffllnn oo pp qq stxx&††––&^^ ññôô'õõöö÷÷ûû(þþ#    (  $$&&**$4466FFHHJJLL!NN!PPRRTT#VV#ZZ%\\%__cc(ii#ttzz||~~"„„††ˆˆŠŠŒŒŽŽ’’# „Zcyrlgrek’latn´BGR 0MKD JSRB dÿÿ -9FS^iÿÿ  '.:GT_jÿÿ  (/;HU`kÿÿ  )0<IValÿÿ   1=DJQWbm"AZE BCRT ^MOL zROM ’TRK ªÿÿ !28>EKRXcnÿÿ "*3?LYdoÿÿ #+4@MZepÿÿ $5AN[fqÿÿ %6BO\grÿÿ &,7CP]hstcaseºcaseÂcaseÊcaseÒcaseÚcaseâcaseêcaseòcaseúdnomdnomdnomdnomdnomdnom dnom&dnom,dnom2dnom8dnom>fracDfracPfrac\frachfractfrac€fracŒfrac˜frac¤frac°frac¼ligaÈligaÎligaÔligaÚligaàligaæligaìligaòlocløloclþlocllocl loclloclnumrnumr"numr(numr.numr4numr:numr@numrFnumrLnumrRnumrXordn^pnumdpnumjpnumppnumvpnum|pnum‚pnumˆpnumŽpnum”pnumšpnum salt¦salt°sinfºsinfÀsinfÆsinfÌsinfÒsinfØsinfÞsinfäsinfêsinfðsinföss01üss01subssubssubssubs"subs(subs.subs4subs:subs@subsFsubsLsupsRsupsXsups^supsdsupsjsupspsupsvsups|sups‚supsˆsupsŽtnum”tnumštnum tnum¦tnum¬tnum²tnum¸tnum¾tnumÄtnumÊtnumÐ                                             8@HPX`hpx€ˆ˜ ¨°¸ÀÈÐØàèðøØÖÔÒÐÎÌÊÈ*,ŽðR´¶)l)Î)Ø**ü+*+X+†+–+¦+¶+ÈÁ+ÂÁ+¼Á+¼/+¶/+°/+°ž+´þb+¸2o”Žpqrstuo”Žpqrstuo”Žpqrstuo”Žpqrstuo”Žpqrstu+d…•+b2vwxyz{|}~xywvz{|}~vwxyz{|}~vwxyz{|}~vwxyz{|}~+2»¼½¾¿ÀÁÂÃĽ¾¼»¿ÀÁÂÃÄ»¼½¾¿ÀÁÂÃÄ»¼½¾¿ÀÁÂÃÄ»¼½¾¿ÀÁÂÃÄ*Ø2ÅÆÇÈÉÊËÌÍÎÇÈÆÅÉÊËÌÍÎÅÆÇÈÉÊËÌÍÎÅÆÇÈÉÊËÌÍÎÅÆÇÈÉÊËÌÍÎ*n2ÅÆÇÈÉÊËÌÍÎÇÈÆÅÉÊËÌÍÎÅÆÇÈÉÊËÌÍÎÅÆÇÈÉÊËÌÍÎÅÆÇÈÉÊËÌÍÎ*&nn*$0fH:,âԌʼ® F 8 v ð .ôªœÚT’tfX>¸öØÊ¼rd¢  Z"<#.$ $Ö%È&&€0bjrz‚Š’š¢ª²ºÂÊÒÚâêòú "*2:BJRZbjrz‚Š’š¢ª²ºÂÊÒÚ˜n‚n—nˆnŒnŽn„n”n˜n‚nŽ—npˆnqŒnrŽns„nt”nu˜nx‚ny—nzˆn{Œn|Žn}„n~”n˜n³‚n´—nµˆn¶Œn·Žn¸„n¹”nº˜n½‚n¾—n¿ˆnÀŒnÁŽn„nÔnĘnÇ‚nÈ—nɈnÊŒnËŽnÌ„nÍ”nÎ2:BJRZbjrz‚Š’š¢ª²ºÂÊÒÚâêƒn‰nn•nƒnމnqns•nuƒny‰n{n}•nƒn´‰n¶n¸•nºƒn¾‰nÀn•nănȉnÊnÌ•nÎ2:BJRZbjrz‚Š’š¢ª²ºÂÊÒÚâê™nŠnn…n™npŠnqns…nt™nzŠn{n}…n~™nµŠn¶n¸…n¹™n¿ŠnÀnÂ…nÙnÉŠnÊnÌ…nÍ&.6>FNV^fnv~†Ž–ž¦®‹n‘n–n‹nq‘ns–nu‹n{‘n}–n‹n¶‘n¸–nº‹nÀ‘n–nÄ‹nÊ‘nÌ–nÎ2:BJRZbjrz‚Š’š¢ª²ºÂÊÒÚâên’n†n—nnr’ns†nt—nun|’n}†n~—nn·’n¸†n¹—nºnÁ’n†n×nÄnË’n̆nÍ—nÎ&.6“n“ns“n}“n¸“n“nÌ "*2:BJRZbjr‡n˜n‡nt˜nu‡n~˜n‡n¹˜nº‡nØnćn͘nÎ&.6™n™nu™n™nº™nÄ™nÎ2:BJRZbjrz‚Š’š¢ª²ºÂÊÒÚâêƒn‰nn•nƒnމnqns•nuƒny‰n{n}•nƒn´‰n¶n¸•nºƒn¾‰nÀn•nănȉnÊnÌ•nÎ2:BJRZbjrz‚Š’š¢ª²ºÂÊÒÚâê™nŠnn…n™npŠnqns…nt™nzŠn{n}…n~™nµŠn¶n¸…n¹™n¿ŠnÀnÂ…nÙnÉŠnÊnÌ…nÍ0bjrz‚Š’š¢ª²ºÂÊÒÚâêòú "*2:BJRZbjrz‚Š’š¢ª²ºÂÊÒÚ˜n‚n—nˆnŒnŽn„n”n˜n‚nŽ—npˆnqŒnrŽns„nt”nu˜nx‚ny—nzˆn{Œn|Žn}„n~”n˜n³‚n´—nµˆn¶Œn·Žn¸„n¹”nº˜n½‚n¾—n¿ˆnÀŒnÁŽn„nÔnĘnÇ‚nÈ—nɈnÊŒnËŽnÌ„nÍ”nÎ&.6>FNV^fnv~†Ž–ž¦®‹n‘n–n‹nq‘ns–nu‹n{‘n}–n‹n¶‘n¸–nº‹nÀ‘n–nÄ‹nÊ‘nÌ–nÎ2:BJRZbjrz‚Š’š¢ª²ºÂÊÒÚâên’n†n—nnr’ns†nt—nun|’n}†n~—nn·’n¸†n¹—nºnÁ’n†n×nÄnË’n̆nÍ—nÎ&.6“n“ns“n}“n¸“n“nÌ "*2:BJRZbjr‡n˜n‡nt˜nu‡n~˜n‡n¹˜nº‡nØnćn͘nÎ&.6™n™nu™n™nº™nÄ™nÎ0bjrz‚Š’š¢ª²ºÂÊÒÚâêòú "*2:BJRZbjrz‚Š’š¢ª²ºÂÊÒÚ˜n‚n—nˆnŒnŽn„n”n˜n‚nŽ—npˆnqŒnrŽns„nt”nu˜nx‚ny—nzˆn{Œn|Žn}„n~”n˜n³‚n´—nµˆn¶Œn·Žn¸„n¹”nº˜n½‚n¾—n¿ˆnÀŒnÁŽn„nÔnĘnÇ‚nÈ—nɈnÊŒnËŽnÌ„nÍ”nÎ2:BJRZbjrz‚Š’š¢ª²ºÂÊÒÚâêƒn‰nn•nƒnމnqns•nuƒny‰n{n}•nƒn´‰n¶n¸•nºƒn¾‰nÀn•nănȉnÊnÌ•nÎ2:BJRZbjrz‚Š’š¢ª²ºÂÊÒÚâê™nŠnn…n™npŠnqns…nt™nzŠn{n}…n~™nµŠn¶n¸…n¹™n¿ŠnÀnÂ…nÙnÉŠnÊnÌ…nÍ&.6>FNV^fnv~†Ž–ž¦®‹n‘n–n‹nq‘ns–nu‹n{‘n}–n‹n¶‘n¸–nº‹nÀ‘n–nÄ‹nÊ‘nÌ–nÎ2:BJRZbjrz‚Š’š¢ª²ºÂÊÒÚâên’n†n—nnr’ns†nt—nun|’n}†n~—nn·’n¸†n¹—nºnÁ’n†n×nÄnË’n̆nÍ—nÎ&.6“n“ns“n}“n¸“n“nÌ "*2:BJRZbjr‡n˜n‡nt˜nu‡n~˜n‡n¹˜nº‡nØnćn͘nÎ&.6™n™nu™n™nº™nÄ™nÎ0bjrz‚Š’š¢ª²ºÂÊÒÚâêòú "*2:BJRZbjrz‚Š’š¢ª²ºÂÊÒÚ˜n‚n—nˆnŒnŽn„n”n˜n‚nŽ—npˆnqŒnrŽns„nt”nu˜nx‚ny—nzˆn{Œn|Žn}„n~”n˜n³‚n´—nµˆn¶Œn·Žn¸„n¹”nº˜n½‚n¾—n¿ˆnÀŒnÁŽn„nÔnĘnÇ‚nÈ—nɈnÊŒnËŽnÌ„nÍ”nÎ2:BJRZbjrz‚Š’š¢ª²ºÂÊÒÚâêƒn‰nn•nƒnމnqns•nuƒny‰n{n}•nƒn´‰n¶n¸•nºƒn¾‰nÀn•nănȉnÊnÌ•nÎ2:BJRZbjrz‚Š’š¢ª²ºÂÊÒÚâê™nŠnn…n™npŠnqns…nt™nzŠn{n}…n~™nµŠn¶n¸…n¹™n¿ŠnÀnÂ…nÙnÉŠnÊnÌ…nÍ&.6>FNV^fnv~†Ž–ž¦®‹n‘n–n‹nq‘ns–nu‹n{‘n}–n‹n¶‘n¸–nº‹nÀ‘n–nÄ‹nÊ‘nÌ–nÎ2:BJRZbjrz‚Š’š¢ª²ºÂÊÒÚâên’n†n—nnr’ns†nt—nun|’n}†n~—nn·’n¸†n¹—nºnÁ’n†n×nÄnË’n̆nÍ—nÎ&.6“n“ns“n}“n¸“n“nÌ "*2:BJRZbjr‡n˜n‡nt˜nu‡n~˜n‡n¹˜nº‡nØnćn͘nÎ&.6™n™nu™n™nº™nÄ™nÎ0bjrz‚Š’š¢ª²ºÂÊÒÚâêòú "*2:BJRZbjrz‚Š’š¢ª²ºÂÊÒÚ˜n‚n—nˆnŒnŽn„n”n˜n‚nŽ—npˆnqŒnrŽns„nt”nu˜nx‚ny—nzˆn{Œn|Žn}„n~”n˜n³‚n´—nµˆn¶Œn·Žn¸„n¹”nº˜n½‚n¾—n¿ˆnÀŒnÁŽn„nÔnĘnÇ‚nÈ—nɈnÊŒnËŽnÌ„nÍ”nÎ2:BJRZbjrz‚Š’š¢ª²ºÂÊÒÚâêƒn‰nn•nƒnމnqns•nuƒny‰n{n}•nƒn´‰n¶n¸•nºƒn¾‰nÀn•nănȉnÊnÌ•nÎ2:BJRZbjrz‚Š’š¢ª²ºÂÊÒÚâê™nŠnn…n™npŠnqns…nt™nzŠn{n}…n~™nµŠn¶n¸…n¹™n¿ŠnÀnÂ…nÙnÉŠnÊnÌ…nÍ&.6>FNV^fnv~†Ž–ž¦®‹n‘n–n‹nq‘ns–nu‹n{‘n}–n‹n¶‘n¸–nº‹nÀ‘n–nÄ‹nÊ‘nÌ–nÎ2:BJRZbjrz‚Š’š¢ª²ºÂÊÒÚâên’n†n—nnr’ns†nt—nun|’n}†n~—nn·’n¸†n¹—nºnÁ’n†n×nÄnË’n̆nÍ—nÎ&.6“n“ns“n}“n¸“n“nÌ "*2:BJRZbjr‡n˜n‡nt˜nu‡n~˜n‡n¹˜nº‡nØnćn͘nÎ&.6™n™nu™n™nº™nÄ™nÎ0bjrz‚Š’š¢ª²ºÂÊÒÚâêòú "*2:BJRZbjrz‚Š’š¢ª²ºÂÊÒÚ˜n‚n—nˆnŒnŽn„n”n˜n‚nŽ—npˆnqŒnrŽns„nt”nu˜nx‚ny—nzˆn{Œn|Žn}„n~”n˜n³‚n´—nµˆn¶Œn·Žn¸„n¹”nº˜n½‚n¾—n¿ˆnÀŒnÁŽn„nÔnĘnÇ‚nÈ—nɈnÊŒnËŽnÌ„nÍ”nÎ2:BJRZbjrz‚Š’š¢ª²ºÂÊÒÚâêƒn‰nn•nƒnމnqns•nuƒny‰n{n}•nƒn´‰n¶n¸•nºƒn¾‰nÀn•nănȉnÊnÌ•nÎ2:BJRZbjrz‚Š’š¢ª²ºÂÊÒÚâê™nŠnn…n™npŠnqns…nt™nzŠn{n}…n~™nµŠn¶n¸…n¹™n¿ŠnÀnÂ…nÙnÉŠnÊnÌ…nÍ&.6>FNV^fnv~†Ž–ž¦®‹n‘n–n‹nq‘ns–nu‹n{‘n}–n‹n¶‘n¸–nº‹nÀ‘n–nÄ‹nÊ‘nÌ–nÎ2:BJRZbjrz‚Š’š¢ª²ºÂÊÒÚâên’n†n—nnr’ns†nt—nun|’n}†n~—nn·’n¸†n¹—nºnÁ’n†n×nÄnË’n̆nÍ—nÎ&.6“n“ns“n}“n¸“n“nÌ "*2:BJRZbjr‡n˜n‡nt˜nu‡n~˜n‡n¹˜nº‡nØnćn͘nÎ&.6™n™nu™n™nº™nÄ™nÎÔ2o”Žpqrstuo”Žpqrstuo”Žpqrstuo”Žpqrstuo”Žpqrstu0LPÓÔÕÖרÙÚÛÜÝÞßàáâãäå6-N$%&'()*+,-./0123456789:;<=km›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±³´µ¶·¸¹zÛÝßáãåçéëíïñóõ÷ùûýÿ   "$&(*,.02468:<>@BDFHJLNPRTVY[fhjlL "(¯IL°IOªI¬L®O "(¯IL°IOªI¬L®Oà "(¯IL°IOªI¬L®O° ÏÐÑÒÓÔÕÖç¨ ×ØÙÚÛÜÝÞè  ßàáâãäåæé xywvz{|}~Lñ±ºv ±ÎDRŽ ”” ou ±ÎŽ ”” o ±ºÅÎ(Ž ”” o ±Ä Ž”” pt w~²¹¼à ÆÍ(—™nnv‚™Ž””ou #>?@^`lrstx|†–šX]DEFGHIJKLMNOPQRSTUVWXYZ[\]wy»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÓÔÕÖרÙÚÜÞàâäæèêìîðòôöøúüþ  !#%')+-/13579;=?ACEGIKMOQSUWZ\gikmI`g““pw¢¢€‡ÌÌ0(0‚$ *†H†÷  ‚0‚1 0 +0a +‚7 S0Q0, +‚7¢€<<<Obsolete>>>0!0 +01_¤\Õ_ÐròTz6nV÷}E¾ ‚˜0‚l0‚T  0  *†H†÷ 0Ï1 0 UUS10UArizona10U Scottsdale1%0#U Starfield Technologies, Inc.1:08U 1http://certificates.starfieldtech.com/repository/1604U-Starfield Services Root Certificate Authority0 100506193433Z 150506193433Z0Œ1 0 UUS10UArizona10U Scottsdale1%0#U Starfield Technologies, Inc.1/0-U&Starfield Services Timestamp Authority0‚"0  *†H†÷ ‚0‚ ‚»3¡5å§¶fwO¶H--øög·Ä-ò¢PÍ–JŸòTÝW…m—"]sãºuË“ î7Ac. ˜aL|XÌÊ•r¾Ì!Ð Aƒ•Lèì“U‡€h‚6Ô ÚOz©ú›lã 4“(G’Õ³øª9Ë´D4Ål œ:…[ö;¤~qƒ:‚·½z('ÝV¿Nx[Ô]!~òKžm÷ ÌºWã¾:÷ô!&œ1¢µ J=IFZ¯]ý[£‚‘0‚0 Uÿ00UÿÀ0U%ÿ 0 +0Uˆ Àëàß9CU×^˜ñ•õS£ð·0U#0€´ÆCÌ›u]/ÄKò‹˜éñQ0„+x0v0*+0†http://ocsp.starfieldtech.com/0H+0†x«µ k/j+±Åˆ~Ä»°ÁØE'oª7X÷‡&ר-ö©·r6N¦?e˜’Û*n]¢þˆà ÞåáëË:Õâ¢-ØŽ¯_= ¶\¥e8E™£``tÅA¥rbbÅo_B¾Qe¨®#jüx©M€Ãú«Zü¡@¤Êþ²Èï^s îw½šöy˜¼±g¢ Ý XÆD{ >b(_ºASXÏ~8tÅøÿµi„tê—¯£À0½0UÒİґÔLq³aË=¡þݨjÔã0U#…0‚€ÒİґÔLq³aË=¡þݨjÔã¡g¤e0c1 0 UUS1!0U The Go Daddy Group, Inc.110/U (Go Daddy Class 2 Certification Authority‚0 U0ÿ0  *†H†÷ ‚2Kó²Ê>‘üÆ¡ŒŽw 3\÷¦= ù‡€niä–0ÿ4‘cr8îÌ£”(¤1özÄT×öå1X¢ÌÎbÛ”Esµ¿EÉ$µÕ‚­#yi¸¶MÎÏLÊ3#航‹AnÉ å‰žÍ;Úp÷~™& T%«ns…æ›! l‚¨øÂ úl–ï‡ Äa‹­îƒ+•øŽ’„r9ë êƒíƒÍ—n¼ëN&¶s+äÓöLþ&qâatJÿW‡uH.ÏQi a•ÕÑ@²LîĬC¦¥ž Õ•bš ψ‚Å2 ä+ŸEæ Ÿ(œ±¹*ZW­7¯Û½Ÿ0‚Þ0‚Æ 0  *†H†÷ 0c1 0 UUS1!0U The Go Daddy Group, Inc.110/U (Go Daddy Class 2 Certification Authority0 061116015437Z 261116015437Z0Ê1 0 UUS10UArizona10U Scottsdale10U GoDaddy.com, Inc.1301U *http://certificates.godaddy.com/repository100.U'Go Daddy Secure Certification Authority10U079692870‚"0  *†H†÷ ‚0‚ ‚Ä-ÕŒœ&Lì25ë_¸YZ¦aY;pc«ãÜ=Ç*¸É3Óyä:í<0#„޳0¶²‡Ã=•Tžß™Ý %!Þe)~5¨©Tëö÷29Ô&U•­ïûþX†×žôŒ* ½BΧ?öî€òªïR¡ifÚ¾­]Ú,fêk»åQJ/Hǘuع)Èîøfm œ³óüx|¢ø£òµÃó¹z‘Á§æ%.œ¨íenjöDSp0•Ü+X+=tJò¾Q°¿‡ÐL'Xkµ5ů1ø î­6‰˜Ï:¯%‡ÀIê§ýg÷EŽ—Ì9â6…µ~7ýöqšt0þ”£?„ O£‚20‚.0Uý¬a2“lEÖâî…_šºçv™hÌç0U#0€ÒİґÔLq³aË=¡þݨjÔã0Uÿ0ÿ03+'0%0#+0†http://ocsp.godaddy.com0FU?0=0; 9 7†5http://certificates.godaddy.com/repository/gdroot.crl0KU D0B0@U 0806+*http://certificates.godaddy.com/repository0Uÿ0  *†H†÷ ‚Ò†Àì½ù¡¶gîf ¢:PŽr¬Jt•SË7ËDIïk3Ù–ð”V¥0<…2!{ÉÇ ¨$¤ÞFÓ%#gÂÖo]{zÌŸÅX*ÁÄž!¨Zó¬¤FóžäcË/¤))Ùr,)ß7'¼OîhÓ!À³äõ íÒªS´¾ðÌY Ö;–•$IßÎìý§H‘E:6oÚE³E¢AÉÔ×DN>¹tvÕ¢U,Ƈ£µ™¬„‡uü¿LÌnÄß=·qôèñQ@"(IàK‡¨4Ì¢ÝZц6d5oownëò…P˜^«S­‘#cœÍ¹²c:áôh5•Sî0‚>0‚&  ïô¿i{0  *†H†÷ 0Ê1 0 UUS10UArizona10U Scottsdale10U GoDaddy.com, Inc.1301U *http://certificates.godaddy.com/repository100.U'Go Daddy Secure Certification Authority10U079692870 090924134423Z 120924134423Z0k1 0 UGB10 ULondon10 ULondon10U Dalton Maag Limited10UDalton Maag Limited0‚"0  *†H†÷ ‚0‚ ‚¢_æØÛÒ¡¢ó~Å4çrØ®û•Ïì¤ê’Ûö¬S5ñ”œ£Ž™Fà+‘¶¦ÿ  º+Fnb执 AõæÀêkUr]ŽÏÜX3‰ÿåuÜÃÌ-`>Ö驯T>”¼ìŠ‘6zíUýØ=k'F _ÔÛÁ_¢÷ˆäˆ~úã‚à/BbQF»Æ0q{²ÌŒ3ví൙­Ã ãˆwx1http://certificates.godaddy.com/repository/gd_intermediate.crt0U#0€ý¬a2“lEÖâî…_šºçv™hÌç0Uhf0gU¡³¡é7Æu‰3ã…×0  *†H†÷ ‚½V> ´}úíÓþE¶ßßHø£ŒÕTÔ’DÁqi£Ã0€Ú7®ÊGhÙ³% 6 é;âÛQtþ^ÉÞ;$±ž9–àLRÊçBfZuhI:-#k^ÄCñž±/ ¥œ>=nZ°•t?.Ká0msÞo¯ãGúÝ$`d§\cÝ©·P4eÇ(IþZzêÀF¶š*Ùe²‘Ê Ö{ˆðê>éU0‡Ï¯‘¨#kE™Ü‘7 ¿ÔÝf_Uôñãí`4•>—¢ÂÊja@0‘Ä¥[Ð`mO4~ 1Såéx–ЃĪ½åbª2"#N.|¶Ÿß\#–1‚þ0‚ú0Õ0Ê1 0 UUS10UArizona10U Scottsdale10U GoDaddy.com, Inc.1301U *http://certificates.godaddy.com/repository100.U'Go Daddy Secure Certification Authority10U07969287 ïô¿i{0 + †0 +‚7 100 +‚7(10 *†H†÷  1  +‚70 +‚7 10  +‚70# *†H†÷  1(™:åß›ŠÌÅÆJe –`* Õ0  *†H†÷ ‚myÿýð¾*~¯ªž3ûÅ…gœÎ]CS|Ïe9j/Î'Ç£>Š ·ŒÞáÈ*¢ªü¬m§ü]–ØI#–¥ TÎD+ *|íŠÌ(Çà¡k´Mp#¤ßºÌE0Ažæã ës;‚0å—I –·à<­ÞAÜÛ®]y]Â~¨vO©.ªÏ~Bv'\—”gÒ=¯Óc´@ØîÒQ×£l à\Rçsrô–pÎׄòÿ:bd&É€¼”úçÓÉ횀F¶1nwrÏï_ `æ“/ÔmÆ÷£eõª)„Ô›>3iCÓ’°Ë5„£'¬7EHð%d‚ôap7Иˆ—F6»_¡‚t0‚p *†H†÷  1‚a0‚]0Ö0Ï1 0 UUS10UArizona10U Scottsdale1%0#U Starfield Technologies, Inc.1:08U 1http://certificates.starfieldtech.com/repository/1604U-Starfield Services Root Certificate Authority 0  *†H†÷  ]0 *†H†÷  1  *†H†÷ 0 *†H†÷  1 110307114934Z0# *†H†÷  1çQ¿îx¸ a"£ñÿkõu 0  *†H†÷ ‚4äÈj’ëLõ 6ÓˆcŸ+gÿ0H¹H€ ëˆîH.Ò=‹ZÑÔ%l,Blp?é,Œg7A¯„œÈÈC$u6é¨4 ØuãoºGûá,¨ûŒÕÜihøÎ‘çœÅ¸K&8pwz\ÑÅÇÌÙÝXk½#@‘8FõgR­ÓéÉ=u”É6B‹®+/—¨óñOP–G]*ëÌ&·Ãò¸ë>Ë` xJö Œ¾¶|R‘_g-ÁC”P›`Ó‚nãLËrËK€ÃH}¶{É=? AÅ‚„_ã2’½øO²ŒäjkûyU¥%Mð·óÂ"ŸzƯ‚E_?. # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. ubuntu-sso-client-13.10/PKG-INFO0000644000202700020270000000165212225013301016426 0ustar dobeydobey00000000000000Metadata-Version: 1.1 Name: ubuntu-sso-client Version: 13.10 Summary: Ubuntu Single Sign-On client Home-page: https://launchpad.net/ubuntu-sso-client Author: Ubuntu One Developers Author-email: ubuntuone-users@lists.launchpad.net License: GPL v3 Description: Desktop service to allow applications to sign into Ubuntu services via SSO Platform: UNKNOWN Requires: Image Requires: OpenSSL Requires: PIL Requires: PyQt4 Requires: dbus Requires: dirspec Requires: gi.repository.GLib Requires: gi.repository.Soup Requires: gi.repository.SoupGNOME Requires: httplib2 Requires: keyring Requires: mocker Requires: oauthlib.oauth1 Requires: qt4reactor Requires: twisted.cred Requires: twisted.internet Requires: twisted.python Requires: twisted.spread.pb Requires: twisted.trial Requires: twisted.web Requires: ubuntuone.devtools.handlers Requires: ubuntuone.devtools.testcases Requires: ubuntuone.devtools.testing.txwebserver Provides: ubuntu_sso ubuntu-sso-client-13.10/run-tests0000775000202700020270000000466312151461656017254 0ustar dobeydobey00000000000000#! /bin/bash # # Author: Natalia Bidart # # Copyright 2010-2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. QT_TESTS_PATH="ubuntu_sso/qt/tests, ubuntu_sso/qt/main/tests" QT_TEST_FILES="test_qt.py,test_qtwisted.py" LINUX_IGNORE_FILES="test_darwin.py,test_windows.py,test_pykeyring.py" # Allow alternative python executable via environment variable. This is # useful for virtualenv testing. PYTHON=${PYTHON:-''} set -e if [ $# -ne 0 ]; then # run specific module given by the caller MODULE="$@" else # run all tests, useful for tarmac and reviews MODULE="ubuntu_sso" fi style_check() { USE_PYFLAKES=1 u1lint --ignore ubuntu_sso/qt/ui if [ -x `which pep8` ]; then pep8 --exclude '.bzr,.pc,build' --ignore=E126,E127,E128 --repeat . bin/* else echo "Please install the 'pep8' package." fi } XVFB_CMDLINE="" XVFB=$(which xvfb-run) if [ $XVFB ]; then XVFB_CMDLINE="$XVFB -a" fi echo "*** Running QT test suite for ""$MODULE"" ***" ./setup.py build $XVFB_CMDLINE $PYTHON /usr/bin/u1trial --reactor=qt4 --gui -i $LINUX_IGNORE_FILES "$MODULE" ./setup.py clean rm -rf _trial_temp rm -rf build style_check ubuntu-sso-client-13.10/README0000664000202700020270000002177412151461656016244 0ustar dobeydobey00000000000000= Ubuntu Single Sign-On Client = ubuntu-sso-client is a desktop application that provides a D-Bus interface to let other applications store and manage credentials in the local keyring. When requesting a set of credentials for a given application, if those credentials are not yet present on the user's keyring, the user is presented with a GUI to either register a new account, or log in using an existing account by means of the Ubuntu SSO web service. Since version 1.1.5, this service does not depend on the gnome-keyring service, but on any keyring service that implements the freedesktop secrets specification (see http://freedesktop.org/wiki/Specifications/secret-storage-spec for reference). == ubuntu-sso-client D-Bus API == This section details the API that ubuntu-sso-client exposes through D-Bus. It is available under the: * {{{com.ubuntu.sso}}} bus name, on the * {{{/com/ubuntu/sso/credentials}}} object path. That object implements the {{{com.ubuntu.sso.CredentialsManagement}}} interface, that has the methods and signals listed below. All of these methods are asynchronous, and return immediately with no value. Signal handlers are required to handle results specially, where necessary. They all return information to the caller through signals, since all the operations (either against the keyring, or against the SSO web service) are blocking, and so the Ubuntu SSO API is entirely asynchronous. NOTE: formerly, the {{{ApplicationCredentials}}} interface was implemented under the {{{/credentials}}} object path. That interface is deprecated and should not be used. However, current applications using this interface will be able to do so until the Ubuntu 11.04 release inclusive, since it won't be removed it until 11.10. === com.ubuntu.sso.CredentialsManagement Methods === Any of these methods may emit the {{{CredentialsError}}} signal, with the caller's "app_name" as the first parameter, and a dictionary with key and value both as strings describing the error. See below for details about this signal. ==== find_credentials(String app_name, Dict of {String, String} extra_params) ==== Look for credentials on the user's keyring for "app_name". Currently, the parameter "extra_params" is not used and an empty dict must be passed. If credentials were found for "app_name", the signal {{{CredentialsFound}}} is emitted with "app_name" and the corresponding credentials dict as the result. If credentials were not found, the signal {{{CredentialsNotFound}}} is emitted with "app_name" as the only parameter. ==== clear_credentials(String app_name, Dict of {String, String} extra_params) ==== Clear the credentials on the user's keyring for "app_name". Currently, the parameter "extra_params" is not used and an empty dict should be passed. This method always emits the signal {{{CredentialsCleared}}} with "app_name" as only parameter (except on error when {{{CredentialsError}}} is emitted). ==== store_credentials(String app_name, Dict of {String, String} credentials) ==== Store the given set of 'credentials' on the user's keyring, for "app_name". Second parameter 'credentials' must provide at least these 4 keys with valid values: * 'token' * 'token_secret' * 'consumer_key' * 'consumer_secret' If the credentials were successfully set for "app_name", the signal {{{CredentialsStored}}} is emitted with "app_name" as the only parameter. ==== register(String app_name, Dict of {String, String} ui_settings) ==== This method will try to fetch the credentials from the user's keyring for "app_name", and will emit the {{{CredentialsFound}}} signal if they are found. If existing credentials are not found, it will open a graphical dialog to let the user create a new account for "app_name", or login to an existing SSO account. Once the user is successfully registered or logged in, the newly acquired credentials for "app_name" will be stored in the keyring and will be returned to the caller through the {{{CredentialsFound}}} signal. * 'app_name': will be displayed in the GUI header (so it should be human readable), plus it will be used to find/build/clear tokens. Special attention must be paid to this value since if it collides with some other app name, return signals may be misleading because the identifier is the application name. The second parameter 'ui_settings' can contain any of the following (none is required): * 'help_text': an explanatory text for the end-users, will be shown below the header in most of the registration process. * 'ping_url': an url to open after successful token retrieval. If defined, the email will be attached to the url and will be pinged with a OAuth-signed request (this is usually useful for server application to keep track of new tokens). * 'tc_url': the link to a Terms and Conditions web page. If defined, a checkbox to agree to the terms will be presented to the user, and will be required to be checked to continue the registration. Also, a link to the terms will be offered for browsing. If not defined, nothing will be shown. * 'window_id': DEPRECATED - used to be an X11 window identifier to be used for gtk.gdk.set_transient_for, so the dialog was always shown above the specified parent window. Additionally, this 'ui_settings' can provide 2 extra keys to define which UI module and UI class should be used in case the service needs to open a graphical interface to the end user. These keys are: * 'ui_executable': the name of an executable script to be used as GUI. ==== login(String app_name, Dict of {String, String} ui_settings) ==== This method behaves like 'register' except that the graphical interface, if shown to the user, will offer login only functionality. So, it will try to fetch the credentials from the user's keyring for "app_name", and will emit the {{{CredentialsFound}}} signal if found. If existing credentials are not found, it will open a graphical dialog to let the user log in into an existing SSO account. Once the user is successfully logged in, the newly acquired credentials for "app_name" will be stored in the keyring and will be returned to the caller through the {{{CredentialsFound}}} signal. Options for parameters on 'ui_settings' match the one listed above for 'register', except that the 'tc_url' will not be used even if defined. === com.ubuntu.sso.CredentialsManagement Signals === The applications listening for this signals should make sure the app_name sent as parameter for each signal matches the one they used for calling the methods defined in the previous section. If the app_name does not match, then the calling applications can safely assume those credentials or error messages are meant for another application and just discard them. ==== CredentialsFound(String app_name, Dict of {String, String} credentials) ==== The credentials are returned when this signal is emitted. It means that the credentials were either on the keyring, or that the login and/or register process was successful and a set of credentials has been stored on the keyring. * "app_name" is the application name as passed to the called method. * "credentials" is a dictionary that contains at least four keys with the token and consumer keys and secrets. The dictionary keys are named: * 'token' * 'token_secret' * 'consumer_key' * 'consumer_secret' ==== CredentialsNotFound(String app_name) ==== Emitted after 'find_credentials' was called and the credentials for "app_name" were not found in the user's keyring. * "app_name" is the application name as passed to the called method. ==== AuthorizationDenied(String app_name) ==== Emitted when the user was presented with a graphical interface and s/he canceled the request for login and/or register by clicking on a 'Cancel' button before the process was completed. * "app_name" is the application name as passed to the called method. ==== CredentialsError(String app_name, Dict of {String, String} error_dict) ==== This signal is raised when there is any problem getting, setting or clearing the credentials. * "app_name" is the application name as passed to the called method. * "error_dict" is a dictionary containing at least 2 fields: * "error_message" a simple message that can be shown to the user explaining the error (is not translated to any language). * "detailed_error" is a string containing a Python stacktrace or something similar to help the developers debug the problem. The application calling ubuntu-sso-client may choose to show it to the user using some sort of expander, or write it to a log file, etc. ==== CredentialsCleared(String app_name) ==== Emitted when the credentials for "app_name" were successfully removed from the user's keyring. Note that if an application requested the removal of non-existent credentials, this signals will be emitted if no error occurred. * "app_name" is the application name as passed to the called method. ==== CredentialsStored(String app_name) ==== Emitted when the credentials passed as the parameter to 'store_credentials' were successfully stored. * "app_name" is the application name as passed to the called method. == To be done: add API docs for accounts service == ubuntu-sso-client-13.10/README.windows0000664000202700020270000000477412151461656017736 0ustar dobeydobey00000000000000= Ubuntu Single Sign-On Client = Ubuntu Single Sign-On Client has been ported to windows to allow Windows applications to take advantage of the service. This README contains instructions on how to build the project so that it can be distributed as a .exe file. In order to be able to build a .exe for the client py2exe is used. The following are a number of recommendations to follow to ensure that your environment is correctly setup in order to use py2exe successfully. == Egg support == As version 0.6.5 py2exe does not have egg support out of the box an therefore when building the .exe file you have to work around this limitation. At the moment the recommended way to work around this issue is to tell easy_install to always unzip the eggs so that py2xe can work with them. In order to unzip an egg when installing it with easy_install you can use the --always-unzip option. Example: easy_install --always-unzip oauth == PyQt issues == Do to the way that py2exe works, there are a number of issues that may happen depending on the setup of you system. === PyQt and PySide === If you have PyQt and PySide py2exe will try to include both of them. The reason for this to happen is due to the way in which py2exe looks for dependencies. The module_finder form py2exe does not distinguish between normal imports and those that are wrapped around a try/except block. This means that the following code from the qtreactor will make py2exe believe that both are needed: This is a dangerous situation because PyQt and PySide do have different release cycles and normally do not depend on the same version of Qt. If in you system you have the two libraries using different version of Qt the build package might import dlls from different version which results in a runtime error. There are two ways to solve this issue: * Uninstall PySide * Ensure that both libs do depend on the same version of Qt. == PyQt and PyInstaller === PyInstaller has support for PyQt application out of the box. This means that PyInstaller has the Qt dlls in its installation. As with the issue with PySide it might happen that the dlls used by PyInstaller and the ones used by the PyQt version installed in you machine differ in their version. In cases where PyInstaller is present in you python path (for example in C:\Python27\Scripts) py2exe will copy the dlls found in the PyInstaller directory for an unknown reason. This will raise a runtime error complaining about the use of dlls from different versions.ubuntu-sso-client-13.10/setup.py0000775000202700020270000003123412225012070017051 0ustar dobeydobey00000000000000#!/usr/bin/python # setup.py - Build system for Ubuntu SSO Client package # # Copyright 2010-2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Setup.py: build, distribute, clean.""" # pylint: disable=W0404, W0511 import distutils import os import sys try: import DistUtilsExtra.auto from DistUtilsExtra.command import build_extra except ImportError: print >> sys.stderr, 'To build this program you need '\ 'https://launchpad.net/python-distutils-extra' sys.exit(1) assert DistUtilsExtra.auto.__version__ >= '2.18', \ 'needs DistUtilsExtra.auto >= 2.18' from distutils import log from ubuntu_sso.utils import get_cert_dir PROJECT_NAME = 'ubuntu-sso-client' VERSION = '13.10' POT_FILE = 'po/ubuntu-sso-client.pot' SERVICE_FILE = 'data/com.ubuntu.sso.service' CONSTANTS = 'ubuntu_sso/constants.py' CLEANFILES = [SERVICE_FILE, POT_FILE, CONSTANTS, 'MANIFEST'] QT_UI_DIR = os.path.join('ubuntu_sso', 'qt', 'ui') def replace_version(*args, **kwargs): """Replace the @VERSION@ in the constants file with the actual version.""" with open(CONSTANTS + '.in') as in_file: content = in_file.read() with open(CONSTANTS, 'w') as out_file: content = content.replace('@VERSION@', VERSION) content = content.replace('@PROJECT_NAME@', PROJECT_NAME) out_file.write(content) def replace_prefix(prefix): """Replace every '@prefix@' with prefix within 'filename' content.""" with open(SERVICE_FILE + '.in') as in_file: content = in_file.read() with open(SERVICE_FILE, 'w') as out_file: out_file.write(content.replace('@prefix@', prefix)) class SSOInstall(DistUtilsExtra.auto.install_auto): """Class to install proper files.""" def run(self): """Do the install. Read from *.service.in and generate .service files by replacing @prefix@ by self.prefix. """ prefix = self.install_data.replace( self.root if self.root is not None else '', '') replace_prefix(prefix) DistUtilsExtra.auto.install_auto.run(self) # Replace the CONSTANTS prefix here, so that we can do it directly in # the installed copy, rather than the lcoal copy. This allows us to # have a semi-generated version for use in tests, and a full version # for use in installed systems. with open(CONSTANTS) as in_file: content = in_file.read() with open(os.path.join(self.install_purelib, PROJECT_NAME, CONSTANTS), 'w') as out_file: out_file.write(content.replace('@prefix@', prefix)) class SSOBuild(build_extra.build_extra): """Build PyQt (.ui) files and resources.""" description = "build PyQt GUIs (.ui) and resources (.qrc)" def compile_ui(self, ui_file, py_file=None): """Compile the .ui files to python modules.""" # Search for pyuic4 in python bin dir, then in the $Path. if py_file is None: # go from the ui_file in the data folder to the # python file in the qt moodule py_file = os.path.split(ui_file)[1] py_file = os.path.splitext(py_file)[0] + '_ui.py' py_file = os.path.join(QT_UI_DIR, py_file) # we indeed want to catch Exception, is ugly but we need it # pylint: disable=W0703 try: # import the uic compiler from pyqt and generate the .py files # something similar could be done with pyside but that is left # as an exercise for the reader. from PyQt4 import uic fp = open(py_file, 'w') uic.compileUi(ui_file, fp) fp.close() log.info('Compiled %s into %s', ui_file, py_file) except Exception, e: self.warn('Unable to compile user interface %s: %s' % (py_file, e)) if not os.path.exists(py_file) or not file(py_file).read(): raise SystemExit(1) return # pylint: enable=W0703 def compile_rc(self, qrc_file, py_file=None): """Compile the resources that will be included with the project.""" import PyQt4 # Search for pyuic4 in python bin dir, then in the $Path. if py_file is None: py_file = os.path.split(qrc_file)[1] py_file = os.path.splitext(py_file)[0] + '_rc.py' py_file = os.path.join(QT_UI_DIR, py_file) path = os.getenv('PATH') os.putenv('PATH', path + os.path.pathsep + os.path.join( os.path.dirname(PyQt4.__file__), 'bin')) if os.system('pyrcc4 -no-compress "%s" -o "%s"' % (qrc_file, py_file)) > 0: self.warn('Unable to generate python module {py_file}' ' for resource file {qrc_file}'.format( py_file=py_file, qrc_file=qrc_file)) if not os.path.exists(py_file) or not file(py_file).read(): raise SystemExit(1) else: log.info('compiled %s into %s' % (qrc_file, py_file)) os.putenv('PATH', path) def _generate_qrc(self, qrc_file, srcfiles, prefix): """Generate the qrc file for the given src files.""" basedir = os.path.dirname(qrc_file) f = open(qrc_file, 'w') try: f.write('\n') import cgi f.write(' \n' % cgi.escape(prefix)) for e in srcfiles: relpath = e[len(basedir) + 1:] f.write(' %s\n' % cgi.escape(relpath.replace(os.path.sep, '/'))) f.write(' \n') f.write('\n') finally: f.close() def build_rc(self, py_file, basedir, prefix='/'): """Generate compiled resource including any files under basedir""" # For details, see http://doc.qt.nokia.com/latest/resources.html qrc_file = os.path.join(basedir, '%s.qrc' % os.path.basename(basedir)) srcfiles = [os.path.join(root, e) for root, _dirs, files in os.walk(basedir) for e in files] # NOTE: Here we cannot detect deleted files. In such cases, we need # to remove .qrc manually. try: self._generate_qrc(qrc_file, srcfiles, prefix) self.compile_rc(qrc_file, py_file) finally: os.unlink(qrc_file) def run(self): """Execute the command.""" replace_version() basepath = os.path.join('data', 'qt') # TODO: build the resource files so that we can include them #self.build_rc(os.path.join(basepath, 'icons_rc.py'), # os.path.join(os.path.dirname(__file__), 'icons'), # '/icons') for dirpath, _, filenames in os.walk(basepath): for filename in filenames: if filename.endswith('.ui'): self.compile_ui(os.path.join(dirpath, filename)) elif filename.endswith('.qrc'): self.compile_rc(os.path.join(dirpath, filename)) build_extra.build_extra.run(self) class SSOClean(DistUtilsExtra.auto.clean_build_tree): """Class to clean up after the build.""" def run(self): """Clean up the built files.""" for built_file in CLEANFILES: if os.path.exists(built_file): os.unlink(built_file) for dirpath, _, filenames in os.walk(os.path.join(QT_UI_DIR)): for current_file in filenames: if current_file.endswith('_ui.py') or\ current_file.endswith('_rc.py'): os.unlink(os.path.join(dirpath, current_file)) DistUtilsExtra.auto.clean_build_tree.run(self) def set_py2exe_paths(): """Set the path so that py2exe finds the required modules.""" # Pylint does not understand same spaced imports # pylint: disable=F0401 import win32com # pylint: enable=F0401 try: # pylint: disable=F0401 import py2exe.mf as modulefinder # pylint: enable=F0401 except ImportError: import modulefinder # py2exe 0.6.4 introduced a replacement modulefinder. # This means we have to add package paths there, # not to the built-in one. If this new modulefinder gets # integrated into Python, then we might be able to revert # this some day. If this doesn't work, try import modulefinder for package_path in win32com.__path__[1:]: modulefinder.AddPackagePath("win32com", package_path) for extra_mod in ["win32com.server", "win32com.client"]: __import__(extra_mod) module = sys.modules[extra_mod] for module_path in module.__path__[1:]: modulefinder.AddPackagePath(extra_mod, module_path) # pylint: disable=C0103 cmdclass = { 'install': SSOInstall, 'build': SSOBuild, 'clean': SSOClean, } sso_executables = [ 'bin/ubuntu-sso-login', 'bin/ubuntu-sso-login-qt', 'bin/ubuntu-sso-proxy-creds-qt', 'bin/ubuntu-sso-ssl-certificate-qt', ] class dummy_build_i18n(distutils.cmd.Command): """Dummy for windows.""" def initialize_options(self, *args): """Dummy.""" def finalize_options(self, *args): """Dummy.""" def run(self, *args): """Dummy.""" if sys.platform == 'win32': cmdclass['build_i18n'] = dummy_build_i18n data_files = [(get_cert_dir(), ['data/UbuntuOne-Go_Daddy_CA.pem', 'data/UbuntuOne-ValiCert_Class_2_VA.pem', 'data/UbuntuOne-Go_Daddy_Class_2_CA.pem'])] if sys.platform == 'win32': set_py2exe_paths() # for PyQt, see http://www.py2exe.org/index.cgi/Py2exeAndPyQt _includes = ['sip', 'email', 'ubuntu_sso.qt.gui', 'ubuntu_sso.qt.controllers', 'PyQt4.QtNetwork', 'PIL'] extra = { 'options': { 'py2exe': { 'bundle_files': 1, 'skip_archive': 0, 'includes': _includes, 'optimize': 1, 'dll_excludes': ["mswsock.dll", "powrprof.dll"], }, }, # add the console script so that py2exe compiles it 'console': sso_executables, 'zipfile': None, } else: data_files.extend([ ('lib/ubuntu-sso-client', sso_executables), ('share/dbus-1/services', ['data/com.ubuntu.sso.service']), ]) extra = {} DistUtilsExtra.auto.setup( name=PROJECT_NAME, version=VERSION, license='GPL v3', author='Ubuntu One Developers', author_email='ubuntuone-users@lists.launchpad.net', description='Ubuntu Single Sign-On client', long_description=('Desktop service to allow applications to sign in' 'to Ubuntu services via SSO'), url='https://launchpad.net/ubuntu-sso-client', extra_path=PROJECT_NAME, data_files=data_files, packages=[ 'ubuntu_sso', 'ubuntu_sso.tests', 'ubuntu_sso.keyring', 'ubuntu_sso.keyring.tests', 'ubuntu_sso.main', 'ubuntu_sso.main.tests', 'ubuntu_sso.networkstate', 'ubuntu_sso.networkstate.tests', 'ubuntu_sso.qt', 'ubuntu_sso.qt.main', 'ubuntu_sso.qt.ui', 'ubuntu_sso.utils', 'ubuntu_sso.utils.tests', 'ubuntu_sso.utils.runner', 'ubuntu_sso.utils.runner.tests', 'ubuntu_sso.utils.webclient', 'ubuntu_sso.utils.webclient.tests', ], cmdclass=cmdclass, **extra) ubuntu-sso-client-13.10/po/0000755000202700020270000000000012225013301015743 5ustar dobeydobey00000000000000ubuntu-sso-client-13.10/po/sk.po0000664000202700020270000003223312151461656016747 0ustar dobeydobey00000000000000# Slovak translation for ubuntu-sso-client # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the ubuntu-sso-client package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: ubuntu-sso-client\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-09-11 18:25+0000\n" "PO-Revision-Date: 2012-03-28 22:22+0000\n" "Last-Translator: Pavol KlaÄanský \n" "Language-Team: Slovak \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-09-17 18:24+0000\n" "X-Generator: Launchpad (build 15944)\n" #. Undefined variable '_', pylint: disable=E0602 #. all the text that is used in the gui #: ../ubuntu_sso/utils/ui.py:49 msgid "By signing up to {app_name} you agree to our {privacy_policy}" msgstr "Zaregistrovaním na {app_name} súhlasíte s naÅ¡imi {privacy_policy}" #: ../ubuntu_sso/utils/ui.py:51 msgid "By signing up to {app_name} you agree to our {terms_and_conditions}" msgstr "" "Zaregistrovaním na {app_name} súhlasíte s naÅ¡imi {terms_and_conditions}" #: ../ubuntu_sso/utils/ui.py:53 msgid " and {privacy_policy}" msgstr " a Ochranou osobných údajov" #: ../ubuntu_sso/utils/ui.py:54 msgid "Cancel" msgstr "ZruÅ¡iÅ¥" #: ../ubuntu_sso/utils/ui.py:55 msgid "Type the characters above" msgstr "Zadajte znaky vyššie" #: ../ubuntu_sso/utils/ui.py:56 msgid "There was a problem getting the captcha, reloading..." msgstr "DoÅ¡lo k chybe pri získavaní captcha, obnovuje sa..." #: ../ubuntu_sso/utils/ui.py:58 #, python-format msgid "If you can't read this then %(reload_link)s this page" msgstr "Ak to nemôžete preÄíťaÅ¥, tak %(reload_link)s túto stránku" #: ../ubuntu_sso/utils/ui.py:60 msgid "refresh" msgstr "obnovte" #: ../ubuntu_sso/utils/ui.py:61 msgid "Reload" msgstr "Znovu naÄítaÅ¥" #: ../ubuntu_sso/utils/ui.py:62 msgid "The captcha is a required field" msgstr "" #: ../ubuntu_sso/utils/ui.py:63 msgid "Close window and set up later" msgstr "ZatvoriÅ¥ okno a nastaviÅ¥ neskôr" #: ../ubuntu_sso/utils/ui.py:64 msgid "Congratulations, {app_name} is installed!" msgstr "" #: ../ubuntu_sso/utils/ui.py:65 #, python-format msgid "To connect this computer to %(app_name)s enter your details below." msgstr "" "Pre pripojenie tohto poÄítaÄa k %(app_name)s zadajte vaÅ¡e údaje nižšie." #: ../ubuntu_sso/utils/ui.py:67 msgid "Register with {app_name}." msgstr "" #: ../ubuntu_sso/utils/ui.py:68 ../ubuntu_sso/utils/ui.py:93 #: ../ubuntu_sso/utils/ui.py:143 msgid "Email address" msgstr "Emailová adresa" #: ../ubuntu_sso/utils/ui.py:69 msgid "Re-type Email address" msgstr "Znovu zadajte emailovú adresu" #: ../ubuntu_sso/utils/ui.py:70 msgid "The email must be a valid email address." msgstr "Email musí byÅ¥ platnou emailovou adresou." #: ../ubuntu_sso/utils/ui.py:71 msgid "" "The email addresses don't match, please double check and try entering them " "again." msgstr "" "Emailové adresy sa nezhodujú, prosím, prekontrolujte ich a skúste ich zadaÅ¥ " "znova." #: ../ubuntu_sso/utils/ui.py:73 msgid "Email" msgstr "Email" #: ../ubuntu_sso/utils/ui.py:74 msgid "The email addresses do not match" msgstr "Emailové adresy sa nezhodujú" #: ../ubuntu_sso/utils/ui.py:75 msgid "Enter code verification here" msgstr "Zadajte sem overovací kód" #: ../ubuntu_sso/utils/ui.py:76 msgid "Please enter your name" msgstr "Prosím, zadajte vaÅ¡e meno" #: ../ubuntu_sso/utils/ui.py:77 msgid "The process did not finish successfully." msgstr "Proces neskonÄil úspeÅ¡ne." #: ../ubuntu_sso/utils/ui.py:79 msgid "Sign me in with my existing account" msgstr "PrihlásiÅ¥ ma s mojím existujúcim úÄtom" #: ../ubuntu_sso/utils/ui.py:80 msgid "This field is required." msgstr "Toto pole je povinné." #: ../ubuntu_sso/utils/ui.py:81 msgid "I've forgotten my password" msgstr "Zabudol som moje heslo" #: ../ubuntu_sso/utils/ui.py:82 ../ubuntu_sso/utils/ui.py:130 msgid "Reset password" msgstr "ResetovaÅ¥ heslo" #: ../ubuntu_sso/utils/ui.py:83 msgid "" "To reset your {app_name} password, enter your registered email address " "below. We will send instructions to reset your password." msgstr "" #: ../ubuntu_sso/utils/ui.py:86 msgid "Please enter a valid email address" msgstr "Prosím, zadajte platnú adresu" #: ../ubuntu_sso/utils/ui.py:87 msgid "There was a problem accessing the Ubuntu Single Sign On backend." msgstr "" #: ../ubuntu_sso/utils/ui.py:89 #, python-format msgid "Create %(app_name)s account" msgstr "VytvoriÅ¥ %(app_name)s úÄet" #: ../ubuntu_sso/utils/ui.py:90 msgid "Loading..." msgstr "NaÄítava sa..." #: ../ubuntu_sso/utils/ui.py:91 msgid "Getting information, please wait..." msgstr "Získavajú sa informácie, prosím, Äakajte..." #: ../ubuntu_sso/utils/ui.py:92 msgid "Already have an account? Click here to sign in" msgstr "Už máte úÄet? Kliknutím sem sa prihlásite" #: ../ubuntu_sso/utils/ui.py:94 #, python-format msgid "Connect to %(app_name)s" msgstr "PripojiÅ¥ sa k %(app_name)s" #: ../ubuntu_sso/utils/ui.py:95 ../ubuntu_sso/utils/ui.py:109 msgid "Password" msgstr "Heslo" #: ../ubuntu_sso/utils/ui.py:97 msgid "Sign In to {app_name}" msgstr "PrihlásiÅ¥ sa k {app_name}" #: ../ubuntu_sso/utils/ui.py:99 msgid "Name" msgstr "Meno" #: ../ubuntu_sso/utils/ui.py:100 msgid "The name must not be empty." msgstr "Meno nemôže byÅ¥ prázdne." #: ../ubuntu_sso/utils/ui.py:101 msgid "Next" msgstr "ÄŽalej" #: ../ubuntu_sso/utils/ui.py:102 msgid "Network detection" msgstr "" #: ../ubuntu_sso/utils/ui.py:103 #, python-format msgid "" "Are you online? We can't detect an internet connection - you will need to be " "connected to set up %(app_name)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:105 msgid "One moment please..." msgstr "Moment, prosím..." #: ../ubuntu_sso/utils/ui.py:106 msgid "Create a password" msgstr "VytvoriÅ¥ heslo" #: ../ubuntu_sso/utils/ui.py:107 msgid "Your password was successfully changed." msgstr "VaÅ¡e heslo bolo úspeÅ¡ne zmenené." #: ../ubuntu_sso/utils/ui.py:108 msgid "At least one number" msgstr "Najmenej jednu Äíslicu" #: ../ubuntu_sso/utils/ui.py:110 msgid "Re-type Password" msgstr "Znovu zadajte heslo" #: ../ubuntu_sso/utils/ui.py:111 msgid "" "The password must have a minimum of 8 characters and include one uppercase " "character and one number." msgstr "" "Heslo musí maÅ¥ aspoň 8 znakov a zahŕňaÅ¥ jedno veľké písmeno a jedno Äíslo." #: ../ubuntu_sso/utils/ui.py:113 msgid "At least 8 characters" msgstr "Najmenej 8 znakov" #: ../ubuntu_sso/utils/ui.py:114 msgid "Passwords don't match" msgstr "Heslá sa nezhodujú" #: ../ubuntu_sso/utils/ui.py:115 msgid "" "The passwords don't match, please double check and try entering them again." msgstr "" "Heslá sa nezhodujú, prosím, prekontrolujte ich a skúste ich zadaÅ¥ znovu." #: ../ubuntu_sso/utils/ui.py:117 msgid "Your password must contain" msgstr "VaÅ¡e heslo músí obsahovaÅ¥" #: ../ubuntu_sso/utils/ui.py:118 msgid "The password is too weak." msgstr "Heslo je príliÅ¡ slabé." #: ../ubuntu_sso/utils/ui.py:119 msgid "At least one uppercase letter" msgstr "Najmenej jedno veľké písmeno" #: ../ubuntu_sso/utils/ui.py:120 msgid "Privacy Policy" msgstr "Ochrana osobných údajov" #: ../ubuntu_sso/utils/ui.py:121 msgid "Connecting to:" msgstr "Pripája sa k:" #: ../ubuntu_sso/utils/ui.py:122 msgid "Proxy Settings" msgstr "Nastavenia proxy" #: ../ubuntu_sso/utils/ui.py:123 msgid "Incorrect login details. Please try again." msgstr "Nesprávne prihlasovacie údaje. Prosím, skúste to znovu." #: ../ubuntu_sso/utils/ui.py:124 msgid "Please provide login details." msgstr "Prosím, poskytnite prihlasovacie údaje." #: ../ubuntu_sso/utils/ui.py:125 msgid "You are connecting through a proxy." msgstr "Pripájate sa cez proxy." #: ../ubuntu_sso/utils/ui.py:126 msgid "Get Help With Proxies" msgstr "ZískaÅ¥ pomoc s proxy" #: ../ubuntu_sso/utils/ui.py:127 msgid "Proxy password:" msgstr "Proxy heslo:" #: ../ubuntu_sso/utils/ui.py:128 msgid "Save and Connect" msgstr "UložiÅ¥ a pripojiÅ¥" #: ../ubuntu_sso/utils/ui.py:129 msgid "Proxy username:" msgstr "Proxy používateľské meno:" #: ../ubuntu_sso/utils/ui.py:131 msgid "" "A password reset code has been sent to your e-mail. Please enter the code " "below along with your new password." msgstr "" "Resetovací kód hesla bol poslaný na váš email. Prosím, zadajte nižšie kód " "spolu s vaším novým heslom." #: ../ubuntu_sso/utils/ui.py:133 msgid "Retype email" msgstr "Znovu zadajte email" #: ../ubuntu_sso/utils/ui.py:134 msgid "Retype password" msgstr "Znovu zadajte heslo" #: ../ubuntu_sso/utils/ui.py:135 #, python-format msgid "To reset your %(app_name)s password, enter your email address below:" msgstr "" "Pre resetovanie vášho %(app_name)s hesla, zadajte vaÅ¡u emailovú adresu " "nižšie:" #: ../ubuntu_sso/utils/ui.py:137 msgid "" "We are very Sorry! The service that signs you on is not responding right " "now\n" "Please try again or come back in a few minutes." msgstr "" #: ../ubuntu_sso/utils/ui.py:140 msgid "Sorry we did not recognize the email address." msgstr "" #: ../ubuntu_sso/utils/ui.py:142 msgid "Reset code" msgstr "Resetovací kód" #: ../ubuntu_sso/utils/ui.py:145 #, python-format msgid "" "A password reset code has been sent to %(email)s.\n" "Please enter the code below along with your new password." msgstr "" "Resetovací kód bol poslaný na %(email)s.\n" "Prosím, zadajte kód nižšie spolu s vaším novým heslom." #: ../ubuntu_sso/utils/ui.py:147 msgid "Set Up Account" msgstr "NastaviÅ¥ úÄet" #: ../ubuntu_sso/utils/ui.py:148 msgid "I don't have an account yet - sign me up" msgstr "EÅ¡te nemám úÄet - zaregistrujte ma" #: ../ubuntu_sso/utils/ui.py:149 msgid "Sign In" msgstr "PrihlásiÅ¥ sa" #: ../ubuntu_sso/utils/ui.py:150 msgid "Log-in with my existing account." msgstr "" #: ../ubuntu_sso/utils/ui.py:151 msgid "the appname whose ssl error we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:152 msgid "Certificate details" msgstr "Podrobnosti certifikátu" #: ../ubuntu_sso/utils/ui.py:153 msgid "Connect" msgstr "PripojiÅ¥" #: ../ubuntu_sso/utils/ui.py:154 msgid "the details ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:161 msgid "Open the SSL certificate UI." msgstr "" #: ../ubuntu_sso/utils/ui.py:162 msgid "SSL Certificate Not Valid" msgstr "" #: ../ubuntu_sso/utils/ui.py:163 msgid "the domain whose ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:164 #, python-format msgid "" "You are trying to connect to a proxy server on %(domain)s. This server uses " "a secure connection, and the SSL certificate is not valid because:" msgstr "" #: ../ubuntu_sso/utils/ui.py:167 msgid "The certificate has not been verified" msgstr "" #: ../ubuntu_sso/utils/ui.py:168 msgid "Do you want to connect to this server?" msgstr "" #: ../ubuntu_sso/utils/ui.py:169 msgid "Get Help With SSL" msgstr "" #: ../ubuntu_sso/utils/ui.py:170 #, python-format msgid "" "If you are not sure about this server, do not use it to connect to " "%(app_name)s." msgstr "" #: ../ubuntu_sso/utils/ui.py:172 msgid "Remember my settings for this certificate." msgstr "" #: ../ubuntu_sso/utils/ui.py:173 msgid "" "The name on the certificate isn't valid or doesn't match the name of the site" msgstr "" #: ../ubuntu_sso/utils/ui.py:175 msgid "The certificate has expired" msgstr "" #: ../ubuntu_sso/utils/ui.py:176 #, python-format msgid "You are now logged into %(app_name)s." msgstr "Teraz ste už prihlásený k %(app_name)s." #: ../ubuntu_sso/utils/ui.py:177 msgid "Surname" msgstr "" #: ../ubuntu_sso/utils/ui.py:178 msgid "Terms of Service" msgstr "Podmienkami služby" #: ../ubuntu_sso/utils/ui.py:179 msgid "Sign Up to {app_name}" msgstr "ZaregistrovaÅ¥ sa na {app_name}" #: ../ubuntu_sso/utils/ui.py:180 msgid "Show Terms & Conditions" msgstr "ZobraziÅ¥ vÅ¡eobecné obchodné podmienky" #: ../ubuntu_sso/utils/ui.py:181 #, python-format msgid "" "Agreeing to the %(app_name)s Terms & Conditions is required to subscribe." msgstr "" #: ../ubuntu_sso/utils/ui.py:183 #, python-format msgid "You can also find these terms at %(url)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:184 msgid "Try again" msgstr "" #: ../ubuntu_sso/utils/ui.py:185 msgid "" "There was an error when trying to complete the process. Please check the " "information and try again." msgstr "" "DoÅ¡lo k chybe pri pokuse o dokonÄenie procesu. Prosím, skontrolujte " "informácie a skúste to znovu." #: ../ubuntu_sso/utils/ui.py:187 msgid "Verification code" msgstr "" #: ../ubuntu_sso/utils/ui.py:188 #, python-format msgid "" "Check %(email)s for an email from Ubuntu Single Sign On. This message " "contains a verification code. Enter the code in the field below and click OK " "to complete creating your %(app_name)s account." msgstr "" #: ../ubuntu_sso/utils/ui.py:192 msgid "Enter verification code" msgstr "Zadajte overovací kód" #: ../ubuntu_sso/utils/ui.py:195 #, python-format msgid "I agree with the %(app_name)s terms and conditions" msgstr "Súhlasím s vÅ¡eobecnými obchodnými podmienkami programu %(app_name)s" #: ../ubuntu_sso/utils/ui.py:196 #, python-format msgid "Yes! Email me %(app_name)s tips and updates." msgstr "Ãno! Zasielajte mi %(app_name)s tipy a aktualizácie." ubuntu-sso-client-13.10/po/si.po0000664000202700020270000002605712151461656016754 0ustar dobeydobey00000000000000# Sinhalese translation for ubuntu-sso-client # Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 # This file is distributed under the same license as the ubuntu-sso-client package. # FIRST AUTHOR , 2011. # msgid "" msgstr "" "Project-Id-Version: ubuntu-sso-client\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-09-11 18:25+0000\n" "PO-Revision-Date: 2012-05-04 17:57+0000\n" "Last-Translator: පසිඳු à¶šà·à·€à·’න්ද \n" "Language-Team: Sinhalese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-09-17 18:24+0000\n" "X-Generator: Launchpad (build 15944)\n" #. Undefined variable '_', pylint: disable=E0602 #. all the text that is used in the gui #: ../ubuntu_sso/utils/ui.py:49 msgid "By signing up to {app_name} you agree to our {privacy_policy}" msgstr "" #: ../ubuntu_sso/utils/ui.py:51 msgid "By signing up to {app_name} you agree to our {terms_and_conditions}" msgstr "" #: ../ubuntu_sso/utils/ui.py:53 msgid " and {privacy_policy}" msgstr "" #: ../ubuntu_sso/utils/ui.py:54 msgid "Cancel" msgstr "à¶…à·„à·à·ƒà·’ කරන්න" #: ../ubuntu_sso/utils/ui.py:55 msgid "Type the characters above" msgstr "à¶´à·„à¶­ à¶…à¶šà·Šâ€à·‚à¶» යතුරුලියනය කරන්න" #: ../ubuntu_sso/utils/ui.py:56 msgid "There was a problem getting the captcha, reloading..." msgstr "" #: ../ubuntu_sso/utils/ui.py:58 #, python-format msgid "If you can't read this then %(reload_link)s this page" msgstr "" #: ../ubuntu_sso/utils/ui.py:60 msgid "refresh" msgstr "" #: ../ubuntu_sso/utils/ui.py:61 msgid "Reload" msgstr "à¶´à·Šâ€à¶»à¶­à·’පූර්ණය" #: ../ubuntu_sso/utils/ui.py:62 msgid "The captcha is a required field" msgstr "" #: ../ubuntu_sso/utils/ui.py:63 msgid "Close window and set up later" msgstr "" #: ../ubuntu_sso/utils/ui.py:64 msgid "Congratulations, {app_name} is installed!" msgstr "" #: ../ubuntu_sso/utils/ui.py:65 #, python-format msgid "To connect this computer to %(app_name)s enter your details below." msgstr "" #: ../ubuntu_sso/utils/ui.py:67 msgid "Register with {app_name}." msgstr "" #: ../ubuntu_sso/utils/ui.py:68 ../ubuntu_sso/utils/ui.py:93 #: ../ubuntu_sso/utils/ui.py:143 msgid "Email address" msgstr "" #: ../ubuntu_sso/utils/ui.py:69 msgid "Re-type Email address" msgstr "" #: ../ubuntu_sso/utils/ui.py:70 msgid "The email must be a valid email address." msgstr "" #: ../ubuntu_sso/utils/ui.py:71 msgid "" "The email addresses don't match, please double check and try entering them " "again." msgstr "" #: ../ubuntu_sso/utils/ui.py:73 msgid "Email" msgstr "විද්â€à¶ºà·”à¶­à·Š à¶­à·à¶´à·‘à¶½" #: ../ubuntu_sso/utils/ui.py:74 msgid "The email addresses do not match" msgstr "" #: ../ubuntu_sso/utils/ui.py:75 msgid "Enter code verification here" msgstr "" #: ../ubuntu_sso/utils/ui.py:76 msgid "Please enter your name" msgstr "කරුණà·à¶šà¶» ඔබේ නම යොදන්න" #: ../ubuntu_sso/utils/ui.py:77 msgid "The process did not finish successfully." msgstr "" #: ../ubuntu_sso/utils/ui.py:79 msgid "Sign me in with my existing account" msgstr "" #: ../ubuntu_sso/utils/ui.py:80 msgid "This field is required." msgstr "" #: ../ubuntu_sso/utils/ui.py:81 msgid "I've forgotten my password" msgstr "" #: ../ubuntu_sso/utils/ui.py:82 ../ubuntu_sso/utils/ui.py:130 msgid "Reset password" msgstr "" #: ../ubuntu_sso/utils/ui.py:83 msgid "" "To reset your {app_name} password, enter your registered email address " "below. We will send instructions to reset your password." msgstr "" #: ../ubuntu_sso/utils/ui.py:86 msgid "Please enter a valid email address" msgstr "" #: ../ubuntu_sso/utils/ui.py:87 msgid "There was a problem accessing the Ubuntu Single Sign On backend." msgstr "" #: ../ubuntu_sso/utils/ui.py:89 #, python-format msgid "Create %(app_name)s account" msgstr "" #: ../ubuntu_sso/utils/ui.py:90 msgid "Loading..." msgstr "පූර්ණය වෙමින්..." #: ../ubuntu_sso/utils/ui.py:91 msgid "Getting information, please wait..." msgstr "තොරතුරු ලබ෠ගනිමින්, මොහොතක් à¶»à·à¶¯à·™à¶±à·Šà¶±..." #: ../ubuntu_sso/utils/ui.py:92 msgid "Already have an account? Click here to sign in" msgstr "" #: ../ubuntu_sso/utils/ui.py:94 #, python-format msgid "Connect to %(app_name)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:95 ../ubuntu_sso/utils/ui.py:109 msgid "Password" msgstr "මුරපදය" #: ../ubuntu_sso/utils/ui.py:97 msgid "Sign In to {app_name}" msgstr "" #: ../ubuntu_sso/utils/ui.py:99 msgid "Name" msgstr "නම" #: ../ubuntu_sso/utils/ui.py:100 msgid "The name must not be empty." msgstr "" #: ../ubuntu_sso/utils/ui.py:101 msgid "Next" msgstr "මීළඟ" #: ../ubuntu_sso/utils/ui.py:102 msgid "Network detection" msgstr "" #: ../ubuntu_sso/utils/ui.py:103 #, python-format msgid "" "Are you online? We can't detect an internet connection - you will need to be " "connected to set up %(app_name)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:105 msgid "One moment please..." msgstr "කරුණà·à¶šà¶» මොහොතක් à¶»à·à¶³à·™à¶±à·Šà¶±..." #: ../ubuntu_sso/utils/ui.py:106 msgid "Create a password" msgstr "" #: ../ubuntu_sso/utils/ui.py:107 msgid "Your password was successfully changed." msgstr "" #: ../ubuntu_sso/utils/ui.py:108 msgid "At least one number" msgstr "" #: ../ubuntu_sso/utils/ui.py:110 msgid "Re-type Password" msgstr "" #: ../ubuntu_sso/utils/ui.py:111 msgid "" "The password must have a minimum of 8 characters and include one uppercase " "character and one number." msgstr "" #: ../ubuntu_sso/utils/ui.py:113 msgid "At least 8 characters" msgstr "" #: ../ubuntu_sso/utils/ui.py:114 msgid "Passwords don't match" msgstr "" #: ../ubuntu_sso/utils/ui.py:115 msgid "" "The passwords don't match, please double check and try entering them again." msgstr "" #: ../ubuntu_sso/utils/ui.py:117 msgid "Your password must contain" msgstr "" #: ../ubuntu_sso/utils/ui.py:118 msgid "The password is too weak." msgstr "" #: ../ubuntu_sso/utils/ui.py:119 msgid "At least one uppercase letter" msgstr "" #: ../ubuntu_sso/utils/ui.py:120 msgid "Privacy Policy" msgstr "" #: ../ubuntu_sso/utils/ui.py:121 msgid "Connecting to:" msgstr "" #: ../ubuntu_sso/utils/ui.py:122 msgid "Proxy Settings" msgstr "" #: ../ubuntu_sso/utils/ui.py:123 msgid "Incorrect login details. Please try again." msgstr "" #: ../ubuntu_sso/utils/ui.py:124 msgid "Please provide login details." msgstr "" #: ../ubuntu_sso/utils/ui.py:125 msgid "You are connecting through a proxy." msgstr "" #: ../ubuntu_sso/utils/ui.py:126 msgid "Get Help With Proxies" msgstr "" #: ../ubuntu_sso/utils/ui.py:127 msgid "Proxy password:" msgstr "" #: ../ubuntu_sso/utils/ui.py:128 msgid "Save and Connect" msgstr "" #: ../ubuntu_sso/utils/ui.py:129 msgid "Proxy username:" msgstr "" #: ../ubuntu_sso/utils/ui.py:131 msgid "" "A password reset code has been sent to your e-mail. Please enter the code " "below along with your new password." msgstr "" #: ../ubuntu_sso/utils/ui.py:133 msgid "Retype email" msgstr "" #: ../ubuntu_sso/utils/ui.py:134 msgid "Retype password" msgstr "" #: ../ubuntu_sso/utils/ui.py:135 #, python-format msgid "To reset your %(app_name)s password, enter your email address below:" msgstr "" #: ../ubuntu_sso/utils/ui.py:137 msgid "" "We are very Sorry! The service that signs you on is not responding right " "now\n" "Please try again or come back in a few minutes." msgstr "" #: ../ubuntu_sso/utils/ui.py:140 msgid "Sorry we did not recognize the email address." msgstr "" #: ../ubuntu_sso/utils/ui.py:142 msgid "Reset code" msgstr "" #: ../ubuntu_sso/utils/ui.py:145 #, python-format msgid "" "A password reset code has been sent to %(email)s.\n" "Please enter the code below along with your new password." msgstr "" #: ../ubuntu_sso/utils/ui.py:147 msgid "Set Up Account" msgstr "" #: ../ubuntu_sso/utils/ui.py:148 msgid "I don't have an account yet - sign me up" msgstr "" #: ../ubuntu_sso/utils/ui.py:149 msgid "Sign In" msgstr "" #: ../ubuntu_sso/utils/ui.py:150 msgid "Log-in with my existing account." msgstr "" #: ../ubuntu_sso/utils/ui.py:151 msgid "the appname whose ssl error we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:152 msgid "Certificate details" msgstr "" #: ../ubuntu_sso/utils/ui.py:153 msgid "Connect" msgstr "" #: ../ubuntu_sso/utils/ui.py:154 msgid "the details ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:161 msgid "Open the SSL certificate UI." msgstr "" #: ../ubuntu_sso/utils/ui.py:162 msgid "SSL Certificate Not Valid" msgstr "" #: ../ubuntu_sso/utils/ui.py:163 msgid "the domain whose ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:164 #, python-format msgid "" "You are trying to connect to a proxy server on %(domain)s. This server uses " "a secure connection, and the SSL certificate is not valid because:" msgstr "" #: ../ubuntu_sso/utils/ui.py:167 msgid "The certificate has not been verified" msgstr "" #: ../ubuntu_sso/utils/ui.py:168 msgid "Do you want to connect to this server?" msgstr "" #: ../ubuntu_sso/utils/ui.py:169 msgid "Get Help With SSL" msgstr "" #: ../ubuntu_sso/utils/ui.py:170 #, python-format msgid "" "If you are not sure about this server, do not use it to connect to " "%(app_name)s." msgstr "" #: ../ubuntu_sso/utils/ui.py:172 msgid "Remember my settings for this certificate." msgstr "" #: ../ubuntu_sso/utils/ui.py:173 msgid "" "The name on the certificate isn't valid or doesn't match the name of the site" msgstr "" #: ../ubuntu_sso/utils/ui.py:175 msgid "The certificate has expired" msgstr "" #: ../ubuntu_sso/utils/ui.py:176 #, python-format msgid "You are now logged into %(app_name)s." msgstr "" #: ../ubuntu_sso/utils/ui.py:177 msgid "Surname" msgstr "" #: ../ubuntu_sso/utils/ui.py:178 msgid "Terms of Service" msgstr "" #: ../ubuntu_sso/utils/ui.py:179 msgid "Sign Up to {app_name}" msgstr "" #: ../ubuntu_sso/utils/ui.py:180 msgid "Show Terms & Conditions" msgstr "" #: ../ubuntu_sso/utils/ui.py:181 #, python-format msgid "" "Agreeing to the %(app_name)s Terms & Conditions is required to subscribe." msgstr "" #: ../ubuntu_sso/utils/ui.py:183 #, python-format msgid "You can also find these terms at %(url)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:184 msgid "Try again" msgstr "" #: ../ubuntu_sso/utils/ui.py:185 msgid "" "There was an error when trying to complete the process. Please check the " "information and try again." msgstr "" #: ../ubuntu_sso/utils/ui.py:187 msgid "Verification code" msgstr "" #: ../ubuntu_sso/utils/ui.py:188 #, python-format msgid "" "Check %(email)s for an email from Ubuntu Single Sign On. This message " "contains a verification code. Enter the code in the field below and click OK " "to complete creating your %(app_name)s account." msgstr "" #: ../ubuntu_sso/utils/ui.py:192 msgid "Enter verification code" msgstr "" #: ../ubuntu_sso/utils/ui.py:195 #, python-format msgid "I agree with the %(app_name)s terms and conditions" msgstr "" #: ../ubuntu_sso/utils/ui.py:196 #, python-format msgid "Yes! Email me %(app_name)s tips and updates." msgstr "" ubuntu-sso-client-13.10/po/tr.po0000664000202700020270000003565412151461656016771 0ustar dobeydobey00000000000000# Turkish translation for ubuntu-sso-client # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the ubuntu-sso-client package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: ubuntu-sso-client\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-09-11 18:25+0000\n" "PO-Revision-Date: 2012-05-25 09:05+0000\n" "Last-Translator: Aequitas \n" "Language-Team: Turkish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-09-17 18:24+0000\n" "X-Generator: Launchpad (build 15944)\n" #. Undefined variable '_', pylint: disable=E0602 #. all the text that is used in the gui #: ../ubuntu_sso/utils/ui.py:49 msgid "By signing up to {app_name} you agree to our {privacy_policy}" msgstr "" "{app_name} uygulamasına kayıt olarak {privacy_policy}'ni kabul etmiÅŸ " "oluyorsunuz" #: ../ubuntu_sso/utils/ui.py:51 msgid "By signing up to {app_name} you agree to our {terms_and_conditions}" msgstr "" "{app_name} uygulamasına kayıt olarak {terms_and_conditions}'ı kabul etmiÅŸ " "olursunuz" #: ../ubuntu_sso/utils/ui.py:53 msgid " and {privacy_policy}" msgstr " ve {privacy_policy}" #: ../ubuntu_sso/utils/ui.py:54 msgid "Cancel" msgstr "İptal" #: ../ubuntu_sso/utils/ui.py:55 msgid "Type the characters above" msgstr "Yukarıdaki karakterleri girin" #: ../ubuntu_sso/utils/ui.py:56 msgid "There was a problem getting the captcha, reloading..." msgstr "DoÄŸrulama kodu alınırken hata oluÅŸtu, tekrarlanıyor..." #: ../ubuntu_sso/utils/ui.py:58 #, python-format msgid "If you can't read this then %(reload_link)s this page" msgstr "Okuyamıyorsanız bu sayfayı %(reload_link)s" #: ../ubuntu_sso/utils/ui.py:60 msgid "refresh" msgstr "tazele" #: ../ubuntu_sso/utils/ui.py:61 msgid "Reload" msgstr "Yeniden Yükle" #: ../ubuntu_sso/utils/ui.py:62 msgid "The captcha is a required field" msgstr "Güvenli kodu gerekli" #: ../ubuntu_sso/utils/ui.py:63 msgid "Close window and set up later" msgstr "Pencereyi kapat ve daha sonra kur" #: ../ubuntu_sso/utils/ui.py:64 msgid "Congratulations, {app_name} is installed!" msgstr "Tebrikler, {app_name} kuruldu!" #: ../ubuntu_sso/utils/ui.py:65 #, python-format msgid "To connect this computer to %(app_name)s enter your details below." msgstr "" "Bu bilgisayarı %(app_name)s ile baÄŸlamak için aÅŸağıya ayrıntılarınızı girin." #: ../ubuntu_sso/utils/ui.py:67 msgid "Register with {app_name}." msgstr "" #: ../ubuntu_sso/utils/ui.py:68 ../ubuntu_sso/utils/ui.py:93 #: ../ubuntu_sso/utils/ui.py:143 msgid "Email address" msgstr "E-posta adresi" #: ../ubuntu_sso/utils/ui.py:69 msgid "Re-type Email address" msgstr "Eposta adresinizi yeniden girin" #: ../ubuntu_sso/utils/ui.py:70 msgid "The email must be a valid email address." msgstr "Eposta, geçerli bir eposta adresi olmalıdır." #: ../ubuntu_sso/utils/ui.py:71 msgid "" "The email addresses don't match, please double check and try entering them " "again." msgstr "Eposta adresleri eÅŸleÅŸmiyor, lütfen kontrol edin ve tekrar deneyin." #: ../ubuntu_sso/utils/ui.py:73 msgid "Email" msgstr "E-posta" #: ../ubuntu_sso/utils/ui.py:74 msgid "The email addresses do not match" msgstr "E-posta adresleri eÅŸleÅŸmiyor" #: ../ubuntu_sso/utils/ui.py:75 msgid "Enter code verification here" msgstr "DoÄŸrulama kodunu buraya yazın" #: ../ubuntu_sso/utils/ui.py:76 msgid "Please enter your name" msgstr "Lütfen adınızı girin" #: ../ubuntu_sso/utils/ui.py:77 msgid "The process did not finish successfully." msgstr "İşlem baÅŸarıyla tamamlanamadı." #: ../ubuntu_sso/utils/ui.py:79 msgid "Sign me in with my existing account" msgstr "Kayıtlı hesabımla giriÅŸ yap" #: ../ubuntu_sso/utils/ui.py:80 msgid "This field is required." msgstr "Bu alan zorunludur." #: ../ubuntu_sso/utils/ui.py:81 msgid "I've forgotten my password" msgstr "Åžifremi unuttum" #: ../ubuntu_sso/utils/ui.py:82 ../ubuntu_sso/utils/ui.py:130 msgid "Reset password" msgstr "Parolayı sıfırla" #: ../ubuntu_sso/utils/ui.py:83 msgid "" "To reset your {app_name} password, enter your registered email address " "below. We will send instructions to reset your password." msgstr "" "{app_name} parolanızı sıfırlamak için, aÅŸağıya kayıtlı e-posta adresinizi " "giriniz. Parolanızı sıfırlamak için talimatlar göndereceÄŸiz." #: ../ubuntu_sso/utils/ui.py:86 msgid "Please enter a valid email address" msgstr "Lütfen geçerli bir e-posta adresi girin" #: ../ubuntu_sso/utils/ui.py:87 msgid "There was a problem accessing the Ubuntu Single Sign On backend." msgstr "Tek Oturumu Açma arkaucuna eriÅŸimde bir sorun vardı." #: ../ubuntu_sso/utils/ui.py:89 #, python-format msgid "Create %(app_name)s account" msgstr "%(app_name)s hesabı oluÅŸtur" #: ../ubuntu_sso/utils/ui.py:90 msgid "Loading..." msgstr "Yükleniyor..." #: ../ubuntu_sso/utils/ui.py:91 msgid "Getting information, please wait..." msgstr "Bilgiler alınıyor, lütfen bekleyin..." #: ../ubuntu_sso/utils/ui.py:92 msgid "Already have an account? Click here to sign in" msgstr "Bir hesabınız var mı? GiriÅŸ yapmak için buraya tıklayın" #: ../ubuntu_sso/utils/ui.py:94 #, python-format msgid "Connect to %(app_name)s" msgstr "%(app_name)s uygulamasına baÄŸlan" #: ../ubuntu_sso/utils/ui.py:95 ../ubuntu_sso/utils/ui.py:109 msgid "Password" msgstr "Parola" #: ../ubuntu_sso/utils/ui.py:97 msgid "Sign In to {app_name}" msgstr "{app_name} uygulamasına giriÅŸ yap" #: ../ubuntu_sso/utils/ui.py:99 msgid "Name" msgstr "Ad" #: ../ubuntu_sso/utils/ui.py:100 msgid "The name must not be empty." msgstr "Ad kısmı boÅŸ kalamaz." #: ../ubuntu_sso/utils/ui.py:101 msgid "Next" msgstr "İleri" #: ../ubuntu_sso/utils/ui.py:102 msgid "Network detection" msgstr "AÄŸ algılama" #: ../ubuntu_sso/utils/ui.py:103 #, python-format msgid "" "Are you online? We can't detect an internet connection - you will need to be " "connected to set up %(app_name)s" msgstr "" "Çevrimiçi misiniz? İnternet baÄŸlantısını algılayamadık - %(app_name)s " "uygulamasını kurmak için internete baÄŸlı olmanız gerekiyor" #: ../ubuntu_sso/utils/ui.py:105 msgid "One moment please..." msgstr "Bir saniye lütfen..." #: ../ubuntu_sso/utils/ui.py:106 msgid "Create a password" msgstr "Parola oluÅŸtur" #: ../ubuntu_sso/utils/ui.py:107 msgid "Your password was successfully changed." msgstr "Parolanız baÅŸarıyla deÄŸiÅŸtirildi." #: ../ubuntu_sso/utils/ui.py:108 msgid "At least one number" msgstr "En azından bir sayı" #: ../ubuntu_sso/utils/ui.py:110 msgid "Re-type Password" msgstr "Parolayı Yeniden Girin" #: ../ubuntu_sso/utils/ui.py:111 msgid "" "The password must have a minimum of 8 characters and include one uppercase " "character and one number." msgstr "" "Parola en az 8 karakter olmalı ve 1 büyük harf ve bir rakam içermeli." #: ../ubuntu_sso/utils/ui.py:113 msgid "At least 8 characters" msgstr "En azından 8 karakter" #: ../ubuntu_sso/utils/ui.py:114 msgid "Passwords don't match" msgstr "Parolalar eÅŸleÅŸmiyor" #: ../ubuntu_sso/utils/ui.py:115 msgid "" "The passwords don't match, please double check and try entering them again." msgstr "" "GirdiÄŸiniz parolalar uyuÅŸmuyor, lütfen iki kere kontrol etmeyi ve yeniden " "girmeyi deneyin." #: ../ubuntu_sso/utils/ui.py:117 msgid "Your password must contain" msgstr "Parolanız ÅŸunu içermeli" #: ../ubuntu_sso/utils/ui.py:118 msgid "The password is too weak." msgstr "Parola çok zayıf" #: ../ubuntu_sso/utils/ui.py:119 msgid "At least one uppercase letter" msgstr "En azından bir büyük harf" #: ../ubuntu_sso/utils/ui.py:120 msgid "Privacy Policy" msgstr "Gizlilik İlkesi" #: ../ubuntu_sso/utils/ui.py:121 msgid "Connecting to:" msgstr "BaÄŸlanılıyor:" #: ../ubuntu_sso/utils/ui.py:122 msgid "Proxy Settings" msgstr "Vekil Sunucu Ayarları" #: ../ubuntu_sso/utils/ui.py:123 msgid "Incorrect login details. Please try again." msgstr "GiriÅŸ bilgileri hatâlı. Lütfen yeniden yeniden deneyin." #: ../ubuntu_sso/utils/ui.py:124 msgid "Please provide login details." msgstr "Lütfen giriÅŸ ayrıntılarını saÄŸlayın." #: ../ubuntu_sso/utils/ui.py:125 msgid "You are connecting through a proxy." msgstr "Vekil Sunucu üzerinden baÄŸlanıyorsunuz." #: ../ubuntu_sso/utils/ui.py:126 msgid "Get Help With Proxies" msgstr "Vekil Sunucu Hakkında Yardım Al" #: ../ubuntu_sso/utils/ui.py:127 msgid "Proxy password:" msgstr "Vekil sunucu parolası:" #: ../ubuntu_sso/utils/ui.py:128 msgid "Save and Connect" msgstr "Kaydet ve BaÄŸlan" #: ../ubuntu_sso/utils/ui.py:129 msgid "Proxy username:" msgstr "Vekil sunucu kullanıcı adı:" #: ../ubuntu_sso/utils/ui.py:131 msgid "" "A password reset code has been sent to your e-mail. Please enter the code " "below along with your new password." msgstr "" "Parola sıfırlama kodu e-postanıza gönderildi. Lütfen aÅŸağıya gönderilen kod " "ve yeni parolanızı girin." #: ../ubuntu_sso/utils/ui.py:133 msgid "Retype email" msgstr "E-Postanızı tekrar giriniz" #: ../ubuntu_sso/utils/ui.py:134 msgid "Retype password" msgstr "Parolanızı tekrar yazın" #: ../ubuntu_sso/utils/ui.py:135 #, python-format msgid "To reset your %(app_name)s password, enter your email address below:" msgstr "%(app_name)s parolasını sıfırlamak için, E-posta adresinizi girin:" #: ../ubuntu_sso/utils/ui.py:137 msgid "" "We are very Sorry! The service that signs you on is not responding right " "now\n" "Please try again or come back in a few minutes." msgstr "" "Üzgünüz! Oturum açma hizmetiniz ÅŸu anda cevap vermiyor\n" "Lütfen birkaç dakika sonra tekrar deneyin." #: ../ubuntu_sso/utils/ui.py:140 msgid "Sorry we did not recognize the email address." msgstr "Üzgünüz, e-posta adresiniz tanınamadı." #: ../ubuntu_sso/utils/ui.py:142 msgid "Reset code" msgstr "Sıfırlama kodu" #: ../ubuntu_sso/utils/ui.py:145 #, python-format msgid "" "A password reset code has been sent to %(email)s.\n" "Please enter the code below along with your new password." msgstr "" "Parola sıfırlama kodu %(email)s adresine gönderildi.\n" "Lütfen kodu aÅŸağıya yeni parolanızla birlikte girin." #: ../ubuntu_sso/utils/ui.py:147 msgid "Set Up Account" msgstr "Hesap Ayarla" #: ../ubuntu_sso/utils/ui.py:148 msgid "I don't have an account yet - sign me up" msgstr "Henüz hesabım yok - hesap aç" #: ../ubuntu_sso/utils/ui.py:149 msgid "Sign In" msgstr "GiriÅŸ Yap" #: ../ubuntu_sso/utils/ui.py:150 msgid "Log-in with my existing account." msgstr "" #: ../ubuntu_sso/utils/ui.py:151 msgid "the appname whose ssl error we are going to show." msgstr "ssl hatasını göstereceÄŸimiz uygulamanın adı." #: ../ubuntu_sso/utils/ui.py:152 msgid "Certificate details" msgstr "Sertifika ayrıntıları" #: ../ubuntu_sso/utils/ui.py:153 msgid "Connect" msgstr "BaÄŸlan" #: ../ubuntu_sso/utils/ui.py:154 msgid "the details ssl certificate we are going to show." msgstr "ssl sertifikası ayrıntılarını göreceÄŸiz." #: ../ubuntu_sso/utils/ui.py:161 msgid "Open the SSL certificate UI." msgstr "SSL sertifikası arayüzünü aç." #: ../ubuntu_sso/utils/ui.py:162 msgid "SSL Certificate Not Valid" msgstr "SSL Sertifikası Geçerli DeÄŸil" #: ../ubuntu_sso/utils/ui.py:163 msgid "the domain whose ssl certificate we are going to show." msgstr "ssl sertifikası alanadını göreceÄŸiz." #: ../ubuntu_sso/utils/ui.py:164 #, python-format msgid "" "You are trying to connect to a proxy server on %(domain)s. This server uses " "a secure connection, and the SSL certificate is not valid because:" msgstr "" "%(domain)s alan adında bulunan bir vekil sunucuya baÄŸlanmaya çalışıyorsunuz. " "Bu sunucu güvenli bir baÄŸlantı kullanmaktadır ve SSL sertifikası ÅŸu yüzden " "geçerli deÄŸildir:" #: ../ubuntu_sso/utils/ui.py:167 msgid "The certificate has not been verified" msgstr "Sertifika doÄŸrulanmadı" #: ../ubuntu_sso/utils/ui.py:168 msgid "Do you want to connect to this server?" msgstr "Bu sunucuya baÄŸlanmak istiyor musunuz?" #: ../ubuntu_sso/utils/ui.py:169 msgid "Get Help With SSL" msgstr "SSL ile Yardım Al" #: ../ubuntu_sso/utils/ui.py:170 #, python-format msgid "" "If you are not sure about this server, do not use it to connect to " "%(app_name)s." msgstr "" "EÄŸer bu sunucu hakkında emin deÄŸilseniz %(app_name)s baÄŸlanmak için onu " "kullanmayın." #: ../ubuntu_sso/utils/ui.py:172 msgid "Remember my settings for this certificate." msgstr "Bu sertifika için ayarlarımı hatırla." #: ../ubuntu_sso/utils/ui.py:173 msgid "" "The name on the certificate isn't valid or doesn't match the name of the site" msgstr "Sertifika adı geçerli deÄŸil ya da sayfanın adıyla eÅŸleÅŸmiyor." #: ../ubuntu_sso/utils/ui.py:175 msgid "The certificate has expired" msgstr "Sertifikanın tarihi geçmiÅŸ" #: ../ubuntu_sso/utils/ui.py:176 #, python-format msgid "You are now logged into %(app_name)s." msgstr "%(app_name)s uygulamasına giriÅŸ yaptınız." #: ../ubuntu_sso/utils/ui.py:177 msgid "Surname" msgstr "Soyadı" #: ../ubuntu_sso/utils/ui.py:178 msgid "Terms of Service" msgstr "Hizmet Kullanım Åžartları" #: ../ubuntu_sso/utils/ui.py:179 msgid "Sign Up to {app_name}" msgstr "{app_name} Uygulamasına Kayıt Ol" #: ../ubuntu_sso/utils/ui.py:180 msgid "Show Terms & Conditions" msgstr "Åžartlar & KoÅŸulları Göster" #: ../ubuntu_sso/utils/ui.py:181 #, python-format msgid "" "Agreeing to the %(app_name)s Terms & Conditions is required to subscribe." msgstr "" "Kayıt olmak için %(app_name)s Hüküm ve Åžartları'nı kabul etmeniz " "gerekmektedir." #: ../ubuntu_sso/utils/ui.py:183 #, python-format msgid "You can also find these terms at %(url)s" msgstr "" "Bu ÅŸartları ayrıca %(url)s adresinde de bulabilirsiniz" #: ../ubuntu_sso/utils/ui.py:184 msgid "Try again" msgstr "Yeniden dene" #: ../ubuntu_sso/utils/ui.py:185 msgid "" "There was an error when trying to complete the process. Please check the " "information and try again." msgstr "" "İşlemi tamamlamaya çalışırken bir hata oluÅŸtu. Lütfen bilgiyi kontrol edin " "ve tekrar deneyin." #: ../ubuntu_sso/utils/ui.py:187 msgid "Verification code" msgstr "DoÄŸrulama kodu" #: ../ubuntu_sso/utils/ui.py:188 #, python-format msgid "" "Check %(email)s for an email from Ubuntu Single Sign On. This message " "contains a verification code. Enter the code in the field below and click OK " "to complete creating your %(app_name)s account." msgstr "" "Ubuntu Tek Oturum Açma'dan gelen iletiyi görmek için %(email)s ileti " "kutunuza bakın. Gönderilen ileti bir doÄŸrulama kodu içermektedir. " "%(app_name)s hesabı oluÅŸturma iÅŸleminizi tamamlamak için gönderilen bu kodu " "aÅŸağıdaki alana girin ve Tamam'a tıkayın." #: ../ubuntu_sso/utils/ui.py:192 msgid "Enter verification code" msgstr "DoÄŸrulama kodunu girin" #: ../ubuntu_sso/utils/ui.py:195 #, python-format msgid "I agree with the %(app_name)s terms and conditions" msgstr "%(app_name)s ÅŸartlar ve koÅŸullarını kabul ediyorum." #: ../ubuntu_sso/utils/ui.py:196 #, python-format msgid "Yes! Email me %(app_name)s tips and updates." msgstr "Evet! %(app_name)s ipuçları ve güncelleÅŸtirmeleri bana bildir." ubuntu-sso-client-13.10/po/zh_TW.po0000664000202700020270000003466012151461656017373 0ustar dobeydobey00000000000000# Chinese (Traditional) translation for ubuntu-sso-client # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the ubuntu-sso-client package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: ubuntu-sso-client\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-09-11 18:25+0000\n" "PO-Revision-Date: 2012-09-08 10:18+0000\n" "Last-Translator: Cheng-Chia Tseng \n" "Language-Team: Chinese (Traditional) \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-09-17 18:24+0000\n" "X-Generator: Launchpad (build 15944)\n" #. Undefined variable '_', pylint: disable=E0602 #. all the text that is used in the gui #: ../ubuntu_sso/utils/ui.py:49 msgid "By signing up to {app_name} you agree to our {privacy_policy}" msgstr "登入 {app_name} å°‡è¦–ç‚ºæ‚¨åŒæ„我們的 {privacy_policy}" #: ../ubuntu_sso/utils/ui.py:51 msgid "By signing up to {app_name} you agree to our {terms_and_conditions}" msgstr "登入 {app_name} å°‡è¦–ç‚ºæ‚¨åŒæ„我們的 {terms_and_conditions}" #: ../ubuntu_sso/utils/ui.py:53 msgid " and {privacy_policy}" msgstr " 與 {privacy_policy}" #: ../ubuntu_sso/utils/ui.py:54 msgid "Cancel" msgstr "å–æ¶ˆ" #: ../ubuntu_sso/utils/ui.py:55 msgid "Type the characters above" msgstr "請輸入上方的字元" #: ../ubuntu_sso/utils/ui.py:56 msgid "There was a problem getting the captcha, reloading..." msgstr "å–å¾— captcha æ™‚ç™¼ç”ŸéŒ¯èª¤ï¼Œæ­£åœ¨é‡æ–°è¼‰å…¥..." #: ../ubuntu_sso/utils/ui.py:58 #, python-format msgid "If you can't read this then %(reload_link)s this page" msgstr "如果您無法閱讀,就%(reload_link)s這份é é¢" #: ../ubuntu_sso/utils/ui.py:60 msgid "refresh" msgstr "釿–°æ•´ç†" #: ../ubuntu_sso/utils/ui.py:61 msgid "Reload" msgstr "釿–°è¼‰å…¥" #: ../ubuntu_sso/utils/ui.py:62 msgid "The captcha is a required field" msgstr "Captcha 是必填欄ä½" #: ../ubuntu_sso/utils/ui.py:63 msgid "Close window and set up later" msgstr "關閉視窗並ç¨å¾Œè¨­ç½®" #: ../ubuntu_sso/utils/ui.py:64 msgid "Congratulations, {app_name} is installed!" msgstr "已經安è£å¥½ {app_name} 了,æ­å–œï¼" #: ../ubuntu_sso/utils/ui.py:65 #, python-format msgid "To connect this computer to %(app_name)s enter your details below." msgstr "è‹¥è¦é€£æŽ¥æ­¤é›»è…¦è‡³ %(app_name)s,請於下方填入您的詳細資料。" #: ../ubuntu_sso/utils/ui.py:67 msgid "Register with {app_name}." msgstr "以 {app_name} 註冊。" #: ../ubuntu_sso/utils/ui.py:68 ../ubuntu_sso/utils/ui.py:93 #: ../ubuntu_sso/utils/ui.py:143 msgid "Email address" msgstr "é›»å­éƒµä»¶åœ°å€" #: ../ubuntu_sso/utils/ui.py:69 msgid "Re-type Email address" msgstr "冿¬¡è¼¸å…¥é›»å­éƒµä»¶åœ°å€" #: ../ubuntu_sso/utils/ui.py:70 msgid "The email must be a valid email address." msgstr "é›»å­éƒµä»¶åœ°å€å¿…須是有效的。" #: ../ubuntu_sso/utils/ui.py:71 msgid "" "The email addresses don't match, please double check and try entering them " "again." msgstr "é›»å­éƒµä»¶åœ°å€ä¸ç›¸ç¬¦ï¼Œè«‹å†æ¬¡ç¢ºèªä¸¦è©¦è‘—釿–°è¼¸å…¥ã€‚" #: ../ubuntu_sso/utils/ui.py:73 msgid "Email" msgstr "é›»å­éƒµä»¶" #: ../ubuntu_sso/utils/ui.py:74 msgid "The email addresses do not match" msgstr "é›»å­éƒµä»¶åœ°å€ä¸ç¬¦" #: ../ubuntu_sso/utils/ui.py:75 msgid "Enter code verification here" msgstr "請在此輸入驗證碼" #: ../ubuntu_sso/utils/ui.py:76 msgid "Please enter your name" msgstr "請輸入您的å稱" #: ../ubuntu_sso/utils/ui.py:77 msgid "The process did not finish successfully." msgstr "ç¨‹åºæœªæˆåŠŸçµæŸã€‚" #: ../ubuntu_sso/utils/ui.py:79 msgid "Sign me in with my existing account" msgstr "用我既有的帳戶登入" #: ../ubuntu_sso/utils/ui.py:80 msgid "This field is required." msgstr "此欄ä½ç‚ºå¿…填。" #: ../ubuntu_sso/utils/ui.py:81 msgid "I've forgotten my password" msgstr "我忘記密碼" #: ../ubuntu_sso/utils/ui.py:82 ../ubuntu_sso/utils/ui.py:130 msgid "Reset password" msgstr "é‡è¨­å¯†ç¢¼" #: ../ubuntu_sso/utils/ui.py:83 msgid "" "To reset your {app_name} password, enter your registered email address " "below. We will send instructions to reset your password." msgstr "è‹¥è¦é‡è¨­æ‚¨çš„ {app_name} 密碼,請在下é¢è¼¸å…¥æ‚¨è¨»å†Šçš„é›»å­éƒµä»¶åœ°å€ã€‚我們將會寄é€ä¸€ä»½æŒ‡ç¤ºä»¥é‡è¨­æ‚¨çš„密碼。" #: ../ubuntu_sso/utils/ui.py:86 msgid "Please enter a valid email address" msgstr "請輸入有效的電å­éƒµä»¶åœ°å€" #: ../ubuntu_sso/utils/ui.py:87 msgid "There was a problem accessing the Ubuntu Single Sign On backend." msgstr "å­˜å– Ubuntu Single Sign On (單一帳號簽入) 後端時發生å•題。" #: ../ubuntu_sso/utils/ui.py:89 #, python-format msgid "Create %(app_name)s account" msgstr "建立 %(app_name)s 帳號" #: ../ubuntu_sso/utils/ui.py:90 msgid "Loading..." msgstr "載入中..." #: ../ubuntu_sso/utils/ui.py:91 msgid "Getting information, please wait..." msgstr "正在å–得資訊,請ç¨å€™..." #: ../ubuntu_sso/utils/ui.py:92 msgid "Already have an account? Click here to sign in" msgstr "已經有帳號了嗎?請點擊此處以登入" #: ../ubuntu_sso/utils/ui.py:94 #, python-format msgid "Connect to %(app_name)s" msgstr "連接至 %(app_name)s" #: ../ubuntu_sso/utils/ui.py:95 ../ubuntu_sso/utils/ui.py:109 msgid "Password" msgstr "密碼" #: ../ubuntu_sso/utils/ui.py:97 msgid "Sign In to {app_name}" msgstr "登入 {app_name}" #: ../ubuntu_sso/utils/ui.py:99 msgid "Name" msgstr "å稱" #: ../ubuntu_sso/utils/ui.py:100 msgid "The name must not be empty." msgstr "å稱ä¸å¾—為空白。" #: ../ubuntu_sso/utils/ui.py:101 msgid "Next" msgstr "下一步" #: ../ubuntu_sso/utils/ui.py:102 msgid "Network detection" msgstr "ç¶²è·¯åµæ¸¬" #: ../ubuntu_sso/utils/ui.py:103 #, python-format msgid "" "Are you online? We can't detect an internet connection - you will need to be " "connected to set up %(app_name)s" msgstr "æ‚¨åœ¨ç·šä¸Šå—Žï¼Ÿæˆ‘å€‘æ²’æœ‰åµæ¸¬åˆ°ä»»ä½•網路連線 —— 您需è¦é€£ä¸Šç¶²æ‰èƒ½è¨­ç½® %(app_name)s" #: ../ubuntu_sso/utils/ui.py:105 msgid "One moment please..." msgstr "è«‹ç¨å€™..." #: ../ubuntu_sso/utils/ui.py:106 msgid "Create a password" msgstr "建立密碼" #: ../ubuntu_sso/utils/ui.py:107 msgid "Your password was successfully changed." msgstr "您的密碼已變更æˆåŠŸã€‚" #: ../ubuntu_sso/utils/ui.py:108 msgid "At least one number" msgstr "至少有一個數字" #: ../ubuntu_sso/utils/ui.py:110 msgid "Re-type Password" msgstr "冿¬¡è¼¸å…¥å¯†ç¢¼" #: ../ubuntu_sso/utils/ui.py:111 msgid "" "The password must have a minimum of 8 characters and include one uppercase " "character and one number." msgstr "密碼長度必須至少 8 å€‹å­—å…ƒï¼Œä¸¦ä¸”è‡³å°‘å«æœ‰ä¸€å€‹å¤§å¯«å­—元與一個數字。" #: ../ubuntu_sso/utils/ui.py:113 msgid "At least 8 characters" msgstr "至少 8 個字元" #: ../ubuntu_sso/utils/ui.py:114 msgid "Passwords don't match" msgstr "密碼ä¸ç›¸ç¬¦" #: ../ubuntu_sso/utils/ui.py:115 msgid "" "The passwords don't match, please double check and try entering them again." msgstr "密碼ä¸ç›¸ç¬¦ï¼Œè«‹å†æ¬¡ç¢ºèªä¸¦è©¦è‘—釿–°è¼¸å…¥ã€‚" #: ../ubuntu_sso/utils/ui.py:117 msgid "Your password must contain" msgstr "您的密碼必須包å«" #: ../ubuntu_sso/utils/ui.py:118 msgid "The password is too weak." msgstr "å¯†ç¢¼éŽæ–¼è–„弱。" #: ../ubuntu_sso/utils/ui.py:119 msgid "At least one uppercase letter" msgstr "至少有一個大寫字æ¯" #: ../ubuntu_sso/utils/ui.py:120 msgid "Privacy Policy" msgstr "éš±ç§æ”¿ç­–" #: ../ubuntu_sso/utils/ui.py:121 msgid "Connecting to:" msgstr "正連接到:" #: ../ubuntu_sso/utils/ui.py:122 msgid "Proxy Settings" msgstr "代ç†ä¼ºæœå™¨è¨­å®šå€¼" #: ../ubuntu_sso/utils/ui.py:123 msgid "Incorrect login details. Please try again." msgstr "ç™»å…¥ç”¨è©³ç´°è³‡æ–™ä¸æ­£ç¢ºã€‚è«‹å†è©¦ä¸€æ¬¡ã€‚" #: ../ubuntu_sso/utils/ui.py:124 msgid "Please provide login details." msgstr "è«‹æä¾›ç™»å…¥ç”¨è©³ç´°è³‡æ–™ã€‚" #: ../ubuntu_sso/utils/ui.py:125 msgid "You are connecting through a proxy." msgstr "您正é€éŽä»£ç†ä¼ºæœå™¨é€£æŽ¥ã€‚" #: ../ubuntu_sso/utils/ui.py:126 msgid "Get Help With Proxies" msgstr "å–得代ç†ä¼ºæœå™¨çš„相關幫助" #: ../ubuntu_sso/utils/ui.py:127 msgid "Proxy password:" msgstr "代ç†ä¼ºæœå™¨å¯†ç¢¼ï¼š" #: ../ubuntu_sso/utils/ui.py:128 msgid "Save and Connect" msgstr "儲存並連接" #: ../ubuntu_sso/utils/ui.py:129 msgid "Proxy username:" msgstr "代ç†ä¼ºæœå™¨ç”¨æˆ¶å稱:" #: ../ubuntu_sso/utils/ui.py:131 msgid "" "A password reset code has been sent to your e-mail. Please enter the code " "below along with your new password." msgstr "密碼é‡è¨­ä»£ç¢¼å·²å¯„é€åˆ°æ‚¨çš„é›»å­ä¿¡ç®±ã€‚è«‹åœ¨ä¸‹æ–¹è¼¸å…¥ä»£ç¢¼ï¼Œä»¥åŠæ‚¨çš„æ–°å¯†ç¢¼ã€‚" #: ../ubuntu_sso/utils/ui.py:133 msgid "Retype email" msgstr "冿¬¡è¼¸å…¥æ‚¨çš„é›»å­éƒµä»¶" #: ../ubuntu_sso/utils/ui.py:134 msgid "Retype password" msgstr "冿¬¡è¼¸å…¥å¯†ç¢¼" #: ../ubuntu_sso/utils/ui.py:135 #, python-format msgid "To reset your %(app_name)s password, enter your email address below:" msgstr "è‹¥è¦é‡è¨­æ‚¨çš„ %(app_name)s 密碼,請於下方輸入您的電å­éƒµä»¶åœ°å€ï¼š" #: ../ubuntu_sso/utils/ui.py:137 msgid "" "We are very Sorry! The service that signs you on is not responding right " "now\n" "Please try again or come back in a few minutes." msgstr "" "我們éžå¸¸æŠ±æ­‰ï¼ç™»å…¥çš„æœå‹™ç›®å‰æ²’有回應\n" "è«‹é‡æ–°è©¦ä¸€é,或是等個幾分é˜å¾Œå†å›žä¾†ã€‚" #: ../ubuntu_sso/utils/ui.py:140 msgid "Sorry we did not recognize the email address." msgstr "很抱歉,我們ä¸èªè­˜é€™å€‹é›»å­éƒµä»¶åœ°å€ã€‚" #: ../ubuntu_sso/utils/ui.py:142 msgid "Reset code" msgstr "é‡è¨­ä»£ç¢¼" #: ../ubuntu_sso/utils/ui.py:145 #, python-format msgid "" "A password reset code has been sent to %(email)s.\n" "Please enter the code below along with your new password." msgstr "" "密碼é‡è¨­ä»£ç¢¼å·²ç¶“寄é€è‡³ %(email)s。\n" "請於下方輸入該代碼與您的新密碼。" #: ../ubuntu_sso/utils/ui.py:147 msgid "Set Up Account" msgstr "設置帳號" #: ../ubuntu_sso/utils/ui.py:148 msgid "I don't have an account yet - sign me up" msgstr "我還沒有帳號 - 我è¦è¨»å†Š" #: ../ubuntu_sso/utils/ui.py:149 msgid "Sign In" msgstr "登入" #: ../ubuntu_sso/utils/ui.py:150 msgid "Log-in with my existing account." msgstr "以我的既有帳號登入。" #: ../ubuntu_sso/utils/ui.py:151 msgid "the appname whose ssl error we are going to show." msgstr "應用程å¼å稱 (我們將顯示它的 SSL 錯誤)。" #: ../ubuntu_sso/utils/ui.py:152 msgid "Certificate details" msgstr "憑證詳細資訊" #: ../ubuntu_sso/utils/ui.py:153 msgid "Connect" msgstr "連接" #: ../ubuntu_sso/utils/ui.py:154 msgid "the details ssl certificate we are going to show." msgstr "詳細資料 (我們將顯示它的 SSL 憑證)。" #: ../ubuntu_sso/utils/ui.py:161 msgid "Open the SSL certificate UI." msgstr "開啟 SSL 憑證使用介é¢ã€‚" #: ../ubuntu_sso/utils/ui.py:162 msgid "SSL Certificate Not Valid" msgstr "SSL 憑證無效" #: ../ubuntu_sso/utils/ui.py:163 msgid "the domain whose ssl certificate we are going to show." msgstr "網域 (我們將顯示它的 SSL 憑證)。" #: ../ubuntu_sso/utils/ui.py:164 #, python-format msgid "" "You are trying to connect to a proxy server on %(domain)s. This server uses " "a secure connection, and the SSL certificate is not valid because:" msgstr "您正在嘗試連接在 %(domain)s 的代ç†ä¼ºæœå™¨ã€‚這個伺æœå™¨ä½¿ç”¨äº†å®‰å…¨æ€§é€£ç·šï¼Œè€Œ SSL 憑證無效的原因是:" #: ../ubuntu_sso/utils/ui.py:167 msgid "The certificate has not been verified" msgstr "憑證尚未驗證" #: ../ubuntu_sso/utils/ui.py:168 msgid "Do you want to connect to this server?" msgstr "您想è¦é€£æŽ¥åˆ°é€™è‡ºä¼ºæœå™¨å—Žï¼Ÿ" #: ../ubuntu_sso/utils/ui.py:169 msgid "Get Help With SSL" msgstr "å–å¾— SSL 的相關幫助" #: ../ubuntu_sso/utils/ui.py:170 #, python-format msgid "" "If you are not sure about this server, do not use it to connect to " "%(app_name)s." msgstr "如果您並ä¸ç¢ºå®šé€™å€‹ä¼ºæœå™¨ï¼Œä¸è¦ç”¨å®ƒä¾†å’Œ %(app_name)s 連接。" #: ../ubuntu_sso/utils/ui.py:172 msgid "Remember my settings for this certificate." msgstr "記得我å°é€™å€‹æ†‘證的設定值。" #: ../ubuntu_sso/utils/ui.py:173 msgid "" "The name on the certificate isn't valid or doesn't match the name of the site" msgstr "憑證上的å稱無效,或和網站的å稱ä¸ç¬¦" #: ../ubuntu_sso/utils/ui.py:175 msgid "The certificate has expired" msgstr "æ†‘è­‰å·²éŽæœŸ" #: ../ubuntu_sso/utils/ui.py:176 #, python-format msgid "You are now logged into %(app_name)s." msgstr "您ç¾åœ¨å·²ç¶“登入 %(app_name)s。" #: ../ubuntu_sso/utils/ui.py:177 msgid "Surname" msgstr "å§“æ°" #: ../ubuntu_sso/utils/ui.py:178 msgid "Terms of Service" msgstr "æœå‹™æ¢æ¬¾" #: ../ubuntu_sso/utils/ui.py:179 msgid "Sign Up to {app_name}" msgstr "註冊 {app_name}" #: ../ubuntu_sso/utils/ui.py:180 msgid "Show Terms & Conditions" msgstr "é¡¯ç¤ºæ¢æ¬¾èˆ‡ç´°å‰‡" #: ../ubuntu_sso/utils/ui.py:181 #, python-format msgid "" "Agreeing to the %(app_name)s Terms & Conditions is required to subscribe." msgstr "è‹¥è¦è¨‚閱,您需è¦åŒæ„ %(app_name)s çš„æ¢æ¬¾èˆ‡ç´°å‰‡ã€‚" #: ../ubuntu_sso/utils/ui.py:183 #, python-format msgid "You can also find these terms at %(url)s" msgstr "您也å¯ä»¥åœ¨ %(url)s æ‰¾åˆ°é€™äº›æ¢æ¬¾" #: ../ubuntu_sso/utils/ui.py:184 msgid "Try again" msgstr "å†è©¦ä¸€æ¬¡" #: ../ubuntu_sso/utils/ui.py:185 msgid "" "There was an error when trying to complete the process. Please check the " "information and try again." msgstr "當嘗試完æˆç¨‹åºæ™‚發生錯誤。請檢查資訊並é‡è©¦ã€‚" #: ../ubuntu_sso/utils/ui.py:187 msgid "Verification code" msgstr "驗證碼" #: ../ubuntu_sso/utils/ui.py:188 #, python-format msgid "" "Check %(email)s for an email from Ubuntu Single Sign On. This message " "contains a verification code. Enter the code in the field below and click OK " "to complete creating your %(app_name)s account." msgstr "" "請檢查 %(email)s å…§æ˜¯å¦æœ‰ä¾†è‡ª Ubuntu Single Sign On " "的電å­éƒµä»¶ã€‚é€™ä»½è¨Šæ¯æœƒåŒ…å«ä¸€å€‹é©—證碼。在下é¢çš„æ¬„ä½è¼¸å…¥é©—證碼後,就點擊 OK,以完æˆå»ºç«‹æ‚¨çš„ %(app_name)s 帳號。" #: ../ubuntu_sso/utils/ui.py:192 msgid "Enter verification code" msgstr "請輸入驗證碼" #: ../ubuntu_sso/utils/ui.py:195 #, python-format msgid "I agree with the %(app_name)s terms and conditions" msgstr "æˆ‘åŒæ„ %(app_name)s æ¢æ¬¾èˆ‡ç´°å‰‡" #: ../ubuntu_sso/utils/ui.py:196 #, python-format msgid "Yes! Email me %(app_name)s tips and updates." msgstr "是ï¼è«‹å¯„給我有關 %(app_name)s 的相關秘訣與更新消æ¯ã€‚" ubuntu-sso-client-13.10/po/uk.po0000664000202700020270000004313012151461656016747 0ustar dobeydobey00000000000000# Ukrainian translation for ubuntu-sso-client # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the ubuntu-sso-client package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: ubuntu-sso-client\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-09-11 18:25+0000\n" "PO-Revision-Date: 2012-04-04 11:36+0000\n" "Last-Translator: Сергій Ðайтінгейл \n" "Language-Team: Ukrainian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-09-17 18:24+0000\n" "X-Generator: Launchpad (build 15944)\n" #. Undefined variable '_', pylint: disable=E0602 #. all the text that is used in the gui #: ../ubuntu_sso/utils/ui.py:49 msgid "By signing up to {app_name} you agree to our {privacy_policy}" msgstr "" "ЗдійÑнюючи вхід до {app_name}, ви погоджуєтеÑÑŒ із нашою {privacy_policy}" #: ../ubuntu_sso/utils/ui.py:51 msgid "By signing up to {app_name} you agree to our {terms_and_conditions}" msgstr "" "ЗдійÑнюючи вхід до {app_name}, ви погоджуєтеÑÑŒ із нашими " "{terms_and_conditions}" #: ../ubuntu_sso/utils/ui.py:53 msgid " and {privacy_policy}" msgstr " и {privacy_policy}" #: ../ubuntu_sso/utils/ui.py:54 msgid "Cancel" msgstr "СкаÑувати" #: ../ubuntu_sso/utils/ui.py:55 msgid "Type the characters above" msgstr "Введіть Ñимволи, подані вище" #: ../ubuntu_sso/utils/ui.py:56 msgid "There was a problem getting the captcha, reloading..." msgstr "СтавÑÑ Ð·Ð±Ñ–Ð¹ при отриманні капчі, Ñпробую ще раз..." #: ../ubuntu_sso/utils/ui.py:58 #, python-format msgid "If you can't read this then %(reload_link)s this page" msgstr "Якщо ви не можете це прочитати, тоді %(reload_link)s цю Ñторінку" #: ../ubuntu_sso/utils/ui.py:60 msgid "refresh" msgstr "оновити" #: ../ubuntu_sso/utils/ui.py:61 msgid "Reload" msgstr "Оновити" #: ../ubuntu_sso/utils/ui.py:62 msgid "The captcha is a required field" msgstr "Ðеобхідно заповнити капчу" #: ../ubuntu_sso/utils/ui.py:63 msgid "Close window and set up later" msgstr "Закрити та налаштувати пізніше" #: ../ubuntu_sso/utils/ui.py:64 msgid "Congratulations, {app_name} is installed!" msgstr "Вітаємо, {app_name} вÑтановлено!" #: ../ubuntu_sso/utils/ui.py:65 #, python-format msgid "To connect this computer to %(app_name)s enter your details below." msgstr "" "Ð”Ð»Ñ Ð¿Ñ–Ð´'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð´Ð¾ цього комп'ютера %(app_name)s введіть Ñвої дані нижче." #: ../ubuntu_sso/utils/ui.py:67 msgid "Register with {app_name}." msgstr "" #: ../ubuntu_sso/utils/ui.py:68 ../ubuntu_sso/utils/ui.py:93 #: ../ubuntu_sso/utils/ui.py:143 msgid "Email address" msgstr "ÐдреÑа електронної пошти" #: ../ubuntu_sso/utils/ui.py:69 msgid "Re-type Email address" msgstr "Повторіть адреÑу електронної пошти" #: ../ubuntu_sso/utils/ui.py:70 msgid "The email must be a valid email address." msgstr "ÐдреÑа електронної пошти має бути Ñправжньою." #: ../ubuntu_sso/utils/ui.py:71 msgid "" "The email addresses don't match, please double check and try entering them " "again." msgstr "" "ÐдреÑи електронної пошти не Ñпівпадають, перевірте та введіть Ñ—Ñ… знову." #: ../ubuntu_sso/utils/ui.py:73 msgid "Email" msgstr "Email" #: ../ubuntu_sso/utils/ui.py:74 msgid "The email addresses do not match" msgstr "ÐдреÑи email не Ñпівпадають" #: ../ubuntu_sso/utils/ui.py:75 msgid "Enter code verification here" msgstr "Введіть код підтвердженнÑ" #: ../ubuntu_sso/utils/ui.py:76 msgid "Please enter your name" msgstr "Введіть ваше ім’Ñ, будь-лаÑка" #: ../ubuntu_sso/utils/ui.py:77 msgid "The process did not finish successfully." msgstr "ÐŸÑ€Ð¾Ñ†ÐµÑ Ð·Ð°ÐºÑ–Ð½Ñ‡Ð¸Ð²ÑÑ Ð½ÐµÐ²Ð´Ð°Ð»Ð¾." #: ../ubuntu_sso/utils/ui.py:79 msgid "Sign me in with my existing account" msgstr "Зайти до мого аккаунту" #: ../ubuntu_sso/utils/ui.py:80 msgid "This field is required." msgstr "Обов’Ñзкове поле." #: ../ubuntu_sso/utils/ui.py:81 msgid "I've forgotten my password" msgstr "Ðе можу згадати пароль" #: ../ubuntu_sso/utils/ui.py:82 ../ubuntu_sso/utils/ui.py:130 msgid "Reset password" msgstr "Скинути пароль" #: ../ubuntu_sso/utils/ui.py:83 msgid "" "To reset your {app_name} password, enter your registered email address " "below. We will send instructions to reset your password." msgstr "" "Ð”Ð»Ñ ÑÐºÐ¸Ð´Ð°Ð½Ð½Ñ Ð¿Ð°Ñ€Ð¾Ð»ÑŽ {app_name}, вкажіть Вашу зареєÑтровану email-адреÑу " "нижче. Вам буде надіÑлано інÑтрукцію по Ñкиданню паролÑ." #: ../ubuntu_sso/utils/ui.py:86 msgid "Please enter a valid email address" msgstr "Будь лаÑка, введіть дійÑну електронну адреÑу" #: ../ubuntu_sso/utils/ui.py:87 msgid "There was a problem accessing the Ubuntu Single Sign On backend." msgstr "" "Виникла проблема при доÑтупі до внутрішнього інтерфейÑу Ñлужби Ubuntu Single " "Sign On." #: ../ubuntu_sso/utils/ui.py:89 #, python-format msgid "Create %(app_name)s account" msgstr "Створити обліковий Ð·Ð°Ð¿Ð¸Ñ Ð´Ð»Ñ %(app_name)s" #: ../ubuntu_sso/utils/ui.py:90 msgid "Loading..." msgstr "ЗавантаженнÑ…" #: ../ubuntu_sso/utils/ui.py:91 msgid "Getting information, please wait..." msgstr "ÐžÑ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ—, зачекайте будь лаÑка..." #: ../ubuntu_sso/utils/ui.py:92 msgid "Already have an account? Click here to sign in" msgstr "Вже зареєÑтровані? ÐатиÑніть Ñюди, щоб увійти" #: ../ubuntu_sso/utils/ui.py:94 #, python-format msgid "Connect to %(app_name)s" msgstr "З'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð· %(app_name)s" #: ../ubuntu_sso/utils/ui.py:95 ../ubuntu_sso/utils/ui.py:109 msgid "Password" msgstr "Пароль" #: ../ubuntu_sso/utils/ui.py:97 msgid "Sign In to {app_name}" msgstr "Увійти до {app_name}" #: ../ubuntu_sso/utils/ui.py:99 msgid "Name" msgstr "Ім’Ñ" #: ../ubuntu_sso/utils/ui.py:100 msgid "The name must not be empty." msgstr "Ð†Ð¼â€™Ñ Ð½Ðµ має бути порожнім" #: ../ubuntu_sso/utils/ui.py:101 msgid "Next" msgstr "Вперед" #: ../ubuntu_sso/utils/ui.py:102 msgid "Network detection" msgstr "ВиÑÐ²Ð»ÐµÐ½Ð½Ñ Ð¼ÐµÑ€ÐµÐ¶Ñ–" #: ../ubuntu_sso/utils/ui.py:103 #, python-format msgid "" "Are you online? We can't detect an internet connection - you will need to be " "connected to set up %(app_name)s" msgstr "" "Ви дійно підключені до інтернету? Ми не можемо виÑвити інтернет-з’єднаннÑ, " "Ñке необхідно Ð´Ð»Ñ Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ %(app_name)s" #: ../ubuntu_sso/utils/ui.py:105 msgid "One moment please..." msgstr "Зачекайте, будь лаÑка..." #: ../ubuntu_sso/utils/ui.py:106 msgid "Create a password" msgstr "Створити пароль" #: ../ubuntu_sso/utils/ui.py:107 msgid "Your password was successfully changed." msgstr "Ваш пароль уÑпішно змінено." #: ../ubuntu_sso/utils/ui.py:108 msgid "At least one number" msgstr "Принаймні одна цифра" #: ../ubuntu_sso/utils/ui.py:110 msgid "Re-type Password" msgstr "Введіть пароль ще раз" #: ../ubuntu_sso/utils/ui.py:111 msgid "" "The password must have a minimum of 8 characters and include one uppercase " "character and one number." msgstr "" "Пароль має ÑкладатиÑÑ Ð½Ðµ менше ніж з 8-ми Ñимволів та міÑтити одну велику " "літеру та одну цифру." #: ../ubuntu_sso/utils/ui.py:113 msgid "At least 8 characters" msgstr "Принаймні 8 Ñимволів" #: ../ubuntu_sso/utils/ui.py:114 msgid "Passwords don't match" msgstr "Паролі не Ñпівпадають" #: ../ubuntu_sso/utils/ui.py:115 msgid "" "The passwords don't match, please double check and try entering them again." msgstr "Ðевірний пароль, будь-лаÑка, перевірте та введіть знову" #: ../ubuntu_sso/utils/ui.py:117 msgid "Your password must contain" msgstr "Ваш пароль має міÑтити" #: ../ubuntu_sso/utils/ui.py:118 msgid "The password is too weak." msgstr "Занадто проÑтий пароль." #: ../ubuntu_sso/utils/ui.py:119 msgid "At least one uppercase letter" msgstr "Принаймні одна велика буква" #: ../ubuntu_sso/utils/ui.py:120 msgid "Privacy Policy" msgstr "Політика приватноÑті" #: ../ubuntu_sso/utils/ui.py:121 msgid "Connecting to:" msgstr "Ð—â€™Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð·:" #: ../ubuntu_sso/utils/ui.py:122 msgid "Proxy Settings" msgstr "Параметри прокÑÑ–" #: ../ubuntu_sso/utils/ui.py:123 msgid "Incorrect login details. Please try again." msgstr "Ðевірні дані Ð´Ð»Ñ Ð²Ñ…Ð¾Ð´Ñƒ. Спробуйте ще раз." #: ../ubuntu_sso/utils/ui.py:124 msgid "Please provide login details." msgstr "Будь лаÑка, надайте дані Ð´Ð»Ñ Ð²Ñ…Ð¾Ð´Ñƒ." #: ../ubuntu_sso/utils/ui.py:125 msgid "You are connecting through a proxy." msgstr "Ви з'єднуєтеÑÑŒ через прокÑÑ–." #: ../ubuntu_sso/utils/ui.py:126 msgid "Get Help With Proxies" msgstr "Отримати допомогу про роботу з прокÑÑ–" #: ../ubuntu_sso/utils/ui.py:127 msgid "Proxy password:" msgstr "Пароль прокÑÑ–:" #: ../ubuntu_sso/utils/ui.py:128 msgid "Save and Connect" msgstr "Зберегти та з’єднати" #: ../ubuntu_sso/utils/ui.py:129 msgid "Proxy username:" msgstr "КориÑтувач прокÑÑ–:" #: ../ubuntu_sso/utils/ui.py:131 msgid "" "A password reset code has been sent to your e-mail. Please enter the code " "below along with your new password." msgstr "" "Код ÑÐºÐ¸Ð´Ð°Ð½Ð½Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð±ÑƒÐ»Ð¾ відправлено на Ваш e-mail. Будь лаÑка, уведіть код " "та новий пароль нижче." #: ../ubuntu_sso/utils/ui.py:133 msgid "Retype email" msgstr "Повторіть email" #: ../ubuntu_sso/utils/ui.py:134 msgid "Retype password" msgstr "Повторіть пароль" #: ../ubuntu_sso/utils/ui.py:135 #, python-format msgid "To reset your %(app_name)s password, enter your email address below:" msgstr "" "Ð”Ð»Ñ Ð²ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñтандартного Ð¿Ð°Ñ€Ð¾Ð»Ñ %(app_name)s, введіть вашу адреÑу " "електронної пошти:" #: ../ubuntu_sso/utils/ui.py:137 msgid "" "We are very Sorry! The service that signs you on is not responding right " "now\n" "Please try again or come back in a few minutes." msgstr "" "Вибачте! Ðа даний момент Ñлужба входу не відповідає\n" "Будь лаÑка, Ñпробуйте ще раз або повторіть через кілька хвилин." #: ../ubuntu_sso/utils/ui.py:140 msgid "Sorry we did not recognize the email address." msgstr "Вибачте, ми не можемо розпізнати цей email." #: ../ubuntu_sso/utils/ui.py:142 msgid "Reset code" msgstr "Код ÑÐºÐ¸Ð´Ð°Ð½Ð½Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ" #: ../ubuntu_sso/utils/ui.py:145 #, python-format msgid "" "A password reset code has been sent to %(email)s.\n" "Please enter the code below along with your new password." msgstr "" "Код ÑÐºÐ¸Ð´Ð°Ð½Ð½Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð²Ñ–Ð´Ñ–Ñлано на %(email)s.\n" "Уведіть код та новий пароль." #: ../ubuntu_sso/utils/ui.py:147 msgid "Set Up Account" msgstr "Ðалаштувати аккаунт" #: ../ubuntu_sso/utils/ui.py:148 msgid "I don't have an account yet - sign me up" msgstr "Ð’ мене ще немає аккаунту - Ñтворити" #: ../ubuntu_sso/utils/ui.py:149 msgid "Sign In" msgstr "Увійти" #: ../ubuntu_sso/utils/ui.py:150 msgid "Log-in with my existing account." msgstr "" #: ../ubuntu_sso/utils/ui.py:151 msgid "the appname whose ssl error we are going to show." msgstr "назва програми, Ð´Ð»Ñ Ñкої буде відображено помилку ssl" #: ../ubuntu_sso/utils/ui.py:152 msgid "Certificate details" msgstr "ВідомоÑті про Ñертифікат" #: ../ubuntu_sso/utils/ui.py:153 msgid "Connect" msgstr "З'єднатиÑÑ" #: ../ubuntu_sso/utils/ui.py:154 msgid "the details ssl certificate we are going to show." msgstr "відомоÑті про ssl Ñертифікат, що будуть відображені." #: ../ubuntu_sso/utils/ui.py:161 msgid "Open the SSL certificate UI." msgstr "Відкрити Ñ–Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ ÐºÐ¾Ñ€Ð¸Ñтувача SSL-Ñертифікату." #: ../ubuntu_sso/utils/ui.py:162 msgid "SSL Certificate Not Valid" msgstr "Ðевірний SSL-Ñертифікат" #: ../ubuntu_sso/utils/ui.py:163 msgid "the domain whose ssl certificate we are going to show." msgstr "домен, ssl-Ñертифікат Ñкого буде відображений." #: ../ubuntu_sso/utils/ui.py:164 #, python-format msgid "" "You are trying to connect to a proxy server on %(domain)s. This server uses " "a secure connection, and the SSL certificate is not valid because:" msgstr "" "Ви намагаєтеÑÑŒ з’єднатиÑÑŒ із прокÑÑ–-Ñервером на %(domain)s. Цей Ñервер " "викориÑтовує безпечне з’єднаннÑ, та SSL-Ñертифікат не вірний тому, що:" #: ../ubuntu_sso/utils/ui.py:167 msgid "The certificate has not been verified" msgstr "Ðе вдалоÑÑ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€Ð¸Ñ‚Ð¸ Ñертифікат" #: ../ubuntu_sso/utils/ui.py:168 msgid "Do you want to connect to this server?" msgstr "Ви дійÑно бажаєте з’єднатиÑÑŒ із цим Ñервером?" #: ../ubuntu_sso/utils/ui.py:169 msgid "Get Help With SSL" msgstr "Отримати довідку про SSL" #: ../ubuntu_sso/utils/ui.py:170 #, python-format msgid "" "If you are not sure about this server, do not use it to connect to " "%(app_name)s." msgstr "" "Якщо Ви не впевнені в цьому Ñервері, не викориÑтовуйте його Ð´Ð»Ñ Ð·â€™Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð· " "%(app_name)s." #: ../ubuntu_sso/utils/ui.py:172 msgid "Remember my settings for this certificate." msgstr "Запам'Ñтати Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ Ñертифікату." #: ../ubuntu_sso/utils/ui.py:173 msgid "" "The name on the certificate isn't valid or doesn't match the name of the site" msgstr "Ðазва Ñертифікату не вірна або не Ñпівпадає з назвою Ñайту" #: ../ubuntu_sso/utils/ui.py:175 msgid "The certificate has expired" msgstr "Сертифікат заÑтарів" #: ../ubuntu_sso/utils/ui.py:176 #, python-format msgid "You are now logged into %(app_name)s." msgstr "Вхід до %(app_name)s виконано." #: ../ubuntu_sso/utils/ui.py:177 msgid "Surname" msgstr "Прізвище" #: ../ubuntu_sso/utils/ui.py:178 msgid "Terms of Service" msgstr "Умови Ñлужб" #: ../ubuntu_sso/utils/ui.py:179 msgid "Sign Up to {app_name}" msgstr "Увійти до {app_name}" #: ../ubuntu_sso/utils/ui.py:180 msgid "Show Terms & Conditions" msgstr "Показати умови викориÑтаннÑ" #: ../ubuntu_sso/utils/ui.py:181 #, python-format msgid "" "Agreeing to the %(app_name)s Terms & Conditions is required to subscribe." msgstr "Ð”Ð»Ñ Ð·Ð´Ñ–Ð¹ÑÐ½ÐµÐ½Ð½Ñ Ð¿Ñ–Ð´Ð¿Ð¸Ñки на %(app_name)s, необхідно прийнÑти умови." #: ../ubuntu_sso/utils/ui.py:183 #, python-format msgid "You can also find these terms at %(url)s" msgstr "" "Ви можете ознайомитиÑÑŒ з цими умовами на %(url)s" #: ../ubuntu_sso/utils/ui.py:184 msgid "Try again" msgstr "Спробуйте знову" #: ../ubuntu_sso/utils/ui.py:185 msgid "" "There was an error when trying to complete the process. Please check the " "information and try again." msgstr "" "Виникла помилка при намаганні завершити процеÑ. Будь-лаÑка, перевірте " "інформацію та Ñпробуйте знову." #: ../ubuntu_sso/utils/ui.py:187 msgid "Verification code" msgstr "Код підтвердженнÑ" #: ../ubuntu_sso/utils/ui.py:188 #, python-format msgid "" "Check %(email)s for an email from Ubuntu Single Sign On. This message " "contains a verification code. Enter the code in the field below and click OK " "to complete creating your %(app_name)s account." msgstr "" "Перевірте %(email)s на предмет Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð²Ñ–Ð´ Ñлужби Ubuntu " "Single Sign On. ЛиÑÑ‚ міÑтить код підтвердженнÑ. Уведіть код до Ð¿Ð¾Ð»Ñ Ð½Ð¸Ð¶Ñ‡Ðµ, " "та натиÑніть OK, завершивши ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¾Ð±Ð»Ñ–ÐºÐ¾Ð²Ð¾Ð³Ð¾ запиÑу Ð´Ð»Ñ %(app_name)s." #: ../ubuntu_sso/utils/ui.py:192 msgid "Enter verification code" msgstr "Уведіть код підтвердженнÑ" #: ../ubuntu_sso/utils/ui.py:195 #, python-format msgid "I agree with the %(app_name)s terms and conditions" msgstr "Я погоджуюÑÑŒ з умовами викориÑÑ‚Ð°Ð½Ð½Ñ %(app_name)s" #: ../ubuntu_sso/utils/ui.py:196 #, python-format msgid "Yes! Email me %(app_name)s tips and updates." msgstr "Так, Ñ Ñ…Ð¾Ñ‡Ñƒ отрімувати новини про %(app_name)s" ubuntu-sso-client-13.10/po/gl.po0000664000202700020270000003616012151461656016737 0ustar dobeydobey00000000000000# Galician translation for ubuntu-sso-client # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the ubuntu-sso-client package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: ubuntu-sso-client\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-09-11 18:25+0000\n" "PO-Revision-Date: 2012-09-12 22:12+0000\n" "Last-Translator: Xosé \n" "Language-Team: Galician \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-09-17 18:24+0000\n" "X-Generator: Launchpad (build 15944)\n" #. Undefined variable '_', pylint: disable=E0602 #. all the text that is used in the gui #: ../ubuntu_sso/utils/ui.py:49 msgid "By signing up to {app_name} you agree to our {privacy_policy}" msgstr "" "Ao rexistrarse en {app_name} está de acordo coa nosa {privacy_policy}" #: ../ubuntu_sso/utils/ui.py:51 msgid "By signing up to {app_name} you agree to our {terms_and_conditions}" msgstr "" "Ao rexistrarse en {app_name} está de acordo cos nosos {terms_and_conditions}" #: ../ubuntu_sso/utils/ui.py:53 msgid " and {privacy_policy}" msgstr " e {privacy_policy}" #: ../ubuntu_sso/utils/ui.py:54 msgid "Cancel" msgstr "Cancelar" #: ../ubuntu_sso/utils/ui.py:55 msgid "Type the characters above" msgstr "Escriba os caracteres de embaixo" #: ../ubuntu_sso/utils/ui.py:56 msgid "There was a problem getting the captcha, reloading..." msgstr "Produciuse un problema ao obter o captcha, recargando..." #: ../ubuntu_sso/utils/ui.py:58 #, python-format msgid "If you can't read this then %(reload_link)s this page" msgstr "Se non pode ler isto, %(reload_link)s esta páxina" #: ../ubuntu_sso/utils/ui.py:60 msgid "refresh" msgstr "recargue" #: ../ubuntu_sso/utils/ui.py:61 msgid "Reload" msgstr "Recargar" #: ../ubuntu_sso/utils/ui.py:62 msgid "The captcha is a required field" msgstr "O captcha é un campo obrigatorio" #: ../ubuntu_sso/utils/ui.py:63 msgid "Close window and set up later" msgstr "Pechar a xanela e configurar despois" #: ../ubuntu_sso/utils/ui.py:64 msgid "Congratulations, {app_name} is installed!" msgstr "Felicidades, {app_name} está instalado." #: ../ubuntu_sso/utils/ui.py:65 #, python-format msgid "To connect this computer to %(app_name)s enter your details below." msgstr "" "Para conectar este computador a %(app_name)s introduza os detalles de " "embaixo." #: ../ubuntu_sso/utils/ui.py:67 msgid "Register with {app_name}." msgstr "Rexistrarse en {app_name}." #: ../ubuntu_sso/utils/ui.py:68 ../ubuntu_sso/utils/ui.py:93 #: ../ubuntu_sso/utils/ui.py:143 msgid "Email address" msgstr "Enderezo de correo electrónico" #: ../ubuntu_sso/utils/ui.py:69 msgid "Re-type Email address" msgstr "Rescriba o seu enderezo de correo electrónico" #: ../ubuntu_sso/utils/ui.py:70 msgid "The email must be a valid email address." msgstr "" "O correo electrónico debe ser un enderezo de correo electrónico válido." #: ../ubuntu_sso/utils/ui.py:71 msgid "" "The email addresses don't match, please double check and try entering them " "again." msgstr "" "Os enderezos de correo electrónico non coinciden, comprobe que o introduce " "correctamente dúas veces." #: ../ubuntu_sso/utils/ui.py:73 msgid "Email" msgstr "Correo Electrónico" #: ../ubuntu_sso/utils/ui.py:74 msgid "The email addresses do not match" msgstr "Os enderezos de correo electrónico non coinciden" #: ../ubuntu_sso/utils/ui.py:75 msgid "Enter code verification here" msgstr "Introduza o código de verificación aquí" #: ../ubuntu_sso/utils/ui.py:76 msgid "Please enter your name" msgstr "Escriba o seu nome" #: ../ubuntu_sso/utils/ui.py:77 msgid "The process did not finish successfully." msgstr "O proceso non rematou correctamente." #: ../ubuntu_sso/utils/ui.py:79 msgid "Sign me in with my existing account" msgstr "Acceda con unha conta xa existente" #: ../ubuntu_sso/utils/ui.py:80 msgid "This field is required." msgstr "Este campo é necesario." #: ../ubuntu_sso/utils/ui.py:81 msgid "I've forgotten my password" msgstr "Esquecín o meu contrasinal" #: ../ubuntu_sso/utils/ui.py:82 ../ubuntu_sso/utils/ui.py:130 msgid "Reset password" msgstr "Reiniciar o contrasinal" #: ../ubuntu_sso/utils/ui.py:83 msgid "" "To reset your {app_name} password, enter your registered email address " "below. We will send instructions to reset your password." msgstr "" "Para restabelecer o contrasinal de {app_name} escriba embaixo o seu enderezo " "de correo-e rexistrado. Enviarémoslle instrucións para restabelecer o seu " "contrasinal." #: ../ubuntu_sso/utils/ui.py:86 msgid "Please enter a valid email address" msgstr "Escriba un enderezo de correo electrónico válido" #: ../ubuntu_sso/utils/ui.py:87 msgid "There was a problem accessing the Ubuntu Single Sign On backend." msgstr "" "Produciuse un problema ao acceder ao «backend» de Ubuntu Single Sign On" #: ../ubuntu_sso/utils/ui.py:89 #, python-format msgid "Create %(app_name)s account" msgstr "Crear unha conta %(app_name)s" #: ../ubuntu_sso/utils/ui.py:90 msgid "Loading..." msgstr "Cargando..." #: ../ubuntu_sso/utils/ui.py:91 msgid "Getting information, please wait..." msgstr "Obtendo información agarde..." #: ../ubuntu_sso/utils/ui.py:92 msgid "Already have an account? Click here to sign in" msgstr "Xa ten unha conta? Prema aquí para iniciar a sesión" #: ../ubuntu_sso/utils/ui.py:94 #, python-format msgid "Connect to %(app_name)s" msgstr "Conectarse a %(app_name)s" #: ../ubuntu_sso/utils/ui.py:95 ../ubuntu_sso/utils/ui.py:109 msgid "Password" msgstr "Contrasinal" #: ../ubuntu_sso/utils/ui.py:97 msgid "Sign In to {app_name}" msgstr "Iniciar sesión en {app_name}" #: ../ubuntu_sso/utils/ui.py:99 msgid "Name" msgstr "Nome" #: ../ubuntu_sso/utils/ui.py:100 msgid "The name must not be empty." msgstr "O nome non debe estar baleiro." #: ../ubuntu_sso/utils/ui.py:101 msgid "Next" msgstr "Adiante" #: ../ubuntu_sso/utils/ui.py:102 msgid "Network detection" msgstr "Detección de rede" #: ../ubuntu_sso/utils/ui.py:103 #, python-format msgid "" "Are you online? We can't detect an internet connection - you will need to be " "connected to set up %(app_name)s" msgstr "" "Está conectado? Non poidemos detectar unha conexión a Internet necesaria " "para configurar %(app_name)s" #: ../ubuntu_sso/utils/ui.py:105 msgid "One moment please..." msgstr "Agarde un momento..." #: ../ubuntu_sso/utils/ui.py:106 msgid "Create a password" msgstr "Cree un contrasinal" #: ../ubuntu_sso/utils/ui.py:107 msgid "Your password was successfully changed." msgstr "O seu contrasinal foi cambiado con éxito." #: ../ubuntu_sso/utils/ui.py:108 msgid "At least one number" msgstr "Cando menos un número" #: ../ubuntu_sso/utils/ui.py:110 msgid "Re-type Password" msgstr "Rescriba o seu contrasinal" #: ../ubuntu_sso/utils/ui.py:111 msgid "" "The password must have a minimum of 8 characters and include one uppercase " "character and one number." msgstr "" "O contrasinal debe ter cando menos 8 caracteres e incluír un caracter en " "maiúsculas e un número." #: ../ubuntu_sso/utils/ui.py:113 msgid "At least 8 characters" msgstr "Cando menos 8 caracteres" #: ../ubuntu_sso/utils/ui.py:114 msgid "Passwords don't match" msgstr "Os contrasinais non coinciden" #: ../ubuntu_sso/utils/ui.py:115 msgid "" "The passwords don't match, please double check and try entering them again." msgstr "" "Os contrasinais non coinciden, compróbeo introducíndoo dúas veces de novo." #: ../ubuntu_sso/utils/ui.py:117 msgid "Your password must contain" msgstr "O seu contrasinal debe conter" #: ../ubuntu_sso/utils/ui.py:118 msgid "The password is too weak." msgstr "O contrasinal é moi débiil" #: ../ubuntu_sso/utils/ui.py:119 msgid "At least one uppercase letter" msgstr "Cando menos unha letra maiúscula" #: ../ubuntu_sso/utils/ui.py:120 msgid "Privacy Policy" msgstr "Política de privacidade" #: ../ubuntu_sso/utils/ui.py:121 msgid "Connecting to:" msgstr "Conectando a:" #: ../ubuntu_sso/utils/ui.py:122 msgid "Proxy Settings" msgstr "Configuración do proxy" #: ../ubuntu_sso/utils/ui.py:123 msgid "Incorrect login details. Please try again." msgstr "Detalles de acceso incorrectos. Ténteo de novo." #: ../ubuntu_sso/utils/ui.py:124 msgid "Please provide login details." msgstr "Fornece os detalles de acceso." #: ../ubuntu_sso/utils/ui.py:125 msgid "You are connecting through a proxy." msgstr "Estase conectando a través dun proxy." #: ../ubuntu_sso/utils/ui.py:126 msgid "Get Help With Proxies" msgstr "Obter axuda con proxy" #: ../ubuntu_sso/utils/ui.py:127 msgid "Proxy password:" msgstr "Contrasinal do proxy:" #: ../ubuntu_sso/utils/ui.py:128 msgid "Save and Connect" msgstr "Gardar e conectar" #: ../ubuntu_sso/utils/ui.py:129 msgid "Proxy username:" msgstr "Nome de usuario no proxy:" #: ../ubuntu_sso/utils/ui.py:131 msgid "" "A password reset code has been sent to your e-mail. Please enter the code " "below along with your new password." msgstr "" "Enviouse un código para restabelecer o contrasinal ao seu correo. Escriba o " "código e o seu contrasinal novo embaixo." #: ../ubuntu_sso/utils/ui.py:133 msgid "Retype email" msgstr "Escriba o correo electrónico de novo" #: ../ubuntu_sso/utils/ui.py:134 msgid "Retype password" msgstr "Escriba de novo o contrasinal" #: ../ubuntu_sso/utils/ui.py:135 #, python-format msgid "To reset your %(app_name)s password, enter your email address below:" msgstr "" "Para restabelecer o seu contrasinal de %(app_name)s , introduza o seu correo " "máis abaixo:" #: ../ubuntu_sso/utils/ui.py:137 msgid "" "We are very Sorry! The service that signs you on is not responding right " "now\n" "Please try again or come back in a few minutes." msgstr "" "Sentímolo! O servizo ao que quere iniciar sesión non está respondendo neste " "momento\n" "Ténteo de novo dentro dun par de minutos." #: ../ubuntu_sso/utils/ui.py:140 msgid "Sorry we did not recognize the email address." msgstr "Sentímolo, non recoñecemos ese enderezo de correo-e." #: ../ubuntu_sso/utils/ui.py:142 msgid "Reset code" msgstr "Código de reinicio" #: ../ubuntu_sso/utils/ui.py:145 #, python-format msgid "" "A password reset code has been sent to %(email)s.\n" "Please enter the code below along with your new password." msgstr "" "Envióuselle un código a %(email)s para restabelecer o seu contrasinal.\n" "Introduza o código de embaixo xunto co seu novo contrasinal." #: ../ubuntu_sso/utils/ui.py:147 msgid "Set Up Account" msgstr "Configurar conta" #: ../ubuntu_sso/utils/ui.py:148 msgid "I don't have an account yet - sign me up" msgstr "Non teño unha conta aínda, rexistrarme" #: ../ubuntu_sso/utils/ui.py:149 msgid "Sign In" msgstr "Entrar" #: ../ubuntu_sso/utils/ui.py:150 msgid "Log-in with my existing account." msgstr "Identificarse coa miña conta existente." #: ../ubuntu_sso/utils/ui.py:151 msgid "the appname whose ssl error we are going to show." msgstr "o appname cuxo erro ssl imos mostrar." #: ../ubuntu_sso/utils/ui.py:152 msgid "Certificate details" msgstr "Información do certificado" #: ../ubuntu_sso/utils/ui.py:153 msgid "Connect" msgstr "Conectar" #: ../ubuntu_sso/utils/ui.py:154 msgid "the details ssl certificate we are going to show." msgstr "os detalles do certificado ssl que imos mostrar." #: ../ubuntu_sso/utils/ui.py:161 msgid "Open the SSL certificate UI." msgstr "Abrir a IU do certificado SSL." #: ../ubuntu_sso/utils/ui.py:162 msgid "SSL Certificate Not Valid" msgstr "O certificado SSL non é válido" #: ../ubuntu_sso/utils/ui.py:163 msgid "the domain whose ssl certificate we are going to show." msgstr "o dominio cuxo certificado ssl imos mostrar." #: ../ubuntu_sso/utils/ui.py:164 #, python-format msgid "" "You are trying to connect to a proxy server on %(domain)s. This server uses " "a secure connection, and the SSL certificate is not valid because:" msgstr "" "Está tentando conectarse a un servidor proxy en %(domain)s. Este servidor " "usa unha conexión segura, e o certificado SSL non é válido porque:" #: ../ubuntu_sso/utils/ui.py:167 msgid "The certificate has not been verified" msgstr "Non foi posíbel verificar o certificado" #: ../ubuntu_sso/utils/ui.py:168 msgid "Do you want to connect to this server?" msgstr "Quere conectarse a este servidor?" #: ../ubuntu_sso/utils/ui.py:169 msgid "Get Help With SSL" msgstr "Obter axuda con SSL" #: ../ubuntu_sso/utils/ui.py:170 #, python-format msgid "" "If you are not sure about this server, do not use it to connect to " "%(app_name)s." msgstr "" "Se non está seguro sobre a veracidade deste servidor, non o use para " "conectarse a %(app_name)s." #: ../ubuntu_sso/utils/ui.py:172 msgid "Remember my settings for this certificate." msgstr "Lembrar a miña configuración para este certificado." #: ../ubuntu_sso/utils/ui.py:173 msgid "" "The name on the certificate isn't valid or doesn't match the name of the site" msgstr "O nome no certificado non é válido ou non coincide co nome do sistio" #: ../ubuntu_sso/utils/ui.py:175 msgid "The certificate has expired" msgstr "O certificado caducou" #: ../ubuntu_sso/utils/ui.py:176 #, python-format msgid "You are now logged into %(app_name)s." msgstr "Agora iniciou sesión en %(app_name)s." #: ../ubuntu_sso/utils/ui.py:177 msgid "Surname" msgstr "Apelidos" #: ../ubuntu_sso/utils/ui.py:178 msgid "Terms of Service" msgstr "Termos do servizo" #: ../ubuntu_sso/utils/ui.py:179 msgid "Sign Up to {app_name}" msgstr "Rexistrarse en {app_name}" #: ../ubuntu_sso/utils/ui.py:180 msgid "Show Terms & Conditions" msgstr "Mostrar os termos e condicións" #: ../ubuntu_sso/utils/ui.py:181 #, python-format msgid "" "Agreeing to the %(app_name)s Terms & Conditions is required to subscribe." msgstr "" "Requírese aceptar os Termos e condicións de %(app_name)s para subscribirse" #: ../ubuntu_sso/utils/ui.py:183 #, python-format msgid "You can also find these terms at %(url)s" msgstr "Tamén pode atopar estes termos en %(url)s" #: ../ubuntu_sso/utils/ui.py:184 msgid "Try again" msgstr "Ténteo de novo" #: ../ubuntu_sso/utils/ui.py:185 msgid "" "There was an error when trying to complete the process. Please check the " "information and try again." msgstr "" "Produciuse un erro ao tentar completar o proceso. Comprobe a información e " "ténteo de novo." #: ../ubuntu_sso/utils/ui.py:187 msgid "Verification code" msgstr "Código de verificación" #: ../ubuntu_sso/utils/ui.py:188 #, python-format msgid "" "Check %(email)s for an email from Ubuntu Single Sign On. This message " "contains a verification code. Enter the code in the field below and click OK " "to complete creating your %(app_name)s account." msgstr "" "Comprobe se ten un correo de Ubuntu Single Sign On en %(email)s. Esta " "mensaxe contén un código de verificación. Escriba este código no campo de " "embaixo e prema OK para completar a creación da conta de %(app_name)s." #: ../ubuntu_sso/utils/ui.py:192 msgid "Enter verification code" msgstr "Introduza o código de verificación" #: ../ubuntu_sso/utils/ui.py:195 #, python-format msgid "I agree with the %(app_name)s terms and conditions" msgstr "Acepto os terrmos e condicións de %(app_name)s." #: ../ubuntu_sso/utils/ui.py:196 #, python-format msgid "Yes! Email me %(app_name)s tips and updates." msgstr "Si, envíeme ao correo trucos e actualizacións de %(app_name)s." ubuntu-sso-client-13.10/po/km.po0000664000202700020270000005657412151461656016757 0ustar dobeydobey00000000000000# Khmer translation for ubuntu-sso-client # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the ubuntu-sso-client package. # FIRST AUTHOR , 2010. msgid "" msgstr "" "Project-Id-Version: ubuntu-sso-client\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-09-11 18:25+0000\n" "PO-Revision-Date: 2012-04-03 08:05+0000\n" "Last-Translator: Khoem Sokhem \n" "Language-Team: Khmer \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-09-17 18:24+0000\n" "X-Generator: Launchpad (build 15944)\n" "X-Language: km-KH\n" #. Undefined variable '_', pylint: disable=E0602 #. all the text that is used in the gui #: ../ubuntu_sso/utils/ui.py:49 msgid "By signing up to {app_name} you agree to our {privacy_policy}" msgstr "" "ដោយ​ចុះ​ឈ្មោះ​នៅ​ក្នុងកម្មវិធី {app_name} អ្នក​យល់ព្រម​នឹង​ {privacy_policy} " "របស់​ពួក​យើង" #: ../ubuntu_sso/utils/ui.py:51 msgid "By signing up to {app_name} you agree to our {terms_and_conditions}" msgstr "" "ដោយ​ចុះ​ឈ្មោះ​នៅ​​ក្នុង​កម្មវិធី {app_name} អ្នក​យល់​ព្រម​នឹង​ " "{terms_and_conditions} របស់​យើង" #: ../ubuntu_sso/utils/ui.py:53 msgid " and {privacy_policy}" msgstr " និង {privacy_policy}" #: ../ubuntu_sso/utils/ui.py:54 msgid "Cancel" msgstr "បោះបង់" #: ../ubuntu_sso/utils/ui.py:55 msgid "Type the characters above" msgstr "វាយ​អក្សរ​ážáž¶áž„លើ" #: ../ubuntu_sso/utils/ui.py:56 msgid "There was a problem getting the captcha, reloading..." msgstr "មាន​បញ្ហា​ក្នុង​ការ​ទទួលយក​ កំពុង​ផ្ទុក​ឡើង​វិញ..." #: ../ubuntu_sso/utils/ui.py:58 #, python-format msgid "If you can't read this then %(reload_link)s this page" msgstr "" "ប្រសិន​បើ​អ្នក​មិន​អាច​​អាន​វា​បាន​ទ០នោះ​អ្នក​អាច​ធាន​ទំពáŸážšâ€‹áž“áŸáŸ‡ " "%(reload_link)s" #: ../ubuntu_sso/utils/ui.py:60 msgid "refresh" msgstr "ធ្វើ​ឲ្យ​ស្រស់" #: ../ubuntu_sso/utils/ui.py:61 msgid "Reload" msgstr "ផ្ទុក​ឡើងវិញ" #: ../ubuntu_sso/utils/ui.py:62 msgid "The captcha is a required field" msgstr "captcha គឺ​ជា​វាល​ដែល​ទាមទារ" #: ../ubuntu_sso/utils/ui.py:63 msgid "Close window and set up later" msgstr "បិទ​បង្អួច ហើយ​រៀបចំ​នៅ​ពáŸáž›â€‹áž€áŸ’រោយ" #: ../ubuntu_sso/utils/ui.py:64 msgid "Congratulations, {app_name} is installed!" msgstr "សូម​អបអរ​សាទរ កម្មវិធី {app_name} ážáŸ’រូវ​បាន​ដំឡើង​រួច​ហើយ !" #: ../ubuntu_sso/utils/ui.py:65 #, python-format msgid "To connect this computer to %(app_name)s enter your details below." msgstr "" "ដើម្បី​ážáž—្ជាប់​កុំព្យូទáŸážšâ€‹áž“áŸáŸ‡â€‹áž‘ៅ %(app_name)s " "បញ្ចូល​សáŸáž…ក្ដី​លម្អិážâ€‹ážŠáž¼áž…​ážáž¶áž„​ក្រោម ។" #: ../ubuntu_sso/utils/ui.py:67 msgid "Register with {app_name}." msgstr "" #: ../ubuntu_sso/utils/ui.py:68 ../ubuntu_sso/utils/ui.py:93 #: ../ubuntu_sso/utils/ui.py:143 msgid "Email address" msgstr "អាសយដ្ឋាន​អ៊ីមែល" #: ../ubuntu_sso/utils/ui.py:69 msgid "Re-type Email address" msgstr "វាយ​អាសយដ្ឋាន​អ៊ីមែល​ឡើង​វិញ" #: ../ubuntu_sso/utils/ui.py:70 msgid "The email must be a valid email address." msgstr "អ៊ីមែល​ážáŸ’រូវ​ážáŸ‚​ជា​អាសយដ្ឋាន​អ៊ីមែល​ដែល​ážáŸ’រឹមážáŸ’រូវ ។" #: ../ubuntu_sso/utils/ui.py:71 msgid "" "The email addresses don't match, please double check and try entering them " "again." msgstr "" "អាសយដ្ឋាន​អ៊ីមែល​មិន​ផ្គូផ្គង​ សូម​ពិនិážáŸ’យមើល​ឡើងវិញ " "រួច​ព្យាយាម​បញ្ចូល​ពួកវា​ម្ដងទៀហ។" #: ../ubuntu_sso/utils/ui.py:73 msgid "Email" msgstr "អ៊ីមែល" #: ../ubuntu_sso/utils/ui.py:74 msgid "The email addresses do not match" msgstr "អាសយដ្ឋាន​អ៊ីមែល​មិន​ដូច​គ្នា​ទáŸ" #: ../ubuntu_sso/utils/ui.py:75 msgid "Enter code verification here" msgstr "បញ្ចូល​ការ​ផ្ទៀងផ្ទាážáŸ‹â€‹áž€áž¼ážŠâ€‹áž“ៅ​ទីនáŸáŸ‡" #: ../ubuntu_sso/utils/ui.py:76 msgid "Please enter your name" msgstr "សូម​បញ្ចូល​ឈ្មោះ​របស់​អ្នក" #: ../ubuntu_sso/utils/ui.py:77 msgid "The process did not finish successfully." msgstr "ដំណើរការ​បាន​បញ្ចប់​ទាំង​បរាជáŸáž™ ។" #: ../ubuntu_sso/utils/ui.py:79 msgid "Sign me in with my existing account" msgstr "ចូល​ក្នុង​គណនី​ដែល​មាន​ស្រាប់" #: ../ubuntu_sso/utils/ui.py:80 msgid "This field is required." msgstr "ទាមទារ​វាល​នáŸáŸ‡ ។" #: ../ubuntu_sso/utils/ui.py:81 msgid "I've forgotten my password" msgstr "ážáŸ’ញុំ​ភ្លáŸáž…​ពាក្យ​សម្ងាážáŸ‹â€‹ážšáž”ស់​ážáŸ’ញុំ" #: ../ubuntu_sso/utils/ui.py:82 ../ubuntu_sso/utils/ui.py:130 msgid "Reset password" msgstr "កំណážáŸ‹â€‹áž–ាក្យសម្ងាážáŸ‹â€‹â€‹áž¡áž¾áž„វិញ" #: ../ubuntu_sso/utils/ui.py:83 msgid "" "To reset your {app_name} password, enter your registered email address " "below. We will send instructions to reset your password." msgstr "" "ដើម្បី​កំណážáŸ‹â€‹áž–ាក្យ​សម្ងាážáŸ‹â€‹ážšáž”ស់ {app_name} អ្នក​ឡើង​វិញ " "បញ្ចូល​អាសយដ្ឋាន​អ៊ីមែល​ដែលបាន​ចុះ​ឈ្មោះ​របស់​អ្នក​ážáž¶áž„​ក្រោម ។ " "យើង​នឹង​ផ្ញើ​ការ​ណែនាំ​ ដើម្បី​កំណážáŸ‹â€‹áž–ាក្យ​សម្ងាážáŸ‹â€‹ážšáž”ស់​អ្នក​ឡើង​វិញ ។" #: ../ubuntu_sso/utils/ui.py:86 msgid "Please enter a valid email address" msgstr "សូម​បញ្ចូល​អាសយដ្ឋាន​អ៊ីមែល​ដែល​ážáŸ’រឹមážáŸ’រូវ" #: ../ubuntu_sso/utils/ui.py:87 msgid "There was a problem accessing the Ubuntu Single Sign On backend." msgstr "មាន​បញ្ហា​ក្នុង​កា​រចូល​ប្រើ​​អ៊ូបុនទូ​នៅ​កម្មវិធី​ផ្នែក​ážáž¶áž„​ក្រោយ ។" #: ../ubuntu_sso/utils/ui.py:89 #, python-format msgid "Create %(app_name)s account" msgstr "បង្កើážâ€‹áž‚ណនី %(app_name)s" #: ../ubuntu_sso/utils/ui.py:90 msgid "Loading..." msgstr "កំពុង​ផ្ទុក..." #: ../ubuntu_sso/utils/ui.py:91 msgid "Getting information, please wait..." msgstr "កំពុង​យក​ពáŸážáŸŒáž˜áž¶áž“​ សូម​រង់ចាំ..." #: ../ubuntu_sso/utils/ui.py:92 msgid "Already have an account? Click here to sign in" msgstr "មាន​គណនា​រួច​ហើយ​ឬ ? ចុច​ទីនáŸáŸ‡ ដើម្បី​ចូល" #: ../ubuntu_sso/utils/ui.py:94 #, python-format msgid "Connect to %(app_name)s" msgstr "ážáž—្ជាប់​ទៅកាន់ %(app_name)s" #: ../ubuntu_sso/utils/ui.py:95 ../ubuntu_sso/utils/ui.py:109 msgid "Password" msgstr "ពាក្យសម្ងាážáŸ‹" #: ../ubuntu_sso/utils/ui.py:97 msgid "Sign In to {app_name}" msgstr "ចូល​ក្នុង​កម្មវិធី {app_name}" #: ../ubuntu_sso/utils/ui.py:99 msgid "Name" msgstr "ឈ្មោះ" #: ../ubuntu_sso/utils/ui.py:100 msgid "The name must not be empty." msgstr "ឈ្មោះ​មិន​អាច​ទទáŸâ€‹áž”ាន​ទáŸ" #: ../ubuntu_sso/utils/ui.py:101 msgid "Next" msgstr "បន្ទាប់" #: ../ubuntu_sso/utils/ui.py:102 msgid "Network detection" msgstr "កា​ររកឃើញ​បណ្ដាញ" #: ../ubuntu_sso/utils/ui.py:103 #, python-format msgid "" "Are you online? We can't detect an internet connection - you will need to be " "connected to set up %(app_name)s" msgstr "" "ážáž¾â€‹áž¢áŸ’នក​នៅ​លើ​បណ្ដាញ ? យើង​រក​មិនឃើញ​ការ​ážáž—្ជាប់​អ៊ីនធឺណិážâ€‹áž‘០" "អ្នក​​ážáŸ’រូវ​ážáŸ‚​ážáž—្ជាប់​ ដើម្បី​រៀបចំ​ %(app_name)s" #: ../ubuntu_sso/utils/ui.py:105 msgid "One moment please..." msgstr "សូម​រង់ចាំ​មួយភ្លែáž..." #: ../ubuntu_sso/utils/ui.py:106 msgid "Create a password" msgstr "បង្កើážâ€‹áž–ាក្យ​សម្ងាážáŸ‹" #: ../ubuntu_sso/utils/ui.py:107 msgid "Your password was successfully changed." msgstr "ពាក្យសម្ងាážáŸ‹â€‹ážšáž”ស់​អ្នក​​ážáŸ’រូវ​បាន​ផ្លាស់ប្ដូរ​ដោយ​ជោគជáŸáž™ ។" #: ../ubuntu_sso/utils/ui.py:108 msgid "At least one number" msgstr "យ៉ាង​ហោចណាស់​មាន​លáŸážâ€‹áž˜áž½áž™" #: ../ubuntu_sso/utils/ui.py:110 msgid "Re-type Password" msgstr "វាយ​បញ្ចូល​ពាក្យ​សម្ងាážáŸ‹â€‹áž‡áž¶ážáŸ’មី" #: ../ubuntu_sso/utils/ui.py:111 msgid "" "The password must have a minimum of 8 characters and include one uppercase " "character and one number." msgstr "" "ពាក្យសម្ងាážáŸ‹â€‹ážáŸ’រូវážáŸ‚​មាន​ážáž½áž¢áž€áŸ’សរ​អប្បបរមា​ចំនួន​ ៨ ážáž½ " "និង​រួម​បញ្ចូល​អក្សរ​ធំ​មួយ​ážáž½ និង​លáŸážâ€‹áž˜áž½áž™â€‹ážáŸ’ទង់ ។" #: ../ubuntu_sso/utils/ui.py:113 msgid "At least 8 characters" msgstr "យ៉ាង​ហោចណាស់​មាន​ ៨ ážáž½áž¢áž€áŸ’សរ" #: ../ubuntu_sso/utils/ui.py:114 msgid "Passwords don't match" msgstr "ពាក្យ​សម្ងាážáŸ‹â€‹áž˜áž·áž“​ដូច​គ្នា​ទáŸ" #: ../ubuntu_sso/utils/ui.py:115 msgid "" "The passwords don't match, please double check and try entering them again." msgstr "" "ពាក្យសម្ងាážáŸ‹â€‹áž˜áž·áž“​ផ្គូផ្គង សូម​ពិនិážáŸ’យមើល​ឡើងវិញ " "រួច​ព្យាយាម​បញ្ចូល​ពួកវា​ម្ដងទៀហ។" #: ../ubuntu_sso/utils/ui.py:117 msgid "Your password must contain" msgstr "ពាក្យ​សម្ងាážáŸ‹â€‹ážšáž”ស់​អ្នក​ážáŸ’រូវ​ážáŸ‚​មាន" #: ../ubuntu_sso/utils/ui.py:118 msgid "The password is too weak." msgstr "ពាក្យ​សម្ងាážáŸ‹â€‹ážáŸ’សោយ​ពáŸáž€ ។" #: ../ubuntu_sso/utils/ui.py:119 msgid "At least one uppercase letter" msgstr "យ៉ាង​ហោចណាស់​អក្សរ​ធំ​មួយ" #: ../ubuntu_sso/utils/ui.py:120 msgid "Privacy Policy" msgstr "គោលនយោបាយ​ភាព​ឯកជន" #: ../ubuntu_sso/utils/ui.py:121 msgid "Connecting to:" msgstr "ážáž—្ជាប់​ទៅ ៖" #: ../ubuntu_sso/utils/ui.py:122 msgid "Proxy Settings" msgstr "ការ​កំណážáŸ‹â€‹áž”្រូក​ស៊ី" #: ../ubuntu_sso/utils/ui.py:123 msgid "Incorrect login details. Please try again." msgstr "សáŸáž…ក្ដី​លម្អិážâ€‹áž…ូល​មិន​ážáŸ’រឹមážáŸ’រូវ ។ សូម​ព្យាយាម​ម្ដង​ទៀážÂ áŸ”" #: ../ubuntu_sso/utils/ui.py:124 msgid "Please provide login details." msgstr "សូម​ផ្ដល់​សáŸáž…ក្ដី​លម្អិážâ€‹áž…ូល ។" #: ../ubuntu_sso/utils/ui.py:125 msgid "You are connecting through a proxy." msgstr "អ្នក​កំពុង​ážáž—្ជាប់​ážáž¶áž˜ážšáž™áŸˆâ€‹áž”្រូកស៊ី ។" #: ../ubuntu_sso/utils/ui.py:126 msgid "Get Help With Proxies" msgstr "យក​ជំនួយ​ដោយ​ប្រើ​ប្រូកស៊ី" #: ../ubuntu_sso/utils/ui.py:127 msgid "Proxy password:" msgstr "ពាក្យ​សម្ងាážáŸ‹â€‹áž”្រូកស៊ី ៖" #: ../ubuntu_sso/utils/ui.py:128 msgid "Save and Connect" msgstr "រក្សាទុក ហើយ​ážáž—្ជាប់" #: ../ubuntu_sso/utils/ui.py:129 msgid "Proxy username:" msgstr "ឈ្មោះ​អ្នកប្រើ​ប្រូកស៊ី ៖" #: ../ubuntu_sso/utils/ui.py:131 msgid "" "A password reset code has been sent to your e-mail. Please enter the code " "below along with your new password." msgstr "" "កូដ​កំណážáŸ‹â€‹áž–ាក្យ​សម្ងាážáŸ‹â€‹áž¡áž¾áž„វិញ​ážáŸ’រូវ​បានផ្ញើ​ទៅ​អ៊ីមែល​របស់​អ្នក ។ " "សូម​បញ្ចូល​កូដ​ážáž¶áž„​ក្រោម​រួម​ជា​មួយ​នឹង​ពាក្យ​សម្ងាážáŸ‹â€‹ážáŸ’មី​របស់​អ្នក ។" #: ../ubuntu_sso/utils/ui.py:133 msgid "Retype email" msgstr "វាយ​បញ្ចូល​អ៊ីមែល​ម្ដង​ទៀáž" #: ../ubuntu_sso/utils/ui.py:134 msgid "Retype password" msgstr "វាយ​បញ្ចូល​ពាក្យ​សម្ងាážáŸ‹â€‹áž˜áŸ’ដង​ទៀáž" #: ../ubuntu_sso/utils/ui.py:135 #, python-format msgid "To reset your %(app_name)s password, enter your email address below:" msgstr "" "ដើម្បី​កំណážáŸ‹â€‹áž–ាក្យសម្ងាážáŸ‹â€‹ %(app_name)s របស់​អ្នក​ឡើង​វិញ " "សូម​បញ្ចូល​អាសយដ្ឋាន​អ៊ីមែល​ដូច​ážáž¶áž„ក្រោម ៖" #: ../ubuntu_sso/utils/ui.py:137 msgid "" "We are very Sorry! The service that signs you on is not responding right " "now\n" "Please try again or come back in a few minutes." msgstr "" "យើង​សោកស្ដាយ​ណាស់ ! សáŸážœáž¶â€‹áž€áž˜áŸ’ម​ដែល​អ្នក​ចូល​មិន​ឆ្លើយ​ážáž”​ទáŸâ€‹áž¥áž¡áž¼ážœâ€‹áž“áŸáŸ‡ " "សូម​ព្យាយាម​ម្ដង​ទៀážâ€‹ ឬ​ážáŸ’រឡប់មក​វិញ​នៅ​ពáŸáž›â€‹áž€áŸ’រោយ ។" #: ../ubuntu_sso/utils/ui.py:140 msgid "Sorry we did not recognize the email address." msgstr "សូម​ទោស យើង​មិន​ស្គាល់​អាសយដ្ឋាន​អ៊ីមែល​របស់​អ្នក​ទáŸÂ áŸ”" #: ../ubuntu_sso/utils/ui.py:142 msgid "Reset code" msgstr "កំណážáŸ‹â€‹áž€áž¼ážŠâ€‹áž¡áž¾áž„​វិញ" #: ../ubuntu_sso/utils/ui.py:145 #, python-format msgid "" "A password reset code has been sent to %(email)s.\n" "Please enter the code below along with your new password." msgstr "" "កូដ​​កំណážáŸ‹â€‹áž–ាក្យសម្ងាážáŸ‹â€‹áž¡áž¾áž„វិញ​ážáŸ’រូវ​បាន​ផ្ញើ​ទៅកាន់ %(email)s ។\n" "សូម​បញ្ចូល​កូដ​ដូច​ážáž¶áž„ក្រោម​ព្រមគ្នា​នឹង​ពាក្យសម្ងាážáŸ‹â€‹ážáŸ’មី​របស់​អ្នក ។" #: ../ubuntu_sso/utils/ui.py:147 msgid "Set Up Account" msgstr "រៀបចំ​គណនី" #: ../ubuntu_sso/utils/ui.py:148 msgid "I don't have an account yet - sign me up" msgstr "ážáŸ’ញុំ​មិន​​ទាន់​មាន​គណនី​នៅ​ឡើយ​ទ០ážáŸ’ញុំ​ážáŸ’រូវ​ចុះ​ឈ្មោះ" #: ../ubuntu_sso/utils/ui.py:149 msgid "Sign In" msgstr "ចូល" #: ../ubuntu_sso/utils/ui.py:150 msgid "Log-in with my existing account." msgstr "" #: ../ubuntu_sso/utils/ui.py:151 msgid "the appname whose ssl error we are going to show." msgstr "ឈ្មោះ​កម្មវិធី​ដែល​កំហុស ssl របស់​​វា យើង​នឹង​បង្ហាញ ។" #: ../ubuntu_sso/utils/ui.py:152 msgid "Certificate details" msgstr "សáŸáž…ក្ដីលម្អិážâ€‹ážœáž·áž‰áŸ’ញាបនបážáŸ’ážš" #: ../ubuntu_sso/utils/ui.py:153 msgid "Connect" msgstr "ážáž—្ជាប់" #: ../ubuntu_sso/utils/ui.py:154 msgid "the details ssl certificate we are going to show." msgstr "សáŸáž…ក្ដី​លម្អិážâ€‹ážœáž·áž‰áŸ’ញាបនបážáŸ’ážš ssl យើង​នឹង​បង្ហាញ ។" #: ../ubuntu_sso/utils/ui.py:161 msgid "Open the SSL certificate UI." msgstr "បើក​ចំណុច​ប្រទាក់​វិញ្ញាបនបážáŸ’ážš SSL ។" #: ../ubuntu_sso/utils/ui.py:162 msgid "SSL Certificate Not Valid" msgstr "វិញ្ញាបនបážáŸ’ážš SSL មិន​ážáŸ’រឹមážáŸ’រូវ​ទáŸ" #: ../ubuntu_sso/utils/ui.py:163 msgid "the domain whose ssl certificate we are going to show." msgstr "ដែន​ដែល​វិញ្ញាបនបážáŸ’ážš ssl វា​ យើង​នឹង​បង្ហាញ ។" #: ../ubuntu_sso/utils/ui.py:164 #, python-format msgid "" "You are trying to connect to a proxy server on %(domain)s. This server uses " "a secure connection, and the SSL certificate is not valid because:" msgstr "" "អ្នក​កំពុង​ព្យាយាម​ážáž—្ជាប់​ទៅកាន់​ម៉ាស៊ីនបម្រើ​ប្រូកស៊ី​នៅ​លើ %(domain)s ។ " "ម៉ាស៊ីន​បម្រើ​នáŸáŸ‡ ប្រើ​ការ​ážáž—្ជាប់​សុវážáŸ’ážáž·áž—áž¶áž– ហើយ​វិញ្ញាបនបážáŸ’ážš SSL " "មិន​ážáŸ’រឹមážáŸ’រូវ​ ពីព្រោះ ៖" #: ../ubuntu_sso/utils/ui.py:167 msgid "The certificate has not been verified" msgstr "វិញ្ញាបនបážáŸ’រ​មិន​ážáŸ’រូវ​បាន​ផ្ទៀងផ្ទាážáŸ‹" #: ../ubuntu_sso/utils/ui.py:168 msgid "Do you want to connect to this server?" msgstr "ážáž¾â€‹â€‹áž¢áŸ’នក​ចង់​ážáž—្ជាប់​ទៅ​ម៉ាស៊ីន​បម្រើ​នáŸáŸ‡â€‹ážŠáŸ‚រ​ឬទáŸÂ ?" #: ../ubuntu_sso/utils/ui.py:169 msgid "Get Help With SSL" msgstr "យក​ជំនួយ​ដោយ​ប្រើ SSL" #: ../ubuntu_sso/utils/ui.py:170 #, python-format msgid "" "If you are not sure about this server, do not use it to connect to " "%(app_name)s." msgstr "" "ប្រសិនបើ​អ្នក​មិន​ប្រាកដ​អំពី​ម៉ាស៊ីនបម្រើ​នáŸáŸ‡â€‹áž‘០" "កុំ​ប្រើ​វា​ដើម្បី​ážáž—្ជាប់​ទៅ %(app_name)s ។" #: ../ubuntu_sso/utils/ui.py:172 msgid "Remember my settings for this certificate." msgstr "ចងចាំ​ការ​កំណážáŸ‹â€‹ážšáž”ស់​ážáŸ’ញុំ​សម្រាប់​វិញ្ញាបនបážáŸ’រ​នáŸáŸ‡Â áŸ”" #: ../ubuntu_sso/utils/ui.py:173 msgid "" "The name on the certificate isn't valid or doesn't match the name of the site" msgstr "" "ឈ្មោះ​នៅ​លើ​វិញ្ញាបនបážáŸ’រ​មិន​ážáŸ’រឹមážáŸ’រូវ " "ឬ​មិន​ដូច​គ្នា​នឹង​ឈ្មោះ​របស់​ážáŸ†áž”ន់បណ្ដាញ" #: ../ubuntu_sso/utils/ui.py:175 msgid "The certificate has expired" msgstr "វិញ្ញាបនបážáŸ’រ​បាន​ផុážâ€‹áž€áŸ†ážŽážáŸ‹â€‹áž áž¾áž™" #: ../ubuntu_sso/utils/ui.py:176 #, python-format msgid "You are now logged into %(app_name)s." msgstr "ឥឡូវ​នáŸáŸ‡ អ្នក​បាន​ចូល​ក្នុង %(app_name)s." #: ../ubuntu_sso/utils/ui.py:177 msgid "Surname" msgstr "នាម​ážáŸ’រកូល" #: ../ubuntu_sso/utils/ui.py:178 msgid "Terms of Service" msgstr "លក្ážážážŽáŸ’ឌ​សáŸážœáž¶áž€áž˜áŸ’ម" #: ../ubuntu_sso/utils/ui.py:179 msgid "Sign Up to {app_name}" msgstr "ចុះ​ឈ្មោះក្នុង {app_name}" #: ../ubuntu_sso/utils/ui.py:180 msgid "Show Terms & Conditions" msgstr "បង្ហាញ​កិច្ចព្រមព្រៀង និង​លក្ážážážŽáŸ’ឌ​ប្រើប្រាស់" #: ../ubuntu_sso/utils/ui.py:181 #, python-format msgid "" "Agreeing to the %(app_name)s Terms & Conditions is required to subscribe." msgstr "យល់ព្រម​នឹងលក្ážážážŽáŸ’ឌរបស់ %(app_name)s ážáŸ’រូវ​បាន ទាមទារ​ឲ្យ​ជាវ ។" #: ../ubuntu_sso/utils/ui.py:183 #, python-format msgid "You can also find these terms at %(url)s" msgstr "អ្នក​កáŸâ€‹áž¢áž¶áž…​រក​លក្ážážážŽáŸ’ឌ​ទាំង​នáŸáŸ‡â€‹áž“ៅ %(url)s" #: ../ubuntu_sso/utils/ui.py:184 msgid "Try again" msgstr "ព្យាយាម​ម្ដង​ទៀáž" #: ../ubuntu_sso/utils/ui.py:185 msgid "" "There was an error when trying to complete the process. Please check the " "information and try again." msgstr "" "មាន​កំហុស​កើážâ€‹áž¡áž¾áž„​ នៅ​ពáŸáž›â€‹áž–្យាយាម​បញ្ចប់​ដំណើរការ ។ សូម​ពិនិážáŸ’យមើល​ពáŸážáŸŒáž˜áž¶áž“ " "រួច​ព្យាយាម​ម្ដងទៀហ។" #: ../ubuntu_sso/utils/ui.py:187 msgid "Verification code" msgstr "កូដ​ផ្ទៀងផ្ទាážáŸ‹" #: ../ubuntu_sso/utils/ui.py:188 #, python-format msgid "" "Check %(email)s for an email from Ubuntu Single Sign On. This message " "contains a verification code. Enter the code in the field below and click OK " "to complete creating your %(app_name)s account." msgstr "" "ពិនិážáŸ’យ​មើល %(email)s " "សម្រាប់​អ៊ីមែល​ដែល​មក​ពី​កា​រចូល​ážáŸ‚​ម្ដង​របស់​អ៊ូប៊ុនទូ ។ " "សារ​នáŸáŸ‡â€‹áž˜áž¶áž“​កូដ​ផ្ទៀងផ្ទាážáŸ‹Â áŸ” បញ្ចូល​កូដ​ក្នុង​វាល​ážáž¶áž„​ក្រោម ហើយ​ចុច​ " "យល់ព្រម ដើម្បី​បញ្ចប់​ការ​បង្កើážâ€‹áž‚ណនី %(app_name)s របស់​អ្នក ។" #: ../ubuntu_sso/utils/ui.py:192 msgid "Enter verification code" msgstr "បញ្ចូល​កូដ​ផ្ទៀងផ្ទាážáŸ‹" #: ../ubuntu_sso/utils/ui.py:195 #, python-format msgid "I agree with the %(app_name)s terms and conditions" msgstr "" "ážáŸ’ញុំ​យល់ព្រម​ជាមួយ​កិច្ចព្រមព្រៀង និង​លក្ážážážŽáŸ’ឌ​ប្រើប្រាស់ %(app_name)s áž“áŸáŸ‡" #: ../ubuntu_sso/utils/ui.py:196 #, python-format msgid "Yes! Email me %(app_name)s tips and updates." msgstr "" "បាទ/ចាស ! ផ្ញើ​អ៊ីមែល​អំពី​ពáŸážáŸŒáž˜áž¶áž“​ជំនួយ និង​បច្ចុប្បន្នភាព %(app_name)s " "មក​កាន់​ážáŸ’ញុំ ។" ubuntu-sso-client-13.10/po/POTFILES.in0000664000202700020270000000002712151461656017543 0ustar dobeydobey00000000000000ubuntu_sso/utils/ui.py ubuntu-sso-client-13.10/po/ta.po0000664000202700020270000002761512151461656016746 0ustar dobeydobey00000000000000# Tamil translation for ubuntu-sso-client # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the ubuntu-sso-client package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: ubuntu-sso-client\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-09-11 18:25+0000\n" "PO-Revision-Date: 2010-11-28 12:39+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Tamil \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-09-17 18:24+0000\n" "X-Generator: Launchpad (build 15944)\n" #. Undefined variable '_', pylint: disable=E0602 #. all the text that is used in the gui #: ../ubuntu_sso/utils/ui.py:49 msgid "By signing up to {app_name} you agree to our {privacy_policy}" msgstr "" #: ../ubuntu_sso/utils/ui.py:51 msgid "By signing up to {app_name} you agree to our {terms_and_conditions}" msgstr "" #: ../ubuntu_sso/utils/ui.py:53 msgid " and {privacy_policy}" msgstr "" #: ../ubuntu_sso/utils/ui.py:54 msgid "Cancel" msgstr "" #: ../ubuntu_sso/utils/ui.py:55 msgid "Type the characters above" msgstr "மேலà¯à®³à¯à®³ எழà¯à®¤à¯à®¤à¯à®•à¯à®•ளை உளà¯à®³à®¿à®Ÿà®µà¯à®®à¯" #: ../ubuntu_sso/utils/ui.py:56 msgid "There was a problem getting the captcha, reloading..." msgstr "" #: ../ubuntu_sso/utils/ui.py:58 #, python-format msgid "If you can't read this then %(reload_link)s this page" msgstr "" #: ../ubuntu_sso/utils/ui.py:60 msgid "refresh" msgstr "" #: ../ubuntu_sso/utils/ui.py:61 msgid "Reload" msgstr "மீணà¯à®Ÿà¯à®®à¯ à®à®±à¯à®±à¯à®•" #: ../ubuntu_sso/utils/ui.py:62 msgid "The captcha is a required field" msgstr "" #: ../ubuntu_sso/utils/ui.py:63 msgid "Close window and set up later" msgstr "" #: ../ubuntu_sso/utils/ui.py:64 msgid "Congratulations, {app_name} is installed!" msgstr "" #: ../ubuntu_sso/utils/ui.py:65 #, python-format msgid "To connect this computer to %(app_name)s enter your details below." msgstr "" #: ../ubuntu_sso/utils/ui.py:67 msgid "Register with {app_name}." msgstr "" #: ../ubuntu_sso/utils/ui.py:68 ../ubuntu_sso/utils/ui.py:93 #: ../ubuntu_sso/utils/ui.py:143 msgid "Email address" msgstr "மினà¯à®©à®žà¯à®šà®²à¯ à®®à¯à®•வரி" #: ../ubuntu_sso/utils/ui.py:69 msgid "Re-type Email address" msgstr "மினà¯à®©à®žà¯à®šà®²à¯ à®®à¯à®•வரியை மறà¯à®ªà®Ÿà®¿à®¯à¯à®®à¯ உளà¯à®³à®¿à®Ÿà¯à®•" #: ../ubuntu_sso/utils/ui.py:70 msgid "The email must be a valid email address." msgstr "" #: ../ubuntu_sso/utils/ui.py:71 msgid "" "The email addresses don't match, please double check and try entering them " "again." msgstr "" #: ../ubuntu_sso/utils/ui.py:73 msgid "Email" msgstr "" #: ../ubuntu_sso/utils/ui.py:74 msgid "The email addresses do not match" msgstr "" #: ../ubuntu_sso/utils/ui.py:75 msgid "Enter code verification here" msgstr "" #: ../ubuntu_sso/utils/ui.py:76 msgid "Please enter your name" msgstr "" #: ../ubuntu_sso/utils/ui.py:77 msgid "The process did not finish successfully." msgstr "" #: ../ubuntu_sso/utils/ui.py:79 msgid "Sign me in with my existing account" msgstr "" #: ../ubuntu_sso/utils/ui.py:80 msgid "This field is required." msgstr "இநà¯à®¤ களம௠தேவைபà¯à®ªà®Ÿà¯à®•ிறதà¯." #: ../ubuntu_sso/utils/ui.py:81 msgid "I've forgotten my password" msgstr "எனà¯à®©à¯à®Ÿà¯ˆà®¯ கடவà¯à®šà¯à®šà¯Šà®²à¯à®²à¯ˆ மறநà¯à®¤à¯à®µà®¿à®Ÿà¯à®Ÿà¯‡à®©à¯" #: ../ubuntu_sso/utils/ui.py:82 ../ubuntu_sso/utils/ui.py:130 msgid "Reset password" msgstr "கடவà¯à®šà¯à®šà¯Šà®²à¯à®²à¯ˆ மீடà¯à®Ÿà®®à¯ˆ" #: ../ubuntu_sso/utils/ui.py:83 msgid "" "To reset your {app_name} password, enter your registered email address " "below. We will send instructions to reset your password." msgstr "" #: ../ubuntu_sso/utils/ui.py:86 msgid "Please enter a valid email address" msgstr "" #: ../ubuntu_sso/utils/ui.py:87 msgid "There was a problem accessing the Ubuntu Single Sign On backend." msgstr "" #: ../ubuntu_sso/utils/ui.py:89 #, python-format msgid "Create %(app_name)s account" msgstr "" #: ../ubuntu_sso/utils/ui.py:90 msgid "Loading..." msgstr "à®à®±à¯à®±à¯à®•ிறதà¯..." #: ../ubuntu_sso/utils/ui.py:91 msgid "Getting information, please wait..." msgstr "" #: ../ubuntu_sso/utils/ui.py:92 msgid "Already have an account? Click here to sign in" msgstr "" #: ../ubuntu_sso/utils/ui.py:94 #, python-format msgid "Connect to %(app_name)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:95 ../ubuntu_sso/utils/ui.py:109 msgid "Password" msgstr "கடவà¯à®šà¯à®šà¯Šà®²à¯" #: ../ubuntu_sso/utils/ui.py:97 msgid "Sign In to {app_name}" msgstr "" #: ../ubuntu_sso/utils/ui.py:99 msgid "Name" msgstr "பெயரà¯" #: ../ubuntu_sso/utils/ui.py:100 msgid "The name must not be empty." msgstr "" #: ../ubuntu_sso/utils/ui.py:101 msgid "Next" msgstr "அடà¯à®¤à¯à®¤" #: ../ubuntu_sso/utils/ui.py:102 msgid "Network detection" msgstr "" #: ../ubuntu_sso/utils/ui.py:103 #, python-format msgid "" "Are you online? We can't detect an internet connection - you will need to be " "connected to set up %(app_name)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:105 msgid "One moment please..." msgstr "ஒர௠கணம௠பொறà¯à®•à¯à®•வà¯à®®à¯..." #: ../ubuntu_sso/utils/ui.py:106 msgid "Create a password" msgstr "" #: ../ubuntu_sso/utils/ui.py:107 msgid "Your password was successfully changed." msgstr "உஙà¯à®•ளà¯à®Ÿà¯ˆà®¯ கடவà¯à®šà¯ சொல௠வெறà¯à®±à®¿à®•ரமாக மாறà¯à®±à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯." #: ../ubuntu_sso/utils/ui.py:108 msgid "At least one number" msgstr "" #: ../ubuntu_sso/utils/ui.py:110 msgid "Re-type Password" msgstr "மினà¯à®©à®žà¯à®šà®²à¯ à®®à¯à®•வரி மறà¯à®ªà®Ÿà®¿à®¯à¯à®®à¯ உளà¯à®³à®¿à®Ÿà¯à®•." #: ../ubuntu_sso/utils/ui.py:111 msgid "" "The password must have a minimum of 8 characters and include one uppercase " "character and one number." msgstr "" "உஙà¯à®•ளà¯à®Ÿà¯ˆà®¯ கடவà¯à®šà¯ சொலà¯à®²à®¾à®©à®¤à¯ கà¯à®±à¯ˆà®¨à¯à®¤à®ªà®Ÿà¯à®šà®®à¯ 8 எழà¯à®¤à¯à®¤à¯à®•à¯à®•ளà¯, ஒர௠பெரிய எழà¯à®¤à¯à®¤à¯ " "மறà¯à®±à¯à®®à¯ ஒர௠எண௠கொணà¯à®Ÿà®¤à®¾à®• இரà¯à®•à¯à®• வேணà¯à®Ÿà¯à®®à¯." #: ../ubuntu_sso/utils/ui.py:113 msgid "At least 8 characters" msgstr "" #: ../ubuntu_sso/utils/ui.py:114 msgid "Passwords don't match" msgstr "" #: ../ubuntu_sso/utils/ui.py:115 msgid "" "The passwords don't match, please double check and try entering them again." msgstr "" #: ../ubuntu_sso/utils/ui.py:117 msgid "Your password must contain" msgstr "" #: ../ubuntu_sso/utils/ui.py:118 msgid "The password is too weak." msgstr "கடவà¯à®šà¯à®šà¯Šà®²à¯ மிகவà¯à®®à¯ பலவீனமாக உளà¯à®³à®¤à¯." #: ../ubuntu_sso/utils/ui.py:119 msgid "At least one uppercase letter" msgstr "" #: ../ubuntu_sso/utils/ui.py:120 msgid "Privacy Policy" msgstr "" #: ../ubuntu_sso/utils/ui.py:121 msgid "Connecting to:" msgstr "" #: ../ubuntu_sso/utils/ui.py:122 msgid "Proxy Settings" msgstr "" #: ../ubuntu_sso/utils/ui.py:123 msgid "Incorrect login details. Please try again." msgstr "" #: ../ubuntu_sso/utils/ui.py:124 msgid "Please provide login details." msgstr "" #: ../ubuntu_sso/utils/ui.py:125 msgid "You are connecting through a proxy." msgstr "" #: ../ubuntu_sso/utils/ui.py:126 msgid "Get Help With Proxies" msgstr "" #: ../ubuntu_sso/utils/ui.py:127 msgid "Proxy password:" msgstr "" #: ../ubuntu_sso/utils/ui.py:128 msgid "Save and Connect" msgstr "" #: ../ubuntu_sso/utils/ui.py:129 msgid "Proxy username:" msgstr "" #: ../ubuntu_sso/utils/ui.py:131 msgid "" "A password reset code has been sent to your e-mail. Please enter the code " "below along with your new password." msgstr "" #: ../ubuntu_sso/utils/ui.py:133 msgid "Retype email" msgstr "" #: ../ubuntu_sso/utils/ui.py:134 msgid "Retype password" msgstr "" #: ../ubuntu_sso/utils/ui.py:135 #, python-format msgid "To reset your %(app_name)s password, enter your email address below:" msgstr "" #: ../ubuntu_sso/utils/ui.py:137 msgid "" "We are very Sorry! The service that signs you on is not responding right " "now\n" "Please try again or come back in a few minutes." msgstr "" #: ../ubuntu_sso/utils/ui.py:140 msgid "Sorry we did not recognize the email address." msgstr "" #: ../ubuntu_sso/utils/ui.py:142 msgid "Reset code" msgstr "கà¯à®±à®¿à®¯à¯€à®Ÿà¯à®Ÿà¯ˆ மீடà¯à®Ÿà®®à¯ˆ" #: ../ubuntu_sso/utils/ui.py:145 #, python-format msgid "" "A password reset code has been sent to %(email)s.\n" "Please enter the code below along with your new password." msgstr "" #: ../ubuntu_sso/utils/ui.py:147 msgid "Set Up Account" msgstr "" #: ../ubuntu_sso/utils/ui.py:148 msgid "I don't have an account yet - sign me up" msgstr "" #: ../ubuntu_sso/utils/ui.py:149 msgid "Sign In" msgstr "" #: ../ubuntu_sso/utils/ui.py:150 msgid "Log-in with my existing account." msgstr "" #: ../ubuntu_sso/utils/ui.py:151 msgid "the appname whose ssl error we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:152 msgid "Certificate details" msgstr "" #: ../ubuntu_sso/utils/ui.py:153 msgid "Connect" msgstr "" #: ../ubuntu_sso/utils/ui.py:154 msgid "the details ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:161 msgid "Open the SSL certificate UI." msgstr "" #: ../ubuntu_sso/utils/ui.py:162 msgid "SSL Certificate Not Valid" msgstr "" #: ../ubuntu_sso/utils/ui.py:163 msgid "the domain whose ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:164 #, python-format msgid "" "You are trying to connect to a proxy server on %(domain)s. This server uses " "a secure connection, and the SSL certificate is not valid because:" msgstr "" #: ../ubuntu_sso/utils/ui.py:167 msgid "The certificate has not been verified" msgstr "" #: ../ubuntu_sso/utils/ui.py:168 msgid "Do you want to connect to this server?" msgstr "" #: ../ubuntu_sso/utils/ui.py:169 msgid "Get Help With SSL" msgstr "" #: ../ubuntu_sso/utils/ui.py:170 #, python-format msgid "" "If you are not sure about this server, do not use it to connect to " "%(app_name)s." msgstr "" #: ../ubuntu_sso/utils/ui.py:172 msgid "Remember my settings for this certificate." msgstr "" #: ../ubuntu_sso/utils/ui.py:173 msgid "" "The name on the certificate isn't valid or doesn't match the name of the site" msgstr "" #: ../ubuntu_sso/utils/ui.py:175 msgid "The certificate has expired" msgstr "" #: ../ubuntu_sso/utils/ui.py:176 #, python-format msgid "You are now logged into %(app_name)s." msgstr "" #: ../ubuntu_sso/utils/ui.py:177 msgid "Surname" msgstr "" #: ../ubuntu_sso/utils/ui.py:178 msgid "Terms of Service" msgstr "" #: ../ubuntu_sso/utils/ui.py:179 msgid "Sign Up to {app_name}" msgstr "" #: ../ubuntu_sso/utils/ui.py:180 msgid "Show Terms & Conditions" msgstr "" #: ../ubuntu_sso/utils/ui.py:181 #, python-format msgid "" "Agreeing to the %(app_name)s Terms & Conditions is required to subscribe." msgstr "" #: ../ubuntu_sso/utils/ui.py:183 #, python-format msgid "You can also find these terms at %(url)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:184 msgid "Try again" msgstr "" #: ../ubuntu_sso/utils/ui.py:185 msgid "" "There was an error when trying to complete the process. Please check the " "information and try again." msgstr "" #: ../ubuntu_sso/utils/ui.py:187 msgid "Verification code" msgstr "" #: ../ubuntu_sso/utils/ui.py:188 #, python-format msgid "" "Check %(email)s for an email from Ubuntu Single Sign On. This message " "contains a verification code. Enter the code in the field below and click OK " "to complete creating your %(app_name)s account." msgstr "" #: ../ubuntu_sso/utils/ui.py:192 msgid "Enter verification code" msgstr "" #: ../ubuntu_sso/utils/ui.py:195 #, python-format msgid "I agree with the %(app_name)s terms and conditions" msgstr "" #: ../ubuntu_sso/utils/ui.py:196 #, python-format msgid "Yes! Email me %(app_name)s tips and updates." msgstr "" ubuntu-sso-client-13.10/po/sv.po0000664000202700020270000003561712151461656016773 0ustar dobeydobey00000000000000# Swedish translation for ubuntu-sso-client # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the ubuntu-sso-client package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: ubuntu-sso-client\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-09-11 18:25+0000\n" "PO-Revision-Date: 2012-03-25 09:43+0000\n" "Last-Translator: Daniel Nylander \n" "Language-Team: Swedish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-09-17 18:24+0000\n" "X-Generator: Launchpad (build 15944)\n" #. Undefined variable '_', pylint: disable=E0602 #. all the text that is used in the gui #: ../ubuntu_sso/utils/ui.py:49 msgid "By signing up to {app_name} you agree to our {privacy_policy}" msgstr "" "Genom att registrera dig för {app_name} sÃ¥ godkänner du vÃ¥r {privacy_policy}" #: ../ubuntu_sso/utils/ui.py:51 msgid "By signing up to {app_name} you agree to our {terms_and_conditions}" msgstr "" "Genom att registrera dig för {app_name} sÃ¥ godkänner du vÃ¥r " "{terms_and_conditions}" #: ../ubuntu_sso/utils/ui.py:53 msgid " and {privacy_policy}" msgstr " samt {privacy_policy}" #: ../ubuntu_sso/utils/ui.py:54 msgid "Cancel" msgstr "Avbryt" #: ../ubuntu_sso/utils/ui.py:55 msgid "Type the characters above" msgstr "Ange ovanstÃ¥ende tecken" #: ../ubuntu_sso/utils/ui.py:56 msgid "There was a problem getting the captcha, reloading..." msgstr "Det uppstod ett fel vid hämtning av captcha. Försöker igen..." #: ../ubuntu_sso/utils/ui.py:58 #, python-format msgid "If you can't read this then %(reload_link)s this page" msgstr "Om du inte kan läsa detta kan du %(reload_link)s denna sida" #: ../ubuntu_sso/utils/ui.py:60 msgid "refresh" msgstr "uppdatera" #: ../ubuntu_sso/utils/ui.py:61 msgid "Reload" msgstr "Uppdatera" #: ../ubuntu_sso/utils/ui.py:62 msgid "The captcha is a required field" msgstr "Captcha är ett nödvändigt fält" #: ../ubuntu_sso/utils/ui.py:63 msgid "Close window and set up later" msgstr "Stäng fönstret och konfigurera senare" #: ../ubuntu_sso/utils/ui.py:64 msgid "Congratulations, {app_name} is installed!" msgstr "Gratulerar, {app_name} är installerat!" #: ../ubuntu_sso/utils/ui.py:65 #, python-format msgid "To connect this computer to %(app_name)s enter your details below." msgstr "" "Ange dina uppgifter nedan för att ansluta denna dator till %(app_name)s." #: ../ubuntu_sso/utils/ui.py:67 msgid "Register with {app_name}." msgstr "" #: ../ubuntu_sso/utils/ui.py:68 ../ubuntu_sso/utils/ui.py:93 #: ../ubuntu_sso/utils/ui.py:143 msgid "Email address" msgstr "E-postadress" #: ../ubuntu_sso/utils/ui.py:69 msgid "Re-type Email address" msgstr "Ange e-postadressen igen" #: ../ubuntu_sso/utils/ui.py:70 msgid "The email must be a valid email address." msgstr "E-postadressen mÃ¥ste vara en giltig e-postadress." #: ../ubuntu_sso/utils/ui.py:71 msgid "" "The email addresses don't match, please double check and try entering them " "again." msgstr "E-postadresserna stämmer inte överens. Kontrollera och försök igen." #: ../ubuntu_sso/utils/ui.py:73 msgid "Email" msgstr "E-post" #: ../ubuntu_sso/utils/ui.py:74 msgid "The email addresses do not match" msgstr "E-postadresserna stämmer inte överens" #: ../ubuntu_sso/utils/ui.py:75 msgid "Enter code verification here" msgstr "Ange kodverifiering här" #: ../ubuntu_sso/utils/ui.py:76 msgid "Please enter your name" msgstr "Ange ditt namn" #: ../ubuntu_sso/utils/ui.py:77 msgid "The process did not finish successfully." msgstr "Processen färdigställdes inte fullt ut." #: ../ubuntu_sso/utils/ui.py:79 msgid "Sign me in with my existing account" msgstr "Logga in mig med mitt befintliga konto" #: ../ubuntu_sso/utils/ui.py:80 msgid "This field is required." msgstr "Detta fält är obligatoriskt." #: ../ubuntu_sso/utils/ui.py:81 msgid "I've forgotten my password" msgstr "Jag har glömt mitt lösenord" #: ../ubuntu_sso/utils/ui.py:82 ../ubuntu_sso/utils/ui.py:130 msgid "Reset password" msgstr "Nollställ lösenord" #: ../ubuntu_sso/utils/ui.py:83 msgid "" "To reset your {app_name} password, enter your registered email address " "below. We will send instructions to reset your password." msgstr "" "Ange din registrerade e-postadress nedan för att Ã¥terställa ditt lösenord " "för {app_name}. Vi kommer att skicka dig instruktioner för hur du " "Ã¥terställer ditt lösenord." #: ../ubuntu_sso/utils/ui.py:86 msgid "Please enter a valid email address" msgstr "Ange en giltig e-postadress" #: ../ubuntu_sso/utils/ui.py:87 msgid "There was a problem accessing the Ubuntu Single Sign On backend." msgstr "" "Det uppstor ett problem vid Ã¥tkomst till Ubuntu Single Sign On-bakänden." #: ../ubuntu_sso/utils/ui.py:89 #, python-format msgid "Create %(app_name)s account" msgstr "Skapa %(app_name)s-konto" #: ../ubuntu_sso/utils/ui.py:90 msgid "Loading..." msgstr "Läser in..." #: ../ubuntu_sso/utils/ui.py:91 msgid "Getting information, please wait..." msgstr "Hämtar information, vänta..." #: ../ubuntu_sso/utils/ui.py:92 msgid "Already have an account? Click here to sign in" msgstr "Har du redan ett konto? Klicka här för att logga in" #: ../ubuntu_sso/utils/ui.py:94 #, python-format msgid "Connect to %(app_name)s" msgstr "Anslut till %(app_name)s" #: ../ubuntu_sso/utils/ui.py:95 ../ubuntu_sso/utils/ui.py:109 msgid "Password" msgstr "Lösenord" #: ../ubuntu_sso/utils/ui.py:97 msgid "Sign In to {app_name}" msgstr "Logga in pÃ¥ {app_name}" #: ../ubuntu_sso/utils/ui.py:99 msgid "Name" msgstr "Namn" #: ../ubuntu_sso/utils/ui.py:100 msgid "The name must not be empty." msgstr "Namnet fÃ¥r inte vara tomt." #: ../ubuntu_sso/utils/ui.py:101 msgid "Next" msgstr "Nästa" #: ../ubuntu_sso/utils/ui.py:102 msgid "Network detection" msgstr "Nätverksidentifiering" #: ../ubuntu_sso/utils/ui.py:103 #, python-format msgid "" "Are you online? We can't detect an internet connection - you will need to be " "connected to set up %(app_name)s" msgstr "" "Är du ansluten till nätverket? Vi kunde inte identifiera en " "internetanslutning - du mÃ¥ste vara ansluten för att konfigurera %(app_name)s" #: ../ubuntu_sso/utils/ui.py:105 msgid "One moment please..." msgstr "Ett ögonblick..." #: ../ubuntu_sso/utils/ui.py:106 msgid "Create a password" msgstr "Skapa ett lösenord" #: ../ubuntu_sso/utils/ui.py:107 msgid "Your password was successfully changed." msgstr "Ditt lösenord har ändrats." #: ../ubuntu_sso/utils/ui.py:108 msgid "At least one number" msgstr "Minst en siffra" #: ../ubuntu_sso/utils/ui.py:110 msgid "Re-type Password" msgstr "Ange lösenordet igen" #: ../ubuntu_sso/utils/ui.py:111 msgid "" "The password must have a minimum of 8 characters and include one uppercase " "character and one number." msgstr "" "Lösenordet mÃ¥ste innehÃ¥lla minst 8 tecken och inkludera ett versalt tecken " "och en siffra." #: ../ubuntu_sso/utils/ui.py:113 msgid "At least 8 characters" msgstr "Minst 8 tecken" #: ../ubuntu_sso/utils/ui.py:114 msgid "Passwords don't match" msgstr "Lösenorden stämmer inte överens" #: ../ubuntu_sso/utils/ui.py:115 msgid "" "The passwords don't match, please double check and try entering them again." msgstr "Lösenorden stämmer inte överens. Kontrollera och försök igen." #: ../ubuntu_sso/utils/ui.py:117 msgid "Your password must contain" msgstr "Ditt lösenord mÃ¥ste innehÃ¥lla" #: ../ubuntu_sso/utils/ui.py:118 msgid "The password is too weak." msgstr "Lösenordet är för svagt." #: ../ubuntu_sso/utils/ui.py:119 msgid "At least one uppercase letter" msgstr "Minst en versal bokstav" #: ../ubuntu_sso/utils/ui.py:120 msgid "Privacy Policy" msgstr "Integritetspolicy" #: ../ubuntu_sso/utils/ui.py:121 msgid "Connecting to:" msgstr "Ansluter till:" #: ../ubuntu_sso/utils/ui.py:122 msgid "Proxy Settings" msgstr "Proxyinställningar" #: ../ubuntu_sso/utils/ui.py:123 msgid "Incorrect login details. Please try again." msgstr "Felaktiga inloggningsuppgifter. Försök igen." #: ../ubuntu_sso/utils/ui.py:124 msgid "Please provide login details." msgstr "Ange dina inloggningsuppgifter." #: ../ubuntu_sso/utils/ui.py:125 msgid "You are connecting through a proxy." msgstr "Du ansluter genom en proxyserver." #: ../ubuntu_sso/utils/ui.py:126 msgid "Get Help With Proxies" msgstr "FÃ¥ hjälp med proxyservrar" #: ../ubuntu_sso/utils/ui.py:127 msgid "Proxy password:" msgstr "Lösenord för proxyserver:" #: ../ubuntu_sso/utils/ui.py:128 msgid "Save and Connect" msgstr "Spara och anslut" #: ../ubuntu_sso/utils/ui.py:129 msgid "Proxy username:" msgstr "Användarnamn för proxyserver:" #: ../ubuntu_sso/utils/ui.py:131 msgid "" "A password reset code has been sent to your e-mail. Please enter the code " "below along with your new password." msgstr "" "En Ã¥terställningskod för lösenordet har skickats till din e-postadress. Ange " "koden nedan tillsammans med ditt nya lösenord." #: ../ubuntu_sso/utils/ui.py:133 msgid "Retype email" msgstr "Upprepa e-postadressen" #: ../ubuntu_sso/utils/ui.py:134 msgid "Retype password" msgstr "Upprepa lösenordet" #: ../ubuntu_sso/utils/ui.py:135 #, python-format msgid "To reset your %(app_name)s password, enter your email address below:" msgstr "" "Ange din e-postadress nedan för att nollställa ditt lösenord för " "%(app_name)s:" #: ../ubuntu_sso/utils/ui.py:137 msgid "" "We are very Sorry! The service that signs you on is not responding right " "now\n" "Please try again or come back in a few minutes." msgstr "" "Vi beklagar. Tjänsten som du loggar in pÃ¥ svarar inte just nu\n" "Försök igen eller kom tillbaka om nÃ¥gra minuter." #: ../ubuntu_sso/utils/ui.py:140 msgid "Sorry we did not recognize the email address." msgstr "Tyvärr, vi känner inte igen denna e-postadress." #: ../ubuntu_sso/utils/ui.py:142 msgid "Reset code" msgstr "Nollställningskod" #: ../ubuntu_sso/utils/ui.py:145 #, python-format msgid "" "A password reset code has been sent to %(email)s.\n" "Please enter the code below along with your new password." msgstr "" "En nollställningskod för lösenordet har skickats till %(email)s.\n" "Ange koden nedan tillsammans med ditt nya lösenord." #: ../ubuntu_sso/utils/ui.py:147 msgid "Set Up Account" msgstr "Konfigurera konto" #: ../ubuntu_sso/utils/ui.py:148 msgid "I don't have an account yet - sign me up" msgstr "Jag har ännu inte ett konto - registrera mig" #: ../ubuntu_sso/utils/ui.py:149 msgid "Sign In" msgstr "Logga in" #: ../ubuntu_sso/utils/ui.py:150 msgid "Log-in with my existing account." msgstr "" #: ../ubuntu_sso/utils/ui.py:151 msgid "the appname whose ssl error we are going to show." msgstr "programnamnet vars SSL-fel vi ska visa." #: ../ubuntu_sso/utils/ui.py:152 msgid "Certificate details" msgstr "Certifikatdetaljer" #: ../ubuntu_sso/utils/ui.py:153 msgid "Connect" msgstr "Anslut" #: ../ubuntu_sso/utils/ui.py:154 msgid "the details ssl certificate we are going to show." msgstr "detaljerna om SSL-certifikatet som vi ska visa." #: ../ubuntu_sso/utils/ui.py:161 msgid "Open the SSL certificate UI." msgstr "Öppna användargränssnitt för SSL-certifikat." #: ../ubuntu_sso/utils/ui.py:162 msgid "SSL Certificate Not Valid" msgstr "SSL-certifikatet är inte giltigt" #: ../ubuntu_sso/utils/ui.py:163 msgid "the domain whose ssl certificate we are going to show." msgstr "domänen vars SSL-certifikat vi ska visa." #: ../ubuntu_sso/utils/ui.py:164 #, python-format msgid "" "You are trying to connect to a proxy server on %(domain)s. This server uses " "a secure connection, and the SSL certificate is not valid because:" msgstr "" "Du försöker att ansluta till en proxyserver pÃ¥ %(domain)s. Denna server " "använder en säker anslutning men SSL-certifikatet är inte giltigt därför att:" #: ../ubuntu_sso/utils/ui.py:167 msgid "The certificate has not been verified" msgstr "Certifikatet har inte verifierats" #: ../ubuntu_sso/utils/ui.py:168 msgid "Do you want to connect to this server?" msgstr "Vill du ansluta till denna server?" #: ../ubuntu_sso/utils/ui.py:169 msgid "Get Help With SSL" msgstr "FÃ¥ hjälp med SSL" #: ../ubuntu_sso/utils/ui.py:170 #, python-format msgid "" "If you are not sure about this server, do not use it to connect to " "%(app_name)s." msgstr "" "Om du inte litar pÃ¥ denna server sÃ¥ använd den inte för att ansluta till " "%(app_name)s." #: ../ubuntu_sso/utils/ui.py:172 msgid "Remember my settings for this certificate." msgstr "Kom ihÃ¥g mina inställningar för detta certifikat." #: ../ubuntu_sso/utils/ui.py:173 msgid "" "The name on the certificate isn't valid or doesn't match the name of the site" msgstr "" "Namnet pÃ¥ certifikatet är inte giltigt eller matchar inte namnet pÃ¥ " "webbplatsen" #: ../ubuntu_sso/utils/ui.py:175 msgid "The certificate has expired" msgstr "Certifikatet har gÃ¥tt ut" #: ../ubuntu_sso/utils/ui.py:176 #, python-format msgid "You are now logged into %(app_name)s." msgstr "Du är nu inloggad pÃ¥ %(app_name)s." #: ../ubuntu_sso/utils/ui.py:177 msgid "Surname" msgstr "Efternamn" #: ../ubuntu_sso/utils/ui.py:178 msgid "Terms of Service" msgstr "Villkor för tjänsten" #: ../ubuntu_sso/utils/ui.py:179 msgid "Sign Up to {app_name}" msgstr "Registrera dig för {app_name}" #: ../ubuntu_sso/utils/ui.py:180 msgid "Show Terms & Conditions" msgstr "Visa användarvillkor" #: ../ubuntu_sso/utils/ui.py:181 #, python-format msgid "" "Agreeing to the %(app_name)s Terms & Conditions is required to subscribe." msgstr "" "Godkännande av villkoren för %(app_name)s krävs för att registrera sig." #: ../ubuntu_sso/utils/ui.py:183 #, python-format msgid "You can also find these terms at %(url)s" msgstr "Du hittar även dessa villkor pÃ¥ %(url)s" #: ../ubuntu_sso/utils/ui.py:184 msgid "Try again" msgstr "Försök igen" #: ../ubuntu_sso/utils/ui.py:185 msgid "" "There was an error when trying to complete the process. Please check the " "information and try again." msgstr "" "Det uppstod ett fel vid försök att färdigställa processen. Kontrollera " "informationen och försök igen." #: ../ubuntu_sso/utils/ui.py:187 msgid "Verification code" msgstr "Verifieringskod" #: ../ubuntu_sso/utils/ui.py:188 #, python-format msgid "" "Check %(email)s for an email from Ubuntu Single Sign On. This message " "contains a verification code. Enter the code in the field below and click OK " "to complete creating your %(app_name)s account." msgstr "" "Leta bland din e-post för %(email)s efter ett meddelande frÃ¥n Ubuntu Single " "Sign On. Detta meddelande innehÃ¥ller en verifieringskod. Ange koden i fältet " "nedan och klicka pÃ¥ OK för att färdigställa skapandet av ditt %(app_name)s-" "konto." #: ../ubuntu_sso/utils/ui.py:192 msgid "Enter verification code" msgstr "Ange verifieringskod" #: ../ubuntu_sso/utils/ui.py:195 #, python-format msgid "I agree with the %(app_name)s terms and conditions" msgstr "Jag godkänner villkoren för %(app_name)s" #: ../ubuntu_sso/utils/ui.py:196 #, python-format msgid "Yes! Email me %(app_name)s tips and updates." msgstr "Ja! Skicka tips och uppdateringar för %(app_name)s via e-post." ubuntu-sso-client-13.10/po/de.po0000664000202700020270000003704212151461656016725 0ustar dobeydobey00000000000000# German translation for ubuntu-sso-client # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the ubuntu-sso-client package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: ubuntu-sso-client\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-09-11 18:25+0000\n" "PO-Revision-Date: 2012-04-22 01:19+0000\n" "Last-Translator: Dennis Baudys \n" "Language-Team: German \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-09-17 18:24+0000\n" "X-Generator: Launchpad (build 15944)\n" #. Undefined variable '_', pylint: disable=E0602 #. all the text that is used in the gui #: ../ubuntu_sso/utils/ui.py:49 msgid "By signing up to {app_name} you agree to our {privacy_policy}" msgstr "" "Indem Sie sich bei {app_name} registrieren, stimmen Sie unseren " "{privacy_policy} zu" #: ../ubuntu_sso/utils/ui.py:51 msgid "By signing up to {app_name} you agree to our {terms_and_conditions}" msgstr "" "Indem Sie sich bei {app_name} registrieren, stimmen Sie unseren " "{terms_and_conditions} zu" #: ../ubuntu_sso/utils/ui.py:53 msgid " and {privacy_policy}" msgstr " und {privacy_policy}" #: ../ubuntu_sso/utils/ui.py:54 msgid "Cancel" msgstr "Abbrechen" #: ../ubuntu_sso/utils/ui.py:55 msgid "Type the characters above" msgstr "Geben Sie die obigen Buchstaben ein" #: ../ubuntu_sso/utils/ui.py:56 msgid "There was a problem getting the captcha, reloading..." msgstr "" "Beim Laden der Sicherheitsabfrage ist ein Fehler aufgetreten, sie wird " "erneut geladen …" #: ../ubuntu_sso/utils/ui.py:58 #, python-format msgid "If you can't read this then %(reload_link)s this page" msgstr "Wenn Sie dies nicht lesen können, %(reload_link)s Sie diese Seite" #: ../ubuntu_sso/utils/ui.py:60 msgid "refresh" msgstr "Aktualisieren" #: ../ubuntu_sso/utils/ui.py:61 msgid "Reload" msgstr "Neu laden" #: ../ubuntu_sso/utils/ui.py:62 msgid "The captcha is a required field" msgstr "Captcha müssen eingegeben werden" #: ../ubuntu_sso/utils/ui.py:63 msgid "Close window and set up later" msgstr "Fenster schließen und später einrichten" #: ../ubuntu_sso/utils/ui.py:64 msgid "Congratulations, {app_name} is installed!" msgstr "Glückwunsch, {app_name} wurde installiert!" #: ../ubuntu_sso/utils/ui.py:65 #, python-format msgid "To connect this computer to %(app_name)s enter your details below." msgstr "" "Geben Sie Ihre Daten unten ein, um diesen Rechner mit %(app_name)s zu " "verbinden." #: ../ubuntu_sso/utils/ui.py:67 msgid "Register with {app_name}." msgstr "" #: ../ubuntu_sso/utils/ui.py:68 ../ubuntu_sso/utils/ui.py:93 #: ../ubuntu_sso/utils/ui.py:143 msgid "Email address" msgstr "E-Mail-Adresse" #: ../ubuntu_sso/utils/ui.py:69 msgid "Re-type Email address" msgstr "E-Mail-Adresse (Bestätigung)" #: ../ubuntu_sso/utils/ui.py:70 msgid "The email must be a valid email address." msgstr "Die E-Mail-Adresse muss gültig sein." #: ../ubuntu_sso/utils/ui.py:71 msgid "" "The email addresses don't match, please double check and try entering them " "again." msgstr "" "Die E-Mail-Adressen stimmen nicht überein, bitte überprüfen Sie Ihre " "Eingaben und versuchen Sie es erneut." #: ../ubuntu_sso/utils/ui.py:73 msgid "Email" msgstr "E-Mail" #: ../ubuntu_sso/utils/ui.py:74 msgid "The email addresses do not match" msgstr "Die E-Mail-Adressen stimmen nicht überein" #: ../ubuntu_sso/utils/ui.py:75 msgid "Enter code verification here" msgstr "Geben Sie den Bestätigungscode ein" #: ../ubuntu_sso/utils/ui.py:76 msgid "Please enter your name" msgstr "Bitte geben Sie Ihren Namen ein" #: ../ubuntu_sso/utils/ui.py:77 msgid "The process did not finish successfully." msgstr "Der Vorgang konnte nicht abgeschlossen werden." #: ../ubuntu_sso/utils/ui.py:79 msgid "Sign me in with my existing account" msgstr "Mit meinem bestehenden Konto anmelden" #: ../ubuntu_sso/utils/ui.py:80 msgid "This field is required." msgstr "Dieses Feld ist ein Pflichfeld." #: ../ubuntu_sso/utils/ui.py:81 msgid "I've forgotten my password" msgstr "Ich habe mein Passwort vergessen" #: ../ubuntu_sso/utils/ui.py:82 ../ubuntu_sso/utils/ui.py:130 msgid "Reset password" msgstr "Passwort zurücksetzen" #: ../ubuntu_sso/utils/ui.py:83 msgid "" "To reset your {app_name} password, enter your registered email address " "below. We will send instructions to reset your password." msgstr "" "Um Ihr {app_name}-Passwort zurückzusetzen, geben Sie die E-Mail-Adresse ein, " "mit der Sie sich registriert haben. Wir schicken Ihnen dann Anweisungen zum " "Zurücksetzen Ihres Passworts." #: ../ubuntu_sso/utils/ui.py:86 msgid "Please enter a valid email address" msgstr "Bitte geben Sie eine gültige E-Mail-Adresse ein" #: ../ubuntu_sso/utils/ui.py:87 msgid "There was a problem accessing the Ubuntu Single Sign On backend." msgstr "" "Beim Zugriff auf das »Ubuntu Single Sign On«-Backend ist ein Problem " "aufgetreten." #: ../ubuntu_sso/utils/ui.py:89 #, python-format msgid "Create %(app_name)s account" msgstr "Benutzerkonto für %(app_name)s erstellen" #: ../ubuntu_sso/utils/ui.py:90 msgid "Loading..." msgstr "Wird geladen ..." #: ../ubuntu_sso/utils/ui.py:91 msgid "Getting information, please wait..." msgstr "Informationen werden geladen, bitte warten …" #: ../ubuntu_sso/utils/ui.py:92 msgid "Already have an account? Click here to sign in" msgstr "" "Haben Sie bereits ein Benutzerkonto? Klicken Sie hier, um sich anzumelden" #: ../ubuntu_sso/utils/ui.py:94 #, python-format msgid "Connect to %(app_name)s" msgstr "Mit %(app_name)s verbinden" #: ../ubuntu_sso/utils/ui.py:95 ../ubuntu_sso/utils/ui.py:109 msgid "Password" msgstr "Passwort" #: ../ubuntu_sso/utils/ui.py:97 msgid "Sign In to {app_name}" msgstr "Bei {app_name} anmelden" #: ../ubuntu_sso/utils/ui.py:99 msgid "Name" msgstr "Name" #: ../ubuntu_sso/utils/ui.py:100 msgid "The name must not be empty." msgstr "Der Name darf nicht leer sein." #: ../ubuntu_sso/utils/ui.py:101 msgid "Next" msgstr "Weiter" #: ../ubuntu_sso/utils/ui.py:102 msgid "Network detection" msgstr "Netzwerkerkennung" #: ../ubuntu_sso/utils/ui.py:103 #, python-format msgid "" "Are you online? We can't detect an internet connection - you will need to be " "connected to set up %(app_name)s" msgstr "" "Sind Sie online? Es konnte keine Internetverbindung festgestellt werden – " "Sie müssen eine Verbindung herstellen, um %(app_name)s einzurichten" #: ../ubuntu_sso/utils/ui.py:105 msgid "One moment please..." msgstr "Einen Moment bitte …" #: ../ubuntu_sso/utils/ui.py:106 msgid "Create a password" msgstr "Ein Passwort anlegen" #: ../ubuntu_sso/utils/ui.py:107 msgid "Your password was successfully changed." msgstr "Ihr Passwort wurde erfolgreich geändert." #: ../ubuntu_sso/utils/ui.py:108 msgid "At least one number" msgstr "Mindestens eine Zahl" #: ../ubuntu_sso/utils/ui.py:110 msgid "Re-type Password" msgstr "Passwort (Bestätigung)" #: ../ubuntu_sso/utils/ui.py:111 msgid "" "The password must have a minimum of 8 characters and include one uppercase " "character and one number." msgstr "" "Das Passwort muss aus mindestens 8 Zeichen bestehen und mindestens einen " "Großbuchstaben und eine Nummer beinhalten." #: ../ubuntu_sso/utils/ui.py:113 msgid "At least 8 characters" msgstr "Mindestens 8 Zeichen" #: ../ubuntu_sso/utils/ui.py:114 msgid "Passwords don't match" msgstr "Die Passwörter stimmen nicht überein" #: ../ubuntu_sso/utils/ui.py:115 msgid "" "The passwords don't match, please double check and try entering them again." msgstr "" "Die Passwörter stimmen nicht überein, bitte überprüfen Sie Ihre Eingaben und " "versuchen Sie es erneut." #: ../ubuntu_sso/utils/ui.py:117 msgid "Your password must contain" msgstr "Im Passwort enthalten sein muss" #: ../ubuntu_sso/utils/ui.py:118 msgid "The password is too weak." msgstr "Das Passwort ist zu einfach." #: ../ubuntu_sso/utils/ui.py:119 msgid "At least one uppercase letter" msgstr "Mindestens ein Großbuchstabe" #: ../ubuntu_sso/utils/ui.py:120 msgid "Privacy Policy" msgstr "Datenschutzbestimmungen" #: ../ubuntu_sso/utils/ui.py:121 msgid "Connecting to:" msgstr "Verbindung wird hergestellt mit:" #: ../ubuntu_sso/utils/ui.py:122 msgid "Proxy Settings" msgstr "Proxy-Einstellungen" #: ../ubuntu_sso/utils/ui.py:123 msgid "Incorrect login details. Please try again." msgstr "Falsche Anmeldeinformationen. Versuchen Sie es erneut." #: ../ubuntu_sso/utils/ui.py:124 msgid "Please provide login details." msgstr "Bitte geben Sie Anmeldeinformationen an." #: ../ubuntu_sso/utils/ui.py:125 msgid "You are connecting through a proxy." msgstr "Sie sind über einen Proxy verbunden." #: ../ubuntu_sso/utils/ui.py:126 msgid "Get Help With Proxies" msgstr "Hilfe zu Proxies erhalten" #: ../ubuntu_sso/utils/ui.py:127 msgid "Proxy password:" msgstr "Proxy-Passwort:" #: ../ubuntu_sso/utils/ui.py:128 msgid "Save and Connect" msgstr "Speichern und Verbinden" #: ../ubuntu_sso/utils/ui.py:129 msgid "Proxy username:" msgstr "Proxy-Nutzername:" #: ../ubuntu_sso/utils/ui.py:131 msgid "" "A password reset code has been sent to your e-mail. Please enter the code " "below along with your new password." msgstr "" "Ein Code zum Zurücksetzen des Passworts wurde an Ihre E-Mail-Adresse " "gesendet. Bitte geben Sie den Code zusammen mit Ihrem neuen Passwort unten " "ein." #: ../ubuntu_sso/utils/ui.py:133 msgid "Retype email" msgstr "E-Mail (Wiederholung)" #: ../ubuntu_sso/utils/ui.py:134 msgid "Retype password" msgstr "Passwort (Wiederholung)" #: ../ubuntu_sso/utils/ui.py:135 #, python-format msgid "To reset your %(app_name)s password, enter your email address below:" msgstr "" "Um Ihr Passwort für %(app_name)s zurückzusetzen, geben Sie bitte Ihre E-Mail-" "Adresse ein:" #: ../ubuntu_sso/utils/ui.py:137 msgid "" "We are very Sorry! The service that signs you on is not responding right " "now\n" "Please try again or come back in a few minutes." msgstr "" "Es tut uns sehr Leid! Der Dienst, der Sie anmeldet, antwortet gerade nicht.\n" "Bitte versuchen Sie es später oder in ein paar Minuten erneut." #: ../ubuntu_sso/utils/ui.py:140 msgid "Sorry we did not recognize the email address." msgstr "Entschuldigung, Ihre E-Mail-Adresse wurde nicht erkannt." #: ../ubuntu_sso/utils/ui.py:142 msgid "Reset code" msgstr "Zurücksetzungscode" #: ../ubuntu_sso/utils/ui.py:145 #, python-format msgid "" "A password reset code has been sent to %(email)s.\n" "Please enter the code below along with your new password." msgstr "" "Ein Zurücksetzungscode wurde an %(email)s verschickt.\n" "Bitte geben Sie diesen Code sowie Ihr neues Passwort unten ein." #: ../ubuntu_sso/utils/ui.py:147 msgid "Set Up Account" msgstr "Konto einrichten" #: ../ubuntu_sso/utils/ui.py:148 msgid "I don't have an account yet - sign me up" msgstr "Ich habe noch kein Konto – Registrieren Sie mich" #: ../ubuntu_sso/utils/ui.py:149 msgid "Sign In" msgstr "Anmelden" #: ../ubuntu_sso/utils/ui.py:150 msgid "Log-in with my existing account." msgstr "" #: ../ubuntu_sso/utils/ui.py:151 msgid "the appname whose ssl error we are going to show." msgstr "Der Name der Anwendung, deren SSL-Fehler angezeigt werden soll." #: ../ubuntu_sso/utils/ui.py:152 msgid "Certificate details" msgstr "Zertifikatdetails" #: ../ubuntu_sso/utils/ui.py:153 msgid "Connect" msgstr "Verbinden" #: ../ubuntu_sso/utils/ui.py:154 msgid "the details ssl certificate we are going to show." msgstr "Die SSL-Zertifikatdetails, die angezeigt werden sollen." #: ../ubuntu_sso/utils/ui.py:161 msgid "Open the SSL certificate UI." msgstr "Die SSL-Zertifikat-UI öffnen." #: ../ubuntu_sso/utils/ui.py:162 msgid "SSL Certificate Not Valid" msgstr "SSL-Zertifikat nicht gültig" #: ../ubuntu_sso/utils/ui.py:163 msgid "the domain whose ssl certificate we are going to show." msgstr "Die Domain, deren SSL-Zertifikat angezeigt werden soll." #: ../ubuntu_sso/utils/ui.py:164 #, python-format msgid "" "You are trying to connect to a proxy server on %(domain)s. This server uses " "a secure connection, and the SSL certificate is not valid because:" msgstr "" "Sie versuchen sich mit einem Proxy-Server auf %(domain)s zu verbinden. " "Dieser Server nutzt eine sichere Verbindung und das SSL-Zertifikat ist " "ungültig, weil:" #: ../ubuntu_sso/utils/ui.py:167 msgid "The certificate has not been verified" msgstr "Das Zertifikat wurde nicht bestätigt" #: ../ubuntu_sso/utils/ui.py:168 msgid "Do you want to connect to this server?" msgstr "Möchten Sie sich mit diesem Server verbinden?" #: ../ubuntu_sso/utils/ui.py:169 msgid "Get Help With SSL" msgstr "Hilfe zu SSL erhalten" #: ../ubuntu_sso/utils/ui.py:170 #, python-format msgid "" "If you are not sure about this server, do not use it to connect to " "%(app_name)s." msgstr "" "Falls Sie sich bei diesem Server nicht sicher sind, nutzen Sie diesen nicht " "um eine Verbindung zu %(app_name)s herzustellen." #: ../ubuntu_sso/utils/ui.py:172 msgid "Remember my settings for this certificate." msgstr "Einstellungen für dieses Zertifikat speichern." #: ../ubuntu_sso/utils/ui.py:173 msgid "" "The name on the certificate isn't valid or doesn't match the name of the site" msgstr "" "Der Name des Zertifikats ist ungültig oder stimmt nicht mit dem Namen der " "Seite überein" #: ../ubuntu_sso/utils/ui.py:175 msgid "The certificate has expired" msgstr "Das Zertifikat ist abgelaufen" #: ../ubuntu_sso/utils/ui.py:176 #, python-format msgid "You are now logged into %(app_name)s." msgstr "Sie sind jetzt bei %(app_name)s angemeldet." #: ../ubuntu_sso/utils/ui.py:177 msgid "Surname" msgstr "Nachname" #: ../ubuntu_sso/utils/ui.py:178 msgid "Terms of Service" msgstr "Nutzungsbedingungen" #: ../ubuntu_sso/utils/ui.py:179 msgid "Sign Up to {app_name}" msgstr "Bei {app_name} anmelden" #: ../ubuntu_sso/utils/ui.py:180 msgid "Show Terms & Conditions" msgstr "Nutzungsbedingungen anzeigen" #: ../ubuntu_sso/utils/ui.py:181 #, python-format msgid "" "Agreeing to the %(app_name)s Terms & Conditions is required to subscribe." msgstr "" "Ihre Zustimmung zu den Nutzungsbedingungen von %(app_name)s ist für ein " "Abonnement erforderlich." #: ../ubuntu_sso/utils/ui.py:183 #, python-format msgid "You can also find these terms at %(url)s" msgstr "" "Sie finden die Nutzungsbedingungen unter %(url)s" #: ../ubuntu_sso/utils/ui.py:184 msgid "Try again" msgstr "Erneut versuchen" #: ../ubuntu_sso/utils/ui.py:185 msgid "" "There was an error when trying to complete the process. Please check the " "information and try again." msgstr "" "Beim Abschließen des Vorgangs ist ein Fehler aufgetreten. Bitte überprüfen " "Sie die Informationen und versuchen Sie es erneut." #: ../ubuntu_sso/utils/ui.py:187 msgid "Verification code" msgstr "Prüfcode" #: ../ubuntu_sso/utils/ui.py:188 #, python-format msgid "" "Check %(email)s for an email from Ubuntu Single Sign On. This message " "contains a verification code. Enter the code in the field below and click OK " "to complete creating your %(app_name)s account." msgstr "" "Überprüfen Sie %(email)s auf eine E-Mail von »Ubuntu Single Sign On«. Diese " "Nachricht enthält einen Prüfcode. Geben Sie den Code in das Feld unten ein " "und bestätigen Sie mit OK, um die Erstellung Ihres Kontos für %(app_name)s " "abzuschließen." #: ../ubuntu_sso/utils/ui.py:192 msgid "Enter verification code" msgstr "Bestätigungscode eingeben" #: ../ubuntu_sso/utils/ui.py:195 #, python-format msgid "I agree with the %(app_name)s terms and conditions" msgstr "Ich akzeptiere die Nutzungsbedingungen von %(app_name)s" #: ../ubuntu_sso/utils/ui.py:196 #, python-format msgid "Yes! Email me %(app_name)s tips and updates." msgstr "" "Ja! Schicken Sie mir %(app_name)s betreffende Tipps und aktuelle " "Informationen per E-Mail zu." ubuntu-sso-client-13.10/po/en_AU.po0000664000202700020270000003500012151461656017314 0ustar dobeydobey00000000000000# English (Australia) translation for ubuntu-sso-client # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the ubuntu-sso-client package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: ubuntu-sso-client\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-09-11 18:25+0000\n" "PO-Revision-Date: 2012-03-22 13:04+0000\n" "Last-Translator: Joel Addison \n" "Language-Team: English (Australia) \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-09-17 18:24+0000\n" "X-Generator: Launchpad (build 15944)\n" #. Undefined variable '_', pylint: disable=E0602 #. all the text that is used in the gui #: ../ubuntu_sso/utils/ui.py:49 msgid "By signing up to {app_name} you agree to our {privacy_policy}" msgstr "By signing up to {app_name} you agree to our {privacy_policy}" #: ../ubuntu_sso/utils/ui.py:51 msgid "By signing up to {app_name} you agree to our {terms_and_conditions}" msgstr "By signing up to {app_name} you agree to our {terms_and_conditions}" #: ../ubuntu_sso/utils/ui.py:53 msgid " and {privacy_policy}" msgstr " and {privacy_policy}" #: ../ubuntu_sso/utils/ui.py:54 msgid "Cancel" msgstr "Cancel" #: ../ubuntu_sso/utils/ui.py:55 msgid "Type the characters above" msgstr "Type the characters above" #: ../ubuntu_sso/utils/ui.py:56 msgid "There was a problem getting the captcha, reloading..." msgstr "There was a problem getting the captcha, reloading..." #: ../ubuntu_sso/utils/ui.py:58 #, python-format msgid "If you can't read this then %(reload_link)s this page" msgstr "If you can't read this then %(reload_link)s this page" #: ../ubuntu_sso/utils/ui.py:60 msgid "refresh" msgstr "refresh" #: ../ubuntu_sso/utils/ui.py:61 msgid "Reload" msgstr "Reload" #: ../ubuntu_sso/utils/ui.py:62 msgid "The captcha is a required field" msgstr "The captcha is a required field" #: ../ubuntu_sso/utils/ui.py:63 msgid "Close window and set up later" msgstr "Close window and set up later" #: ../ubuntu_sso/utils/ui.py:64 msgid "Congratulations, {app_name} is installed!" msgstr "Congratulations, {app_name} is installed!" #: ../ubuntu_sso/utils/ui.py:65 #, python-format msgid "To connect this computer to %(app_name)s enter your details below." msgstr "To connect this computer to %(app_name)s enter your details below." #: ../ubuntu_sso/utils/ui.py:67 msgid "Register with {app_name}." msgstr "" #: ../ubuntu_sso/utils/ui.py:68 ../ubuntu_sso/utils/ui.py:93 #: ../ubuntu_sso/utils/ui.py:143 msgid "Email address" msgstr "Email address" #: ../ubuntu_sso/utils/ui.py:69 msgid "Re-type Email address" msgstr "Re-type Email address" #: ../ubuntu_sso/utils/ui.py:70 msgid "The email must be a valid email address." msgstr "The email must be a valid email address." #: ../ubuntu_sso/utils/ui.py:71 msgid "" "The email addresses don't match, please double check and try entering them " "again." msgstr "" "The email addresses don't match, please double check and try entering them " "again." #: ../ubuntu_sso/utils/ui.py:73 msgid "Email" msgstr "Email" #: ../ubuntu_sso/utils/ui.py:74 msgid "The email addresses do not match" msgstr "The email addresses do not match" #: ../ubuntu_sso/utils/ui.py:75 msgid "Enter code verification here" msgstr "Enter code verification here" #: ../ubuntu_sso/utils/ui.py:76 msgid "Please enter your name" msgstr "Please enter your name" #: ../ubuntu_sso/utils/ui.py:77 msgid "The process did not finish successfully." msgstr "The process did not finish successfully." #: ../ubuntu_sso/utils/ui.py:79 msgid "Sign me in with my existing account" msgstr "Sign me in with my existing account" #: ../ubuntu_sso/utils/ui.py:80 msgid "This field is required." msgstr "This field is required." #: ../ubuntu_sso/utils/ui.py:81 msgid "I've forgotten my password" msgstr "I've forgotten my password" #: ../ubuntu_sso/utils/ui.py:82 ../ubuntu_sso/utils/ui.py:130 msgid "Reset password" msgstr "Reset password" #: ../ubuntu_sso/utils/ui.py:83 msgid "" "To reset your {app_name} password, enter your registered email address " "below. We will send instructions to reset your password." msgstr "" "To reset your {app_name} password, enter your registered email address " "below. We will send instructions to reset your password." #: ../ubuntu_sso/utils/ui.py:86 msgid "Please enter a valid email address" msgstr "Please enter a valid email address" #: ../ubuntu_sso/utils/ui.py:87 msgid "There was a problem accessing the Ubuntu Single Sign On backend." msgstr "There was a problem accessing the Ubuntu Single Sign On backend." #: ../ubuntu_sso/utils/ui.py:89 #, python-format msgid "Create %(app_name)s account" msgstr "Create %(app_name)s account" #: ../ubuntu_sso/utils/ui.py:90 msgid "Loading..." msgstr "Loading..." #: ../ubuntu_sso/utils/ui.py:91 msgid "Getting information, please wait..." msgstr "Getting information, please wait..." #: ../ubuntu_sso/utils/ui.py:92 msgid "Already have an account? Click here to sign in" msgstr "Already have an account? Click here to sign in" #: ../ubuntu_sso/utils/ui.py:94 #, python-format msgid "Connect to %(app_name)s" msgstr "Connect to %(app_name)s" #: ../ubuntu_sso/utils/ui.py:95 ../ubuntu_sso/utils/ui.py:109 msgid "Password" msgstr "Password" #: ../ubuntu_sso/utils/ui.py:97 msgid "Sign In to {app_name}" msgstr "Sign In to {app_name}" #: ../ubuntu_sso/utils/ui.py:99 msgid "Name" msgstr "Name" #: ../ubuntu_sso/utils/ui.py:100 msgid "The name must not be empty." msgstr "The name must not be empty." #: ../ubuntu_sso/utils/ui.py:101 msgid "Next" msgstr "Next" #: ../ubuntu_sso/utils/ui.py:102 msgid "Network detection" msgstr "Network detection" #: ../ubuntu_sso/utils/ui.py:103 #, python-format msgid "" "Are you online? We can't detect an internet connection - you will need to be " "connected to set up %(app_name)s" msgstr "" "Are you online? We can't detect an internet connection - you will need to be " "connected to set up %(app_name)s" #: ../ubuntu_sso/utils/ui.py:105 msgid "One moment please..." msgstr "One moment please..." #: ../ubuntu_sso/utils/ui.py:106 msgid "Create a password" msgstr "Create a password" #: ../ubuntu_sso/utils/ui.py:107 msgid "Your password was successfully changed." msgstr "Your password was successfully changed." #: ../ubuntu_sso/utils/ui.py:108 msgid "At least one number" msgstr "At least one number" #: ../ubuntu_sso/utils/ui.py:110 msgid "Re-type Password" msgstr "Re-type Password" #: ../ubuntu_sso/utils/ui.py:111 msgid "" "The password must have a minimum of 8 characters and include one uppercase " "character and one number." msgstr "" "The password must have a minimum of 8 characters and include one uppercase " "character and one number." #: ../ubuntu_sso/utils/ui.py:113 msgid "At least 8 characters" msgstr "At least 8 characters" #: ../ubuntu_sso/utils/ui.py:114 msgid "Passwords don't match" msgstr "Passwords don't match" #: ../ubuntu_sso/utils/ui.py:115 msgid "" "The passwords don't match, please double check and try entering them again." msgstr "" "The passwords don't match, please double-check and try entering them again." #: ../ubuntu_sso/utils/ui.py:117 msgid "Your password must contain" msgstr "Your password must contain" #: ../ubuntu_sso/utils/ui.py:118 msgid "The password is too weak." msgstr "The password is too weak." #: ../ubuntu_sso/utils/ui.py:119 msgid "At least one uppercase letter" msgstr "At least one uppercase letter" #: ../ubuntu_sso/utils/ui.py:120 msgid "Privacy Policy" msgstr "Privacy Policy" #: ../ubuntu_sso/utils/ui.py:121 msgid "Connecting to:" msgstr "Connecting to:" #: ../ubuntu_sso/utils/ui.py:122 msgid "Proxy Settings" msgstr "Proxy Settings" #: ../ubuntu_sso/utils/ui.py:123 msgid "Incorrect login details. Please try again." msgstr "Incorrect login details. Please try again." #: ../ubuntu_sso/utils/ui.py:124 msgid "Please provide login details." msgstr "Please provide login details." #: ../ubuntu_sso/utils/ui.py:125 msgid "You are connecting through a proxy." msgstr "You are connecting through a proxy." #: ../ubuntu_sso/utils/ui.py:126 msgid "Get Help With Proxies" msgstr "Get Help With Proxies" #: ../ubuntu_sso/utils/ui.py:127 msgid "Proxy password:" msgstr "Proxy password:" #: ../ubuntu_sso/utils/ui.py:128 msgid "Save and Connect" msgstr "Save and Connect" #: ../ubuntu_sso/utils/ui.py:129 msgid "Proxy username:" msgstr "Proxy username:" #: ../ubuntu_sso/utils/ui.py:131 msgid "" "A password reset code has been sent to your e-mail. Please enter the code " "below along with your new password." msgstr "" "A password reset code has been sent to your email. Please enter the code " "below along with your new password." #: ../ubuntu_sso/utils/ui.py:133 msgid "Retype email" msgstr "Retype email" #: ../ubuntu_sso/utils/ui.py:134 msgid "Retype password" msgstr "Retype password" #: ../ubuntu_sso/utils/ui.py:135 #, python-format msgid "To reset your %(app_name)s password, enter your email address below:" msgstr "To reset your %(app_name)s password, enter your email address below:" #: ../ubuntu_sso/utils/ui.py:137 msgid "" "We are very Sorry! The service that signs you on is not responding right " "now\n" "Please try again or come back in a few minutes." msgstr "" "We are very Sorry! The service that signs you on is not responding right " "now\n" "Please try again or come back in a few minutes." #: ../ubuntu_sso/utils/ui.py:140 msgid "Sorry we did not recognize the email address." msgstr "Sorry we did not recognize the email address." #: ../ubuntu_sso/utils/ui.py:142 msgid "Reset code" msgstr "Reset code" #: ../ubuntu_sso/utils/ui.py:145 #, python-format msgid "" "A password reset code has been sent to %(email)s.\n" "Please enter the code below along with your new password." msgstr "" "A password reset code has been sent to %(email)s.\n" "Please enter the code below along with your new password." #: ../ubuntu_sso/utils/ui.py:147 msgid "Set Up Account" msgstr "Set Up Account" #: ../ubuntu_sso/utils/ui.py:148 msgid "I don't have an account yet - sign me up" msgstr "I don't have an account yet - sign me up" #: ../ubuntu_sso/utils/ui.py:149 msgid "Sign In" msgstr "Sign In" #: ../ubuntu_sso/utils/ui.py:150 msgid "Log-in with my existing account." msgstr "" #: ../ubuntu_sso/utils/ui.py:151 msgid "the appname whose ssl error we are going to show." msgstr "the appname whose ssl error we are going to show." #: ../ubuntu_sso/utils/ui.py:152 msgid "Certificate details" msgstr "Certificate details" #: ../ubuntu_sso/utils/ui.py:153 msgid "Connect" msgstr "Connect" #: ../ubuntu_sso/utils/ui.py:154 msgid "the details ssl certificate we are going to show." msgstr "the details ssl certificate we are going to show." #: ../ubuntu_sso/utils/ui.py:161 msgid "Open the SSL certificate UI." msgstr "Open the SSL certificate UI." #: ../ubuntu_sso/utils/ui.py:162 msgid "SSL Certificate Not Valid" msgstr "SSL Certificate Not Valid" #: ../ubuntu_sso/utils/ui.py:163 msgid "the domain whose ssl certificate we are going to show." msgstr "the domain whose ssl certificate we are going to show." #: ../ubuntu_sso/utils/ui.py:164 #, python-format msgid "" "You are trying to connect to a proxy server on %(domain)s. This server uses " "a secure connection, and the SSL certificate is not valid because:" msgstr "" "You are trying to connect to a proxy server on %(domain)s. This server uses " "a secure connection, and the SSL certificate is not valid because:" #: ../ubuntu_sso/utils/ui.py:167 msgid "The certificate has not been verified" msgstr "The certificate has not been verified" #: ../ubuntu_sso/utils/ui.py:168 msgid "Do you want to connect to this server?" msgstr "Do you want to connect to this server?" #: ../ubuntu_sso/utils/ui.py:169 msgid "Get Help With SSL" msgstr "Get Help With SSL" #: ../ubuntu_sso/utils/ui.py:170 #, python-format msgid "" "If you are not sure about this server, do not use it to connect to " "%(app_name)s." msgstr "" "If you are not sure about this server, do not use it to connect to " "%(app_name)s." #: ../ubuntu_sso/utils/ui.py:172 msgid "Remember my settings for this certificate." msgstr "Remember my settings for this certificate." #: ../ubuntu_sso/utils/ui.py:173 msgid "" "The name on the certificate isn't valid or doesn't match the name of the site" msgstr "" "The name on the certificate isn't valid or doesn't match the name of the site" #: ../ubuntu_sso/utils/ui.py:175 msgid "The certificate has expired" msgstr "The certificate has expired" #: ../ubuntu_sso/utils/ui.py:176 #, python-format msgid "You are now logged into %(app_name)s." msgstr "You are now logged into %(app_name)s." #: ../ubuntu_sso/utils/ui.py:177 msgid "Surname" msgstr "Surname" #: ../ubuntu_sso/utils/ui.py:178 msgid "Terms of Service" msgstr "Terms of Service" #: ../ubuntu_sso/utils/ui.py:179 msgid "Sign Up to {app_name}" msgstr "Sign Up to {app_name}" #: ../ubuntu_sso/utils/ui.py:180 msgid "Show Terms & Conditions" msgstr "Show Terms & Conditions" #: ../ubuntu_sso/utils/ui.py:181 #, python-format msgid "" "Agreeing to the %(app_name)s Terms & Conditions is required to subscribe." msgstr "" "Agreeing to the %(app_name)s Terms & Conditions is required to subscribe." #: ../ubuntu_sso/utils/ui.py:183 #, python-format msgid "You can also find these terms at %(url)s" msgstr "You can also find these terms at %(url)s" #: ../ubuntu_sso/utils/ui.py:184 msgid "Try again" msgstr "Try again" #: ../ubuntu_sso/utils/ui.py:185 msgid "" "There was an error when trying to complete the process. Please check the " "information and try again." msgstr "" "There was an error when trying to complete the process. Please check the " "information and try again." #: ../ubuntu_sso/utils/ui.py:187 msgid "Verification code" msgstr "Verification code" #: ../ubuntu_sso/utils/ui.py:188 #, python-format msgid "" "Check %(email)s for an email from Ubuntu Single Sign On. This message " "contains a verification code. Enter the code in the field below and click OK " "to complete creating your %(app_name)s account." msgstr "" "Check %(email)s for an email from Ubuntu Single Sign On. This message " "contains a verification code. Enter the code in the field below and click OK " "to complete creating your %(app_name)s account." #: ../ubuntu_sso/utils/ui.py:192 msgid "Enter verification code" msgstr "Enter verification code" #: ../ubuntu_sso/utils/ui.py:195 #, python-format msgid "I agree with the %(app_name)s terms and conditions" msgstr "I agree with the %(app_name)s terms and conditions" #: ../ubuntu_sso/utils/ui.py:196 #, python-format msgid "Yes! Email me %(app_name)s tips and updates." msgstr "Yes! Email me %(app_name)s tips and updates." ubuntu-sso-client-13.10/po/zh_HK.po0000664000202700020270000003456012151461656017342 0ustar dobeydobey00000000000000# Chinese (Hong Kong) translation for ubuntu-sso-client # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the ubuntu-sso-client package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: ubuntu-sso-client\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-09-11 18:25+0000\n" "PO-Revision-Date: 2012-04-19 16:06+0000\n" "Last-Translator: Roy Chan \n" "Language-Team: Chinese (Hong Kong) \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-09-17 18:24+0000\n" "X-Generator: Launchpad (build 15944)\n" #. Undefined variable '_', pylint: disable=E0602 #. all the text that is used in the gui #: ../ubuntu_sso/utils/ui.py:49 msgid "By signing up to {app_name} you agree to our {privacy_policy}" msgstr "登入 {app_name} å°‡è¦–ç‚ºæ‚¨åŒæ„我們的 {privacy_policy}" #: ../ubuntu_sso/utils/ui.py:51 msgid "By signing up to {app_name} you agree to our {terms_and_conditions}" msgstr "登入 {app_name} å°‡è¦–ç‚ºæ‚¨åŒæ„我們的 {terms_and_conditions}" #: ../ubuntu_sso/utils/ui.py:53 msgid " and {privacy_policy}" msgstr " 與 {privacy_policy}" #: ../ubuntu_sso/utils/ui.py:54 msgid "Cancel" msgstr "å–æ¶ˆ" #: ../ubuntu_sso/utils/ui.py:55 msgid "Type the characters above" msgstr "請輸入上方的字元" #: ../ubuntu_sso/utils/ui.py:56 msgid "There was a problem getting the captcha, reloading..." msgstr "å–å¾— captcha æ™‚ç™¼ç”ŸéŒ¯èª¤ï¼Œæ­£åœ¨é‡æ–°è¼‰å…¥..." #: ../ubuntu_sso/utils/ui.py:58 #, python-format msgid "If you can't read this then %(reload_link)s this page" msgstr "如果您無法閱讀,就%(reload_link)s這份é é¢" #: ../ubuntu_sso/utils/ui.py:60 msgid "refresh" msgstr "釿–°æ•´ç†" #: ../ubuntu_sso/utils/ui.py:61 msgid "Reload" msgstr "釿–°è¼‰å…¥" #: ../ubuntu_sso/utils/ui.py:62 msgid "The captcha is a required field" msgstr "Captcha 是必填欄ä½" #: ../ubuntu_sso/utils/ui.py:63 msgid "Close window and set up later" msgstr "關閉視窗並ç¨å¾Œè¨­ç½®" #: ../ubuntu_sso/utils/ui.py:64 msgid "Congratulations, {app_name} is installed!" msgstr "已經安è£å¥½ {app_name} 了,æ­å–œï¼" #: ../ubuntu_sso/utils/ui.py:65 #, python-format msgid "To connect this computer to %(app_name)s enter your details below." msgstr "è‹¥è¦é€£æŽ¥æ­¤é›»è…¦è‡³ %(app_name)s,請於下方填入您的詳細資料。" #: ../ubuntu_sso/utils/ui.py:67 msgid "Register with {app_name}." msgstr "" #: ../ubuntu_sso/utils/ui.py:68 ../ubuntu_sso/utils/ui.py:93 #: ../ubuntu_sso/utils/ui.py:143 msgid "Email address" msgstr "é›»å­éƒµä»¶åœ°å€" #: ../ubuntu_sso/utils/ui.py:69 msgid "Re-type Email address" msgstr "冿¬¡è¼¸å…¥é›»å­éƒµä»¶ä½å€" #: ../ubuntu_sso/utils/ui.py:70 msgid "The email must be a valid email address." msgstr "é›»å­éƒµä»¶ä½å€æ ¼å¼å¿…須有效。" #: ../ubuntu_sso/utils/ui.py:71 msgid "" "The email addresses don't match, please double check and try entering them " "again." msgstr "é›»å­éƒµä»¶ä½å€ä¸ç›¸ç¬¦ï¼Œè«‹å†æ¬¡ç¢ºèªä¸¦è©¦è‘—釿–°è¼¸å…¥ã€‚" #: ../ubuntu_sso/utils/ui.py:73 msgid "Email" msgstr "é›»å­éƒµä»¶" #: ../ubuntu_sso/utils/ui.py:74 msgid "The email addresses do not match" msgstr "é›»å­éƒµä»¶åœ°å€ä¸ç¬¦" #: ../ubuntu_sso/utils/ui.py:75 msgid "Enter code verification here" msgstr "請在此輸入驗證碼" #: ../ubuntu_sso/utils/ui.py:76 msgid "Please enter your name" msgstr "請輸入您的å稱" #: ../ubuntu_sso/utils/ui.py:77 msgid "The process did not finish successfully." msgstr "ç¨‹åºæœªæˆåŠŸçµæŸã€‚" #: ../ubuntu_sso/utils/ui.py:79 msgid "Sign me in with my existing account" msgstr "用我既有的帳戶登入" #: ../ubuntu_sso/utils/ui.py:80 msgid "This field is required." msgstr "此欄ä½ç‚ºå¿…填。" #: ../ubuntu_sso/utils/ui.py:81 msgid "I've forgotten my password" msgstr "我忘記密碼" #: ../ubuntu_sso/utils/ui.py:82 ../ubuntu_sso/utils/ui.py:130 msgid "Reset password" msgstr "é‡è¨­å¯†ç¢¼" #: ../ubuntu_sso/utils/ui.py:83 msgid "" "To reset your {app_name} password, enter your registered email address " "below. We will send instructions to reset your password." msgstr "è‹¥è¦é‡è¨­æ‚¨çš„ {app_name} 密碼,請在下é¢è¼¸å…¥æ‚¨è¨»å†Šçš„é›»å­éƒµä»¶åœ°å€ã€‚我們將會寄é€ä¸€ä»½æŒ‡ç¤ºä»¥é‡è¨­æ‚¨çš„密碼。" #: ../ubuntu_sso/utils/ui.py:86 msgid "Please enter a valid email address" msgstr "請輸入有效的電å­éƒµä»¶åœ°å€" #: ../ubuntu_sso/utils/ui.py:87 msgid "There was a problem accessing the Ubuntu Single Sign On backend." msgstr "å­˜å– Ubuntu Single Sign On (單一帳號簽入) 後端時發生å•題。" #: ../ubuntu_sso/utils/ui.py:89 #, python-format msgid "Create %(app_name)s account" msgstr "建立 %(app_name)s 帳號" #: ../ubuntu_sso/utils/ui.py:90 msgid "Loading..." msgstr "載入中..." #: ../ubuntu_sso/utils/ui.py:91 msgid "Getting information, please wait..." msgstr "正在å–得資訊,請ç¨å€™..." #: ../ubuntu_sso/utils/ui.py:92 msgid "Already have an account? Click here to sign in" msgstr "已經有帳號了嗎?請點擊此處以登入" #: ../ubuntu_sso/utils/ui.py:94 #, python-format msgid "Connect to %(app_name)s" msgstr "連接至 %(app_name)s" #: ../ubuntu_sso/utils/ui.py:95 ../ubuntu_sso/utils/ui.py:109 msgid "Password" msgstr "密碼" #: ../ubuntu_sso/utils/ui.py:97 msgid "Sign In to {app_name}" msgstr "登入 {app_name}" #: ../ubuntu_sso/utils/ui.py:99 msgid "Name" msgstr "åå­—" #: ../ubuntu_sso/utils/ui.py:100 msgid "The name must not be empty." msgstr "å稱ä¸å¾—為空白。" #: ../ubuntu_sso/utils/ui.py:101 msgid "Next" msgstr "下一幅" #: ../ubuntu_sso/utils/ui.py:102 msgid "Network detection" msgstr "ç¶²çµ¡åµæ¸¬" #: ../ubuntu_sso/utils/ui.py:103 #, python-format msgid "" "Are you online? We can't detect an internet connection - you will need to be " "connected to set up %(app_name)s" msgstr "æ‚¨åœ¨ç·šä¸Šå—Žï¼Ÿæˆ‘å€‘æ²’æœ‰åµæ¸¬åˆ°ä»»ä½•網絡連線 —— 您需è¦é€£ä¸Šç¶²æ‰èƒ½è¨­ç½® %(app_name)s" #: ../ubuntu_sso/utils/ui.py:105 msgid "One moment please..." msgstr "è«‹ç¨å€™..." #: ../ubuntu_sso/utils/ui.py:106 msgid "Create a password" msgstr "建立密碼" #: ../ubuntu_sso/utils/ui.py:107 msgid "Your password was successfully changed." msgstr "您的密碼已變更æˆåŠŸã€‚" #: ../ubuntu_sso/utils/ui.py:108 msgid "At least one number" msgstr "至少有一個數字" #: ../ubuntu_sso/utils/ui.py:110 msgid "Re-type Password" msgstr "冿¬¡è¼¸å…¥å¯†ç¢¼" #: ../ubuntu_sso/utils/ui.py:111 msgid "" "The password must have a minimum of 8 characters and include one uppercase " "character and one number." msgstr "密碼長度必須至少 8 å€‹å­—å…ƒï¼Œä¸¦ä¸”è‡³å°‘å«æœ‰ä¸€å€‹å¤§å¯«å­—元與一個數字。" #: ../ubuntu_sso/utils/ui.py:113 msgid "At least 8 characters" msgstr "至少 8 個字元" #: ../ubuntu_sso/utils/ui.py:114 msgid "Passwords don't match" msgstr "密碼ä¸ç›¸ç¬¦" #: ../ubuntu_sso/utils/ui.py:115 msgid "" "The passwords don't match, please double check and try entering them again." msgstr "密碼ä¸ç›¸ç¬¦ï¼Œè«‹å†æ¬¡ç¢ºèªä¸¦è©¦è‘—釿–°è¼¸å…¥ã€‚" #: ../ubuntu_sso/utils/ui.py:117 msgid "Your password must contain" msgstr "您的密碼必須包å«" #: ../ubuntu_sso/utils/ui.py:118 msgid "The password is too weak." msgstr "å¯†ç¢¼éŽæ–¼è–„弱。" #: ../ubuntu_sso/utils/ui.py:119 msgid "At least one uppercase letter" msgstr "至少有一個大寫字æ¯" #: ../ubuntu_sso/utils/ui.py:120 msgid "Privacy Policy" msgstr "ç§é𱿔¿ç­–" #: ../ubuntu_sso/utils/ui.py:121 msgid "Connecting to:" msgstr "正連接到:" #: ../ubuntu_sso/utils/ui.py:122 msgid "Proxy Settings" msgstr "代ç†ä¼ºæœå™¨è¨­å®šå€¼" #: ../ubuntu_sso/utils/ui.py:123 msgid "Incorrect login details. Please try again." msgstr "ç™»å…¥ç”¨è©³ç´°è³‡æ–™ä¸æ­£ç¢ºã€‚è«‹å†è©¦ä¸€æ¬¡ã€‚" #: ../ubuntu_sso/utils/ui.py:124 msgid "Please provide login details." msgstr "è«‹æä¾›ç™»å…¥ç”¨è©³ç´°è³‡æ–™ã€‚" #: ../ubuntu_sso/utils/ui.py:125 msgid "You are connecting through a proxy." msgstr "您正é€éŽä»£ç†ä¼ºæœå™¨é€£æŽ¥ã€‚" #: ../ubuntu_sso/utils/ui.py:126 msgid "Get Help With Proxies" msgstr "å–得代ç†ä¼ºæœå™¨çš„相關幫助" #: ../ubuntu_sso/utils/ui.py:127 msgid "Proxy password:" msgstr "代ç†ä¼ºæœå™¨å¯†ç¢¼ï¼š" #: ../ubuntu_sso/utils/ui.py:128 msgid "Save and Connect" msgstr "儲存並連接" #: ../ubuntu_sso/utils/ui.py:129 msgid "Proxy username:" msgstr "代ç†ä¼ºæœå™¨ä½¿ç”¨è€…å稱" #: ../ubuntu_sso/utils/ui.py:131 msgid "" "A password reset code has been sent to your e-mail. Please enter the code " "below along with your new password." msgstr "密碼é‡è¨­ä»£ç¢¼å·²å¯„é€åˆ°æ‚¨çš„é›»å­ä¿¡ç®±ã€‚è«‹åœ¨ä¸‹æ–¹è¼¸å…¥ä»£ç¢¼ï¼Œä»¥åŠæ‚¨çš„æ–°å¯†ç¢¼ã€‚" #: ../ubuntu_sso/utils/ui.py:133 msgid "Retype email" msgstr "冿¬¡è¼¸å…¥æ‚¨çš„é›»å­éƒµä»¶" #: ../ubuntu_sso/utils/ui.py:134 msgid "Retype password" msgstr "冿¬¡è¼¸å…¥å¯†ç¢¼" #: ../ubuntu_sso/utils/ui.py:135 #, python-format msgid "To reset your %(app_name)s password, enter your email address below:" msgstr "è‹¥è¦é‡è¨­æ‚¨çš„ %(app_name)s 密碼,請於下方輸入您的電å­éƒµä»¶ä½å€ï¼š" #: ../ubuntu_sso/utils/ui.py:137 msgid "" "We are very Sorry! The service that signs you on is not responding right " "now\n" "Please try again or come back in a few minutes." msgstr "" "我們éžå¸¸æŠ±æ­‰ï¼ç™»å…¥çš„æœå‹™ç›®å‰æ²’有回應\n" "è«‹é‡æ–°è©¦ä¸€é,或是等個幾分é˜å¾Œå†å›žä¾†ã€‚" #: ../ubuntu_sso/utils/ui.py:140 msgid "Sorry we did not recognize the email address." msgstr "很抱歉,我們ä¸èªè­˜é€™å€‹é›»å­éƒµä»¶åœ°å€ã€‚" #: ../ubuntu_sso/utils/ui.py:142 msgid "Reset code" msgstr "é‡è¨­ä»£ç¢¼" #: ../ubuntu_sso/utils/ui.py:145 #, python-format msgid "" "A password reset code has been sent to %(email)s.\n" "Please enter the code below along with your new password." msgstr "" "密碼é‡è¨­ä»£ç¢¼å·²ç¶“寄é€è‡³ %(email)s。\n" "請於下方輸入該代碼與您的新密碼。" #: ../ubuntu_sso/utils/ui.py:147 msgid "Set Up Account" msgstr "設置帳號" #: ../ubuntu_sso/utils/ui.py:148 msgid "I don't have an account yet - sign me up" msgstr "我還沒有帳號 - 我è¦è¨»å†Š" #: ../ubuntu_sso/utils/ui.py:149 msgid "Sign In" msgstr "登入" #: ../ubuntu_sso/utils/ui.py:150 msgid "Log-in with my existing account." msgstr "" #: ../ubuntu_sso/utils/ui.py:151 msgid "the appname whose ssl error we are going to show." msgstr "應用程å¼å稱 (我們將顯示它的 SSL 錯誤)。" #: ../ubuntu_sso/utils/ui.py:152 msgid "Certificate details" msgstr "憑證詳細資訊" #: ../ubuntu_sso/utils/ui.py:153 msgid "Connect" msgstr "連接" #: ../ubuntu_sso/utils/ui.py:154 msgid "the details ssl certificate we are going to show." msgstr "詳細資料 (我們將顯示它的 SSL 憑證)。" #: ../ubuntu_sso/utils/ui.py:161 msgid "Open the SSL certificate UI." msgstr "開啟 SSL 憑證使用介é¢ã€‚" #: ../ubuntu_sso/utils/ui.py:162 msgid "SSL Certificate Not Valid" msgstr "SSL 憑證無效" #: ../ubuntu_sso/utils/ui.py:163 msgid "the domain whose ssl certificate we are going to show." msgstr "網域 (我們將顯示它的 SSL 憑證)。" #: ../ubuntu_sso/utils/ui.py:164 #, python-format msgid "" "You are trying to connect to a proxy server on %(domain)s. This server uses " "a secure connection, and the SSL certificate is not valid because:" msgstr "您正在嘗試連接在 %(domain)s 的代ç†ä¼ºæœå™¨ã€‚這個伺æœå™¨ä½¿ç”¨äº†å®‰å…¨æ€§é€£ç·šï¼Œè€Œ SSL 憑證無效的原因是:" #: ../ubuntu_sso/utils/ui.py:167 msgid "The certificate has not been verified" msgstr "憑證尚未驗證" #: ../ubuntu_sso/utils/ui.py:168 msgid "Do you want to connect to this server?" msgstr "您想è¦é€£æŽ¥åˆ°é€™å°ä¼ºæœå™¨å—Žï¼Ÿ" #: ../ubuntu_sso/utils/ui.py:169 msgid "Get Help With SSL" msgstr "å–å¾— SSL 的相關幫助" #: ../ubuntu_sso/utils/ui.py:170 #, python-format msgid "" "If you are not sure about this server, do not use it to connect to " "%(app_name)s." msgstr "如果您並ä¸ç¢ºå®šé€™å€‹ä¼ºæœå™¨ï¼Œä¸è¦ç”¨å®ƒä¾†å’Œ %(app_name)s 連接。" #: ../ubuntu_sso/utils/ui.py:172 msgid "Remember my settings for this certificate." msgstr "記得我å°é€™å€‹æ†‘證的設定值。" #: ../ubuntu_sso/utils/ui.py:173 msgid "" "The name on the certificate isn't valid or doesn't match the name of the site" msgstr "憑證上的å稱無效,或和網站的å稱ä¸ç¬¦" #: ../ubuntu_sso/utils/ui.py:175 msgid "The certificate has expired" msgstr "æ†‘è­‰å·²éŽæœŸ" #: ../ubuntu_sso/utils/ui.py:176 #, python-format msgid "You are now logged into %(app_name)s." msgstr "您ç¾åœ¨å·²ç¶“登入 %(app_name)s。" #: ../ubuntu_sso/utils/ui.py:177 msgid "Surname" msgstr "å§“æ°" #: ../ubuntu_sso/utils/ui.py:178 msgid "Terms of Service" msgstr "æœå‹™æ¢æ¬¾" #: ../ubuntu_sso/utils/ui.py:179 msgid "Sign Up to {app_name}" msgstr "註冊 {app_name}" #: ../ubuntu_sso/utils/ui.py:180 msgid "Show Terms & Conditions" msgstr "é¡¯ç¤ºæ¢æ¬¾èˆ‡ç´°å‰‡" #: ../ubuntu_sso/utils/ui.py:181 #, python-format msgid "" "Agreeing to the %(app_name)s Terms & Conditions is required to subscribe." msgstr "è‹¥è¦è¨‚閱,您需è¦åŒæ„ %(app_name)s çš„æ¢æ¬¾èˆ‡ç´°å‰‡ã€‚" #: ../ubuntu_sso/utils/ui.py:183 #, python-format msgid "You can also find these terms at %(url)s" msgstr "您也å¯ä»¥åœ¨ %(url)s æ‰¾åˆ°é€™äº›æ¢æ¬¾" #: ../ubuntu_sso/utils/ui.py:184 msgid "Try again" msgstr "å†è©¦ä¸€æ¬¡" #: ../ubuntu_sso/utils/ui.py:185 msgid "" "There was an error when trying to complete the process. Please check the " "information and try again." msgstr "當嘗試完æˆç¨‹åºæ™‚發生錯誤。請檢查資訊並é‡è©¦ã€‚" #: ../ubuntu_sso/utils/ui.py:187 msgid "Verification code" msgstr "驗證碼" #: ../ubuntu_sso/utils/ui.py:188 #, python-format msgid "" "Check %(email)s for an email from Ubuntu Single Sign On. This message " "contains a verification code. Enter the code in the field below and click OK " "to complete creating your %(app_name)s account." msgstr "" "請檢查 %(email)s å…§æ˜¯å¦æœ‰ä¾†è‡ª Ubuntu Single Sign On " "的電å­éƒµä»¶ã€‚é€™ä»½è¨Šæ¯æœƒåŒ…å«ä¸€å€‹é©—證碼。在下é¢çš„æ¬„ä½è¼¸å…¥é©—證碼後,就點擊 OK,以完æˆå»ºç«‹æ‚¨çš„ %(app_name)s 帳號。" #: ../ubuntu_sso/utils/ui.py:192 msgid "Enter verification code" msgstr "請輸入驗證碼" #: ../ubuntu_sso/utils/ui.py:195 #, python-format msgid "I agree with the %(app_name)s terms and conditions" msgstr "æˆ‘åŒæ„ %(app_name)s æ¢æ¬¾èˆ‡ç´°å‰‡" #: ../ubuntu_sso/utils/ui.py:196 #, python-format msgid "Yes! Email me %(app_name)s tips and updates." msgstr "是ï¼è«‹å¯„給我有關 %(app_name)s 的相關秘訣與更新消æ¯ã€‚" ubuntu-sso-client-13.10/po/ru.po0000664000202700020270000004422512151461656016764 0ustar dobeydobey00000000000000# Russian translation for ubuntu-sso-client # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the ubuntu-sso-client package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: ubuntu-sso-client\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-09-11 18:25+0000\n" "PO-Revision-Date: 2012-09-14 15:57+0000\n" "Last-Translator: Eugene Marshal \n" "Language-Team: Russian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-09-17 18:24+0000\n" "X-Generator: Launchpad (build 15944)\n" #. Undefined variable '_', pylint: disable=E0602 #. all the text that is used in the gui #: ../ubuntu_sso/utils/ui.py:49 msgid "By signing up to {app_name} you agree to our {privacy_policy}" msgstr "ВыполнÑÑ Ð²Ñ…Ð¾Ð´ в {app_name}, вы ÑоглашаетеÑÑŒ Ñ Ð½Ð°ÑˆÐµÐ¹ {privacy_policy}" #: ../ubuntu_sso/utils/ui.py:51 msgid "By signing up to {app_name} you agree to our {terms_and_conditions}" msgstr "" "ВыполнÑÑ Ð²Ñ…Ð¾Ð´ в {app_name}, вы ÑоглашаетеÑÑŒ Ñ Ð½Ð°ÑˆÐ¸Ð¼Ð¸ {terms_and_conditions}" #: ../ubuntu_sso/utils/ui.py:53 msgid " and {privacy_policy}" msgstr " и {privacy_policy}" #: ../ubuntu_sso/utils/ui.py:54 msgid "Cancel" msgstr "Отмена" #: ../ubuntu_sso/utils/ui.py:55 msgid "Type the characters above" msgstr "Введите Ñимволы на картинке" #: ../ubuntu_sso/utils/ui.py:56 msgid "There was a problem getting the captcha, reloading..." msgstr "Были проблемы Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸ÐµÐ¼ капчи, перезагрузка..." #: ../ubuntu_sso/utils/ui.py:58 #, python-format msgid "If you can't read this then %(reload_link)s this page" msgstr "ЕÑли вы не можете прочитать Ñто, тогда %(reload_link)s Ñту Ñтраницу" #: ../ubuntu_sso/utils/ui.py:60 msgid "refresh" msgstr "обновить" #: ../ubuntu_sso/utils/ui.py:61 msgid "Reload" msgstr "Перезагрузить" #: ../ubuntu_sso/utils/ui.py:62 msgid "The captcha is a required field" msgstr "Ðеобходимо заполнить капчу" #: ../ubuntu_sso/utils/ui.py:63 msgid "Close window and set up later" msgstr "Закрыть окно и наÑтроить позже" #: ../ubuntu_sso/utils/ui.py:64 msgid "Congratulations, {app_name} is installed!" msgstr "ПоздравлÑем, уÑтановка {app_name} выполнена!" #: ../ubuntu_sso/utils/ui.py:65 #, python-format msgid "To connect this computer to %(app_name)s enter your details below." msgstr "Ð”Ð»Ñ ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ компьютера Ñ %(app_name)s введите ваши данные" #: ../ubuntu_sso/utils/ui.py:67 msgid "Register with {app_name}." msgstr "ЗарегиÑтрировать Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ {app_name}." #: ../ubuntu_sso/utils/ui.py:68 ../ubuntu_sso/utils/ui.py:93 #: ../ubuntu_sso/utils/ui.py:143 msgid "Email address" msgstr "ÐÐ´Ñ€ÐµÑ Ñлектронной почты" #: ../ubuntu_sso/utils/ui.py:69 msgid "Re-type Email address" msgstr "Повторите ввод адреÑа Ñлектронной почты" #: ../ubuntu_sso/utils/ui.py:70 msgid "The email must be a valid email address." msgstr "Ðеверный Ð°Ð´Ñ€ÐµÑ Ñлектронной почты" #: ../ubuntu_sso/utils/ui.py:71 msgid "" "The email addresses don't match, please double check and try entering them " "again." msgstr "" "ÐдреÑа Ñлектронной почты не Ñовпадают, проверьте и введите их заново." #: ../ubuntu_sso/utils/ui.py:73 msgid "Email" msgstr "Эл. почта" #: ../ubuntu_sso/utils/ui.py:74 msgid "The email addresses do not match" msgstr "ÐдреÑа Ñл. почты не Ñовпадают" #: ../ubuntu_sso/utils/ui.py:75 msgid "Enter code verification here" msgstr "Введите код подтверждениÑ" #: ../ubuntu_sso/utils/ui.py:76 msgid "Please enter your name" msgstr "ПожалуйÑта, введите ваше имÑ" #: ../ubuntu_sso/utils/ui.py:77 msgid "The process did not finish successfully." msgstr "ПроцеÑÑ Ð½Ðµ завершен уÑпешно." #: ../ubuntu_sso/utils/ui.py:79 msgid "Sign me in with my existing account" msgstr "Войти, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ ÑущеÑтвующую учётную запиÑÑŒ" #: ../ubuntu_sso/utils/ui.py:80 msgid "This field is required." msgstr "ОбÑзательное поле." #: ../ubuntu_sso/utils/ui.py:81 msgid "I've forgotten my password" msgstr "Я забыл пароль" #: ../ubuntu_sso/utils/ui.py:82 ../ubuntu_sso/utils/ui.py:130 msgid "Reset password" msgstr "СброÑить пароль" #: ../ubuntu_sso/utils/ui.py:83 msgid "" "To reset your {app_name} password, enter your registered email address " "below. We will send instructions to reset your password." msgstr "" "Ð”Ð»Ñ ÑброÑа Ð¿Ð°Ñ€Ð¾Ð»Ñ {app_name}, введите ваш зарегиÑтрированный Ð°Ð´Ñ€ÐµÑ Ñл.почты " "ниже. Вам будет отправлена инÑÑ‚Ñ€ÑƒÐºÑ†Ð¸Ñ Ð¿Ð¾ ÑброÑу паролÑ." #: ../ubuntu_sso/utils/ui.py:86 msgid "Please enter a valid email address" msgstr "Введите правильный Ð°Ð´Ñ€ÐµÑ Ñлектронной почты" #: ../ubuntu_sso/utils/ui.py:87 msgid "There was a problem accessing the Ubuntu Single Sign On backend." msgstr "" "Возникла неполадка при доÑтупе к внутреннему интерфейÑу Ñлужбы единого входа " "Ubuntu Single Sign On." #: ../ubuntu_sso/utils/ui.py:89 #, python-format msgid "Create %(app_name)s account" msgstr "Создать учётную запиÑÑŒ %(app_name)s" #: ../ubuntu_sso/utils/ui.py:90 msgid "Loading..." msgstr "Загрузка..." #: ../ubuntu_sso/utils/ui.py:91 msgid "Getting information, please wait..." msgstr "Получение Ñведений, пожалуйÑта, подождите" #: ../ubuntu_sso/utils/ui.py:92 msgid "Already have an account? Click here to sign in" msgstr "Уже зарегиÑтрированы? Ðажмите здеÑÑŒ чтобы войти" #: ../ubuntu_sso/utils/ui.py:94 #, python-format msgid "Connect to %(app_name)s" msgstr "Соединение Ñ %(app_name)s" #: ../ubuntu_sso/utils/ui.py:95 ../ubuntu_sso/utils/ui.py:109 msgid "Password" msgstr "Пароль" #: ../ubuntu_sso/utils/ui.py:97 msgid "Sign In to {app_name}" msgstr "Войти в {app_name}" #: ../ubuntu_sso/utils/ui.py:99 msgid "Name" msgstr "ИмÑ" #: ../ubuntu_sso/utils/ui.py:100 msgid "The name must not be empty." msgstr "Поле \"ИмÑ\" должно быть заполнено." #: ../ubuntu_sso/utils/ui.py:101 msgid "Next" msgstr "Далее" #: ../ubuntu_sso/utils/ui.py:102 msgid "Network detection" msgstr "Определение Ñети" #: ../ubuntu_sso/utils/ui.py:103 #, python-format msgid "" "Are you online? We can't detect an internet connection - you will need to be " "connected to set up %(app_name)s" msgstr "" "Подключены ли вы к интернету? Мы не может определить Ñетевое подключение, " "необходимое Ð´Ð»Ñ Ð½Ð°Ñтройки %(app_name)s" #: ../ubuntu_sso/utils/ui.py:105 msgid "One moment please..." msgstr "Подождите, пожалуйÑта..." #: ../ubuntu_sso/utils/ui.py:106 msgid "Create a password" msgstr "Создать пароль" #: ../ubuntu_sso/utils/ui.py:107 msgid "Your password was successfully changed." msgstr "Пароль уÑпешно изменён" #: ../ubuntu_sso/utils/ui.py:108 msgid "At least one number" msgstr "Минимум одно чиÑло" #: ../ubuntu_sso/utils/ui.py:110 msgid "Re-type Password" msgstr "Введите пароль Ñнова" #: ../ubuntu_sso/utils/ui.py:111 msgid "" "The password must have a minimum of 8 characters and include one uppercase " "character and one number." msgstr "" "Пароль должен Ñодержать как минимум 8 знаков и включать Ñ…Ð¾Ñ‚Ñ Ð±Ñ‹ одну " "заглавную букву и одну цифру." #: ../ubuntu_sso/utils/ui.py:113 msgid "At least 8 characters" msgstr "Минимум 8 Ñимволов" #: ../ubuntu_sso/utils/ui.py:114 msgid "Passwords don't match" msgstr "Пароли не Ñовпадают" #: ../ubuntu_sso/utils/ui.py:115 msgid "" "The passwords don't match, please double check and try entering them again." msgstr "Ðеверный пароль, пожалуйÑта, проверьте и введите заново" #: ../ubuntu_sso/utils/ui.py:117 msgid "Your password must contain" msgstr "Ваш пароль должен Ñодержать" #: ../ubuntu_sso/utils/ui.py:118 msgid "The password is too weak." msgstr "Слишком Ñлабый пароль." #: ../ubuntu_sso/utils/ui.py:119 msgid "At least one uppercase letter" msgstr "Ð¥Ð¾Ñ‚Ñ Ð±Ñ‹ одну заглавную букву" #: ../ubuntu_sso/utils/ui.py:120 msgid "Privacy Policy" msgstr "Политика ПриватноÑти" #: ../ubuntu_sso/utils/ui.py:121 msgid "Connecting to:" msgstr "Подключение к:" #: ../ubuntu_sso/utils/ui.py:122 msgid "Proxy Settings" msgstr "ÐаÑтройки прокÑи-Ñервера" #: ../ubuntu_sso/utils/ui.py:123 msgid "Incorrect login details. Please try again." msgstr "Ðеправильные данные входа. ПожалуйÑта, повторите Ñнова." #: ../ubuntu_sso/utils/ui.py:124 msgid "Please provide login details." msgstr "ПожалуйÑта, предоÑтавьте реквизиты Ð´Ð»Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð²Ñ…Ð¾Ð´Ð°." #: ../ubuntu_sso/utils/ui.py:125 msgid "You are connecting through a proxy." msgstr "Ð’Ñ‹ подключены Ñ Ð¸Ñпользование прокÑи-Ñервера." #: ../ubuntu_sso/utils/ui.py:126 msgid "Get Help With Proxies" msgstr "Справка отноÑительно прокÑи-Ñерверов" #: ../ubuntu_sso/utils/ui.py:127 msgid "Proxy password:" msgstr "Пароль прокÑи-Ñервера:" #: ../ubuntu_sso/utils/ui.py:128 msgid "Save and Connect" msgstr "Сохранить и подключитьÑÑ" #: ../ubuntu_sso/utils/ui.py:129 msgid "Proxy username:" msgstr "Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¿Ñ€Ð¾ÐºÑи-Ñервера:" #: ../ubuntu_sso/utils/ui.py:131 msgid "" "A password reset code has been sent to your e-mail. Please enter the code " "below along with your new password." msgstr "" "Код ÑброÑа Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð±Ñ‹Ð» отправлен на ваш Ð°Ð´Ñ€ÐµÑ Ñлектронной почты. ПожалуйÑта, " "введите код и новый пароль ниже." #: ../ubuntu_sso/utils/ui.py:133 msgid "Retype email" msgstr "Введите Ð°Ð´Ñ€ÐµÑ Ñл. почты Ñнова" #: ../ubuntu_sso/utils/ui.py:134 msgid "Retype password" msgstr "Введите пароль ещё раз" #: ../ubuntu_sso/utils/ui.py:135 #, python-format msgid "To reset your %(app_name)s password, enter your email address below:" msgstr "Ð”Ð»Ñ ÑброÑа Ð¿Ð°Ñ€Ð¾Ð»Ñ %(app_name)s, введите ваш Ð°Ð´Ñ€ÐµÑ Ñлектронной почты:" #: ../ubuntu_sso/utils/ui.py:137 msgid "" "We are very Sorry! The service that signs you on is not responding right " "now\n" "Please try again or come back in a few minutes." msgstr "" "ПриноÑим извинениÑ! Служба обеÑÐ¿ÐµÑ‡Ð¸Ð²Ð°ÑŽÑ‰Ð°Ñ Ð²Ñ…Ð¾Ð´ в данный момент недоÑтупна\n" "ПожалуйÑта, повторите Ñнова или обратитеÑÑŒ через неÑколько минут." #: ../ubuntu_sso/utils/ui.py:140 msgid "Sorry we did not recognize the email address." msgstr "Извините, но данный Ð°Ð´Ñ€ÐµÑ Ñл.почты не найден." #: ../ubuntu_sso/utils/ui.py:142 msgid "Reset code" msgstr "Код ÑброÑа паролÑ" #: ../ubuntu_sso/utils/ui.py:145 #, python-format msgid "" "A password reset code has been sent to %(email)s.\n" "Please enter the code below along with your new password." msgstr "" "Код ÑброÑа Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½ на %(email)s.\n" "Введите код и ваш новый пароль." #: ../ubuntu_sso/utils/ui.py:147 msgid "Set Up Account" msgstr "ÐаÑтроить учётную запиÑÑŒ" #: ../ubuntu_sso/utils/ui.py:148 msgid "I don't have an account yet - sign me up" msgstr "Ðет учётной запиÑи. ЗарегиÑтрироватьÑÑ?" #: ../ubuntu_sso/utils/ui.py:149 msgid "Sign In" msgstr "Войти" #: ../ubuntu_sso/utils/ui.py:150 msgid "Log-in with my existing account." msgstr "Войти в ÑиÑтему Ñ Ð´ÐµÐ¹Ñтвующей учётной запиÑи." #: ../ubuntu_sso/utils/ui.py:151 msgid "the appname whose ssl error we are going to show." msgstr "название приложениÑ, Ð´Ð»Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ð³Ð¾ будет отображена ошибка ssl." #: ../ubuntu_sso/utils/ui.py:152 msgid "Certificate details" msgstr "Ð¡Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ñертификата" #: ../ubuntu_sso/utils/ui.py:153 msgid "Connect" msgstr "ПодключитьÑÑ" #: ../ubuntu_sso/utils/ui.py:154 msgid "the details ssl certificate we are going to show." msgstr "ÑÐ²ÐµÐ´ÐµÐ½Ð¸Ñ ssl-Ñертификата, которые будут показаны." #: ../ubuntu_sso/utils/ui.py:161 msgid "Open the SSL certificate UI." msgstr "Открыть Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ SSL-Ñертификата." #: ../ubuntu_sso/utils/ui.py:162 msgid "SSL Certificate Not Valid" msgstr "ÐедопуÑтимый SSL-Ñертификат" #: ../ubuntu_sso/utils/ui.py:163 msgid "the domain whose ssl certificate we are going to show." msgstr "домен, чей ssl-Ñертификат будет показан." #: ../ubuntu_sso/utils/ui.py:164 #, python-format msgid "" "You are trying to connect to a proxy server on %(domain)s. This server uses " "a secure connection, and the SSL certificate is not valid because:" msgstr "" "Ð’Ñ‹ пытаетеÑÑŒ подключитьÑÑ Ðº прокÑи-Ñерверу на %(domain)s. Сервер иÑпользует " "безопаÑное Ñоединение, а SSL-Ñертификат недопуÑтим:" #: ../ubuntu_sso/utils/ui.py:167 msgid "The certificate has not been verified" msgstr "Сертификат не был проверен" #: ../ubuntu_sso/utils/ui.py:168 msgid "Do you want to connect to this server?" msgstr "Ð’Ñ‹ дейÑтвительно хотите подключитьÑÑ Ðº Ñтому Ñерверу?" #: ../ubuntu_sso/utils/ui.py:169 msgid "Get Help With SSL" msgstr "Справка отноÑительно SSL" #: ../ubuntu_sso/utils/ui.py:170 #, python-format msgid "" "If you are not sure about this server, do not use it to connect to " "%(app_name)s." msgstr "" "ЕÑли вы не уверены в необходимоÑти иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñтого Ñервера, не " "иÑпользуйте его Ð´Ð»Ñ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ðº %(app_name)s." #: ../ubuntu_sso/utils/ui.py:172 msgid "Remember my settings for this certificate." msgstr "Сохранить мои наÑтройки Ð´Ð»Ñ Ñтого Ñертификата." #: ../ubuntu_sso/utils/ui.py:173 msgid "" "The name on the certificate isn't valid or doesn't match the name of the site" msgstr "" "Ðазвание Ñертификата недопуÑтимо или не ÑоответÑтвует имени веб-Ñайта." #: ../ubuntu_sso/utils/ui.py:175 msgid "The certificate has expired" msgstr "Срок дейÑÑ‚Ð²Ð¸Ñ Ñертификата иÑтёк" #: ../ubuntu_sso/utils/ui.py:176 #, python-format msgid "You are now logged into %(app_name)s." msgstr "Вход в %(app_name)s выполнен." #: ../ubuntu_sso/utils/ui.py:177 msgid "Surname" msgstr "ФамилиÑ" #: ../ubuntu_sso/utils/ui.py:178 msgid "Terms of Service" msgstr "УÑÐ»Ð¾Ð²Ð¸Ñ Ð¿Ñ€ÐµÐ´Ð¾ÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ ÑƒÑлуг" #: ../ubuntu_sso/utils/ui.py:179 msgid "Sign Up to {app_name}" msgstr "Войти в {app_name}" #: ../ubuntu_sso/utils/ui.py:180 msgid "Show Terms & Conditions" msgstr "Показать уÑÐ»Ð¾Ð²Ð¸Ñ Ð¸ÑпользованиÑ" #: ../ubuntu_sso/utils/ui.py:181 #, python-format msgid "" "Agreeing to the %(app_name)s Terms & Conditions is required to subscribe." msgstr "" "Ð”Ð»Ñ Ð¾ÑущеÑÑ‚Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñки на %(app_name)s, необходимо ÑоглаÑитьÑÑ Ñ " "правилами." #: ../ubuntu_sso/utils/ui.py:183 #, python-format msgid "You can also find these terms at %(url)s" msgstr "" "Ð’Ñ‹ можете ознакомитьÑÑ Ñ Ñтими уÑловиÑми на %(url)s" #: ../ubuntu_sso/utils/ui.py:184 msgid "Try again" msgstr "Попробуйте ещё раз" #: ../ubuntu_sso/utils/ui.py:185 msgid "" "There was an error when trying to complete the process. Please check the " "information and try again." msgstr "" "Произошла ошибка при попытке Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ñ†ÐµÑÑа. ПожалуйÑта, проверьте " "информацию и попробуйте Ñнова." #: ../ubuntu_sso/utils/ui.py:187 msgid "Verification code" msgstr "Проверочный код" #: ../ubuntu_sso/utils/ui.py:188 #, python-format msgid "" "Check %(email)s for an email from Ubuntu Single Sign On. This message " "contains a verification code. Enter the code in the field below and click OK " "to complete creating your %(app_name)s account." msgstr "" "Проверьте, получено ли Ñообщение единой Ñлужбы входа Ubuntu Single Sign On " "по адреÑу %(email)s . Это Ñообщение Ñодержит проверочный код. Введите код в " "поле ниже и нажмите OK, завершив Ñоздание учётной запиÑи Ð´Ð»Ñ %(app_name)s." #: ../ubuntu_sso/utils/ui.py:192 msgid "Enter verification code" msgstr "Введите код подтверждениÑ" #: ../ubuntu_sso/utils/ui.py:195 #, python-format msgid "I agree with the %(app_name)s terms and conditions" msgstr "Я ÑоглашаюÑÑŒ Ñ ÑƒÑловиÑми Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ %(app_name)s" #: ../ubuntu_sso/utils/ui.py:196 #, python-format msgid "Yes! Email me %(app_name)s tips and updates." msgstr "Да, подпишите Ð¼ÐµÐ½Ñ Ð½Ð° раÑÑылку %(app_name)s" ubuntu-sso-client-13.10/po/af.po0000664000202700020270000002561612151461656016727 0ustar dobeydobey00000000000000# Afrikaans translation for ubuntu-sso-client # Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 # This file is distributed under the same license as the ubuntu-sso-client package. # FIRST AUTHOR , 2011. # msgid "" msgstr "" "Project-Id-Version: ubuntu-sso-client\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-09-11 18:25+0000\n" "PO-Revision-Date: 2011-02-27 14:57+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Afrikaans \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-09-17 18:24+0000\n" "X-Generator: Launchpad (build 15944)\n" #. Undefined variable '_', pylint: disable=E0602 #. all the text that is used in the gui #: ../ubuntu_sso/utils/ui.py:49 msgid "By signing up to {app_name} you agree to our {privacy_policy}" msgstr "" #: ../ubuntu_sso/utils/ui.py:51 msgid "By signing up to {app_name} you agree to our {terms_and_conditions}" msgstr "" #: ../ubuntu_sso/utils/ui.py:53 msgid " and {privacy_policy}" msgstr "" #: ../ubuntu_sso/utils/ui.py:54 msgid "Cancel" msgstr "" #: ../ubuntu_sso/utils/ui.py:55 msgid "Type the characters above" msgstr "Tik die karakters hierbo" #: ../ubuntu_sso/utils/ui.py:56 msgid "There was a problem getting the captcha, reloading..." msgstr "" #: ../ubuntu_sso/utils/ui.py:58 #, python-format msgid "If you can't read this then %(reload_link)s this page" msgstr "" #: ../ubuntu_sso/utils/ui.py:60 msgid "refresh" msgstr "" #: ../ubuntu_sso/utils/ui.py:61 msgid "Reload" msgstr "Herlaai" #: ../ubuntu_sso/utils/ui.py:62 msgid "The captcha is a required field" msgstr "" #: ../ubuntu_sso/utils/ui.py:63 msgid "Close window and set up later" msgstr "" #: ../ubuntu_sso/utils/ui.py:64 msgid "Congratulations, {app_name} is installed!" msgstr "" #: ../ubuntu_sso/utils/ui.py:65 #, python-format msgid "To connect this computer to %(app_name)s enter your details below." msgstr "" #: ../ubuntu_sso/utils/ui.py:67 msgid "Register with {app_name}." msgstr "" #: ../ubuntu_sso/utils/ui.py:68 ../ubuntu_sso/utils/ui.py:93 #: ../ubuntu_sso/utils/ui.py:143 msgid "Email address" msgstr "E-pos adres" #: ../ubuntu_sso/utils/ui.py:69 msgid "Re-type Email address" msgstr "Her-tik e-pos adres" #: ../ubuntu_sso/utils/ui.py:70 msgid "The email must be a valid email address." msgstr "Die e-pos adres moet geldig wees." #: ../ubuntu_sso/utils/ui.py:71 msgid "" "The email addresses don't match, please double check and try entering them " "again." msgstr "" #: ../ubuntu_sso/utils/ui.py:73 msgid "Email" msgstr "" #: ../ubuntu_sso/utils/ui.py:74 msgid "The email addresses do not match" msgstr "" #: ../ubuntu_sso/utils/ui.py:75 msgid "Enter code verification here" msgstr "" #: ../ubuntu_sso/utils/ui.py:76 msgid "Please enter your name" msgstr "" #: ../ubuntu_sso/utils/ui.py:77 msgid "The process did not finish successfully." msgstr "" #: ../ubuntu_sso/utils/ui.py:79 msgid "Sign me in with my existing account" msgstr "" #: ../ubuntu_sso/utils/ui.py:80 msgid "This field is required." msgstr "" #: ../ubuntu_sso/utils/ui.py:81 msgid "I've forgotten my password" msgstr "" #: ../ubuntu_sso/utils/ui.py:82 ../ubuntu_sso/utils/ui.py:130 msgid "Reset password" msgstr "" #: ../ubuntu_sso/utils/ui.py:83 msgid "" "To reset your {app_name} password, enter your registered email address " "below. We will send instructions to reset your password." msgstr "" #: ../ubuntu_sso/utils/ui.py:86 msgid "Please enter a valid email address" msgstr "" #: ../ubuntu_sso/utils/ui.py:87 msgid "There was a problem accessing the Ubuntu Single Sign On backend." msgstr "" #: ../ubuntu_sso/utils/ui.py:89 #, python-format msgid "Create %(app_name)s account" msgstr "" #: ../ubuntu_sso/utils/ui.py:90 msgid "Loading..." msgstr "Laai tans..." #: ../ubuntu_sso/utils/ui.py:91 msgid "Getting information, please wait..." msgstr "" #: ../ubuntu_sso/utils/ui.py:92 msgid "Already have an account? Click here to sign in" msgstr "Het u alreeds 'n rekening? Kliek hier om in te teken" #: ../ubuntu_sso/utils/ui.py:94 #, python-format msgid "Connect to %(app_name)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:95 ../ubuntu_sso/utils/ui.py:109 msgid "Password" msgstr "Wagwoord" #: ../ubuntu_sso/utils/ui.py:97 msgid "Sign In to {app_name}" msgstr "" #: ../ubuntu_sso/utils/ui.py:99 msgid "Name" msgstr "Naam" #: ../ubuntu_sso/utils/ui.py:100 msgid "The name must not be empty." msgstr "" #: ../ubuntu_sso/utils/ui.py:101 msgid "Next" msgstr "Volgende" #: ../ubuntu_sso/utils/ui.py:102 msgid "Network detection" msgstr "" #: ../ubuntu_sso/utils/ui.py:103 #, python-format msgid "" "Are you online? We can't detect an internet connection - you will need to be " "connected to set up %(app_name)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:105 msgid "One moment please..." msgstr "Een oomblik asseblief..." #: ../ubuntu_sso/utils/ui.py:106 msgid "Create a password" msgstr "" #: ../ubuntu_sso/utils/ui.py:107 msgid "Your password was successfully changed." msgstr "'n Wagwoord is suksesvol verander." #: ../ubuntu_sso/utils/ui.py:108 msgid "At least one number" msgstr "" #: ../ubuntu_sso/utils/ui.py:110 msgid "Re-type Password" msgstr "Her-tik wagwoord" #: ../ubuntu_sso/utils/ui.py:111 msgid "" "The password must have a minimum of 8 characters and include one uppercase " "character and one number." msgstr "" "Die wagwoord moet uit minstens 8 karakters bestaan, en minstens een " "hoofletter en een getal bevat." #: ../ubuntu_sso/utils/ui.py:113 msgid "At least 8 characters" msgstr "" #: ../ubuntu_sso/utils/ui.py:114 msgid "Passwords don't match" msgstr "" #: ../ubuntu_sso/utils/ui.py:115 msgid "" "The passwords don't match, please double check and try entering them again." msgstr "" #: ../ubuntu_sso/utils/ui.py:117 msgid "Your password must contain" msgstr "" #: ../ubuntu_sso/utils/ui.py:118 msgid "The password is too weak." msgstr "" #: ../ubuntu_sso/utils/ui.py:119 msgid "At least one uppercase letter" msgstr "" #: ../ubuntu_sso/utils/ui.py:120 msgid "Privacy Policy" msgstr "" #: ../ubuntu_sso/utils/ui.py:121 msgid "Connecting to:" msgstr "" #: ../ubuntu_sso/utils/ui.py:122 msgid "Proxy Settings" msgstr "" #: ../ubuntu_sso/utils/ui.py:123 msgid "Incorrect login details. Please try again." msgstr "" #: ../ubuntu_sso/utils/ui.py:124 msgid "Please provide login details." msgstr "" #: ../ubuntu_sso/utils/ui.py:125 msgid "You are connecting through a proxy." msgstr "" #: ../ubuntu_sso/utils/ui.py:126 msgid "Get Help With Proxies" msgstr "" #: ../ubuntu_sso/utils/ui.py:127 msgid "Proxy password:" msgstr "" #: ../ubuntu_sso/utils/ui.py:128 msgid "Save and Connect" msgstr "" #: ../ubuntu_sso/utils/ui.py:129 msgid "Proxy username:" msgstr "" #: ../ubuntu_sso/utils/ui.py:131 msgid "" "A password reset code has been sent to your e-mail. Please enter the code " "below along with your new password." msgstr "" #: ../ubuntu_sso/utils/ui.py:133 msgid "Retype email" msgstr "" #: ../ubuntu_sso/utils/ui.py:134 msgid "Retype password" msgstr "" #: ../ubuntu_sso/utils/ui.py:135 #, python-format msgid "To reset your %(app_name)s password, enter your email address below:" msgstr "" #: ../ubuntu_sso/utils/ui.py:137 msgid "" "We are very Sorry! The service that signs you on is not responding right " "now\n" "Please try again or come back in a few minutes." msgstr "" #: ../ubuntu_sso/utils/ui.py:140 msgid "Sorry we did not recognize the email address." msgstr "" #: ../ubuntu_sso/utils/ui.py:142 msgid "Reset code" msgstr "" #: ../ubuntu_sso/utils/ui.py:145 #, python-format msgid "" "A password reset code has been sent to %(email)s.\n" "Please enter the code below along with your new password." msgstr "" #: ../ubuntu_sso/utils/ui.py:147 msgid "Set Up Account" msgstr "" #: ../ubuntu_sso/utils/ui.py:148 msgid "I don't have an account yet - sign me up" msgstr "" #: ../ubuntu_sso/utils/ui.py:149 msgid "Sign In" msgstr "" #: ../ubuntu_sso/utils/ui.py:150 msgid "Log-in with my existing account." msgstr "" #: ../ubuntu_sso/utils/ui.py:151 msgid "the appname whose ssl error we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:152 msgid "Certificate details" msgstr "" #: ../ubuntu_sso/utils/ui.py:153 msgid "Connect" msgstr "" #: ../ubuntu_sso/utils/ui.py:154 msgid "the details ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:161 msgid "Open the SSL certificate UI." msgstr "" #: ../ubuntu_sso/utils/ui.py:162 msgid "SSL Certificate Not Valid" msgstr "" #: ../ubuntu_sso/utils/ui.py:163 msgid "the domain whose ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:164 #, python-format msgid "" "You are trying to connect to a proxy server on %(domain)s. This server uses " "a secure connection, and the SSL certificate is not valid because:" msgstr "" #: ../ubuntu_sso/utils/ui.py:167 msgid "The certificate has not been verified" msgstr "" #: ../ubuntu_sso/utils/ui.py:168 msgid "Do you want to connect to this server?" msgstr "" #: ../ubuntu_sso/utils/ui.py:169 msgid "Get Help With SSL" msgstr "" #: ../ubuntu_sso/utils/ui.py:170 #, python-format msgid "" "If you are not sure about this server, do not use it to connect to " "%(app_name)s." msgstr "" #: ../ubuntu_sso/utils/ui.py:172 msgid "Remember my settings for this certificate." msgstr "" #: ../ubuntu_sso/utils/ui.py:173 msgid "" "The name on the certificate isn't valid or doesn't match the name of the site" msgstr "" #: ../ubuntu_sso/utils/ui.py:175 msgid "The certificate has expired" msgstr "" #: ../ubuntu_sso/utils/ui.py:176 #, python-format msgid "You are now logged into %(app_name)s." msgstr "" #: ../ubuntu_sso/utils/ui.py:177 msgid "Surname" msgstr "" #: ../ubuntu_sso/utils/ui.py:178 msgid "Terms of Service" msgstr "" #: ../ubuntu_sso/utils/ui.py:179 msgid "Sign Up to {app_name}" msgstr "" #: ../ubuntu_sso/utils/ui.py:180 msgid "Show Terms & Conditions" msgstr "" #: ../ubuntu_sso/utils/ui.py:181 #, python-format msgid "" "Agreeing to the %(app_name)s Terms & Conditions is required to subscribe." msgstr "" #: ../ubuntu_sso/utils/ui.py:183 #, python-format msgid "You can also find these terms at %(url)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:184 msgid "Try again" msgstr "" #: ../ubuntu_sso/utils/ui.py:185 msgid "" "There was an error when trying to complete the process. Please check the " "information and try again." msgstr "" #: ../ubuntu_sso/utils/ui.py:187 msgid "Verification code" msgstr "" #: ../ubuntu_sso/utils/ui.py:188 #, python-format msgid "" "Check %(email)s for an email from Ubuntu Single Sign On. This message " "contains a verification code. Enter the code in the field below and click OK " "to complete creating your %(app_name)s account." msgstr "" #: ../ubuntu_sso/utils/ui.py:192 msgid "Enter verification code" msgstr "" #: ../ubuntu_sso/utils/ui.py:195 #, python-format msgid "I agree with the %(app_name)s terms and conditions" msgstr "" #: ../ubuntu_sso/utils/ui.py:196 #, python-format msgid "Yes! Email me %(app_name)s tips and updates." msgstr "" ubuntu-sso-client-13.10/po/lv.po0000664000202700020270000003600412151461656016753 0ustar dobeydobey00000000000000# Latvian translation for ubuntu-sso-client # Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 # This file is distributed under the same license as the ubuntu-sso-client package. # # FIRST AUTHOR , 2011. # RÅ«dolfs Mazurs , 2011. msgid "" msgstr "" "Project-Id-Version: ubuntu-sso-client\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-09-11 18:25+0000\n" "PO-Revision-Date: 2012-04-16 10:34+0000\n" "Last-Translator: PÄ“teris KriÅ¡jÄnis \n" "Language-Team: Latvian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-09-17 18:24+0000\n" "X-Generator: Launchpad (build 15944)\n" #. Undefined variable '_', pylint: disable=E0602 #. all the text that is used in the gui #: ../ubuntu_sso/utils/ui.py:49 msgid "By signing up to {app_name} you agree to our {privacy_policy}" msgstr "Piesakoties uz {app_name}, jÅ«s piekrÄ«tat mÅ«su {privacy_policy}" #: ../ubuntu_sso/utils/ui.py:51 msgid "By signing up to {app_name} you agree to our {terms_and_conditions}" msgstr "Piesakoties uz {app_name}, jÅ«s piekrÄ«tat mÅ«su {terms_and_conditions}" #: ../ubuntu_sso/utils/ui.py:53 msgid " and {privacy_policy}" msgstr " un {privacy_policy}" #: ../ubuntu_sso/utils/ui.py:54 msgid "Cancel" msgstr "Atcelt" #: ../ubuntu_sso/utils/ui.py:55 msgid "Type the characters above" msgstr "Ievadiet rakstzÄ«mes augstÄk" #: ../ubuntu_sso/utils/ui.py:56 msgid "There was a problem getting the captcha, reloading..." msgstr "GadÄ«jÄs kļūda, saņemot CAPTCHA, pÄrlÄdÄ“..." #: ../ubuntu_sso/utils/ui.py:58 #, python-format msgid "If you can't read this then %(reload_link)s this page" msgstr "Ja jÅ«s Å¡o nevarat izlasÄ«t, tad %(reload_link)s Å¡o lapu" #: ../ubuntu_sso/utils/ui.py:60 msgid "refresh" msgstr "atsvaidzinÄt" #: ../ubuntu_sso/utils/ui.py:61 msgid "Reload" msgstr "PÄrlÄdÄ“t" #: ../ubuntu_sso/utils/ui.py:62 msgid "The captcha is a required field" msgstr "Captcha ir pieprasÄ«ts lauks" #: ../ubuntu_sso/utils/ui.py:63 msgid "Close window and set up later" msgstr "AizvÄ“rt logu un iestatÄ«t vÄ“lÄk" #: ../ubuntu_sso/utils/ui.py:64 msgid "Congratulations, {app_name} is installed!" msgstr "Apsveicam, {app_name} ir uzinstalÄ“ta!" #: ../ubuntu_sso/utils/ui.py:65 #, python-format msgid "To connect this computer to %(app_name)s enter your details below." msgstr "" "Lai savienotu Å¡o datoru ar %(app_name)s, ievadiet informÄciju par sevi zemÄk." #: ../ubuntu_sso/utils/ui.py:67 msgid "Register with {app_name}." msgstr "" #: ../ubuntu_sso/utils/ui.py:68 ../ubuntu_sso/utils/ui.py:93 #: ../ubuntu_sso/utils/ui.py:143 msgid "Email address" msgstr "E-pasta adrese" #: ../ubuntu_sso/utils/ui.py:69 msgid "Re-type Email address" msgstr "Atkal ievadiet E-pasta adresi" #: ../ubuntu_sso/utils/ui.py:70 msgid "The email must be a valid email address." msgstr "E-pasta adresei ir jÄbÅ«t derÄ«gai." #: ../ubuntu_sso/utils/ui.py:71 msgid "" "The email addresses don't match, please double check and try entering them " "again." msgstr "E-pasta adreses nesakrÄ«t, lÅ«dzu, pÄrbaudiet tÄs un ievadiet vÄ“lreiz." #: ../ubuntu_sso/utils/ui.py:73 msgid "Email" msgstr "E-pasts" #: ../ubuntu_sso/utils/ui.py:74 msgid "The email addresses do not match" msgstr "e-pasta adreses nesakrÄ«t" #: ../ubuntu_sso/utils/ui.py:75 msgid "Enter code verification here" msgstr "Å eit ievadiet verifikÄcijas kodu" #: ../ubuntu_sso/utils/ui.py:76 msgid "Please enter your name" msgstr "LÅ«dzu, ievadiet savu vÄrdu" #: ../ubuntu_sso/utils/ui.py:77 msgid "The process did not finish successfully." msgstr "Process nebeidzÄs veiksmÄ«gi." #: ../ubuntu_sso/utils/ui.py:79 msgid "Sign me in with my existing account" msgstr "Piesakiet mani ar manu eksistÄ“joÅ¡o kontu" #: ../ubuntu_sso/utils/ui.py:80 msgid "This field is required." msgstr "Å is lauks ir nepiecieÅ¡ams." #: ../ubuntu_sso/utils/ui.py:81 msgid "I've forgotten my password" msgstr "Es aizmirsu savu paroli" #: ../ubuntu_sso/utils/ui.py:82 ../ubuntu_sso/utils/ui.py:130 msgid "Reset password" msgstr "PÄrstatÄ«t paroli" #: ../ubuntu_sso/utils/ui.py:83 msgid "" "To reset your {app_name} password, enter your registered email address " "below. We will send instructions to reset your password." msgstr "" "Lai atiestatÄ«tu jÅ«su {app_name} paroli, zemÄk norÄdiet jÅ«su reÄ£istrÄ“to e-" "pasta adresi. MÄ“s jums nosÅ«tÄ«sim instrukcijas kÄ pÄriestatÄ«t jÅ«su paroli." #: ../ubuntu_sso/utils/ui.py:86 msgid "Please enter a valid email address" msgstr "LÅ«dzu, ievadiet derÄ«gu e-pasta adresi" #: ../ubuntu_sso/utils/ui.py:87 msgid "There was a problem accessing the Ubuntu Single Sign On backend." msgstr "ProblÄ“ma piekļūstot Ubuntu Single Sign On aizmugurei." #: ../ubuntu_sso/utils/ui.py:89 #, python-format msgid "Create %(app_name)s account" msgstr "Izveidot %(app_name)s kontu" #: ../ubuntu_sso/utils/ui.py:90 msgid "Loading..." msgstr "IelÄdÄ“..." #: ../ubuntu_sso/utils/ui.py:91 msgid "Getting information, please wait..." msgstr "IegÅ«st informÄciju, lÅ«dzu, uzgaidiet..." #: ../ubuntu_sso/utils/ui.py:92 msgid "Already have an account? Click here to sign in" msgstr "Jau ir konts? Klikšķiniet Å¡eit, lai pieteiktos" #: ../ubuntu_sso/utils/ui.py:94 #, python-format msgid "Connect to %(app_name)s" msgstr "Savienoties ar %(app_name)s" #: ../ubuntu_sso/utils/ui.py:95 ../ubuntu_sso/utils/ui.py:109 msgid "Password" msgstr "Parole" #: ../ubuntu_sso/utils/ui.py:97 msgid "Sign In to {app_name}" msgstr "Pieteikties darbam ar {app_name}" #: ../ubuntu_sso/utils/ui.py:99 msgid "Name" msgstr "VÄrds" #: ../ubuntu_sso/utils/ui.py:100 msgid "The name must not be empty." msgstr "Nosaukums nedrÄ«kst bÅ«t tukÅ¡s." #: ../ubuntu_sso/utils/ui.py:101 msgid "Next" msgstr "NÄkamais" #: ../ubuntu_sso/utils/ui.py:102 msgid "Network detection" msgstr "TÄ«kla noteikÅ¡ana" #: ../ubuntu_sso/utils/ui.py:103 #, python-format msgid "" "Are you online? We can't detect an internet connection - you will need to be " "connected to set up %(app_name)s" msgstr "" "Vai jÅ«s esat tieÅ¡saistÄ“? MÄ“s nevaram noteikt jÅ«su interneta savienojumu - " "jums tas ir nepiecieÅ¡ams, lai iestatÄ«tu %(app_name)s" #: ../ubuntu_sso/utils/ui.py:105 msgid "One moment please..." msgstr "Uzgaidiet brÄ«di..." #: ../ubuntu_sso/utils/ui.py:106 msgid "Create a password" msgstr "Izveidot paroli" #: ../ubuntu_sso/utils/ui.py:107 msgid "Your password was successfully changed." msgstr "JÅ«su parole tika veiksmÄ«gi nomainÄ«ta." #: ../ubuntu_sso/utils/ui.py:108 msgid "At least one number" msgstr "Vismaz vienu skaitli" #: ../ubuntu_sso/utils/ui.py:110 msgid "Re-type Password" msgstr "Atkal ievadiet paroli" #: ../ubuntu_sso/utils/ui.py:111 msgid "" "The password must have a minimum of 8 characters and include one uppercase " "character and one number." msgstr "" "ParolÄ“ ir jÄbÅ«t vismaz 8 rakstzÄ«mÄ“m un jÄiekļauj vismaz viens lielais burts " "un viens cipars." #: ../ubuntu_sso/utils/ui.py:113 msgid "At least 8 characters" msgstr "Vismaz 8 rakstzÄ«mes" #: ../ubuntu_sso/utils/ui.py:114 msgid "Passwords don't match" msgstr "Paroles nesakrÄ«t" #: ../ubuntu_sso/utils/ui.py:115 msgid "" "The passwords don't match, please double check and try entering them again." msgstr "Paroles nesakrÄ«t. LÅ«dzu, pÄrbaudiet un ievadiet tÄs atkal." #: ../ubuntu_sso/utils/ui.py:117 msgid "Your password must contain" msgstr "JÅ«su parolei jÄsatur" #: ../ubuntu_sso/utils/ui.py:118 msgid "The password is too weak." msgstr "Parole ir pÄrÄk vÄja." #: ../ubuntu_sso/utils/ui.py:119 msgid "At least one uppercase letter" msgstr "Vismaz viens lielais burts" #: ../ubuntu_sso/utils/ui.py:120 msgid "Privacy Policy" msgstr "PrivÄtuma politika" #: ../ubuntu_sso/utils/ui.py:121 msgid "Connecting to:" msgstr "Savienojas ar:" #: ../ubuntu_sso/utils/ui.py:122 msgid "Proxy Settings" msgstr "Starpnieka iestatÄ«jumi" #: ../ubuntu_sso/utils/ui.py:123 msgid "Incorrect login details. Please try again." msgstr "Nepareiza pieteikÅ¡anÄs informÄcija. LÅ«dzu, mēģiniet vÄ“lreiz." #: ../ubuntu_sso/utils/ui.py:124 msgid "Please provide login details." msgstr "LÅ«dzu, uzrÄdiet pieteikÅ¡anÄs informÄciju." #: ../ubuntu_sso/utils/ui.py:125 msgid "You are connecting through a proxy." msgstr "JÅ«s esat savienots caur starpniekserveri." #: ../ubuntu_sso/utils/ui.py:126 msgid "Get Help With Proxies" msgstr "IegÅ«t palÄ«dzÄ«bu starpniekservera izmantoÅ¡anÄ" #: ../ubuntu_sso/utils/ui.py:127 msgid "Proxy password:" msgstr "Starpnieka parole:" #: ../ubuntu_sso/utils/ui.py:128 msgid "Save and Connect" msgstr "SaglabÄt un savienot" #: ../ubuntu_sso/utils/ui.py:129 msgid "Proxy username:" msgstr "Starpnieka lietotÄjvÄrds:" #: ../ubuntu_sso/utils/ui.py:131 msgid "" "A password reset code has been sent to your e-mail. Please enter the code " "below along with your new password." msgstr "" "Paroles pÄriestatīšanas kods ir nosÅ«tÄ«ts uz jÅ«su e-pasta adresi. LÅ«dzu, " "ievadiet zemÄk norÄdÄ«to kontu lÄ«dz ar jÅ«su jauno paroli." #: ../ubuntu_sso/utils/ui.py:133 msgid "Retype email" msgstr "PÄrievadiet e-pasta adresi" #: ../ubuntu_sso/utils/ui.py:134 msgid "Retype password" msgstr "PÄrievadiet paroli" #: ../ubuntu_sso/utils/ui.py:135 #, python-format msgid "To reset your %(app_name)s password, enter your email address below:" msgstr "" "Lai pÄrstatÄ«tu %(app_name)s paroli, ievadiet savu e-pasta adresi zemÄk:" #: ../ubuntu_sso/utils/ui.py:137 msgid "" "We are very Sorry! The service that signs you on is not responding right " "now\n" "Please try again or come back in a few minutes." msgstr "" "MÄ“s ļoti atvainojamies - pieteikÅ¡anÄs serviss Å¡obrÄ«d neatbild.\n" "LÅ«dzu, mēģiniet vÄ“lreiz, vai atgriežieties pÄ“c pÄris minÅ«tÄ“m." #: ../ubuntu_sso/utils/ui.py:140 msgid "Sorry we did not recognize the email address." msgstr "Atvainojiet, mÄ“s neatpazÄ«stam jÅ«su e-pasta adresi." #: ../ubuntu_sso/utils/ui.py:142 msgid "Reset code" msgstr "PÄrstatÄ«t kodu" #: ../ubuntu_sso/utils/ui.py:145 #, python-format msgid "" "A password reset code has been sent to %(email)s.\n" "Please enter the code below along with your new password." msgstr "" "Paroles pÄrstatīšanas kods tika nosÅ«tÄ«ts uz %(email)s.\n" "LÅ«dzu, ievadiet kodu zemÄk kopÄ ar jauno paroli." #: ../ubuntu_sso/utils/ui.py:147 msgid "Set Up Account" msgstr "IestatÄ«t kontu" #: ../ubuntu_sso/utils/ui.py:148 msgid "I don't have an account yet - sign me up" msgstr "Man vÄ“l nav konta - lÅ«dzu, piesakiet mani" #: ../ubuntu_sso/utils/ui.py:149 msgid "Sign In" msgstr "Pieteikties" #: ../ubuntu_sso/utils/ui.py:150 msgid "Log-in with my existing account." msgstr "" #: ../ubuntu_sso/utils/ui.py:151 msgid "the appname whose ssl error we are going to show." msgstr "Lietotnes nosaukums, kuras SSL kļūdu mÄ“s taisÄmies parÄdÄ«t." #: ../ubuntu_sso/utils/ui.py:152 msgid "Certificate details" msgstr "Sertifikata detaļas" #: ../ubuntu_sso/utils/ui.py:153 msgid "Connect" msgstr "Savienot" #: ../ubuntu_sso/utils/ui.py:154 msgid "the details ssl certificate we are going to show." msgstr "SSL sertifikÄts, kura detaļas mÄ“s taisÄmies parÄdÄ«t." #: ../ubuntu_sso/utils/ui.py:161 msgid "Open the SSL certificate UI." msgstr "AtvÄ“rt SSL sertifikÄta lietotÄja saskarni." #: ../ubuntu_sso/utils/ui.py:162 msgid "SSL Certificate Not Valid" msgstr "SSL sertifikÄts nav derÄ«gs" #: ../ubuntu_sso/utils/ui.py:163 msgid "the domain whose ssl certificate we are going to show." msgstr "DomÄ“ns, kura SSL sertifikÄtu mÄ“s taisamies parÄdÄ«t." #: ../ubuntu_sso/utils/ui.py:164 #, python-format msgid "" "You are trying to connect to a proxy server on %(domain)s. This server uses " "a secure connection, and the SSL certificate is not valid because:" msgstr "" "JÅ«s mēģinÄt pieslÄ“gties starpniekserverim %(domain)s. Å is serveris izmanto " "droÅ¡o savienojumu, un SSL sertifikÄts nav derÄ«gs tÄpÄ“c ka:" #: ../ubuntu_sso/utils/ui.py:167 msgid "The certificate has not been verified" msgstr "SertifikÄts nav pÄrbaudÄ«ts" #: ../ubuntu_sso/utils/ui.py:168 msgid "Do you want to connect to this server?" msgstr "Vai vÄ“laties veidot savienojumu ar Å¡o serveri?" #: ../ubuntu_sso/utils/ui.py:169 msgid "Get Help With SSL" msgstr "IegÅ«t palÄ«dzÄ«bu par SSL izmantoÅ¡anu" #: ../ubuntu_sso/utils/ui.py:170 #, python-format msgid "" "If you are not sure about this server, do not use it to connect to " "%(app_name)s." msgstr "" "Ja neesat pÄrliecinÄts par Å¡o serveri, neizmantojiet to, lai savienotos ar " "%(app_name)s." #: ../ubuntu_sso/utils/ui.py:172 msgid "Remember my settings for this certificate." msgstr "AtcerÄ“ties manus iestatÄ«jumus Å¡im sertifikÄtam." #: ../ubuntu_sso/utils/ui.py:173 msgid "" "The name on the certificate isn't valid or doesn't match the name of the site" msgstr "" "SertifikÄta nosaukums nav derÄ«gs, vai arÄ« tas neatbilst vietnes nosaukumam." #: ../ubuntu_sso/utils/ui.py:175 msgid "The certificate has expired" msgstr "SertifikÄtam beidzies derÄ«guma termiņš" #: ../ubuntu_sso/utils/ui.py:176 #, python-format msgid "You are now logged into %(app_name)s." msgstr "JÅ«s esat pieteicies %(app_name)s." #: ../ubuntu_sso/utils/ui.py:177 msgid "Surname" msgstr "UzvÄrds" #: ../ubuntu_sso/utils/ui.py:178 msgid "Terms of Service" msgstr "Servisa noteikumi" #: ../ubuntu_sso/utils/ui.py:179 msgid "Sign Up to {app_name}" msgstr "PieteikÅ¡anÄs darbam ar {app_name}" #: ../ubuntu_sso/utils/ui.py:180 msgid "Show Terms & Conditions" msgstr "RÄdÄ«t noteikumus" #: ../ubuntu_sso/utils/ui.py:181 #, python-format msgid "" "Agreeing to the %(app_name)s Terms & Conditions is required to subscribe." msgstr "Lai pierakstÄ«tos ir jÄpiekrÄ«t %(app_name)s lietoÅ¡anas noteikumiem." #: ../ubuntu_sso/utils/ui.py:183 #, python-format msgid "You can also find these terms at %(url)s" msgstr "JÅ«s varat Å¡os noteikumus atrast arÄ« %(url)s" #: ../ubuntu_sso/utils/ui.py:184 msgid "Try again" msgstr "Mēģiniet vÄ“lreiz" #: ../ubuntu_sso/utils/ui.py:185 msgid "" "There was an error when trying to complete the process. Please check the " "information and try again." msgstr "" "GadÄ«jÄs kļūda, mēģinot pabeigt procesu. LÅ«dzu, pÄrbaudiet informÄciju un " "mēģiniet vÄ“lreiz." #: ../ubuntu_sso/utils/ui.py:187 msgid "Verification code" msgstr "PÄrbaudes kods" #: ../ubuntu_sso/utils/ui.py:188 #, python-format msgid "" "Check %(email)s for an email from Ubuntu Single Sign On. This message " "contains a verification code. Enter the code in the field below and click OK " "to complete creating your %(app_name)s account." msgstr "" "PÄrbaudiet %(email)s, vai tur nav saņemta vÄ“stule no Ubuntu Single Sign On. " "Å Ä« vÄ“stule satur pÄrbaudes kodu. Ievadiet kodu laukÄ zemÄk un klikšķiniet OK " "lai pabeigtu jÅ«su %(app_name)s konta izveidi." #: ../ubuntu_sso/utils/ui.py:192 msgid "Enter verification code" msgstr "Ievadiet verifikÄcijas kodu" #: ../ubuntu_sso/utils/ui.py:195 #, python-format msgid "I agree with the %(app_name)s terms and conditions" msgstr "Es piekrÄ«tu %(app_name)s nosacÄ«jumiem" #: ../ubuntu_sso/utils/ui.py:196 #, python-format msgid "Yes! Email me %(app_name)s tips and updates." msgstr "JÄ, sÅ«tÄ«t man vÄ“stules par %(app_name)s padomiem un atjauninÄjumiem." ubuntu-sso-client-13.10/po/bn.po0000664000202700020270000005046512151461656016740 0ustar dobeydobey00000000000000# Bengali translation for ubuntu-sso-client # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the ubuntu-sso-client package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: ubuntu-sso-client\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-09-11 18:25+0000\n" "PO-Revision-Date: 2012-04-19 22:11+0000\n" "Last-Translator: Robin Mehdee \n" "Language-Team: Bengali \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-09-17 18:24+0000\n" "X-Generator: Launchpad (build 15944)\n" #. Undefined variable '_', pylint: disable=E0602 #. all the text that is used in the gui #: ../ubuntu_sso/utils/ui.py:49 msgid "By signing up to {app_name} you agree to our {privacy_policy}" msgstr "{app_name} ঠসাইনের মাধà§à¦¯à¦®à§‡ আপনি আমাদের {privacy_policy} তে সমà§à¦®à¦¤ হন" #: ../ubuntu_sso/utils/ui.py:51 msgid "By signing up to {app_name} you agree to our {terms_and_conditions}" msgstr "" "{app_name} ঠসাইনের মাধà§à¦¯à¦®à§‡ আপনি আমাদের {terms_and_conditions} ঠসমà§à¦®à¦¤ হন" #: ../ubuntu_sso/utils/ui.py:53 msgid " and {privacy_policy}" msgstr " à¦à¦¬à¦‚ {privacy_policy}" #: ../ubuntu_sso/utils/ui.py:54 msgid "Cancel" msgstr "বাতিল" #: ../ubuntu_sso/utils/ui.py:55 msgid "Type the characters above" msgstr "উপরিউকà§à¦¤ বরà§à¦£à¦¸à¦®à§‚হ টাইপ করà§à¦¨" #: ../ubuntu_sso/utils/ui.py:56 msgid "There was a problem getting the captcha, reloading..." msgstr "কà§à¦¯à¦¾à¦ªà¦šà¦¾-টি পেতে তà§à¦°à§à¦Ÿà¦¿ হয়েছে, পà§à¦¨à¦°à¦¾à§Ÿ চেষà§à¦Ÿà¦¾ করা হচà§à¦›à§‡..." #: ../ubuntu_sso/utils/ui.py:58 #, python-format msgid "If you can't read this then %(reload_link)s this page" msgstr "যদি আপনি à¦à¦Ÿà¦¿ পড়তে না পারেন তারপর %(reload_link)s à¦à¦‡ পৃষà§à¦ à¦¾" #: ../ubuntu_sso/utils/ui.py:60 msgid "refresh" msgstr "রিফà§à¦°à§‡à¦¶ করà§à¦¨" #: ../ubuntu_sso/utils/ui.py:61 msgid "Reload" msgstr "পà§à¦¨à¦°à¦¾à§Ÿ লোড" #: ../ubuntu_sso/utils/ui.py:62 msgid "The captcha is a required field" msgstr "কà§à¦¯à¦¾à¦ªà¦šà¦¾ à¦à¦•টি আবশà§à¦¯à¦•ীয় কà§à¦·à§‡à¦¤à§à¦°" #: ../ubuntu_sso/utils/ui.py:63 msgid "Close window and set up later" msgstr "উইনà§à¦¡à§‹ বনà§à¦§ করà§à¦¨ à¦à¦¬à¦‚ পরে নিরà§à¦§à¦¾à¦°à¦¨ করà§à¦¨" #: ../ubuntu_sso/utils/ui.py:64 msgid "Congratulations, {app_name} is installed!" msgstr "অভিননà§à¦¦à¦¨, {app_name} ইনà§à¦¸à¦Ÿà¦² হয়েছে!" #: ../ubuntu_sso/utils/ui.py:65 #, python-format msgid "To connect this computer to %(app_name)s enter your details below." msgstr "" "à¦à¦‡ কমà§à¦ªà¦¿à¦‰à¦Ÿà¦¾à¦°à¦Ÿà¦¿ %(app_name)s à¦à¦° সঙà§à¦—ে সংযà§à¦•à§à¦¤ করতে চাইলে নিমà§à¦¨à§‡ আপনার বিবরণ " "পà§à¦°à¦¦à¦¾à¦¨ করà§à¦¨à¥¤" #: ../ubuntu_sso/utils/ui.py:67 msgid "Register with {app_name}." msgstr "" #: ../ubuntu_sso/utils/ui.py:68 ../ubuntu_sso/utils/ui.py:93 #: ../ubuntu_sso/utils/ui.py:143 msgid "Email address" msgstr "ইমেইল ঠিকানা" #: ../ubuntu_sso/utils/ui.py:69 msgid "Re-type Email address" msgstr "পà§à¦¨à¦°à¦¾à§Ÿ ই-মেইল ঠিকানা টাইপ করà§à¦¨" #: ../ubuntu_sso/utils/ui.py:70 msgid "The email must be a valid email address." msgstr "ই-মেইলটি অবশà§à¦¯à¦‡ à¦à¦•টি বৈধ ই-মেইল ঠিকানা হতে হবে।" #: ../ubuntu_sso/utils/ui.py:71 msgid "" "The email addresses don't match, please double check and try entering them " "again." msgstr "" "ই-মেইল ঠিকানা সমূহ মিলছে না, অনà§à¦—à§à¦°à¦¹ করে পà§à¦¨à¦°à¦¾à§Ÿ পরীকà§à¦·à¦¾ করà§à¦¨ à¦à¦¬à¦‚ আবার পà§à¦°à¦¦à¦¾à¦¨ " "করà§à¦¨à¥¤" #: ../ubuntu_sso/utils/ui.py:73 msgid "Email" msgstr "ইমেইল" #: ../ubuntu_sso/utils/ui.py:74 msgid "The email addresses do not match" msgstr "ইমেইল ঠিকানা সদৃশ নয়" #: ../ubuntu_sso/utils/ui.py:75 msgid "Enter code verification here" msgstr "à¦à¦–ানে ভেরিফিকেশন কোড পà§à¦°à¦¦à¦¾à¦¨ করà§à¦¨" #: ../ubuntu_sso/utils/ui.py:76 msgid "Please enter your name" msgstr "অনà§à¦—à§à¦°à¦¹ করে আপনার নাম দিন" #: ../ubuntu_sso/utils/ui.py:77 msgid "The process did not finish successfully." msgstr "পà§à¦°à¦•à§à¦°à¦¿à§Ÿà¦¾à¦Ÿà¦¿ সফলভাবে সমà§à¦ªà¦¨à§à¦¨ হয় নি।" #: ../ubuntu_sso/utils/ui.py:79 msgid "Sign me in with my existing account" msgstr "আমার বরà§à¦¤à¦®à¦¾à¦¨ অà§à¦¯à¦¾à¦•াউনà§à¦Ÿà§‡à¦° মাধà§à¦¯à¦®à§‡ আমাকে সাইন ইন করà§à¦¨" #: ../ubuntu_sso/utils/ui.py:80 msgid "This field is required." msgstr "à¦à¦‡ ফিলà§à¦¡à¦Ÿà¦¿ পà§à¦°à§Ÿà§‹à¦œà¦¨à§€à§Ÿà¥¤" #: ../ubuntu_sso/utils/ui.py:81 msgid "I've forgotten my password" msgstr "আমি আমার পাসওয়ারà§à¦¡ ভà§à¦²à§‡ গিয়েছি" #: ../ubuntu_sso/utils/ui.py:82 ../ubuntu_sso/utils/ui.py:130 msgid "Reset password" msgstr "পাসওয়ারà§à¦¡ রিসেট কর" #: ../ubuntu_sso/utils/ui.py:83 msgid "" "To reset your {app_name} password, enter your registered email address " "below. We will send instructions to reset your password." msgstr "" "আপনার {app_name} পাসওয়ারà§à¦¡ পà§à¦¨à¦ƒà¦¨à¦¿à¦°à§à¦§à¦¾à¦°à¦¨ করতে, নিমà§à¦¨ আপনার নিবনà§à¦§à¦¨à¦•ৃত ইমেইল " "ঠিকানা দিন। আমরা আপনার পাসওয়ারà§à¦¡ পà§à¦¨à¦ƒà¦¨à¦¿à¦°à§à¦§à¦¾à¦°à¦¨ করতে নিরà§à¦¦à§‡à¦¶ পাঠাবো।" #: ../ubuntu_sso/utils/ui.py:86 msgid "Please enter a valid email address" msgstr "অনà§à¦—à§à¦°à¦¹ করে কারà§à¦¯à¦•র ইমেইল ঠিকানা দিন" #: ../ubuntu_sso/utils/ui.py:87 msgid "There was a problem accessing the Ubuntu Single Sign On backend." msgstr "" #: ../ubuntu_sso/utils/ui.py:89 #, python-format msgid "Create %(app_name)s account" msgstr "%(app_name)s à¦à§à¦¯à¦¾à¦•াউনà§à¦Ÿ তৈরী কর" #: ../ubuntu_sso/utils/ui.py:90 msgid "Loading..." msgstr "লোড করা হচà§à¦›à§‡..." #: ../ubuntu_sso/utils/ui.py:91 msgid "Getting information, please wait..." msgstr "তথà§à¦¯ পেতে, অনà§à¦—à§à¦°à¦¹ করে অপেকà§à¦·à¦¾ করà§à¦¨..." #: ../ubuntu_sso/utils/ui.py:92 msgid "Already have an account? Click here to sign in" msgstr "ইতোমধà§à¦¯à§‡ à¦à§à¦¯à¦¾à¦•াউনà§à¦Ÿ আছে? সাইন-ইন করতে à¦à¦–ানে কà§à¦²à¦¿à¦• করà§à¦¨" #: ../ubuntu_sso/utils/ui.py:94 #, python-format msgid "Connect to %(app_name)s" msgstr "%(app_name)s à¦à¦° সঙà§à¦—ে সংযà§à¦•à§à¦¤ হোন" #: ../ubuntu_sso/utils/ui.py:95 ../ubuntu_sso/utils/ui.py:109 msgid "Password" msgstr "পাসওয়ারà§à¦¡" #: ../ubuntu_sso/utils/ui.py:97 msgid "Sign In to {app_name}" msgstr "{app_name} তে সাইন ইন হন" #: ../ubuntu_sso/utils/ui.py:99 msgid "Name" msgstr "নাম" #: ../ubuntu_sso/utils/ui.py:100 msgid "The name must not be empty." msgstr "নাম অবশà§à¦¯à¦‡ খালি হবেনা।" #: ../ubuntu_sso/utils/ui.py:101 msgid "Next" msgstr "পরবরà§à¦¤à§€" #: ../ubuntu_sso/utils/ui.py:102 msgid "Network detection" msgstr "নেটওয়ারà§à¦• সনাকà§à¦¤à¦•রণ" #: ../ubuntu_sso/utils/ui.py:103 #, python-format msgid "" "Are you online? We can't detect an internet connection - you will need to be " "connected to set up %(app_name)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:105 msgid "One moment please..." msgstr "অনà§à¦—à§à¦°à¦¹ করে অপেকà§à¦·à¦¾ করà§à¦¨..." #: ../ubuntu_sso/utils/ui.py:106 msgid "Create a password" msgstr "পাসওয়ারà§à¦¡ তৈরি করà§à¦¨" #: ../ubuntu_sso/utils/ui.py:107 msgid "Your password was successfully changed." msgstr "আপনার পাসওয়ারà§à¦¡ পরিবরà§à¦¤à¦¨ সফল হয়েছে।" #: ../ubuntu_sso/utils/ui.py:108 msgid "At least one number" msgstr "কমপকà§à¦·à§‡ à¦à¦•টি সংখà§à¦¯à¦¾" #: ../ubuntu_sso/utils/ui.py:110 msgid "Re-type Password" msgstr "পà§à¦¨à¦°à¦¾à§Ÿ পাসওয়ারà§à¦¡ টাইপ করà§à¦¨" #: ../ubuntu_sso/utils/ui.py:111 msgid "" "The password must have a minimum of 8 characters and include one uppercase " "character and one number." msgstr "" "পাসওয়ারà§à¦¡à¦Ÿà¦¿ অবশà§à¦¯à¦‡ কমপকà§à¦·à§‡ à§®-অকà§à¦·à¦° বিশিষà§à¦Ÿ হতে হবে à¦à¦¬à¦‚ à¦à¦¤à§‡ কমপকà§à¦·à§‡ à¦à¦•টি বড় " "হাতের অকà§à¦·à¦° ও à¦à¦•টি সংখà§à¦¯à¦¾ থাকতে হবে।" #: ../ubuntu_sso/utils/ui.py:113 msgid "At least 8 characters" msgstr "কমপকà§à¦·à§‡ à§® অকà§à¦·à¦°" #: ../ubuntu_sso/utils/ui.py:114 msgid "Passwords don't match" msgstr "পাসওয়ারà§à¦¡ সদৃশ নয়" #: ../ubuntu_sso/utils/ui.py:115 msgid "" "The passwords don't match, please double check and try entering them again." msgstr "" "পাসওয়ারà§à¦¡ সমূহ মিলছে না, অনà§à¦—à§à¦°à¦¹ করে পà§à¦¨à¦°à¦¾à§Ÿ পরীকà§à¦·à¦¾ করà§à¦¨ à¦à¦¬à¦‚ পà§à¦°à¦¦à¦¾à¦¨ করতে " "চেষà§à¦Ÿà¦¾ করà§à¦¨à¥¤" #: ../ubuntu_sso/utils/ui.py:117 msgid "Your password must contain" msgstr "আপনার পাসওয়ারà§à¦¡à§‡ অবশà§à¦¯à¦‡ থাকতে হবে" #: ../ubuntu_sso/utils/ui.py:118 msgid "The password is too weak." msgstr "পাসওয়ারà§à¦¡à¦Ÿà¦¿ বেশী দà§à¦°à§à¦¬à¦²à¥¤" #: ../ubuntu_sso/utils/ui.py:119 msgid "At least one uppercase letter" msgstr "কমপকà§à¦·à§‡ à¦à¦•টি বড় হাতের অকà§à¦·à¦°" #: ../ubuntu_sso/utils/ui.py:120 msgid "Privacy Policy" msgstr "গোপনীয়তা নীতি" #: ../ubuntu_sso/utils/ui.py:121 msgid "Connecting to:" msgstr "যা হতে সংযà§à¦•à§à¦¤ করা হচà§à¦›à§‡" #: ../ubuntu_sso/utils/ui.py:122 msgid "Proxy Settings" msgstr "পà§à¦°à¦•à§à¦¸à¦¿ সেটিং" #: ../ubuntu_sso/utils/ui.py:123 msgid "Incorrect login details. Please try again." msgstr "বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ লগইন ভà§à¦²à¥¤ অনà§à¦—à§à¦°à¦¹ করে আবার চেষà§à¦Ÿà¦¾ করà§à¦¨à¥¤" #: ../ubuntu_sso/utils/ui.py:124 msgid "Please provide login details." msgstr "অনà§à¦—à§à¦°à¦¹ করে লগইনের বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ পà§à¦°à¦¦à¦¾à¦¨ করà§à¦¨" #: ../ubuntu_sso/utils/ui.py:125 msgid "You are connecting through a proxy." msgstr "আপনি à¦à¦•টি পà§à¦°à¦•à§à¦¸à¦¿à¦° মাধà§à¦¯à¦®à§‡ সংযà§à¦•à§à¦¤" #: ../ubuntu_sso/utils/ui.py:126 msgid "Get Help With Proxies" msgstr "পà§à¦°à¦•à§à¦¸à¦¿à¦° মাধà§à¦¯à¦®à§‡ সহায়তা নিন" #: ../ubuntu_sso/utils/ui.py:127 msgid "Proxy password:" msgstr "পà§à¦°à¦•à§à¦¸à¦¿ পাসওয়ারà§à¦¡:" #: ../ubuntu_sso/utils/ui.py:128 msgid "Save and Connect" msgstr "সংরকà§à¦·à¦£ à¦à¦¬à¦‚ সংযà§à¦•à§à¦¤ করà§à¦¨" #: ../ubuntu_sso/utils/ui.py:129 msgid "Proxy username:" msgstr "পà§à¦°à¦•à§à¦¸à¦¿ বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•ারীর নাম:" #: ../ubuntu_sso/utils/ui.py:131 msgid "" "A password reset code has been sent to your e-mail. Please enter the code " "below along with your new password." msgstr "" #: ../ubuntu_sso/utils/ui.py:133 msgid "Retype email" msgstr "ইমেইল পà§à¦¨à¦°à¦¾à¦¯à¦¼ টাইপ করà§à¦¨" #: ../ubuntu_sso/utils/ui.py:134 msgid "Retype password" msgstr "পাসওয়ারà§à¦¡ পà§à¦¨à¦°à¦¾à¦¯à¦¼ টাইপ করà§à¦¨" #: ../ubuntu_sso/utils/ui.py:135 #, python-format msgid "To reset your %(app_name)s password, enter your email address below:" msgstr "" "%(app_name)s à¦à¦° পাসওয়ারà§à¦¡ রিসেট করতে à¦à¦–ানে আপনার ই-মেইল ঠিকানা পà§à¦°à¦¦à¦¾à¦¨ করà§à¦¨à¦ƒ" #: ../ubuntu_sso/utils/ui.py:137 msgid "" "We are very Sorry! The service that signs you on is not responding right " "now\n" "Please try again or come back in a few minutes." msgstr "" "আমরা খà§à¦¬à¦‡ দà§à¦ƒà¦–িত! সারà§à¦­à¦¿à¦¸ যাতে আপনি সাইন ইন à¦à¦‡ মà§à¦¹à§‚রà§à¦¤à§‡ সাড়া দেয়নি\n" "অনà§à¦—à§à¦°à¦¹ করে আবার চেষà§à¦Ÿà¦¾ করà§à¦¨ অথবা কয়েক মিনিটের মধà§à¦¯à§‡ ফিরে আসà§à¦¨à¥¤" #: ../ubuntu_sso/utils/ui.py:140 msgid "Sorry we did not recognize the email address." msgstr "দà§à¦ƒà¦–িত আমরা ইমেলের ঠিকানা চিনতে পারিনি।" #: ../ubuntu_sso/utils/ui.py:142 msgid "Reset code" msgstr "কোড রিসেট কর" #: ../ubuntu_sso/utils/ui.py:145 #, python-format msgid "" "A password reset code has been sent to %(email)s.\n" "Please enter the code below along with your new password." msgstr "" "à¦à¦•টি পাসওয়ারà§à¦¡ রিসেট কোড %(email)s ঠপাঠানো হয়েছে।\n" "নিমà§à¦¨à§‡ আপনার নতà§à¦¨ পাসওয়ারà§à¦¡ সহ কোডটি পà§à¦°à¦¦à¦¾à¦¨ করà§à¦¨à¥¤" #: ../ubuntu_sso/utils/ui.py:147 msgid "Set Up Account" msgstr "অà§à¦¯à¦¾à¦•াউনà§à¦Ÿ নিরà§à¦§à¦¾à¦°à¦¨ করà§à¦¨" #: ../ubuntu_sso/utils/ui.py:148 msgid "I don't have an account yet - sign me up" msgstr "আমি à¦à¦–নও কোন অà§à¦¯à¦¾à¦•াউনà§à¦Ÿ নাই - আমাকে সাইন আপ করà§à¦¨" #: ../ubuntu_sso/utils/ui.py:149 msgid "Sign In" msgstr "সাইন ইন" #: ../ubuntu_sso/utils/ui.py:150 msgid "Log-in with my existing account." msgstr "" #: ../ubuntu_sso/utils/ui.py:151 msgid "the appname whose ssl error we are going to show." msgstr "appname যার SSL তà§à¦°à§à¦Ÿà¦¿ আমরা পà§à¦°à¦¦à¦°à§à¦¶à¦¨ করতে যাচà§à¦›à¦¿à¥¤" #: ../ubuntu_sso/utils/ui.py:152 msgid "Certificate details" msgstr "সারà§à¦Ÿà¦¿à¦«à¦¿à¦•েটের বিসà§à¦¤à¦¾à¦°à¦¿à¦¤" #: ../ubuntu_sso/utils/ui.py:153 msgid "Connect" msgstr "সংযà§à¦•à§à¦¤ হোন" #: ../ubuntu_sso/utils/ui.py:154 msgid "the details ssl certificate we are going to show." msgstr "বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ SSL সারà§à¦Ÿà¦¿à¦«à¦¿à¦•েট আমরা পà§à¦°à¦¦à¦°à§à¦¶à¦¨ করতে যাচà§à¦›à¦¿à¥¤" #: ../ubuntu_sso/utils/ui.py:161 msgid "Open the SSL certificate UI." msgstr "SSL সারà§à¦Ÿà¦¿à¦«à¦¿à¦•েটের UI খà§à¦²à§à¦¨à¥¤" #: ../ubuntu_sso/utils/ui.py:162 msgid "SSL Certificate Not Valid" msgstr "SSL সারà§à¦Ÿà¦¿à¦«à¦¿à¦•েট কারà§à¦¯à¦•র নয়" #: ../ubuntu_sso/utils/ui.py:163 msgid "the domain whose ssl certificate we are going to show." msgstr "ডোমেইন যার SSL সারà§à¦Ÿà¦¿à¦«à¦¿à¦•েট আমরা পà§à¦°à¦¦à¦°à§à¦¶à¦¨ করতে যাচà§à¦›à¦¿à¥¤" #: ../ubuntu_sso/utils/ui.py:164 #, python-format msgid "" "You are trying to connect to a proxy server on %(domain)s. This server uses " "a secure connection, and the SSL certificate is not valid because:" msgstr "" "আপনি %(domain)s পà§à¦°à¦•à§à¦¸à¦¿ সারà§à¦­à¦¾à¦°à§‡ সংযà§à¦•à§à¦¤ হতে চেষà§à¦Ÿà¦¾ করছেন, à¦à¦‡ সারà§à¦­à¦¾à¦° নিরাপদ " "সংযোগ বà§à¦¯à¦¬à¦¹à¦¾à¦° করে, à¦à¦¬à¦‚ SSL সারà§à¦Ÿà¦¿à¦«à¦¿à¦•েট কারà§à¦¯à¦•র নয় কারণ:" #: ../ubuntu_sso/utils/ui.py:167 msgid "The certificate has not been verified" msgstr "সারà§à¦Ÿà¦¿à¦«à¦¿à¦•েট যাচাই করা হয় নি" #: ../ubuntu_sso/utils/ui.py:168 msgid "Do you want to connect to this server?" msgstr "আপনি কি à¦à¦‡ সারà§à¦­à¦¾à¦°à§‡ সংযà§à¦•à§à¦¤ হতে চান?" #: ../ubuntu_sso/utils/ui.py:169 msgid "Get Help With SSL" msgstr "SSL দà§à¦¬à¦¾à¦°à¦¾ সহায়তা পান" #: ../ubuntu_sso/utils/ui.py:170 #, python-format msgid "" "If you are not sure about this server, do not use it to connect to " "%(app_name)s." msgstr "" "যদি আপনি à¦à¦‡ সারà§à¦­à¦¾à¦° সমà§à¦ªà¦°à§à¦•ে নিশà§à¦šà¦¿à¦¤ না হন, %(app_name)s à¦à¦° সাথে সংযà§à¦•à§à¦¤ হতে " "à¦à¦Ÿà¦¿ বà§à¦¯à¦¬à¦¹à¦¾à¦° করবেননা।" #: ../ubuntu_sso/utils/ui.py:172 msgid "Remember my settings for this certificate." msgstr "à¦à¦‡ সারà§à¦Ÿà¦¿à¦«à¦¿à¦•েটের জনà§à¦¯ আমার সেটিং মনে রাখà§à¦¨à¥¤" #: ../ubuntu_sso/utils/ui.py:173 msgid "" "The name on the certificate isn't valid or doesn't match the name of the site" msgstr "সারà§à¦Ÿà¦¿à¦«à¦¿à¦•েটের নাম কারà§à¦¯à¦•র নয় অথবা কোন সাইটের নাম মেলে না" #: ../ubuntu_sso/utils/ui.py:175 msgid "The certificate has expired" msgstr "সারà§à¦Ÿà¦¿à¦«à¦¿à¦•েটের মেয়াদউরà§à¦¤à§à¦¤à§€à¦£ হয়েছে" #: ../ubuntu_sso/utils/ui.py:176 #, python-format msgid "You are now logged into %(app_name)s." msgstr "আপনি à¦à¦–ন %(app_name)s তে লগইন।" #: ../ubuntu_sso/utils/ui.py:177 msgid "Surname" msgstr "Surname" #: ../ubuntu_sso/utils/ui.py:178 msgid "Terms of Service" msgstr "সারà§à¦­à¦¿à¦¸à§‡à¦° শরà§à¦¤à¦¾à¦¬à¦²à§€" #: ../ubuntu_sso/utils/ui.py:179 msgid "Sign Up to {app_name}" msgstr "{app_name} তে সাইন আপ হোন" #: ../ubuntu_sso/utils/ui.py:180 msgid "Show Terms & Conditions" msgstr "বà§à¦¯à¦¬à¦¹à¦¾à¦°à§‡à¦° শরà§à¦¤à¦¾à¦¬à¦²à§€ দেখাও" #: ../ubuntu_sso/utils/ui.py:181 #, python-format msgid "" "Agreeing to the %(app_name)s Terms & Conditions is required to subscribe." msgstr "" "%(app_name)s তে সমà§à¦®à¦¤ হতে শরà§à¦¤à¦¾à¦¬à¦²à§€ à¦à¦¬à¦‚ অবসà§à¦¥à¦¾ সাবসà§à¦•à§à¦°à¦¾à¦‡à¦¬ করতে আবশà§à¦¯à¦•।" #: ../ubuntu_sso/utils/ui.py:183 #, python-format msgid "You can also find these terms at %(url)s" msgstr "আপনি à¦à¦‡ শরà§à¦¤à¦¾à¦¬à¦²à§€ %(url)s তে পেতে পারেন" #: ../ubuntu_sso/utils/ui.py:184 msgid "Try again" msgstr "পà§à¦¨à¦°à¦¾à§Ÿ চেষà§à¦Ÿà¦¾ করà§à¦¨" #: ../ubuntu_sso/utils/ui.py:185 msgid "" "There was an error when trying to complete the process. Please check the " "information and try again." msgstr "" "পà§à¦°à¦•à§à¦°à¦¿à§Ÿà¦¾à¦Ÿà¦¿ সমà§à¦ªà¦¨à§à¦¨ করার সময় à¦à¦•টি কà§à¦°à§à¦Ÿà¦¿ দেখা দিয়েছে। অনà§à¦—à§à¦°à¦¹ করে তথà§à¦¯à¦¾à¦¬à¦²à§€ " "পরীকà§à¦·à¦¾ করà§à¦¨ à¦à¦¬à¦‚ পà§à¦¨à¦°à¦¾à§Ÿ চেষà§à¦Ÿà¦¾ করà§à¦¨à¥¤" #: ../ubuntu_sso/utils/ui.py:187 msgid "Verification code" msgstr "যাচাই কোড" #: ../ubuntu_sso/utils/ui.py:188 #, python-format msgid "" "Check %(email)s for an email from Ubuntu Single Sign On. This message " "contains a verification code. Enter the code in the field below and click OK " "to complete creating your %(app_name)s account." msgstr "" "উবà§à¦¨à§à¦Ÿà§ à¦à¦•ক লগইন থেকে ইমেইলের জনà§à¦¯ %(email)s বাছাই করà§à¦¨à¥¤ à¦à¦‡ বারà§à¦¤à¦¾ যাচাই কোড " "ধারণ করে। নিমà§à¦¨à§‡à¦° কà§à¦·à§‡à¦¤à§à¦°à§‡ কোড দিন à¦à¦¬à¦‚ আপনার %(app_name)s অà§à¦¯à¦¾à¦•াউনà§à¦Ÿ তৈরি " "সমà§à¦ªà¦¨à§à¦¨ করতে OK কà§à¦²à¦¿à¦• করà§à¦¨à¥¤" #: ../ubuntu_sso/utils/ui.py:192 msgid "Enter verification code" msgstr "ভেরিফিকেশন কোডটি পà§à¦°à¦¦à¦¾à¦¨ করà§à¦¨" #: ../ubuntu_sso/utils/ui.py:195 #, python-format msgid "I agree with the %(app_name)s terms and conditions" msgstr "আমি %(app_name)s à¦à¦° শরà§à¦¤à¦¾à¦¬à¦²à§€à¦° সঙà§à¦—ে à¦à¦•মত" #: ../ubuntu_sso/utils/ui.py:196 #, python-format msgid "Yes! Email me %(app_name)s tips and updates." msgstr "হà§à¦¯à¦¾à¦! %(app_name)s à¦à¦° টিপ ও আপডেট আমাকে ই-মেইল কর।" ubuntu-sso-client-13.10/po/ne.po0000664000202700020270000002716412151461656016743 0ustar dobeydobey00000000000000# Nepali translation for ubuntu-sso-client # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the ubuntu-sso-client package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: ubuntu-sso-client\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-09-11 18:25+0000\n" "PO-Revision-Date: 2010-09-14 11:00+0000\n" "Last-Translator: Rabi Poudyal \n" "Language-Team: Nepali \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-09-17 18:24+0000\n" "X-Generator: Launchpad (build 15944)\n" #. Undefined variable '_', pylint: disable=E0602 #. all the text that is used in the gui #: ../ubuntu_sso/utils/ui.py:49 msgid "By signing up to {app_name} you agree to our {privacy_policy}" msgstr "" #: ../ubuntu_sso/utils/ui.py:51 msgid "By signing up to {app_name} you agree to our {terms_and_conditions}" msgstr "" #: ../ubuntu_sso/utils/ui.py:53 msgid " and {privacy_policy}" msgstr "" #: ../ubuntu_sso/utils/ui.py:54 msgid "Cancel" msgstr "" #: ../ubuntu_sso/utils/ui.py:55 msgid "Type the characters above" msgstr "माथिका अकà¥à¤·à¤°à¤¹à¤°à¥‚ टाइप गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥" #: ../ubuntu_sso/utils/ui.py:56 msgid "There was a problem getting the captcha, reloading..." msgstr "" #: ../ubuntu_sso/utils/ui.py:58 #, python-format msgid "If you can't read this then %(reload_link)s this page" msgstr "" #: ../ubuntu_sso/utils/ui.py:60 msgid "refresh" msgstr "" #: ../ubuntu_sso/utils/ui.py:61 msgid "Reload" msgstr "पà¥à¤¨:लोड गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥" #: ../ubuntu_sso/utils/ui.py:62 msgid "The captcha is a required field" msgstr "" #: ../ubuntu_sso/utils/ui.py:63 msgid "Close window and set up later" msgstr "" #: ../ubuntu_sso/utils/ui.py:64 msgid "Congratulations, {app_name} is installed!" msgstr "" #: ../ubuntu_sso/utils/ui.py:65 #, python-format msgid "To connect this computer to %(app_name)s enter your details below." msgstr "" #: ../ubuntu_sso/utils/ui.py:67 msgid "Register with {app_name}." msgstr "" #: ../ubuntu_sso/utils/ui.py:68 ../ubuntu_sso/utils/ui.py:93 #: ../ubuntu_sso/utils/ui.py:143 msgid "Email address" msgstr "इमेल ठेगाना" #: ../ubuntu_sso/utils/ui.py:69 msgid "Re-type Email address" msgstr "इमेल ठेगाना पà¥à¤¨à¤ƒ टाइप गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥" #: ../ubuntu_sso/utils/ui.py:70 msgid "The email must be a valid email address." msgstr "" #: ../ubuntu_sso/utils/ui.py:71 msgid "" "The email addresses don't match, please double check and try entering them " "again." msgstr "" #: ../ubuntu_sso/utils/ui.py:73 msgid "Email" msgstr "" #: ../ubuntu_sso/utils/ui.py:74 msgid "The email addresses do not match" msgstr "" #: ../ubuntu_sso/utils/ui.py:75 msgid "Enter code verification here" msgstr "" #: ../ubuntu_sso/utils/ui.py:76 msgid "Please enter your name" msgstr "" #: ../ubuntu_sso/utils/ui.py:77 msgid "The process did not finish successfully." msgstr "" #: ../ubuntu_sso/utils/ui.py:79 msgid "Sign me in with my existing account" msgstr "" #: ../ubuntu_sso/utils/ui.py:80 msgid "This field is required." msgstr "" #: ../ubuntu_sso/utils/ui.py:81 msgid "I've forgotten my password" msgstr "" #: ../ubuntu_sso/utils/ui.py:82 ../ubuntu_sso/utils/ui.py:130 msgid "Reset password" msgstr "पासवरà¥à¤¡ रिसेट गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤" #: ../ubuntu_sso/utils/ui.py:83 msgid "" "To reset your {app_name} password, enter your registered email address " "below. We will send instructions to reset your password." msgstr "" #: ../ubuntu_sso/utils/ui.py:86 msgid "Please enter a valid email address" msgstr "" #: ../ubuntu_sso/utils/ui.py:87 msgid "There was a problem accessing the Ubuntu Single Sign On backend." msgstr "" #: ../ubuntu_sso/utils/ui.py:89 #, python-format msgid "Create %(app_name)s account" msgstr "" #: ../ubuntu_sso/utils/ui.py:90 msgid "Loading..." msgstr "लोड हà¥à¤à¤¦à¥ˆà¤›..." #: ../ubuntu_sso/utils/ui.py:91 msgid "Getting information, please wait..." msgstr "" #: ../ubuntu_sso/utils/ui.py:92 msgid "Already have an account? Click here to sign in" msgstr "" #: ../ubuntu_sso/utils/ui.py:94 #, python-format msgid "Connect to %(app_name)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:95 ../ubuntu_sso/utils/ui.py:109 msgid "Password" msgstr "पासवरà¥à¤¡" #: ../ubuntu_sso/utils/ui.py:97 msgid "Sign In to {app_name}" msgstr "" #: ../ubuntu_sso/utils/ui.py:99 msgid "Name" msgstr "नाम" #: ../ubuntu_sso/utils/ui.py:100 msgid "The name must not be empty." msgstr "" #: ../ubuntu_sso/utils/ui.py:101 msgid "Next" msgstr "अरà¥à¤•ो" #: ../ubuntu_sso/utils/ui.py:102 msgid "Network detection" msgstr "" #: ../ubuntu_sso/utils/ui.py:103 #, python-format msgid "" "Are you online? We can't detect an internet connection - you will need to be " "connected to set up %(app_name)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:105 msgid "One moment please..." msgstr "कृपया à¤à¤•छिन..." #: ../ubuntu_sso/utils/ui.py:106 msgid "Create a password" msgstr "" #: ../ubuntu_sso/utils/ui.py:107 msgid "Your password was successfully changed." msgstr "तपाईको पासवरà¥à¤¡ सफलतपूरà¥à¤µà¤• परिवरà¥à¤¤à¤¨ भयो।" #: ../ubuntu_sso/utils/ui.py:108 msgid "At least one number" msgstr "" #: ../ubuntu_sso/utils/ui.py:110 msgid "Re-type Password" msgstr "पासवरà¥à¤¡ पà¥à¤¨à¤ƒ टाइप गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥" #: ../ubuntu_sso/utils/ui.py:111 msgid "" "The password must have a minimum of 8 characters and include one uppercase " "character and one number." msgstr "" "पासवरà¥à¤¡ नà¥à¤¯à¥‚नतम ८ अकà¥à¤·à¤°à¤•ो हà¥à¤¨à¥à¤ªà¤°à¥à¤› साथै à¤à¤•वटा ठूलो अकà¥à¤·à¤° र à¤à¤•वटा अङà¥à¤• समावेश " "हà¥à¤¨à¥à¤ªà¤°à¥à¤›à¥¤" #: ../ubuntu_sso/utils/ui.py:113 msgid "At least 8 characters" msgstr "" #: ../ubuntu_sso/utils/ui.py:114 msgid "Passwords don't match" msgstr "" #: ../ubuntu_sso/utils/ui.py:115 msgid "" "The passwords don't match, please double check and try entering them again." msgstr "पासवरà¥à¤¡à¤¹à¤°à¥‚ मिलेननà¥, कृपया फेरि जाà¤à¤š गरी पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤" #: ../ubuntu_sso/utils/ui.py:117 msgid "Your password must contain" msgstr "" #: ../ubuntu_sso/utils/ui.py:118 msgid "The password is too weak." msgstr "पासवरà¥à¤¡ निकै कमजोर छ।" #: ../ubuntu_sso/utils/ui.py:119 msgid "At least one uppercase letter" msgstr "" #: ../ubuntu_sso/utils/ui.py:120 msgid "Privacy Policy" msgstr "" #: ../ubuntu_sso/utils/ui.py:121 msgid "Connecting to:" msgstr "" #: ../ubuntu_sso/utils/ui.py:122 msgid "Proxy Settings" msgstr "" #: ../ubuntu_sso/utils/ui.py:123 msgid "Incorrect login details. Please try again." msgstr "" #: ../ubuntu_sso/utils/ui.py:124 msgid "Please provide login details." msgstr "" #: ../ubuntu_sso/utils/ui.py:125 msgid "You are connecting through a proxy." msgstr "" #: ../ubuntu_sso/utils/ui.py:126 msgid "Get Help With Proxies" msgstr "" #: ../ubuntu_sso/utils/ui.py:127 msgid "Proxy password:" msgstr "" #: ../ubuntu_sso/utils/ui.py:128 msgid "Save and Connect" msgstr "" #: ../ubuntu_sso/utils/ui.py:129 msgid "Proxy username:" msgstr "" #: ../ubuntu_sso/utils/ui.py:131 msgid "" "A password reset code has been sent to your e-mail. Please enter the code " "below along with your new password." msgstr "" #: ../ubuntu_sso/utils/ui.py:133 msgid "Retype email" msgstr "" #: ../ubuntu_sso/utils/ui.py:134 msgid "Retype password" msgstr "" #: ../ubuntu_sso/utils/ui.py:135 #, python-format msgid "To reset your %(app_name)s password, enter your email address below:" msgstr "" #: ../ubuntu_sso/utils/ui.py:137 msgid "" "We are very Sorry! The service that signs you on is not responding right " "now\n" "Please try again or come back in a few minutes." msgstr "" #: ../ubuntu_sso/utils/ui.py:140 msgid "Sorry we did not recognize the email address." msgstr "" #: ../ubuntu_sso/utils/ui.py:142 msgid "Reset code" msgstr "रिसेट कोड" #: ../ubuntu_sso/utils/ui.py:145 #, python-format msgid "" "A password reset code has been sent to %(email)s.\n" "Please enter the code below along with your new password." msgstr "" #: ../ubuntu_sso/utils/ui.py:147 msgid "Set Up Account" msgstr "" #: ../ubuntu_sso/utils/ui.py:148 msgid "I don't have an account yet - sign me up" msgstr "" #: ../ubuntu_sso/utils/ui.py:149 msgid "Sign In" msgstr "" #: ../ubuntu_sso/utils/ui.py:150 msgid "Log-in with my existing account." msgstr "" #: ../ubuntu_sso/utils/ui.py:151 msgid "the appname whose ssl error we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:152 msgid "Certificate details" msgstr "" #: ../ubuntu_sso/utils/ui.py:153 msgid "Connect" msgstr "" #: ../ubuntu_sso/utils/ui.py:154 msgid "the details ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:161 msgid "Open the SSL certificate UI." msgstr "" #: ../ubuntu_sso/utils/ui.py:162 msgid "SSL Certificate Not Valid" msgstr "" #: ../ubuntu_sso/utils/ui.py:163 msgid "the domain whose ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:164 #, python-format msgid "" "You are trying to connect to a proxy server on %(domain)s. This server uses " "a secure connection, and the SSL certificate is not valid because:" msgstr "" #: ../ubuntu_sso/utils/ui.py:167 msgid "The certificate has not been verified" msgstr "" #: ../ubuntu_sso/utils/ui.py:168 msgid "Do you want to connect to this server?" msgstr "" #: ../ubuntu_sso/utils/ui.py:169 msgid "Get Help With SSL" msgstr "" #: ../ubuntu_sso/utils/ui.py:170 #, python-format msgid "" "If you are not sure about this server, do not use it to connect to " "%(app_name)s." msgstr "" #: ../ubuntu_sso/utils/ui.py:172 msgid "Remember my settings for this certificate." msgstr "" #: ../ubuntu_sso/utils/ui.py:173 msgid "" "The name on the certificate isn't valid or doesn't match the name of the site" msgstr "" #: ../ubuntu_sso/utils/ui.py:175 msgid "The certificate has expired" msgstr "" #: ../ubuntu_sso/utils/ui.py:176 #, python-format msgid "You are now logged into %(app_name)s." msgstr "" #: ../ubuntu_sso/utils/ui.py:177 msgid "Surname" msgstr "" #: ../ubuntu_sso/utils/ui.py:178 msgid "Terms of Service" msgstr "" #: ../ubuntu_sso/utils/ui.py:179 msgid "Sign Up to {app_name}" msgstr "" #: ../ubuntu_sso/utils/ui.py:180 msgid "Show Terms & Conditions" msgstr "" #: ../ubuntu_sso/utils/ui.py:181 #, python-format msgid "" "Agreeing to the %(app_name)s Terms & Conditions is required to subscribe." msgstr "" #: ../ubuntu_sso/utils/ui.py:183 #, python-format msgid "You can also find these terms at %(url)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:184 msgid "Try again" msgstr "" #: ../ubuntu_sso/utils/ui.py:185 msgid "" "There was an error when trying to complete the process. Please check the " "information and try again." msgstr "" #: ../ubuntu_sso/utils/ui.py:187 msgid "Verification code" msgstr "" #: ../ubuntu_sso/utils/ui.py:188 #, python-format msgid "" "Check %(email)s for an email from Ubuntu Single Sign On. This message " "contains a verification code. Enter the code in the field below and click OK " "to complete creating your %(app_name)s account." msgstr "" #: ../ubuntu_sso/utils/ui.py:192 msgid "Enter verification code" msgstr "" #: ../ubuntu_sso/utils/ui.py:195 #, python-format msgid "I agree with the %(app_name)s terms and conditions" msgstr "" #: ../ubuntu_sso/utils/ui.py:196 #, python-format msgid "Yes! Email me %(app_name)s tips and updates." msgstr "" ubuntu-sso-client-13.10/po/eo.po0000664000202700020270000003277612151461656016751 0ustar dobeydobey00000000000000# Esperanto translation for ubuntu-sso-client # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the ubuntu-sso-client package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: ubuntu-sso-client\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-09-11 18:25+0000\n" "PO-Revision-Date: 2012-09-10 08:59+0000\n" "Last-Translator: Michael Moroni \n" "Language-Team: Esperanto \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-09-17 18:24+0000\n" "X-Generator: Launchpad (build 15944)\n" #. Undefined variable '_', pylint: disable=E0602 #. all the text that is used in the gui #: ../ubuntu_sso/utils/ui.py:49 msgid "By signing up to {app_name} you agree to our {privacy_policy}" msgstr "EnskribiÄante al {app_name} vi jesas al nia {privacy_policy}" #: ../ubuntu_sso/utils/ui.py:51 msgid "By signing up to {app_name} you agree to our {terms_and_conditions}" msgstr "EnskribiÄante al {app_name} vi jesas al niaj {terms_and_conditions}" #: ../ubuntu_sso/utils/ui.py:53 msgid " and {privacy_policy}" msgstr " kaj {privacy_policy}" #: ../ubuntu_sso/utils/ui.py:54 msgid "Cancel" msgstr "Nuligi" #: ../ubuntu_sso/utils/ui.py:55 msgid "Type the characters above" msgstr "Entajpu la suprajn signojn" #: ../ubuntu_sso/utils/ui.py:56 msgid "There was a problem getting the captcha, reloading..." msgstr "Problemo okazis dum obtenado de la homecpruvilo. ReÅarganta..." #: ../ubuntu_sso/utils/ui.py:58 #, python-format msgid "If you can't read this then %(reload_link)s this page" msgstr "Se vi ne povas legi Äin do %(reload_link)s ĉi tiun paÄon" #: ../ubuntu_sso/utils/ui.py:60 msgid "refresh" msgstr "aktualigu" #: ../ubuntu_sso/utils/ui.py:61 msgid "Reload" msgstr "ReÅargi" #: ../ubuntu_sso/utils/ui.py:62 msgid "The captcha is a required field" msgstr "CAPTCHA estas petita kampo" #: ../ubuntu_sso/utils/ui.py:63 msgid "Close window and set up later" msgstr "Fermi la fenestron kaj agordi Äin poste" #: ../ubuntu_sso/utils/ui.py:64 msgid "Congratulations, {app_name} is installed!" msgstr "Gratulojn, {app_name} estas instalita!" #: ../ubuntu_sso/utils/ui.py:65 #, python-format msgid "To connect this computer to %(app_name)s enter your details below." msgstr "" "Por konekti ĉi tiun komputilon al %(app_name)s entajpu viajn detalojn sube." #: ../ubuntu_sso/utils/ui.py:67 msgid "Register with {app_name}." msgstr "Registri per {app_name}." #: ../ubuntu_sso/utils/ui.py:68 ../ubuntu_sso/utils/ui.py:93 #: ../ubuntu_sso/utils/ui.py:143 msgid "Email address" msgstr "RetpoÅtadreso" #: ../ubuntu_sso/utils/ui.py:69 msgid "Re-type Email address" msgstr "Retajpu retpoÅtadreson" #: ../ubuntu_sso/utils/ui.py:70 msgid "The email must be a valid email address." msgstr "La retpoÅtadreso devas esti valida retpoÅtadreso" #: ../ubuntu_sso/utils/ui.py:71 msgid "" "The email addresses don't match, please double check and try entering them " "again." msgstr "" "La retpoÅtadresoj ne kongruas. Bonvole kontrolu ilin kaj reprovu retajpante " "ilin." #: ../ubuntu_sso/utils/ui.py:73 msgid "Email" msgstr "RetpoÅtadreso" #: ../ubuntu_sso/utils/ui.py:74 msgid "The email addresses do not match" msgstr "La retpoÅtadresoj ne kongruas" #: ../ubuntu_sso/utils/ui.py:75 msgid "Enter code verification here" msgstr "Entajpu kontrolkodon ĉi tie" #: ../ubuntu_sso/utils/ui.py:76 msgid "Please enter your name" msgstr "Bonvole entajpu vian nomon" #: ../ubuntu_sso/utils/ui.py:77 msgid "The process did not finish successfully." msgstr "La procezo nesukcese finiÄis." #: ../ubuntu_sso/utils/ui.py:79 msgid "Sign me in with my existing account" msgstr "Ensaluti min per mia ekzistanta konto" #: ../ubuntu_sso/utils/ui.py:80 msgid "This field is required." msgstr "Ĉi tiu kampo estas deviga." #: ../ubuntu_sso/utils/ui.py:81 msgid "I've forgotten my password" msgstr "Mi forgesis mian pasvorton" #: ../ubuntu_sso/utils/ui.py:82 ../ubuntu_sso/utils/ui.py:130 msgid "Reset password" msgstr "Reagordi pasvorton" #: ../ubuntu_sso/utils/ui.py:83 msgid "" "To reset your {app_name} password, enter your registered email address " "below. We will send instructions to reset your password." msgstr "" #: ../ubuntu_sso/utils/ui.py:86 msgid "Please enter a valid email address" msgstr "Bonvole entajpu validan retadreson" #: ../ubuntu_sso/utils/ui.py:87 msgid "There was a problem accessing the Ubuntu Single Sign On backend." msgstr "" #: ../ubuntu_sso/utils/ui.py:89 #, python-format msgid "Create %(app_name)s account" msgstr "Krei konton por %(app_name)s" #: ../ubuntu_sso/utils/ui.py:90 msgid "Loading..." msgstr "Åœarganta..." #: ../ubuntu_sso/utils/ui.py:91 msgid "Getting information, please wait..." msgstr "Obtenanta informojn, bonvole atendu..." #: ../ubuntu_sso/utils/ui.py:92 msgid "Already have an account? Click here to sign in" msgstr "Ĉu vi jam havas konton? Alklaku ĉi tie por ensaluti" #: ../ubuntu_sso/utils/ui.py:94 #, python-format msgid "Connect to %(app_name)s" msgstr "Konekti al %(app_name)s" #: ../ubuntu_sso/utils/ui.py:95 ../ubuntu_sso/utils/ui.py:109 msgid "Password" msgstr "Pasvorto" #: ../ubuntu_sso/utils/ui.py:97 msgid "Sign In to {app_name}" msgstr "Ensaluti al {app_name}" #: ../ubuntu_sso/utils/ui.py:99 msgid "Name" msgstr "Nomo" #: ../ubuntu_sso/utils/ui.py:100 msgid "The name must not be empty." msgstr "Nomo ne estu malplena." #: ../ubuntu_sso/utils/ui.py:101 msgid "Next" msgstr "Sekva" #: ../ubuntu_sso/utils/ui.py:102 msgid "Network detection" msgstr "Detektado de reto" #: ../ubuntu_sso/utils/ui.py:103 #, python-format msgid "" "Are you online? We can't detect an internet connection - you will need to be " "connected to set up %(app_name)s" msgstr "" "Cu vi estas interrete? Ni ne kapablas detekti vian interretan konekton - vi " "necesos retkonekton por agordi %(app_name)s" #: ../ubuntu_sso/utils/ui.py:105 msgid "One moment please..." msgstr "Momenton bonvolu..." #: ../ubuntu_sso/utils/ui.py:106 msgid "Create a password" msgstr "Krei pasvorton" #: ../ubuntu_sso/utils/ui.py:107 msgid "Your password was successfully changed." msgstr "Via pasvorto sukcese ÅanÄiÄis." #: ../ubuntu_sso/utils/ui.py:108 msgid "At least one number" msgstr "AlmenaÅ­ unu numeron" #: ../ubuntu_sso/utils/ui.py:110 msgid "Re-type Password" msgstr "Retajpu pasvorton" #: ../ubuntu_sso/utils/ui.py:111 msgid "" "The password must have a minimum of 8 characters and include one uppercase " "character and one number." msgstr "" "La pasvorto konsistu el minimume 8 signoj kaj enhavu unu majusklan literon " "kaj unu ciferon." #: ../ubuntu_sso/utils/ui.py:113 msgid "At least 8 characters" msgstr "AlmenaÅ­ 8 karaktrojn" #: ../ubuntu_sso/utils/ui.py:114 msgid "Passwords don't match" msgstr "Pasvortoj ne kongruas" #: ../ubuntu_sso/utils/ui.py:115 msgid "" "The passwords don't match, please double check and try entering them again." msgstr "La pasvortoj ne kongruas. Bonvole kontrolu kaj reentajpu ilin." #: ../ubuntu_sso/utils/ui.py:117 msgid "Your password must contain" msgstr "Via pasvorto enhavu" #: ../ubuntu_sso/utils/ui.py:118 msgid "The password is too weak." msgstr "La pasvorto estas tro malforta." #: ../ubuntu_sso/utils/ui.py:119 msgid "At least one uppercase letter" msgstr "AlmenaÅ­ unu majusklan literon" #: ../ubuntu_sso/utils/ui.py:120 msgid "Privacy Policy" msgstr "Politiko pri privateco" #: ../ubuntu_sso/utils/ui.py:121 msgid "Connecting to:" msgstr "Konektanta al:" #: ../ubuntu_sso/utils/ui.py:122 msgid "Proxy Settings" msgstr "Agordoj de prokurilo" #: ../ubuntu_sso/utils/ui.py:123 msgid "Incorrect login details. Please try again." msgstr "Nekorektaj datumoj de ensaluto. Bonvole provu denove." #: ../ubuntu_sso/utils/ui.py:124 msgid "Please provide login details." msgstr "Bonvole provizi datumojn de ensaluto." #: ../ubuntu_sso/utils/ui.py:125 msgid "You are connecting through a proxy." msgstr "Vi estas konektanta per prokurilo." #: ../ubuntu_sso/utils/ui.py:126 msgid "Get Help With Proxies" msgstr "Obteni helpon kun prokuriloj" #: ../ubuntu_sso/utils/ui.py:127 msgid "Proxy password:" msgstr "Pasvorto de prokurilo:" #: ../ubuntu_sso/utils/ui.py:128 msgid "Save and Connect" msgstr "Konservi kaj konekti" #: ../ubuntu_sso/utils/ui.py:129 msgid "Proxy username:" msgstr "Uzantnomo de prokurilo:" #: ../ubuntu_sso/utils/ui.py:131 msgid "" "A password reset code has been sent to your e-mail. Please enter the code " "below along with your new password." msgstr "" #: ../ubuntu_sso/utils/ui.py:133 msgid "Retype email" msgstr "Retajpi retpoÅtadreson" #: ../ubuntu_sso/utils/ui.py:134 msgid "Retype password" msgstr "Retajpi pasvorton" #: ../ubuntu_sso/utils/ui.py:135 #, python-format msgid "To reset your %(app_name)s password, enter your email address below:" msgstr "" "Por reagordi la pasporton de %(app_name)s entajpu vian repoÅtadreson sube:" #: ../ubuntu_sso/utils/ui.py:137 msgid "" "We are very Sorry! The service that signs you on is not responding right " "now\n" "Please try again or come back in a few minutes." msgstr "" #: ../ubuntu_sso/utils/ui.py:140 msgid "Sorry we did not recognize the email address." msgstr "Pardonu, ni ne rekonis la retpoÅtadreson." #: ../ubuntu_sso/utils/ui.py:142 msgid "Reset code" msgstr "Reagordi kodon" #: ../ubuntu_sso/utils/ui.py:145 #, python-format msgid "" "A password reset code has been sent to %(email)s.\n" "Please enter the code below along with your new password." msgstr "" "Kodo por reagordi la pasvorton estis ĵus sendita al %(email)s.\n" "Bonvole entajpu la kodon sube, kune kun via nova pasvorto." #: ../ubuntu_sso/utils/ui.py:147 msgid "Set Up Account" msgstr "Agordi konton" #: ../ubuntu_sso/utils/ui.py:148 msgid "I don't have an account yet - sign me up" msgstr "Mi ankoraÅ­ ne havas konton - enskribiÄi" #: ../ubuntu_sso/utils/ui.py:149 msgid "Sign In" msgstr "Ensaluti" #: ../ubuntu_sso/utils/ui.py:150 msgid "Log-in with my existing account." msgstr "Ensaluti per mia ekzistanta konto." #: ../ubuntu_sso/utils/ui.py:151 msgid "the appname whose ssl error we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:152 msgid "Certificate details" msgstr "Detaloj pri atestilo" #: ../ubuntu_sso/utils/ui.py:153 msgid "Connect" msgstr "Konekti" #: ../ubuntu_sso/utils/ui.py:154 msgid "the details ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:161 msgid "Open the SSL certificate UI." msgstr "Malfermi la uzantinterfacon por SSL-atestilo" #: ../ubuntu_sso/utils/ui.py:162 msgid "SSL Certificate Not Valid" msgstr "SSL-atestilo nevalida" #: ../ubuntu_sso/utils/ui.py:163 msgid "the domain whose ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:164 #, python-format msgid "" "You are trying to connect to a proxy server on %(domain)s. This server uses " "a secure connection, and the SSL certificate is not valid because:" msgstr "" #: ../ubuntu_sso/utils/ui.py:167 msgid "The certificate has not been verified" msgstr "La atestilo ne estis kontrolata" #: ../ubuntu_sso/utils/ui.py:168 msgid "Do you want to connect to this server?" msgstr "Ĉu vi volas konekti al ĉi tiu servilo?" #: ../ubuntu_sso/utils/ui.py:169 msgid "Get Help With SSL" msgstr "Obteni helpon pri SSL" #: ../ubuntu_sso/utils/ui.py:170 #, python-format msgid "" "If you are not sure about this server, do not use it to connect to " "%(app_name)s." msgstr "" #: ../ubuntu_sso/utils/ui.py:172 msgid "Remember my settings for this certificate." msgstr "" #: ../ubuntu_sso/utils/ui.py:173 msgid "" "The name on the certificate isn't valid or doesn't match the name of the site" msgstr "" #: ../ubuntu_sso/utils/ui.py:175 msgid "The certificate has expired" msgstr "La atestilo eksvalidiÄis" #: ../ubuntu_sso/utils/ui.py:176 #, python-format msgid "You are now logged into %(app_name)s." msgstr "Vi nun ensalutis al %(app_name)s." #: ../ubuntu_sso/utils/ui.py:177 msgid "Surname" msgstr "Familinomo" #: ../ubuntu_sso/utils/ui.py:178 msgid "Terms of Service" msgstr "Servkondiĉoj" #: ../ubuntu_sso/utils/ui.py:179 msgid "Sign Up to {app_name}" msgstr "EnskribiÄi al {app_name}" #: ../ubuntu_sso/utils/ui.py:180 msgid "Show Terms & Conditions" msgstr "Montri kondiĉojn" #: ../ubuntu_sso/utils/ui.py:181 #, python-format msgid "" "Agreeing to the %(app_name)s Terms & Conditions is required to subscribe." msgstr "" #: ../ubuntu_sso/utils/ui.py:183 #, python-format msgid "You can also find these terms at %(url)s" msgstr "" "Vi povas trovi ĉi tiujn kondiĉojn ankaÅ­ ĉe %(url)s" #: ../ubuntu_sso/utils/ui.py:184 msgid "Try again" msgstr "Provu denove" #: ../ubuntu_sso/utils/ui.py:185 msgid "" "There was an error when trying to complete the process. Please check the " "information and try again." msgstr "" "Eraro okazis dum finiÄo de la procezo. Bonvole kontrolu la informojn kaj " "reprovu." #: ../ubuntu_sso/utils/ui.py:187 msgid "Verification code" msgstr "Kontrolkodo" #: ../ubuntu_sso/utils/ui.py:188 #, python-format msgid "" "Check %(email)s for an email from Ubuntu Single Sign On. This message " "contains a verification code. Enter the code in the field below and click OK " "to complete creating your %(app_name)s account." msgstr "" #: ../ubuntu_sso/utils/ui.py:192 msgid "Enter verification code" msgstr "Entajpu kontrolkodon" #: ../ubuntu_sso/utils/ui.py:195 #, python-format msgid "I agree with the %(app_name)s terms and conditions" msgstr "Mi konsentas kun la kondiĉoj de %(app_name)s" #: ../ubuntu_sso/utils/ui.py:196 #, python-format msgid "Yes! Email me %(app_name)s tips and updates." msgstr "Jes! Sendu al mi konsiletojn kaj Äisdatigojn por %(app_name)s." ubuntu-sso-client-13.10/po/hy.po0000664000202700020270000002512612151461656016755 0ustar dobeydobey00000000000000# Armenian translation for ubuntu-sso-client # Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 # This file is distributed under the same license as the ubuntu-sso-client package. # FIRST AUTHOR , 2011. # msgid "" msgstr "" "Project-Id-Version: ubuntu-sso-client\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-09-11 18:25+0000\n" "PO-Revision-Date: 2011-03-11 21:59+0000\n" "Last-Translator: Serj Safarian \n" "Language-Team: Armenian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-09-17 18:24+0000\n" "X-Generator: Launchpad (build 15944)\n" #. Undefined variable '_', pylint: disable=E0602 #. all the text that is used in the gui #: ../ubuntu_sso/utils/ui.py:49 msgid "By signing up to {app_name} you agree to our {privacy_policy}" msgstr "" #: ../ubuntu_sso/utils/ui.py:51 msgid "By signing up to {app_name} you agree to our {terms_and_conditions}" msgstr "" #: ../ubuntu_sso/utils/ui.py:53 msgid " and {privacy_policy}" msgstr "" #: ../ubuntu_sso/utils/ui.py:54 msgid "Cancel" msgstr "" #: ../ubuntu_sso/utils/ui.py:55 msgid "Type the characters above" msgstr "" #: ../ubuntu_sso/utils/ui.py:56 msgid "There was a problem getting the captcha, reloading..." msgstr "" #: ../ubuntu_sso/utils/ui.py:58 #, python-format msgid "If you can't read this then %(reload_link)s this page" msgstr "" #: ../ubuntu_sso/utils/ui.py:60 msgid "refresh" msgstr "" #: ../ubuntu_sso/utils/ui.py:61 msgid "Reload" msgstr "" #: ../ubuntu_sso/utils/ui.py:62 msgid "The captcha is a required field" msgstr "" #: ../ubuntu_sso/utils/ui.py:63 msgid "Close window and set up later" msgstr "" #: ../ubuntu_sso/utils/ui.py:64 msgid "Congratulations, {app_name} is installed!" msgstr "" #: ../ubuntu_sso/utils/ui.py:65 #, python-format msgid "To connect this computer to %(app_name)s enter your details below." msgstr "" #: ../ubuntu_sso/utils/ui.py:67 msgid "Register with {app_name}." msgstr "" #: ../ubuntu_sso/utils/ui.py:68 ../ubuntu_sso/utils/ui.py:93 #: ../ubuntu_sso/utils/ui.py:143 msgid "Email address" msgstr "Ô·Õ¬. Õ°Õ¡Õ½ÖÕ¥" #: ../ubuntu_sso/utils/ui.py:69 msgid "Re-type Email address" msgstr "" #: ../ubuntu_sso/utils/ui.py:70 msgid "The email must be a valid email address." msgstr "" #: ../ubuntu_sso/utils/ui.py:71 msgid "" "The email addresses don't match, please double check and try entering them " "again." msgstr "" #: ../ubuntu_sso/utils/ui.py:73 msgid "Email" msgstr "" #: ../ubuntu_sso/utils/ui.py:74 msgid "The email addresses do not match" msgstr "" #: ../ubuntu_sso/utils/ui.py:75 msgid "Enter code verification here" msgstr "" #: ../ubuntu_sso/utils/ui.py:76 msgid "Please enter your name" msgstr "" #: ../ubuntu_sso/utils/ui.py:77 msgid "The process did not finish successfully." msgstr "" #: ../ubuntu_sso/utils/ui.py:79 msgid "Sign me in with my existing account" msgstr "" #: ../ubuntu_sso/utils/ui.py:80 msgid "This field is required." msgstr "" #: ../ubuntu_sso/utils/ui.py:81 msgid "I've forgotten my password" msgstr "" #: ../ubuntu_sso/utils/ui.py:82 ../ubuntu_sso/utils/ui.py:130 msgid "Reset password" msgstr "" #: ../ubuntu_sso/utils/ui.py:83 msgid "" "To reset your {app_name} password, enter your registered email address " "below. We will send instructions to reset your password." msgstr "" #: ../ubuntu_sso/utils/ui.py:86 msgid "Please enter a valid email address" msgstr "" #: ../ubuntu_sso/utils/ui.py:87 msgid "There was a problem accessing the Ubuntu Single Sign On backend." msgstr "" #: ../ubuntu_sso/utils/ui.py:89 #, python-format msgid "Create %(app_name)s account" msgstr "" #: ../ubuntu_sso/utils/ui.py:90 msgid "Loading..." msgstr "Ô²Õ¥Õ¼Õ¶Õ¸Ö‚Õ´..." #: ../ubuntu_sso/utils/ui.py:91 msgid "Getting information, please wait..." msgstr "" #: ../ubuntu_sso/utils/ui.py:92 msgid "Already have an account? Click here to sign in" msgstr "" #: ../ubuntu_sso/utils/ui.py:94 #, python-format msgid "Connect to %(app_name)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:95 ../ubuntu_sso/utils/ui.py:109 msgid "Password" msgstr "" #: ../ubuntu_sso/utils/ui.py:97 msgid "Sign In to {app_name}" msgstr "" #: ../ubuntu_sso/utils/ui.py:99 msgid "Name" msgstr "" #: ../ubuntu_sso/utils/ui.py:100 msgid "The name must not be empty." msgstr "" #: ../ubuntu_sso/utils/ui.py:101 msgid "Next" msgstr "" #: ../ubuntu_sso/utils/ui.py:102 msgid "Network detection" msgstr "" #: ../ubuntu_sso/utils/ui.py:103 #, python-format msgid "" "Are you online? We can't detect an internet connection - you will need to be " "connected to set up %(app_name)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:105 msgid "One moment please..." msgstr "" #: ../ubuntu_sso/utils/ui.py:106 msgid "Create a password" msgstr "" #: ../ubuntu_sso/utils/ui.py:107 msgid "Your password was successfully changed." msgstr "" #: ../ubuntu_sso/utils/ui.py:108 msgid "At least one number" msgstr "" #: ../ubuntu_sso/utils/ui.py:110 msgid "Re-type Password" msgstr "" #: ../ubuntu_sso/utils/ui.py:111 msgid "" "The password must have a minimum of 8 characters and include one uppercase " "character and one number." msgstr "" #: ../ubuntu_sso/utils/ui.py:113 msgid "At least 8 characters" msgstr "" #: ../ubuntu_sso/utils/ui.py:114 msgid "Passwords don't match" msgstr "" #: ../ubuntu_sso/utils/ui.py:115 msgid "" "The passwords don't match, please double check and try entering them again." msgstr "" #: ../ubuntu_sso/utils/ui.py:117 msgid "Your password must contain" msgstr "" #: ../ubuntu_sso/utils/ui.py:118 msgid "The password is too weak." msgstr "" #: ../ubuntu_sso/utils/ui.py:119 msgid "At least one uppercase letter" msgstr "" #: ../ubuntu_sso/utils/ui.py:120 msgid "Privacy Policy" msgstr "" #: ../ubuntu_sso/utils/ui.py:121 msgid "Connecting to:" msgstr "" #: ../ubuntu_sso/utils/ui.py:122 msgid "Proxy Settings" msgstr "" #: ../ubuntu_sso/utils/ui.py:123 msgid "Incorrect login details. Please try again." msgstr "" #: ../ubuntu_sso/utils/ui.py:124 msgid "Please provide login details." msgstr "" #: ../ubuntu_sso/utils/ui.py:125 msgid "You are connecting through a proxy." msgstr "" #: ../ubuntu_sso/utils/ui.py:126 msgid "Get Help With Proxies" msgstr "" #: ../ubuntu_sso/utils/ui.py:127 msgid "Proxy password:" msgstr "" #: ../ubuntu_sso/utils/ui.py:128 msgid "Save and Connect" msgstr "" #: ../ubuntu_sso/utils/ui.py:129 msgid "Proxy username:" msgstr "" #: ../ubuntu_sso/utils/ui.py:131 msgid "" "A password reset code has been sent to your e-mail. Please enter the code " "below along with your new password." msgstr "" #: ../ubuntu_sso/utils/ui.py:133 msgid "Retype email" msgstr "" #: ../ubuntu_sso/utils/ui.py:134 msgid "Retype password" msgstr "" #: ../ubuntu_sso/utils/ui.py:135 #, python-format msgid "To reset your %(app_name)s password, enter your email address below:" msgstr "" #: ../ubuntu_sso/utils/ui.py:137 msgid "" "We are very Sorry! The service that signs you on is not responding right " "now\n" "Please try again or come back in a few minutes." msgstr "" #: ../ubuntu_sso/utils/ui.py:140 msgid "Sorry we did not recognize the email address." msgstr "" #: ../ubuntu_sso/utils/ui.py:142 msgid "Reset code" msgstr "" #: ../ubuntu_sso/utils/ui.py:145 #, python-format msgid "" "A password reset code has been sent to %(email)s.\n" "Please enter the code below along with your new password." msgstr "" #: ../ubuntu_sso/utils/ui.py:147 msgid "Set Up Account" msgstr "" #: ../ubuntu_sso/utils/ui.py:148 msgid "I don't have an account yet - sign me up" msgstr "" #: ../ubuntu_sso/utils/ui.py:149 msgid "Sign In" msgstr "" #: ../ubuntu_sso/utils/ui.py:150 msgid "Log-in with my existing account." msgstr "" #: ../ubuntu_sso/utils/ui.py:151 msgid "the appname whose ssl error we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:152 msgid "Certificate details" msgstr "" #: ../ubuntu_sso/utils/ui.py:153 msgid "Connect" msgstr "" #: ../ubuntu_sso/utils/ui.py:154 msgid "the details ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:161 msgid "Open the SSL certificate UI." msgstr "" #: ../ubuntu_sso/utils/ui.py:162 msgid "SSL Certificate Not Valid" msgstr "" #: ../ubuntu_sso/utils/ui.py:163 msgid "the domain whose ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:164 #, python-format msgid "" "You are trying to connect to a proxy server on %(domain)s. This server uses " "a secure connection, and the SSL certificate is not valid because:" msgstr "" #: ../ubuntu_sso/utils/ui.py:167 msgid "The certificate has not been verified" msgstr "" #: ../ubuntu_sso/utils/ui.py:168 msgid "Do you want to connect to this server?" msgstr "" #: ../ubuntu_sso/utils/ui.py:169 msgid "Get Help With SSL" msgstr "" #: ../ubuntu_sso/utils/ui.py:170 #, python-format msgid "" "If you are not sure about this server, do not use it to connect to " "%(app_name)s." msgstr "" #: ../ubuntu_sso/utils/ui.py:172 msgid "Remember my settings for this certificate." msgstr "" #: ../ubuntu_sso/utils/ui.py:173 msgid "" "The name on the certificate isn't valid or doesn't match the name of the site" msgstr "" #: ../ubuntu_sso/utils/ui.py:175 msgid "The certificate has expired" msgstr "" #: ../ubuntu_sso/utils/ui.py:176 #, python-format msgid "You are now logged into %(app_name)s." msgstr "" #: ../ubuntu_sso/utils/ui.py:177 msgid "Surname" msgstr "" #: ../ubuntu_sso/utils/ui.py:178 msgid "Terms of Service" msgstr "" #: ../ubuntu_sso/utils/ui.py:179 msgid "Sign Up to {app_name}" msgstr "" #: ../ubuntu_sso/utils/ui.py:180 msgid "Show Terms & Conditions" msgstr "" #: ../ubuntu_sso/utils/ui.py:181 #, python-format msgid "" "Agreeing to the %(app_name)s Terms & Conditions is required to subscribe." msgstr "" #: ../ubuntu_sso/utils/ui.py:183 #, python-format msgid "You can also find these terms at %(url)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:184 msgid "Try again" msgstr "" #: ../ubuntu_sso/utils/ui.py:185 msgid "" "There was an error when trying to complete the process. Please check the " "information and try again." msgstr "" #: ../ubuntu_sso/utils/ui.py:187 msgid "Verification code" msgstr "" #: ../ubuntu_sso/utils/ui.py:188 #, python-format msgid "" "Check %(email)s for an email from Ubuntu Single Sign On. This message " "contains a verification code. Enter the code in the field below and click OK " "to complete creating your %(app_name)s account." msgstr "" #: ../ubuntu_sso/utils/ui.py:192 msgid "Enter verification code" msgstr "" #: ../ubuntu_sso/utils/ui.py:195 #, python-format msgid "I agree with the %(app_name)s terms and conditions" msgstr "" #: ../ubuntu_sso/utils/ui.py:196 #, python-format msgid "Yes! Email me %(app_name)s tips and updates." msgstr "" ubuntu-sso-client-13.10/po/am.po0000664000202700020270000002565712151461656016743 0ustar dobeydobey00000000000000# Amharic translation for ubuntu-sso-client # Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 # This file is distributed under the same license as the ubuntu-sso-client package. # FIRST AUTHOR , 2011. # msgid "" msgstr "" "Project-Id-Version: ubuntu-sso-client\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-09-11 18:25+0000\n" "PO-Revision-Date: 2011-06-03 23:30+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Amharic \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-09-17 18:24+0000\n" "X-Generator: Launchpad (build 15944)\n" #. Undefined variable '_', pylint: disable=E0602 #. all the text that is used in the gui #: ../ubuntu_sso/utils/ui.py:49 msgid "By signing up to {app_name} you agree to our {privacy_policy}" msgstr "" #: ../ubuntu_sso/utils/ui.py:51 msgid "By signing up to {app_name} you agree to our {terms_and_conditions}" msgstr "" #: ../ubuntu_sso/utils/ui.py:53 msgid " and {privacy_policy}" msgstr "" #: ../ubuntu_sso/utils/ui.py:54 msgid "Cancel" msgstr "" #: ../ubuntu_sso/utils/ui.py:55 msgid "Type the characters above" msgstr "" #: ../ubuntu_sso/utils/ui.py:56 msgid "There was a problem getting the captcha, reloading..." msgstr "" #: ../ubuntu_sso/utils/ui.py:58 #, python-format msgid "If you can't read this then %(reload_link)s this page" msgstr "" #: ../ubuntu_sso/utils/ui.py:60 msgid "refresh" msgstr "" #: ../ubuntu_sso/utils/ui.py:61 msgid "Reload" msgstr "" #: ../ubuntu_sso/utils/ui.py:62 msgid "The captcha is a required field" msgstr "" #: ../ubuntu_sso/utils/ui.py:63 msgid "Close window and set up later" msgstr "" #: ../ubuntu_sso/utils/ui.py:64 msgid "Congratulations, {app_name} is installed!" msgstr "" #: ../ubuntu_sso/utils/ui.py:65 #, python-format msgid "To connect this computer to %(app_name)s enter your details below." msgstr "" #: ../ubuntu_sso/utils/ui.py:67 msgid "Register with {app_name}." msgstr "" #: ../ubuntu_sso/utils/ui.py:68 ../ubuntu_sso/utils/ui.py:93 #: ../ubuntu_sso/utils/ui.py:143 msgid "Email address" msgstr "የኢሜይሠአድራሻ" #: ../ubuntu_sso/utils/ui.py:69 msgid "Re-type Email address" msgstr "የኢሜይሠአድራሻ እንደገና ይጻá‰" #: ../ubuntu_sso/utils/ui.py:70 msgid "The email must be a valid email address." msgstr "" #: ../ubuntu_sso/utils/ui.py:71 msgid "" "The email addresses don't match, please double check and try entering them " "again." msgstr "" #: ../ubuntu_sso/utils/ui.py:73 msgid "Email" msgstr "" #: ../ubuntu_sso/utils/ui.py:74 msgid "The email addresses do not match" msgstr "" #: ../ubuntu_sso/utils/ui.py:75 msgid "Enter code verification here" msgstr "" #: ../ubuntu_sso/utils/ui.py:76 msgid "Please enter your name" msgstr "" #: ../ubuntu_sso/utils/ui.py:77 msgid "The process did not finish successfully." msgstr "" #: ../ubuntu_sso/utils/ui.py:79 msgid "Sign me in with my existing account" msgstr "" #: ../ubuntu_sso/utils/ui.py:80 msgid "This field is required." msgstr "" #: ../ubuntu_sso/utils/ui.py:81 msgid "I've forgotten my password" msgstr "የመáŒá‰¢á‹« ቃሌን ረሳáˆá‰µ" #: ../ubuntu_sso/utils/ui.py:82 ../ubuntu_sso/utils/ui.py:130 msgid "Reset password" msgstr "" #: ../ubuntu_sso/utils/ui.py:83 msgid "" "To reset your {app_name} password, enter your registered email address " "below. We will send instructions to reset your password." msgstr "" #: ../ubuntu_sso/utils/ui.py:86 msgid "Please enter a valid email address" msgstr "" #: ../ubuntu_sso/utils/ui.py:87 msgid "There was a problem accessing the Ubuntu Single Sign On backend." msgstr "" #: ../ubuntu_sso/utils/ui.py:89 #, python-format msgid "Create %(app_name)s account" msgstr "" #: ../ubuntu_sso/utils/ui.py:90 msgid "Loading..." msgstr "በመጫን ላይ..." #: ../ubuntu_sso/utils/ui.py:91 msgid "Getting information, please wait..." msgstr "" #: ../ubuntu_sso/utils/ui.py:92 msgid "Already have an account? Click here to sign in" msgstr "" #: ../ubuntu_sso/utils/ui.py:94 #, python-format msgid "Connect to %(app_name)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:95 ../ubuntu_sso/utils/ui.py:109 msgid "Password" msgstr "የመáŒá‰¢á‹« ቃáˆ" #: ../ubuntu_sso/utils/ui.py:97 msgid "Sign In to {app_name}" msgstr "" #: ../ubuntu_sso/utils/ui.py:99 msgid "Name" msgstr "ስáˆ" #: ../ubuntu_sso/utils/ui.py:100 msgid "The name must not be empty." msgstr "" #: ../ubuntu_sso/utils/ui.py:101 msgid "Next" msgstr "ይቀጥሉ" #: ../ubuntu_sso/utils/ui.py:102 msgid "Network detection" msgstr "" #: ../ubuntu_sso/utils/ui.py:103 #, python-format msgid "" "Are you online? We can't detect an internet connection - you will need to be " "connected to set up %(app_name)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:105 msgid "One moment please..." msgstr "እባክዎን ትንሽ ይቆዩ..." #: ../ubuntu_sso/utils/ui.py:106 msgid "Create a password" msgstr "" #: ../ubuntu_sso/utils/ui.py:107 msgid "Your password was successfully changed." msgstr "የመáŒá‰¢á‹« ቃáˆá‹Ž በሚገባ ተሳክቶ ተቀይሯáˆ" #: ../ubuntu_sso/utils/ui.py:108 msgid "At least one number" msgstr "" #: ../ubuntu_sso/utils/ui.py:110 msgid "Re-type Password" msgstr "የመáŒá‰¢á‹« ቃáˆá‹ŽáŠ• እንደገና ይጻá‰" #: ../ubuntu_sso/utils/ui.py:111 msgid "" "The password must have a minimum of 8 characters and include one uppercase " "character and one number." msgstr "" #: ../ubuntu_sso/utils/ui.py:113 msgid "At least 8 characters" msgstr "" #: ../ubuntu_sso/utils/ui.py:114 msgid "Passwords don't match" msgstr "" #: ../ubuntu_sso/utils/ui.py:115 msgid "" "The passwords don't match, please double check and try entering them again." msgstr "" #: ../ubuntu_sso/utils/ui.py:117 msgid "Your password must contain" msgstr "" #: ../ubuntu_sso/utils/ui.py:118 msgid "The password is too weak." msgstr "የመáŒá‰¢á‹« ቃáˆá‹Ž በጣሠደካማ áŠá‹" #: ../ubuntu_sso/utils/ui.py:119 msgid "At least one uppercase letter" msgstr "" #: ../ubuntu_sso/utils/ui.py:120 msgid "Privacy Policy" msgstr "" #: ../ubuntu_sso/utils/ui.py:121 msgid "Connecting to:" msgstr "" #: ../ubuntu_sso/utils/ui.py:122 msgid "Proxy Settings" msgstr "" #: ../ubuntu_sso/utils/ui.py:123 msgid "Incorrect login details. Please try again." msgstr "" #: ../ubuntu_sso/utils/ui.py:124 msgid "Please provide login details." msgstr "" #: ../ubuntu_sso/utils/ui.py:125 msgid "You are connecting through a proxy." msgstr "" #: ../ubuntu_sso/utils/ui.py:126 msgid "Get Help With Proxies" msgstr "" #: ../ubuntu_sso/utils/ui.py:127 msgid "Proxy password:" msgstr "" #: ../ubuntu_sso/utils/ui.py:128 msgid "Save and Connect" msgstr "" #: ../ubuntu_sso/utils/ui.py:129 msgid "Proxy username:" msgstr "" #: ../ubuntu_sso/utils/ui.py:131 msgid "" "A password reset code has been sent to your e-mail. Please enter the code " "below along with your new password." msgstr "" #: ../ubuntu_sso/utils/ui.py:133 msgid "Retype email" msgstr "" #: ../ubuntu_sso/utils/ui.py:134 msgid "Retype password" msgstr "" #: ../ubuntu_sso/utils/ui.py:135 #, python-format msgid "To reset your %(app_name)s password, enter your email address below:" msgstr "" #: ../ubuntu_sso/utils/ui.py:137 msgid "" "We are very Sorry! The service that signs you on is not responding right " "now\n" "Please try again or come back in a few minutes." msgstr "" #: ../ubuntu_sso/utils/ui.py:140 msgid "Sorry we did not recognize the email address." msgstr "" #: ../ubuntu_sso/utils/ui.py:142 msgid "Reset code" msgstr "" #: ../ubuntu_sso/utils/ui.py:145 #, python-format msgid "" "A password reset code has been sent to %(email)s.\n" "Please enter the code below along with your new password." msgstr "" #: ../ubuntu_sso/utils/ui.py:147 msgid "Set Up Account" msgstr "" #: ../ubuntu_sso/utils/ui.py:148 msgid "I don't have an account yet - sign me up" msgstr "" #: ../ubuntu_sso/utils/ui.py:149 msgid "Sign In" msgstr "" #: ../ubuntu_sso/utils/ui.py:150 msgid "Log-in with my existing account." msgstr "" #: ../ubuntu_sso/utils/ui.py:151 msgid "the appname whose ssl error we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:152 msgid "Certificate details" msgstr "" #: ../ubuntu_sso/utils/ui.py:153 msgid "Connect" msgstr "" #: ../ubuntu_sso/utils/ui.py:154 msgid "the details ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:161 msgid "Open the SSL certificate UI." msgstr "" #: ../ubuntu_sso/utils/ui.py:162 msgid "SSL Certificate Not Valid" msgstr "" #: ../ubuntu_sso/utils/ui.py:163 msgid "the domain whose ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:164 #, python-format msgid "" "You are trying to connect to a proxy server on %(domain)s. This server uses " "a secure connection, and the SSL certificate is not valid because:" msgstr "" #: ../ubuntu_sso/utils/ui.py:167 msgid "The certificate has not been verified" msgstr "" #: ../ubuntu_sso/utils/ui.py:168 msgid "Do you want to connect to this server?" msgstr "" #: ../ubuntu_sso/utils/ui.py:169 msgid "Get Help With SSL" msgstr "" #: ../ubuntu_sso/utils/ui.py:170 #, python-format msgid "" "If you are not sure about this server, do not use it to connect to " "%(app_name)s." msgstr "" #: ../ubuntu_sso/utils/ui.py:172 msgid "Remember my settings for this certificate." msgstr "" #: ../ubuntu_sso/utils/ui.py:173 msgid "" "The name on the certificate isn't valid or doesn't match the name of the site" msgstr "" #: ../ubuntu_sso/utils/ui.py:175 msgid "The certificate has expired" msgstr "" #: ../ubuntu_sso/utils/ui.py:176 #, python-format msgid "You are now logged into %(app_name)s." msgstr "" #: ../ubuntu_sso/utils/ui.py:177 msgid "Surname" msgstr "" #: ../ubuntu_sso/utils/ui.py:178 msgid "Terms of Service" msgstr "" #: ../ubuntu_sso/utils/ui.py:179 msgid "Sign Up to {app_name}" msgstr "" #: ../ubuntu_sso/utils/ui.py:180 msgid "Show Terms & Conditions" msgstr "" #: ../ubuntu_sso/utils/ui.py:181 #, python-format msgid "" "Agreeing to the %(app_name)s Terms & Conditions is required to subscribe." msgstr "" #: ../ubuntu_sso/utils/ui.py:183 #, python-format msgid "You can also find these terms at %(url)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:184 msgid "Try again" msgstr "" #: ../ubuntu_sso/utils/ui.py:185 msgid "" "There was an error when trying to complete the process. Please check the " "information and try again." msgstr "" #: ../ubuntu_sso/utils/ui.py:187 msgid "Verification code" msgstr "" #: ../ubuntu_sso/utils/ui.py:188 #, python-format msgid "" "Check %(email)s for an email from Ubuntu Single Sign On. This message " "contains a verification code. Enter the code in the field below and click OK " "to complete creating your %(app_name)s account." msgstr "" #: ../ubuntu_sso/utils/ui.py:192 msgid "Enter verification code" msgstr "" #: ../ubuntu_sso/utils/ui.py:195 #, python-format msgid "I agree with the %(app_name)s terms and conditions" msgstr "" #: ../ubuntu_sso/utils/ui.py:196 #, python-format msgid "Yes! Email me %(app_name)s tips and updates." msgstr "" ubuntu-sso-client-13.10/po/bs.po0000664000202700020270000003522012151461656016735 0ustar dobeydobey00000000000000# Bosnian translation for ubuntu-sso-client # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the ubuntu-sso-client package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: ubuntu-sso-client\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-09-11 18:25+0000\n" "PO-Revision-Date: 2012-09-10 23:26+0000\n" "Last-Translator: Samir Ribić \n" "Language-Team: Bosnian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-09-17 18:24+0000\n" "X-Generator: Launchpad (build 15944)\n" #. Undefined variable '_', pylint: disable=E0602 #. all the text that is used in the gui #: ../ubuntu_sso/utils/ui.py:49 msgid "By signing up to {app_name} you agree to our {privacy_policy}" msgstr "Potpisivanjem{app_name} slažete se s naÅ¡om {privacy_policy}" #: ../ubuntu_sso/utils/ui.py:51 msgid "By signing up to {app_name} you agree to our {terms_and_conditions}" msgstr "" "Potpisivanjem na {app_name} slažete se s naÅ¡im {terms_and_conditions}" #: ../ubuntu_sso/utils/ui.py:53 msgid " and {privacy_policy}" msgstr " i {privacy_policy}" #: ../ubuntu_sso/utils/ui.py:54 msgid "Cancel" msgstr "Odustani" #: ../ubuntu_sso/utils/ui.py:55 msgid "Type the characters above" msgstr "UpiÅ¡ite gornje znakove" #: ../ubuntu_sso/utils/ui.py:56 msgid "There was a problem getting the captcha, reloading..." msgstr "DoÅ¡lo je do problema uzimajući podatke, ponovno uÄitavanje ..." #: ../ubuntu_sso/utils/ui.py:58 #, python-format msgid "If you can't read this then %(reload_link)s this page" msgstr "Ako ovo ne možete Äitati onda %(reload_link)s ovu stranu" #: ../ubuntu_sso/utils/ui.py:60 msgid "refresh" msgstr "osvježi" #: ../ubuntu_sso/utils/ui.py:61 msgid "Reload" msgstr "Ponovo uÄitaj" #: ../ubuntu_sso/utils/ui.py:62 msgid "The captcha is a required field" msgstr "Hvatajuće mjesto je obavezno polje" #: ../ubuntu_sso/utils/ui.py:63 msgid "Close window and set up later" msgstr "Zatvori prozor i postavi kasnije" #: ../ubuntu_sso/utils/ui.py:64 msgid "Congratulations, {app_name} is installed!" msgstr "ÄŒestitamo, {app_name} je instalirano!" #: ../ubuntu_sso/utils/ui.py:65 #, python-format msgid "To connect this computer to %(app_name)s enter your details below." msgstr "" "Da biste spojili ovaj raÄunar na %(app_name)s, u nastavku upiÅ¡ite svoje " "detalje." #: ../ubuntu_sso/utils/ui.py:67 msgid "Register with {app_name}." msgstr "Registruj s {app_name}." #: ../ubuntu_sso/utils/ui.py:68 ../ubuntu_sso/utils/ui.py:93 #: ../ubuntu_sso/utils/ui.py:143 msgid "Email address" msgstr "Adresa e-poÅ¡te" #: ../ubuntu_sso/utils/ui.py:69 msgid "Re-type Email address" msgstr "Ponovno upiÅ¡ite adresu e-poÅ¡te" #: ../ubuntu_sso/utils/ui.py:70 msgid "The email must be a valid email address." msgstr "Adresa e-poÅ¡ta mora biti ispravna." #: ../ubuntu_sso/utils/ui.py:71 msgid "" "The email addresses don't match, please double check and try entering them " "again." msgstr "" "Adrese e-poÅ¡te se ne podudaraju, molim provjerite da ste ih ispravno upisali." #: ../ubuntu_sso/utils/ui.py:73 msgid "Email" msgstr "ElektroniÄka poÅ¡ta" #: ../ubuntu_sso/utils/ui.py:74 msgid "The email addresses do not match" msgstr "Adrese elektronske poÅ¡te se ne slažu" #: ../ubuntu_sso/utils/ui.py:75 msgid "Enter code verification here" msgstr "UpiÅ¡ite kôd provjere ovdje" #: ../ubuntu_sso/utils/ui.py:76 msgid "Please enter your name" msgstr "Molimo unesite svoje ime" #: ../ubuntu_sso/utils/ui.py:77 msgid "The process did not finish successfully." msgstr "Proces se nije uspjeÅ¡no zavrÅ¡io." #: ../ubuntu_sso/utils/ui.py:79 msgid "Sign me in with my existing account" msgstr "Prijavi me s mojim postojećim nalogom" #: ../ubuntu_sso/utils/ui.py:80 msgid "This field is required." msgstr "Ovo polje je obavezno." #: ../ubuntu_sso/utils/ui.py:81 msgid "I've forgotten my password" msgstr "Zaboravio/la sam lozinku" #: ../ubuntu_sso/utils/ui.py:82 ../ubuntu_sso/utils/ui.py:130 msgid "Reset password" msgstr "Resetiraj lozinku" #: ../ubuntu_sso/utils/ui.py:83 msgid "" "To reset your {app_name} password, enter your registered email address " "below. We will send instructions to reset your password." msgstr "" "Da resetujete {app_name} lozinku, unesite registrovanu adresu elektronske " "poÅ¡te. Poslaćemo vam instrukcije kako da resetujete ovu lozinku." #: ../ubuntu_sso/utils/ui.py:86 msgid "Please enter a valid email address" msgstr "Unesite važeću adresu elektronske poÅ¡te" #: ../ubuntu_sso/utils/ui.py:87 msgid "There was a problem accessing the Ubuntu Single Sign On backend." msgstr "Desio se problem u pristupu pozadini za jedinstvenu prijavu." #: ../ubuntu_sso/utils/ui.py:89 #, python-format msgid "Create %(app_name)s account" msgstr "Stvorite %(app_name)s korisniÄki raÄun" #: ../ubuntu_sso/utils/ui.py:90 msgid "Loading..." msgstr "UÄitavanje..." #: ../ubuntu_sso/utils/ui.py:91 msgid "Getting information, please wait..." msgstr "Dobavljam podatke, molim saÄekajte..." #: ../ubuntu_sso/utils/ui.py:92 msgid "Already have an account? Click here to sign in" msgstr "Već imate korisniÄki raÄun? Kliknite ovdje za prijavu." #: ../ubuntu_sso/utils/ui.py:94 #, python-format msgid "Connect to %(app_name)s" msgstr "Spoji se na %(app_name)s" #: ../ubuntu_sso/utils/ui.py:95 ../ubuntu_sso/utils/ui.py:109 msgid "Password" msgstr "Lozinka" #: ../ubuntu_sso/utils/ui.py:97 msgid "Sign In to {app_name}" msgstr "Prijava na {app_name}" #: ../ubuntu_sso/utils/ui.py:99 msgid "Name" msgstr "Ime" #: ../ubuntu_sso/utils/ui.py:100 msgid "The name must not be empty." msgstr "Ime ne smije biti prazno" #: ../ubuntu_sso/utils/ui.py:101 msgid "Next" msgstr "Dalje" #: ../ubuntu_sso/utils/ui.py:102 msgid "Network detection" msgstr "Prepoznavanje mreže" #: ../ubuntu_sso/utils/ui.py:103 #, python-format msgid "" "Are you online? We can't detect an internet connection - you will need to be " "connected to set up %(app_name)s" msgstr "" "Da li ste na mreži? Mi ne možemo da otkrije Internet vezu - biće potrebno da " "budete povezani da se postavi %(app_name)s" #: ../ubuntu_sso/utils/ui.py:105 msgid "One moment please..." msgstr "Trenutak molim..." #: ../ubuntu_sso/utils/ui.py:106 msgid "Create a password" msgstr "Kreiraj lozinku" #: ../ubuntu_sso/utils/ui.py:107 msgid "Your password was successfully changed." msgstr "VaÅ¡a je lozinka uspjeÅ¡no promijenjena." #: ../ubuntu_sso/utils/ui.py:108 msgid "At least one number" msgstr "Barem jedan broj" #: ../ubuntu_sso/utils/ui.py:110 msgid "Re-type Password" msgstr "Ponovno upiÅ¡ite lozinku" #: ../ubuntu_sso/utils/ui.py:111 msgid "" "The password must have a minimum of 8 characters and include one uppercase " "character and one number." msgstr "" "Lozinka mora imati najmanje 8 znakova, ukljuÄujući jedno veliko slovo i " "jedan broj." #: ../ubuntu_sso/utils/ui.py:113 msgid "At least 8 characters" msgstr "Barem osam znakova" #: ../ubuntu_sso/utils/ui.py:114 msgid "Passwords don't match" msgstr "Lozinke se ne slažu" #: ../ubuntu_sso/utils/ui.py:115 msgid "" "The passwords don't match, please double check and try entering them again." msgstr "" "Lozinke se ne podudaraju, molim provjerite jesu li dobro upisane i pokuÅ¡ajte " "ponovno." #: ../ubuntu_sso/utils/ui.py:117 msgid "Your password must contain" msgstr "VaÅ¡a lozinka mora sadržati" #: ../ubuntu_sso/utils/ui.py:118 msgid "The password is too weak." msgstr "Lozinka je preslaba." #: ../ubuntu_sso/utils/ui.py:119 msgid "At least one uppercase letter" msgstr "Barem jedno veliko slovo" #: ../ubuntu_sso/utils/ui.py:120 msgid "Privacy Policy" msgstr "Politika privatnosti" #: ../ubuntu_sso/utils/ui.py:121 msgid "Connecting to:" msgstr "Povezujem se na:" #: ../ubuntu_sso/utils/ui.py:122 msgid "Proxy Settings" msgstr "Postavke mrežnog posrednika" #: ../ubuntu_sso/utils/ui.py:123 msgid "Incorrect login details. Please try again." msgstr "Neispravni detalji prijave. Molim pokuÅ¡ajte ponovo." #: ../ubuntu_sso/utils/ui.py:124 msgid "Please provide login details." msgstr "Molim dajte detalje prijave" #: ../ubuntu_sso/utils/ui.py:125 msgid "You are connecting through a proxy." msgstr "Povezujete se kroz proksi." #: ../ubuntu_sso/utils/ui.py:126 msgid "Get Help With Proxies" msgstr "Pomoć s mrežnim posrednicima." #: ../ubuntu_sso/utils/ui.py:127 msgid "Proxy password:" msgstr "Lozinka za posrednika:" #: ../ubuntu_sso/utils/ui.py:128 msgid "Save and Connect" msgstr "Snimi i poveži" #: ../ubuntu_sso/utils/ui.py:129 msgid "Proxy username:" msgstr "KorisniÄko ime za posrednika:" #: ../ubuntu_sso/utils/ui.py:131 msgid "" "A password reset code has been sent to your e-mail. Please enter the code " "below along with your new password." msgstr "" "Kod za poniÅ¡tavanje lozinke je poslat na vaÅ¡ e-mail. Molimo Vas da unesete " "kod ispod zajedno sa novom lozinkom." #: ../ubuntu_sso/utils/ui.py:133 msgid "Retype email" msgstr "Ponovo unesite e-mail." #: ../ubuntu_sso/utils/ui.py:134 msgid "Retype password" msgstr "Ponovo unesite lozinku." #: ../ubuntu_sso/utils/ui.py:135 #, python-format msgid "To reset your %(app_name)s password, enter your email address below:" msgstr "" "Da biste resetirali svoju %(app_name)s lozinku, upiÅ¡ite ispod adresu svoje e-" "poÅ¡te:" #: ../ubuntu_sso/utils/ui.py:137 msgid "" "We are very Sorry! The service that signs you on is not responding right " "now\n" "Please try again or come back in a few minutes." msgstr "" "Žao nam je! Servis koji vas potpisuje ne odgovara sada\n" "PokuÅ¡ajte ponovo ili vratite se za nekoliko minuta." #: ../ubuntu_sso/utils/ui.py:140 msgid "Sorry we did not recognize the email address." msgstr "Nažalost, nismo prepoznali adresu elektronske poÅ¡te" #: ../ubuntu_sso/utils/ui.py:142 msgid "Reset code" msgstr "Resetiraj kôd" #: ../ubuntu_sso/utils/ui.py:145 #, python-format msgid "" "A password reset code has been sent to %(email)s.\n" "Please enter the code below along with your new password." msgstr "" "Kôd za resetiranje lozinke je poslan na %(email)s.\n" "Molim upiÅ¡ite kôd ispod, zajedno sa svojom lozinkom." #: ../ubuntu_sso/utils/ui.py:147 msgid "Set Up Account" msgstr "Postavka naloga" #: ../ubuntu_sso/utils/ui.py:148 msgid "I don't have an account yet - sign me up" msgstr "JoÅ¡ nemam nalog - prijavi me" #: ../ubuntu_sso/utils/ui.py:149 msgid "Sign In" msgstr "Prijava" #: ../ubuntu_sso/utils/ui.py:150 msgid "Log-in with my existing account." msgstr "Prijava s mojim postojećim nalogom." #: ../ubuntu_sso/utils/ui.py:151 msgid "the appname whose ssl error we are going to show." msgstr "ime programa Äiju ssl greÅ¡ku prikazujemo" #: ../ubuntu_sso/utils/ui.py:152 msgid "Certificate details" msgstr "Detalji sertifikata" #: ../ubuntu_sso/utils/ui.py:153 msgid "Connect" msgstr "Poveži se" #: ../ubuntu_sso/utils/ui.py:154 msgid "the details ssl certificate we are going to show." msgstr "detalji ssl certifikata koji se prikazuje" #: ../ubuntu_sso/utils/ui.py:161 msgid "Open the SSL certificate UI." msgstr "Otvori korisniÄki interfejs SSL certifikata." #: ../ubuntu_sso/utils/ui.py:162 msgid "SSL Certificate Not Valid" msgstr "SSL Certifikat nevažeći" #: ../ubuntu_sso/utils/ui.py:163 msgid "the domain whose ssl certificate we are going to show." msgstr "domena Äiji se ssl certifikat prikazuje" #: ../ubuntu_sso/utils/ui.py:164 #, python-format msgid "" "You are trying to connect to a proxy server on %(domain)s. This server uses " "a secure connection, and the SSL certificate is not valid because:" msgstr "" "PokuÅ¡avate se prijaviti na posredniÄki server na %(domain)s. Server koristi " "sigurnu konekciji, a SSL certifikat nije važeći jer:" #: ../ubuntu_sso/utils/ui.py:167 msgid "The certificate has not been verified" msgstr "Certifikat nije bio verifikovan," #: ../ubuntu_sso/utils/ui.py:168 msgid "Do you want to connect to this server?" msgstr "Želite li se povezati na ovaj server?" #: ../ubuntu_sso/utils/ui.py:169 msgid "Get Help With SSL" msgstr "Pomoć s SSL" #: ../ubuntu_sso/utils/ui.py:170 #, python-format msgid "" "If you are not sure about this server, do not use it to connect to " "%(app_name)s." msgstr "" "Ako niste sigurni po pitanju servera ne koristite ga za vezu na %(app_name)s." #: ../ubuntu_sso/utils/ui.py:172 msgid "Remember my settings for this certificate." msgstr "Zapamti moje postavke za ovaj certifikat." #: ../ubuntu_sso/utils/ui.py:173 msgid "" "The name on the certificate isn't valid or doesn't match the name of the site" msgstr "Ime na certifikatu nije važeće ili ne odgovara imenu sajta" #: ../ubuntu_sso/utils/ui.py:175 msgid "The certificate has expired" msgstr "Certifikat je istekao" #: ../ubuntu_sso/utils/ui.py:176 #, python-format msgid "You are now logged into %(app_name)s." msgstr "Prijavljeni ste na %(app_name)s." #: ../ubuntu_sso/utils/ui.py:177 msgid "Surname" msgstr "Prezime" #: ../ubuntu_sso/utils/ui.py:178 msgid "Terms of Service" msgstr "Uslovi upotrebe" #: ../ubuntu_sso/utils/ui.py:179 msgid "Sign Up to {app_name}" msgstr "Prijavi se na {app_name}" #: ../ubuntu_sso/utils/ui.py:180 msgid "Show Terms & Conditions" msgstr "Prikaži uslove upotrebe" #: ../ubuntu_sso/utils/ui.py:181 #, python-format msgid "" "Agreeing to the %(app_name)s Terms & Conditions is required to subscribe." msgstr "Slaganje s uslovima upotrebe %(app_name)s zahtijeva potpis." #: ../ubuntu_sso/utils/ui.py:183 #, python-format msgid "You can also find these terms at %(url)s" msgstr "Možete naći ove uslove na %(url)s" #: ../ubuntu_sso/utils/ui.py:184 msgid "Try again" msgstr "PokuÅ¡aj ponovo" #: ../ubuntu_sso/utils/ui.py:185 msgid "" "There was an error when trying to complete the process. Please check the " "information and try again." msgstr "" "DoÅ¡lo je do greÅ¡ke prilikom dovrÅ¡avanja procesa. Molim provjerite " "informacije i pokuÅ¡ajte ponovno." #: ../ubuntu_sso/utils/ui.py:187 msgid "Verification code" msgstr "Verifikacijski kod" #: ../ubuntu_sso/utils/ui.py:188 #, python-format msgid "" "Check %(email)s for an email from Ubuntu Single Sign On. This message " "contains a verification code. Enter the code in the field below and click OK " "to complete creating your %(app_name)s account." msgstr "" "Provjerite %(email)s za poÅ¡tu s Ubuntu Single Sign On. Ova poruka sadrži " "verifikacijski kod. Unesite kod u polje ispod i kliknite OK da kompletirate " "kreiranje naloga za %(app_name)s ." #: ../ubuntu_sso/utils/ui.py:192 msgid "Enter verification code" msgstr "UpiÅ¡ite kôd provjere" #: ../ubuntu_sso/utils/ui.py:195 #, python-format msgid "I agree with the %(app_name)s terms and conditions" msgstr "Slažem se s uslovima programa %(app_name)s ." #: ../ubuntu_sso/utils/ui.py:196 #, python-format msgid "Yes! Email me %(app_name)s tips and updates." msgstr "Da! Å aljite mi %(app_name)s savjete i novosti." ubuntu-sso-client-13.10/po/be.po0000664000202700020270000003117112151461656016720 0ustar dobeydobey00000000000000# Belarusian translation for ubuntu-sso-client # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the ubuntu-sso-client package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: ubuntu-sso-client\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-09-11 18:25+0000\n" "PO-Revision-Date: 2010-09-07 10:09+0000\n" "Last-Translator: Iryna Nikanchuk \n" "Language-Team: Belarusian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-09-17 18:24+0000\n" "X-Generator: Launchpad (build 15944)\n" #. Undefined variable '_', pylint: disable=E0602 #. all the text that is used in the gui #: ../ubuntu_sso/utils/ui.py:49 msgid "By signing up to {app_name} you agree to our {privacy_policy}" msgstr "" #: ../ubuntu_sso/utils/ui.py:51 msgid "By signing up to {app_name} you agree to our {terms_and_conditions}" msgstr "" #: ../ubuntu_sso/utils/ui.py:53 msgid " and {privacy_policy}" msgstr "" #: ../ubuntu_sso/utils/ui.py:54 msgid "Cancel" msgstr "" #: ../ubuntu_sso/utils/ui.py:55 msgid "Type the characters above" msgstr "УвÑдзіце Ñымбалі з малюнка" #: ../ubuntu_sso/utils/ui.py:56 msgid "There was a problem getting the captcha, reloading..." msgstr "Праблема з атрыманьнем капчы, перазагрузка..." #: ../ubuntu_sso/utils/ui.py:58 #, python-format msgid "If you can't read this then %(reload_link)s this page" msgstr "" #: ../ubuntu_sso/utils/ui.py:60 msgid "refresh" msgstr "" #: ../ubuntu_sso/utils/ui.py:61 msgid "Reload" msgstr "Перазагрузіць" #: ../ubuntu_sso/utils/ui.py:62 msgid "The captcha is a required field" msgstr "" #: ../ubuntu_sso/utils/ui.py:63 msgid "Close window and set up later" msgstr "" #: ../ubuntu_sso/utils/ui.py:64 msgid "Congratulations, {app_name} is installed!" msgstr "" #: ../ubuntu_sso/utils/ui.py:65 #, python-format msgid "To connect this computer to %(app_name)s enter your details below." msgstr "" "Каб Ñпалучыць гÑты кампутар з %(app_name)s увÑдзіце ніжÑй звеÑткі пра ÑÑбе." #: ../ubuntu_sso/utils/ui.py:67 msgid "Register with {app_name}." msgstr "" #: ../ubuntu_sso/utils/ui.py:68 ../ubuntu_sso/utils/ui.py:93 #: ../ubuntu_sso/utils/ui.py:143 msgid "Email address" msgstr "ÐÐ´Ñ€Ð°Ñ Ñлектроннай пошты" #: ../ubuntu_sso/utils/ui.py:69 msgid "Re-type Email address" msgstr "Паўтарыце Ð°Ð´Ñ€Ð°Ñ Ñлектроннай пошты" #: ../ubuntu_sso/utils/ui.py:70 msgid "The email must be a valid email address." msgstr "ÐÐ´Ñ€Ð°Ñ Ð¿Ð¾ÑˆÑ‚Ñ‹ павінен быць правільным." #: ../ubuntu_sso/utils/ui.py:71 msgid "" "The email addresses don't match, please double check and try entering them " "again." msgstr "ÐдраÑÑ‹ пошты не Ñупадаюць, праверце Ñ–Ñ… Ñ– паÑпрабуйце ÑÑˆÑ‡Ñ Ñ€Ð°Ð·." #: ../ubuntu_sso/utils/ui.py:73 msgid "Email" msgstr "" #: ../ubuntu_sso/utils/ui.py:74 msgid "The email addresses do not match" msgstr "" #: ../ubuntu_sso/utils/ui.py:75 msgid "Enter code verification here" msgstr "УвÑдзіце код праверкі тут" #: ../ubuntu_sso/utils/ui.py:76 msgid "Please enter your name" msgstr "" #: ../ubuntu_sso/utils/ui.py:77 msgid "The process did not finish successfully." msgstr "ПрацÑÑ Ð½Ñ ÑкончыўÑÑ Ð¿Ð°ÑьпÑхова." #: ../ubuntu_sso/utils/ui.py:79 msgid "Sign me in with my existing account" msgstr "" #: ../ubuntu_sso/utils/ui.py:80 msgid "This field is required." msgstr "ÐбавÑзковае поле." #: ../ubuntu_sso/utils/ui.py:81 msgid "I've forgotten my password" msgstr "Я забыўÑÑ Ð½Ð° пароль" #: ../ubuntu_sso/utils/ui.py:82 ../ubuntu_sso/utils/ui.py:130 msgid "Reset password" msgstr "Ськінуць пароль" #: ../ubuntu_sso/utils/ui.py:83 msgid "" "To reset your {app_name} password, enter your registered email address " "below. We will send instructions to reset your password." msgstr "" #: ../ubuntu_sso/utils/ui.py:86 msgid "Please enter a valid email address" msgstr "" #: ../ubuntu_sso/utils/ui.py:87 msgid "There was a problem accessing the Ubuntu Single Sign On backend." msgstr "" #: ../ubuntu_sso/utils/ui.py:89 #, python-format msgid "Create %(app_name)s account" msgstr "Стварыць рахунак %(app_name)s" #: ../ubuntu_sso/utils/ui.py:90 msgid "Loading..." msgstr "Загрузка..." #: ../ubuntu_sso/utils/ui.py:91 msgid "Getting information, please wait..." msgstr "" #: ../ubuntu_sso/utils/ui.py:92 msgid "Already have an account? Click here to sign in" msgstr "Ужо маеце рахунак? Клікніце тут каб увайÑьці" #: ../ubuntu_sso/utils/ui.py:94 #, python-format msgid "Connect to %(app_name)s" msgstr "Злучыцца з %(app_name)s" #: ../ubuntu_sso/utils/ui.py:95 ../ubuntu_sso/utils/ui.py:109 msgid "Password" msgstr "Пароль" #: ../ubuntu_sso/utils/ui.py:97 msgid "Sign In to {app_name}" msgstr "" #: ../ubuntu_sso/utils/ui.py:99 msgid "Name" msgstr "ІмÑ" #: ../ubuntu_sso/utils/ui.py:100 msgid "The name must not be empty." msgstr "" #: ../ubuntu_sso/utils/ui.py:101 msgid "Next" msgstr "Далей" #: ../ubuntu_sso/utils/ui.py:102 msgid "Network detection" msgstr "" #: ../ubuntu_sso/utils/ui.py:103 #, python-format msgid "" "Are you online? We can't detect an internet connection - you will need to be " "connected to set up %(app_name)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:105 msgid "One moment please..." msgstr "Пачакайце калі лаÑка..." #: ../ubuntu_sso/utils/ui.py:106 msgid "Create a password" msgstr "" #: ../ubuntu_sso/utils/ui.py:107 msgid "Your password was successfully changed." msgstr "Ваш пароль быў паÑьпÑхова зьменены." #: ../ubuntu_sso/utils/ui.py:108 msgid "At least one number" msgstr "" #: ../ubuntu_sso/utils/ui.py:110 msgid "Re-type Password" msgstr "Паўтарыць пароль" #: ../ubuntu_sso/utils/ui.py:111 msgid "" "The password must have a minimum of 8 characters and include one uppercase " "character and one number." msgstr "" "Пароль павінен мець Ð½Ñ Ð¼ÐµÐ½ÑŒÑˆ за 8 знакаў Ñ– ўтрымліваць адзін знак верхнÑга " "Ñ€ÑгіÑтра Ñ– адзін нумар." #: ../ubuntu_sso/utils/ui.py:113 msgid "At least 8 characters" msgstr "" #: ../ubuntu_sso/utils/ui.py:114 msgid "Passwords don't match" msgstr "" #: ../ubuntu_sso/utils/ui.py:115 msgid "" "The passwords don't match, please double check and try entering them again." msgstr "Паролі не Ñупадаюць, праверце Ñ–Ñ… Ñ– паÑпрабуйце ÑÑˆÑ‡Ñ Ñ€Ð°Ð·." #: ../ubuntu_sso/utils/ui.py:117 msgid "Your password must contain" msgstr "" #: ../ubuntu_sso/utils/ui.py:118 msgid "The password is too weak." msgstr "Пароль занадта Ñлабы." #: ../ubuntu_sso/utils/ui.py:119 msgid "At least one uppercase letter" msgstr "" #: ../ubuntu_sso/utils/ui.py:120 msgid "Privacy Policy" msgstr "" #: ../ubuntu_sso/utils/ui.py:121 msgid "Connecting to:" msgstr "" #: ../ubuntu_sso/utils/ui.py:122 msgid "Proxy Settings" msgstr "" #: ../ubuntu_sso/utils/ui.py:123 msgid "Incorrect login details. Please try again." msgstr "" #: ../ubuntu_sso/utils/ui.py:124 msgid "Please provide login details." msgstr "" #: ../ubuntu_sso/utils/ui.py:125 msgid "You are connecting through a proxy." msgstr "" #: ../ubuntu_sso/utils/ui.py:126 msgid "Get Help With Proxies" msgstr "" #: ../ubuntu_sso/utils/ui.py:127 msgid "Proxy password:" msgstr "" #: ../ubuntu_sso/utils/ui.py:128 msgid "Save and Connect" msgstr "" #: ../ubuntu_sso/utils/ui.py:129 msgid "Proxy username:" msgstr "" #: ../ubuntu_sso/utils/ui.py:131 msgid "" "A password reset code has been sent to your e-mail. Please enter the code " "below along with your new password." msgstr "" #: ../ubuntu_sso/utils/ui.py:133 msgid "Retype email" msgstr "" #: ../ubuntu_sso/utils/ui.py:134 msgid "Retype password" msgstr "" #: ../ubuntu_sso/utils/ui.py:135 #, python-format msgid "To reset your %(app_name)s password, enter your email address below:" msgstr "" "Каб Ñькінуць ваш %(app_name)s пароль, увÑдзіце Ð°Ð´Ñ€Ð°Ñ Ñлектроннай пошты:" #: ../ubuntu_sso/utils/ui.py:137 msgid "" "We are very Sorry! The service that signs you on is not responding right " "now\n" "Please try again or come back in a few minutes." msgstr "" #: ../ubuntu_sso/utils/ui.py:140 msgid "Sorry we did not recognize the email address." msgstr "" #: ../ubuntu_sso/utils/ui.py:142 msgid "Reset code" msgstr "Ськінуць код" #: ../ubuntu_sso/utils/ui.py:145 #, python-format msgid "" "A password reset code has been sent to %(email)s.\n" "Please enter the code below along with your new password." msgstr "" "Код зьмены Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð±Ñ‹Ñž адпраўлены на %(email)s.\n" "Калі лаÑка, увÑдзіце код ніжÑй разам з новым паролем." #: ../ubuntu_sso/utils/ui.py:147 msgid "Set Up Account" msgstr "" #: ../ubuntu_sso/utils/ui.py:148 msgid "I don't have an account yet - sign me up" msgstr "" #: ../ubuntu_sso/utils/ui.py:149 msgid "Sign In" msgstr "" #: ../ubuntu_sso/utils/ui.py:150 msgid "Log-in with my existing account." msgstr "" #: ../ubuntu_sso/utils/ui.py:151 msgid "the appname whose ssl error we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:152 msgid "Certificate details" msgstr "" #: ../ubuntu_sso/utils/ui.py:153 msgid "Connect" msgstr "" #: ../ubuntu_sso/utils/ui.py:154 msgid "the details ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:161 msgid "Open the SSL certificate UI." msgstr "" #: ../ubuntu_sso/utils/ui.py:162 msgid "SSL Certificate Not Valid" msgstr "" #: ../ubuntu_sso/utils/ui.py:163 msgid "the domain whose ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:164 #, python-format msgid "" "You are trying to connect to a proxy server on %(domain)s. This server uses " "a secure connection, and the SSL certificate is not valid because:" msgstr "" #: ../ubuntu_sso/utils/ui.py:167 msgid "The certificate has not been verified" msgstr "" #: ../ubuntu_sso/utils/ui.py:168 msgid "Do you want to connect to this server?" msgstr "" #: ../ubuntu_sso/utils/ui.py:169 msgid "Get Help With SSL" msgstr "" #: ../ubuntu_sso/utils/ui.py:170 #, python-format msgid "" "If you are not sure about this server, do not use it to connect to " "%(app_name)s." msgstr "" #: ../ubuntu_sso/utils/ui.py:172 msgid "Remember my settings for this certificate." msgstr "" #: ../ubuntu_sso/utils/ui.py:173 msgid "" "The name on the certificate isn't valid or doesn't match the name of the site" msgstr "" #: ../ubuntu_sso/utils/ui.py:175 msgid "The certificate has expired" msgstr "" #: ../ubuntu_sso/utils/ui.py:176 #, python-format msgid "You are now logged into %(app_name)s." msgstr "" #: ../ubuntu_sso/utils/ui.py:177 msgid "Surname" msgstr "" #: ../ubuntu_sso/utils/ui.py:178 msgid "Terms of Service" msgstr "" #: ../ubuntu_sso/utils/ui.py:179 msgid "Sign Up to {app_name}" msgstr "" #: ../ubuntu_sso/utils/ui.py:180 msgid "Show Terms & Conditions" msgstr "Паказаць умовы" #: ../ubuntu_sso/utils/ui.py:181 #, python-format msgid "" "Agreeing to the %(app_name)s Terms & Conditions is required to subscribe." msgstr "" #: ../ubuntu_sso/utils/ui.py:183 #, python-format msgid "You can also find these terms at %(url)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:184 msgid "Try again" msgstr "" #: ../ubuntu_sso/utils/ui.py:185 msgid "" "There was an error when trying to complete the process. Please check the " "information and try again." msgstr "" "Памылка Ð¿Ð°Ð´Ñ‡Ð°Ñ Ð·Ð°Ð²ÑршÑÐ½ÑŒÐ½Ñ Ð¿Ñ€Ð°Ñ†ÑÑу. Калі лаÑка, праверце інфармацыю Ñ– " "паÑпрабуйце ÑÑˆÑ‡Ñ Ñ€Ð°Ð·." #: ../ubuntu_sso/utils/ui.py:187 msgid "Verification code" msgstr "" #: ../ubuntu_sso/utils/ui.py:188 #, python-format msgid "" "Check %(email)s for an email from Ubuntu Single Sign On. This message " "contains a verification code. Enter the code in the field below and click OK " "to complete creating your %(app_name)s account." msgstr "" #: ../ubuntu_sso/utils/ui.py:192 msgid "Enter verification code" msgstr "УвÑдзіце код праверкі" #: ../ubuntu_sso/utils/ui.py:195 #, python-format msgid "I agree with the %(app_name)s terms and conditions" msgstr "Я згодны з умовамі %(app_name)s" #: ../ubuntu_sso/utils/ui.py:196 #, python-format msgid "Yes! Email me %(app_name)s tips and updates." msgstr "Так! Падпішыце мÑне на раÑÑылку %(app_name)s." ubuntu-sso-client-13.10/po/ro.po0000664000202700020270000003636212151461656016761 0ustar dobeydobey00000000000000# Romanian translation for ubuntu-sso-client # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the ubuntu-sso-client package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: ubuntu-sso-client\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-09-11 18:25+0000\n" "PO-Revision-Date: 2012-03-22 07:24+0000\n" "Last-Translator: Marian Vasile \n" "Language-Team: Romanian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-09-17 18:24+0000\n" "X-Generator: Launchpad (build 15944)\n" #. Undefined variable '_', pylint: disable=E0602 #. all the text that is used in the gui #: ../ubuntu_sso/utils/ui.py:49 msgid "By signing up to {app_name} you agree to our {privacy_policy}" msgstr "" "Prin înregistrarea la {app_name} sunteÈ›i de acord cu {privacy_policy} " "promovată de noi" #: ../ubuntu_sso/utils/ui.py:51 msgid "By signing up to {app_name} you agree to our {terms_and_conditions}" msgstr "" "Prin înregistrarea la {app_name} sunteÈ›i de acord cu {terms_and_conditions}" #: ../ubuntu_sso/utils/ui.py:53 msgid " and {privacy_policy}" msgstr " È™i {privacy_policy}" #: ../ubuntu_sso/utils/ui.py:54 msgid "Cancel" msgstr "Anulează" #: ../ubuntu_sso/utils/ui.py:55 msgid "Type the characters above" msgstr "TastaÈ›i caracterele de mai sus" #: ../ubuntu_sso/utils/ui.py:56 msgid "There was a problem getting the captcha, reloading..." msgstr "A existat o problemă în obÈ›inerea captcha, se reîncarcă..." #: ../ubuntu_sso/utils/ui.py:58 #, python-format msgid "If you can't read this then %(reload_link)s this page" msgstr "Dacă nu puteÈ›i citi pagina, reîncărcaÈ›i-o %(reload_link)s" #: ../ubuntu_sso/utils/ui.py:60 msgid "refresh" msgstr "actualizează" #: ../ubuntu_sso/utils/ui.py:61 msgid "Reload" msgstr "Reîncarcă" #: ../ubuntu_sso/utils/ui.py:62 msgid "The captcha is a required field" msgstr "Caseta captcha este neapărat necesară" #: ../ubuntu_sso/utils/ui.py:63 msgid "Close window and set up later" msgstr "ÃŽnchideÈ›i fereastra È™i reveniÈ›i mai târziu pentru configurări" #: ../ubuntu_sso/utils/ui.py:64 msgid "Congratulations, {app_name} is installed!" msgstr "Felicitări, aÈ›i instalat {app_name}!" #: ../ubuntu_sso/utils/ui.py:65 #, python-format msgid "To connect this computer to %(app_name)s enter your details below." msgstr "" "Pentru a conecta acest calculator la %(app_name)s introduceÈ›i detaliile mai " "jos." #: ../ubuntu_sso/utils/ui.py:67 msgid "Register with {app_name}." msgstr "" #: ../ubuntu_sso/utils/ui.py:68 ../ubuntu_sso/utils/ui.py:93 #: ../ubuntu_sso/utils/ui.py:143 msgid "Email address" msgstr "Adresă email" #: ../ubuntu_sso/utils/ui.py:69 msgid "Re-type Email address" msgstr "TastaÈ›i din nou adresa de email" #: ../ubuntu_sso/utils/ui.py:70 msgid "The email must be a valid email address." msgstr "Adresa de email trebuie să fie validă." #: ../ubuntu_sso/utils/ui.py:71 msgid "" "The email addresses don't match, please double check and try entering them " "again." msgstr "" "Adresele de email nu se potrivesc, reverificaÈ›i È™i încercaÈ›i să le " "introduceÈ›i din nou." #: ../ubuntu_sso/utils/ui.py:73 msgid "Email" msgstr "Email" #: ../ubuntu_sso/utils/ui.py:74 msgid "The email addresses do not match" msgstr "Adresele email nu se potrivesc" #: ../ubuntu_sso/utils/ui.py:75 msgid "Enter code verification here" msgstr "IntroduceÈ›i codul de verificare aici." #: ../ubuntu_sso/utils/ui.py:76 msgid "Please enter your name" msgstr "IntroduceÈ›i numele dumneavoastră" #: ../ubuntu_sso/utils/ui.py:77 msgid "The process did not finish successfully." msgstr "Procesul nu s-a sfârÈ™it cu succes." #: ../ubuntu_sso/utils/ui.py:79 msgid "Sign me in with my existing account" msgstr "ÃŽnregistrează-mă folosind contul existent" #: ../ubuntu_sso/utils/ui.py:80 msgid "This field is required." msgstr "Acest câmp este obligatoriu." #: ../ubuntu_sso/utils/ui.py:81 msgid "I've forgotten my password" msgstr "Mi-am uitat parola" #: ../ubuntu_sso/utils/ui.py:82 ../ubuntu_sso/utils/ui.py:130 msgid "Reset password" msgstr "Resetează parola" #: ../ubuntu_sso/utils/ui.py:83 msgid "" "To reset your {app_name} password, enter your registered email address " "below. We will send instructions to reset your password." msgstr "" "Pentru a reseta parola {app_name}, introduceÈ›i adresa de email asociată în " "câmpul de mai jos. Vă vom trimite instrucÈ›iuni pentru resetarea parolei." #: ../ubuntu_sso/utils/ui.py:86 msgid "Please enter a valid email address" msgstr "IntroduceÈ›i o adresă de email validă" #: ../ubuntu_sso/utils/ui.py:87 msgid "There was a problem accessing the Ubuntu Single Sign On backend." msgstr "" "A apărut o problemă la accesarea programului suport al Ubuntu Single Sign On." #: ../ubuntu_sso/utils/ui.py:89 #, python-format msgid "Create %(app_name)s account" msgstr "Creează un cont pentru %(app_name)s" #: ../ubuntu_sso/utils/ui.py:90 msgid "Loading..." msgstr "Se încarcă..." #: ../ubuntu_sso/utils/ui.py:91 msgid "Getting information, please wait..." msgstr "Se obÈ›in informaÈ›iile, aÈ™teptaÈ›i..." #: ../ubuntu_sso/utils/ui.py:92 msgid "Already have an account? Click here to sign in" msgstr "AveÅ£i deja un cont? Clic aici pentru a vă autentifica" #: ../ubuntu_sso/utils/ui.py:94 #, python-format msgid "Connect to %(app_name)s" msgstr "Conectare la %(app_name)s" #: ../ubuntu_sso/utils/ui.py:95 ../ubuntu_sso/utils/ui.py:109 msgid "Password" msgstr "Parolă" #: ../ubuntu_sso/utils/ui.py:97 msgid "Sign In to {app_name}" msgstr "ÃŽnregistrare la {app_name}" #: ../ubuntu_sso/utils/ui.py:99 msgid "Name" msgstr "Nume" #: ../ubuntu_sso/utils/ui.py:100 msgid "The name must not be empty." msgstr "Câmpul pentru nume nu trebuie să rămână gol." #: ../ubuntu_sso/utils/ui.py:101 msgid "Next" msgstr "Următorul" #: ../ubuntu_sso/utils/ui.py:102 msgid "Network detection" msgstr "Detectare reÈ›ea" #: ../ubuntu_sso/utils/ui.py:103 #, python-format msgid "" "Are you online? We can't detect an internet connection - you will need to be " "connected to set up %(app_name)s" msgstr "" "SunteÈ›i conectat? Nu se poate detecta o conexiune la Internet - ar trebui să " "fiÈ›i conectat pentru a configura %(app_name)s" #: ../ubuntu_sso/utils/ui.py:105 msgid "One moment please..." msgstr "AÅŸteptaÅ£i puÅ£in..." #: ../ubuntu_sso/utils/ui.py:106 msgid "Create a password" msgstr "CreaÈ›i o parolă" #: ../ubuntu_sso/utils/ui.py:107 msgid "Your password was successfully changed." msgstr "Parola voastră a fost schimbată cu succes." #: ../ubuntu_sso/utils/ui.py:108 msgid "At least one number" msgstr "Cel puÈ›in un număr" #: ../ubuntu_sso/utils/ui.py:110 msgid "Re-type Password" msgstr "ReintroduceÈ›i parola" #: ../ubuntu_sso/utils/ui.py:111 msgid "" "The password must have a minimum of 8 characters and include one uppercase " "character and one number." msgstr "" "Parola trebuie să aibă un minim de 8 caractere È™i să includă un caracter " "majuscul È™i un număr." #: ../ubuntu_sso/utils/ui.py:113 msgid "At least 8 characters" msgstr "Cel puÈ›in 8 caractere" #: ../ubuntu_sso/utils/ui.py:114 msgid "Passwords don't match" msgstr "Parolele nu coincid" #: ../ubuntu_sso/utils/ui.py:115 msgid "" "The passwords don't match, please double check and try entering them again." msgstr "" "Parolele nu se potrivesc, reverificaÈ›i È™i încercaÈ›i să le introduceÈ›i din " "nou." #: ../ubuntu_sso/utils/ui.py:117 msgid "Your password must contain" msgstr "Parola trebuie să conÈ›ină" #: ../ubuntu_sso/utils/ui.py:118 msgid "The password is too weak." msgstr "Parola este prea slabă." #: ../ubuntu_sso/utils/ui.py:119 msgid "At least one uppercase letter" msgstr "Cel puÈ›in un caracter în majusculă" #: ../ubuntu_sso/utils/ui.py:120 msgid "Privacy Policy" msgstr "Politica de confidenÈ›ialitate" #: ../ubuntu_sso/utils/ui.py:121 msgid "Connecting to:" msgstr "Conectare la:" #: ../ubuntu_sso/utils/ui.py:122 msgid "Proxy Settings" msgstr "Configurări proxy" #: ../ubuntu_sso/utils/ui.py:123 msgid "Incorrect login details. Please try again." msgstr "Detalii autentificare incorecte. ReîncercaÈ›i." #: ../ubuntu_sso/utils/ui.py:124 msgid "Please provide login details." msgstr "IntroduceÈ›i detaliile de autentificare." #: ../ubuntu_sso/utils/ui.py:125 msgid "You are connecting through a proxy." msgstr "SunteÈ›i conectat printr-un proxy." #: ../ubuntu_sso/utils/ui.py:126 msgid "Get Help With Proxies" msgstr "ObÈ›ineÈ›i ajutor în legătură cu serverele proxy" #: ../ubuntu_sso/utils/ui.py:127 msgid "Proxy password:" msgstr "Parolă proxy:" #: ../ubuntu_sso/utils/ui.py:128 msgid "Save and Connect" msgstr "Salvează È™i conectează" #: ../ubuntu_sso/utils/ui.py:129 msgid "Proxy username:" msgstr "Nume utilizator proxy:" #: ../ubuntu_sso/utils/ui.py:131 msgid "" "A password reset code has been sent to your e-mail. Please enter the code " "below along with your new password." msgstr "" "Pe adresa dumneavoastră de mail a fost trimis un cod pentru resetarea " "parolei. IntroduceÈ›i codul mai jos, împreună cu noua parolă." #: ../ubuntu_sso/utils/ui.py:133 msgid "Retype email" msgstr "ReintroduceÈ›i adresa email" #: ../ubuntu_sso/utils/ui.py:134 msgid "Retype password" msgstr "ReintroduceÈ›i parola" #: ../ubuntu_sso/utils/ui.py:135 #, python-format msgid "To reset your %(app_name)s password, enter your email address below:" msgstr "" "Pentru a restabili parola pentru %(app_name)s introduceÈ›i adresa de email " "mai jos:" #: ../ubuntu_sso/utils/ui.py:137 msgid "" "We are very Sorry! The service that signs you on is not responding right " "now\n" "Please try again or come back in a few minutes." msgstr "" "Ne pare rău! Serviciul pentru care v-aÈ›i autentificat nu răspunde\n" "ÃŽncercaÈ›i din nou sau reveniÈ›i în câteva minute." #: ../ubuntu_sso/utils/ui.py:140 msgid "Sorry we did not recognize the email address." msgstr "Adresa de email nu este recunoscută." #: ../ubuntu_sso/utils/ui.py:142 msgid "Reset code" msgstr "Cod de resetare" #: ../ubuntu_sso/utils/ui.py:145 #, python-format msgid "" "A password reset code has been sent to %(email)s.\n" "Please enter the code below along with your new password." msgstr "" "Un cod pentru resetarea parolei a fost trimis la %(email)s.\n" "IntroduceÈ›i codul mai jos, împreună cu noua parolă." #: ../ubuntu_sso/utils/ui.py:147 msgid "Set Up Account" msgstr "Configurare cont" #: ../ubuntu_sso/utils/ui.py:148 msgid "I don't have an account yet - sign me up" msgstr "Nu am încă un cont - înregistrează-mă" #: ../ubuntu_sso/utils/ui.py:149 msgid "Sign In" msgstr "Autentificare" #: ../ubuntu_sso/utils/ui.py:150 msgid "Log-in with my existing account." msgstr "" #: ../ubuntu_sso/utils/ui.py:151 msgid "the appname whose ssl error we are going to show." msgstr "numele aplicaÈ›iei pentru care vom arăta eroarea ssl" #: ../ubuntu_sso/utils/ui.py:152 msgid "Certificate details" msgstr "Detalii certificat" #: ../ubuntu_sso/utils/ui.py:153 msgid "Connect" msgstr "Conectare" #: ../ubuntu_sso/utils/ui.py:154 msgid "the details ssl certificate we are going to show." msgstr "detaliile certificatului ssl care vor fi prezentate" #: ../ubuntu_sso/utils/ui.py:161 msgid "Open the SSL certificate UI." msgstr "Deschide interfaÈ›a grafică a certificatului SSL" #: ../ubuntu_sso/utils/ui.py:162 msgid "SSL Certificate Not Valid" msgstr "Certificatul SSL nu este valid" #: ../ubuntu_sso/utils/ui.py:163 msgid "the domain whose ssl certificate we are going to show." msgstr "domeniul al cărui certificar ssl va fi prezentat." #: ../ubuntu_sso/utils/ui.py:164 #, python-format msgid "" "You are trying to connect to a proxy server on %(domain)s. This server uses " "a secure connection, and the SSL certificate is not valid because:" msgstr "" "Se pare că încercaÈ›i să vă conectaÈ›i la un server proxy pe %(domain)s. Acest " "server utilizează o conexiune securizată, iar certificatul SSL nu este valid " "deoarece:" #: ../ubuntu_sso/utils/ui.py:167 msgid "The certificate has not been verified" msgstr "Certificatul nu a fost verificat" #: ../ubuntu_sso/utils/ui.py:168 msgid "Do you want to connect to this server?" msgstr "DoriÈ›i să vă conectaÈ›i la acest server?" #: ../ubuntu_sso/utils/ui.py:169 msgid "Get Help With SSL" msgstr "ObÈ›ineÈ›i ajutor în legătură cu SSL" #: ../ubuntu_sso/utils/ui.py:170 #, python-format msgid "" "If you are not sure about this server, do not use it to connect to " "%(app_name)s." msgstr "" "Dacă nu aveÈ›i încredere în acest server, nu îl utilizaÈ›i pentru a vă conecta " "la %(app_name)s." #: ../ubuntu_sso/utils/ui.py:172 msgid "Remember my settings for this certificate." msgstr "ReÈ›ine configurările mele pentru acest certificat." #: ../ubuntu_sso/utils/ui.py:173 msgid "" "The name on the certificate isn't valid or doesn't match the name of the site" msgstr "" "Numele certificatului nu este valid sau nu corespunde numelui de pe site" #: ../ubuntu_sso/utils/ui.py:175 msgid "The certificate has expired" msgstr "Certificatul a expirat" #: ../ubuntu_sso/utils/ui.py:176 #, python-format msgid "You are now logged into %(app_name)s." msgstr "SunteÈ›i autentificat la %(app_name)s." #: ../ubuntu_sso/utils/ui.py:177 msgid "Surname" msgstr "Nume de familie" #: ../ubuntu_sso/utils/ui.py:178 msgid "Terms of Service" msgstr "Termeni serviciu" #: ../ubuntu_sso/utils/ui.py:179 msgid "Sign Up to {app_name}" msgstr "ÃŽnregistrare la {app_name}" #: ../ubuntu_sso/utils/ui.py:180 msgid "Show Terms & Conditions" msgstr "Arată termenii È™i condiÈ›iile" #: ../ubuntu_sso/utils/ui.py:181 #, python-format msgid "" "Agreeing to the %(app_name)s Terms & Conditions is required to subscribe." msgstr "" "Acceptarea termenilor È™i condiÈ›iilor %(app_name)s este necesară pentru " "înregistrare." #: ../ubuntu_sso/utils/ui.py:183 #, python-format msgid "You can also find these terms at %(url)s" msgstr "Mai puteÈ›i găsi aceÈ™ti termeni la %(url)s" #: ../ubuntu_sso/utils/ui.py:184 msgid "Try again" msgstr "ÃŽncercaÈ›i din nou" #: ../ubuntu_sso/utils/ui.py:185 msgid "" "There was an error when trying to complete the process. Please check the " "information and try again." msgstr "" "A intervenit o eroare la încercarea de a finaliza procesul. VerificaÈ›i " "informaÈ›iile È™i încercaÈ›i din nou." #: ../ubuntu_sso/utils/ui.py:187 msgid "Verification code" msgstr "Cod de verificare" #: ../ubuntu_sso/utils/ui.py:188 #, python-format msgid "" "Check %(email)s for an email from Ubuntu Single Sign On. This message " "contains a verification code. Enter the code in the field below and click OK " "to complete creating your %(app_name)s account." msgstr "" "VerificaÈ›i-vă %(email)s pentru mesajul primit de la Ubuntu Single Sign On. " "Acest mesaj conÈ›ine un cod de verificare. IntroduceÈ›i codul mai jos È™i " "apăsaÈ›i pe butonul ÃŽn regulă pentru a termina crearea contului %(app_name)s." #: ../ubuntu_sso/utils/ui.py:192 msgid "Enter verification code" msgstr "IntroduceÈ›i codul de vericare" #: ../ubuntu_sso/utils/ui.py:195 #, python-format msgid "I agree with the %(app_name)s terms and conditions" msgstr "Sunt de acord cu termenii È™i condiÈ›iile aplicaÈ›iei %(app_name)s" #: ../ubuntu_sso/utils/ui.py:196 #, python-format msgid "Yes! Email me %(app_name)s tips and updates." msgstr "Da! Trimite-mi prin email sfaturi È™i actualizări pentru %(app_name)s" ubuntu-sso-client-13.10/po/vec.po0000664000202700020270000002756612151461656017124 0ustar dobeydobey00000000000000# Venetian translation for ubuntu-sso-client # Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 # This file is distributed under the same license as the ubuntu-sso-client package. # FIRST AUTHOR , 2011. # msgid "" msgstr "" "Project-Id-Version: ubuntu-sso-client\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-09-11 18:25+0000\n" "PO-Revision-Date: 2011-03-31 19:59+0000\n" "Last-Translator: Michele Fontanive \n" "Language-Team: Venetian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-09-17 18:24+0000\n" "X-Generator: Launchpad (build 15944)\n" #. Undefined variable '_', pylint: disable=E0602 #. all the text that is used in the gui #: ../ubuntu_sso/utils/ui.py:49 msgid "By signing up to {app_name} you agree to our {privacy_policy}" msgstr "" #: ../ubuntu_sso/utils/ui.py:51 msgid "By signing up to {app_name} you agree to our {terms_and_conditions}" msgstr "" #: ../ubuntu_sso/utils/ui.py:53 msgid " and {privacy_policy}" msgstr "" #: ../ubuntu_sso/utils/ui.py:54 msgid "Cancel" msgstr "" #: ../ubuntu_sso/utils/ui.py:55 msgid "Type the characters above" msgstr "Buta entro le létere che te vede sora" #: ../ubuntu_sso/utils/ui.py:56 msgid "There was a problem getting the captcha, reloading..." msgstr "Ghe n'é stat an problema te'l captcha, cargando da novo..." #: ../ubuntu_sso/utils/ui.py:58 #, python-format msgid "If you can't read this then %(reload_link)s this page" msgstr "" #: ../ubuntu_sso/utils/ui.py:60 msgid "refresh" msgstr "" #: ../ubuntu_sso/utils/ui.py:61 msgid "Reload" msgstr "Carga da novo" #: ../ubuntu_sso/utils/ui.py:62 msgid "The captcha is a required field" msgstr "" #: ../ubuntu_sso/utils/ui.py:63 msgid "Close window and set up later" msgstr "" #: ../ubuntu_sso/utils/ui.py:64 msgid "Congratulations, {app_name} is installed!" msgstr "" #: ../ubuntu_sso/utils/ui.py:65 #, python-format msgid "To connect this computer to %(app_name)s enter your details below." msgstr "Par tacàr sto computer a %(app_name)s buta entro i to detagli sot." #: ../ubuntu_sso/utils/ui.py:67 msgid "Register with {app_name}." msgstr "" #: ../ubuntu_sso/utils/ui.py:68 ../ubuntu_sso/utils/ui.py:93 #: ../ubuntu_sso/utils/ui.py:143 msgid "Email address" msgstr "Indiriso email" #: ../ubuntu_sso/utils/ui.py:69 msgid "Re-type Email address" msgstr "Buta entro da novo l'indiriso email" #: ../ubuntu_sso/utils/ui.py:70 msgid "The email must be a valid email address." msgstr "L'email la ha da eser an indiriso email giust." #: ../ubuntu_sso/utils/ui.py:71 msgid "" "The email addresses don't match, please double check and try entering them " "again." msgstr "" "I indirisi no i se cata, par piazer ricontrola e proa a ributarli entro." #: ../ubuntu_sso/utils/ui.py:73 msgid "Email" msgstr "" #: ../ubuntu_sso/utils/ui.py:74 msgid "The email addresses do not match" msgstr "" #: ../ubuntu_sso/utils/ui.py:75 msgid "Enter code verification here" msgstr "Inserisi qua al codice de verifica" #: ../ubuntu_sso/utils/ui.py:76 msgid "Please enter your name" msgstr "" #: ../ubuntu_sso/utils/ui.py:77 msgid "The process did not finish successfully." msgstr "Al proceso l'e falì" #: ../ubuntu_sso/utils/ui.py:79 msgid "Sign me in with my existing account" msgstr "" #: ../ubuntu_sso/utils/ui.py:80 msgid "This field is required." msgstr "'Sto canp al ghe ol." #: ../ubuntu_sso/utils/ui.py:81 msgid "I've forgotten my password" msgstr "Me son desmentegà la password" #: ../ubuntu_sso/utils/ui.py:82 ../ubuntu_sso/utils/ui.py:130 msgid "Reset password" msgstr "Resèta password" #: ../ubuntu_sso/utils/ui.py:83 msgid "" "To reset your {app_name} password, enter your registered email address " "below. We will send instructions to reset your password." msgstr "" #: ../ubuntu_sso/utils/ui.py:86 msgid "Please enter a valid email address" msgstr "" #: ../ubuntu_sso/utils/ui.py:87 msgid "There was a problem accessing the Ubuntu Single Sign On backend." msgstr "" #: ../ubuntu_sso/utils/ui.py:89 #, python-format msgid "Create %(app_name)s account" msgstr "Crea an account par %(app_name)s" #: ../ubuntu_sso/utils/ui.py:90 msgid "Loading..." msgstr "Cargando..." #: ../ubuntu_sso/utils/ui.py:91 msgid "Getting information, please wait..." msgstr "" #: ../ubuntu_sso/utils/ui.py:92 msgid "Already have an account? Click here to sign in" msgstr "Atu già n'account? Fraca qua par entrar" #: ../ubuntu_sso/utils/ui.py:94 #, python-format msgid "Connect to %(app_name)s" msgstr "Taca a %(app_name)s" #: ../ubuntu_sso/utils/ui.py:95 ../ubuntu_sso/utils/ui.py:109 msgid "Password" msgstr "Password" #: ../ubuntu_sso/utils/ui.py:97 msgid "Sign In to {app_name}" msgstr "" #: ../ubuntu_sso/utils/ui.py:99 msgid "Name" msgstr "Nome" #: ../ubuntu_sso/utils/ui.py:100 msgid "The name must not be empty." msgstr "" #: ../ubuntu_sso/utils/ui.py:101 msgid "Next" msgstr "Prosimo" #: ../ubuntu_sso/utils/ui.py:102 msgid "Network detection" msgstr "" #: ../ubuntu_sso/utils/ui.py:103 #, python-format msgid "" "Are you online? We can't detect an internet connection - you will need to be " "connected to set up %(app_name)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:105 msgid "One moment please..." msgstr "Speta n'atimo..." #: ../ubuntu_sso/utils/ui.py:106 msgid "Create a password" msgstr "" #: ../ubuntu_sso/utils/ui.py:107 msgid "Your password was successfully changed." msgstr "Password canbiada giusta." #: ../ubuntu_sso/utils/ui.py:108 msgid "At least one number" msgstr "" #: ../ubuntu_sso/utils/ui.py:110 msgid "Re-type Password" msgstr "Buta entro da novo la password" #: ../ubuntu_sso/utils/ui.py:111 msgid "" "The password must have a minimum of 8 characters and include one uppercase " "character and one number." msgstr "" "La password bisogna che la abie almanco 8 carateri e almanco 'na letera " "granda e an numero." #: ../ubuntu_sso/utils/ui.py:113 msgid "At least 8 characters" msgstr "" #: ../ubuntu_sso/utils/ui.py:114 msgid "Passwords don't match" msgstr "" #: ../ubuntu_sso/utils/ui.py:115 msgid "" "The passwords don't match, please double check and try entering them again." msgstr "" "Le passwords no le se cata, ricontrola e proa a butarle entro da novo." #: ../ubuntu_sso/utils/ui.py:117 msgid "Your password must contain" msgstr "" #: ../ubuntu_sso/utils/ui.py:118 msgid "The password is too weak." msgstr "La password l'e masa fiaca." #: ../ubuntu_sso/utils/ui.py:119 msgid "At least one uppercase letter" msgstr "" #: ../ubuntu_sso/utils/ui.py:120 msgid "Privacy Policy" msgstr "" #: ../ubuntu_sso/utils/ui.py:121 msgid "Connecting to:" msgstr "" #: ../ubuntu_sso/utils/ui.py:122 msgid "Proxy Settings" msgstr "" #: ../ubuntu_sso/utils/ui.py:123 msgid "Incorrect login details. Please try again." msgstr "" #: ../ubuntu_sso/utils/ui.py:124 msgid "Please provide login details." msgstr "" #: ../ubuntu_sso/utils/ui.py:125 msgid "You are connecting through a proxy." msgstr "" #: ../ubuntu_sso/utils/ui.py:126 msgid "Get Help With Proxies" msgstr "" #: ../ubuntu_sso/utils/ui.py:127 msgid "Proxy password:" msgstr "" #: ../ubuntu_sso/utils/ui.py:128 msgid "Save and Connect" msgstr "" #: ../ubuntu_sso/utils/ui.py:129 msgid "Proxy username:" msgstr "" #: ../ubuntu_sso/utils/ui.py:131 msgid "" "A password reset code has been sent to your e-mail. Please enter the code " "below along with your new password." msgstr "" #: ../ubuntu_sso/utils/ui.py:133 msgid "Retype email" msgstr "" #: ../ubuntu_sso/utils/ui.py:134 msgid "Retype password" msgstr "" #: ../ubuntu_sso/utils/ui.py:135 #, python-format msgid "To reset your %(app_name)s password, enter your email address below:" msgstr "" "Par resetar la to password de %(app_name)s, buta entro al to indiriso email " "sot:" #: ../ubuntu_sso/utils/ui.py:137 msgid "" "We are very Sorry! The service that signs you on is not responding right " "now\n" "Please try again or come back in a few minutes." msgstr "" #: ../ubuntu_sso/utils/ui.py:140 msgid "Sorry we did not recognize the email address." msgstr "" #: ../ubuntu_sso/utils/ui.py:142 msgid "Reset code" msgstr "Codice de reset" #: ../ubuntu_sso/utils/ui.py:145 #, python-format msgid "" "A password reset code has been sent to %(email)s.\n" "Please enter the code below along with your new password." msgstr "" "An codice de reset password l'e stat mandà a %(email)s.\n" "Par piazer buta entro al codice sot co'la to nova password." #: ../ubuntu_sso/utils/ui.py:147 msgid "Set Up Account" msgstr "" #: ../ubuntu_sso/utils/ui.py:148 msgid "I don't have an account yet - sign me up" msgstr "" #: ../ubuntu_sso/utils/ui.py:149 msgid "Sign In" msgstr "" #: ../ubuntu_sso/utils/ui.py:150 msgid "Log-in with my existing account." msgstr "" #: ../ubuntu_sso/utils/ui.py:151 msgid "the appname whose ssl error we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:152 msgid "Certificate details" msgstr "" #: ../ubuntu_sso/utils/ui.py:153 msgid "Connect" msgstr "" #: ../ubuntu_sso/utils/ui.py:154 msgid "the details ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:161 msgid "Open the SSL certificate UI." msgstr "" #: ../ubuntu_sso/utils/ui.py:162 msgid "SSL Certificate Not Valid" msgstr "" #: ../ubuntu_sso/utils/ui.py:163 msgid "the domain whose ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:164 #, python-format msgid "" "You are trying to connect to a proxy server on %(domain)s. This server uses " "a secure connection, and the SSL certificate is not valid because:" msgstr "" #: ../ubuntu_sso/utils/ui.py:167 msgid "The certificate has not been verified" msgstr "" #: ../ubuntu_sso/utils/ui.py:168 msgid "Do you want to connect to this server?" msgstr "" #: ../ubuntu_sso/utils/ui.py:169 msgid "Get Help With SSL" msgstr "" #: ../ubuntu_sso/utils/ui.py:170 #, python-format msgid "" "If you are not sure about this server, do not use it to connect to " "%(app_name)s." msgstr "" #: ../ubuntu_sso/utils/ui.py:172 msgid "Remember my settings for this certificate." msgstr "" #: ../ubuntu_sso/utils/ui.py:173 msgid "" "The name on the certificate isn't valid or doesn't match the name of the site" msgstr "" #: ../ubuntu_sso/utils/ui.py:175 msgid "The certificate has expired" msgstr "" #: ../ubuntu_sso/utils/ui.py:176 #, python-format msgid "You are now logged into %(app_name)s." msgstr "" #: ../ubuntu_sso/utils/ui.py:177 msgid "Surname" msgstr "" #: ../ubuntu_sso/utils/ui.py:178 msgid "Terms of Service" msgstr "" #: ../ubuntu_sso/utils/ui.py:179 msgid "Sign Up to {app_name}" msgstr "" #: ../ubuntu_sso/utils/ui.py:180 msgid "Show Terms & Conditions" msgstr "Fa veder condizion de uso" #: ../ubuntu_sso/utils/ui.py:181 #, python-format msgid "" "Agreeing to the %(app_name)s Terms & Conditions is required to subscribe." msgstr "" #: ../ubuntu_sso/utils/ui.py:183 #, python-format msgid "You can also find these terms at %(url)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:184 msgid "Try again" msgstr "" #: ../ubuntu_sso/utils/ui.py:185 msgid "" "There was an error when trying to complete the process. Please check the " "information and try again." msgstr "" "Ghe n'e stat an eror te'l conpletamento del proceso. Par piazer controla le " "informazion e riproa." #: ../ubuntu_sso/utils/ui.py:187 msgid "Verification code" msgstr "" #: ../ubuntu_sso/utils/ui.py:188 #, python-format msgid "" "Check %(email)s for an email from Ubuntu Single Sign On. This message " "contains a verification code. Enter the code in the field below and click OK " "to complete creating your %(app_name)s account." msgstr "" #: ../ubuntu_sso/utils/ui.py:192 msgid "Enter verification code" msgstr "Inserisi al codice de verifica" #: ../ubuntu_sso/utils/ui.py:195 #, python-format msgid "I agree with the %(app_name)s terms and conditions" msgstr "Son d'acordo co le condizion de uso de %(app_name)s" #: ../ubuntu_sso/utils/ui.py:196 #, python-format msgid "Yes! Email me %(app_name)s tips and updates." msgstr "Si! Mandéme emails de sugerimento e agiornamento par %(app_name)s" ubuntu-sso-client-13.10/po/ko.po0000664000202700020270000003033612151461656016745 0ustar dobeydobey00000000000000# Korean translation for ubuntu-sso-client # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the ubuntu-sso-client package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: ubuntu-sso-client\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-09-11 18:25+0000\n" "PO-Revision-Date: 2012-05-15 07:11+0000\n" "Last-Translator: MinSik CHO \n" "Language-Team: Korean \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-09-17 18:24+0000\n" "X-Generator: Launchpad (build 15944)\n" #. Undefined variable '_', pylint: disable=E0602 #. all the text that is used in the gui #: ../ubuntu_sso/utils/ui.py:49 msgid "By signing up to {app_name} you agree to our {privacy_policy}" msgstr "{app_name}ì— ë¡œê·¸ì¸í•˜ë©´ {privacy_policy}ì— ë™ì˜í•˜ëŠ” 것으로 간주ë©ë‹ˆë‹¤." #: ../ubuntu_sso/utils/ui.py:51 msgid "By signing up to {app_name} you agree to our {terms_and_conditions}" msgstr "" #: ../ubuntu_sso/utils/ui.py:53 msgid " and {privacy_policy}" msgstr "" #: ../ubuntu_sso/utils/ui.py:54 msgid "Cancel" msgstr "" #: ../ubuntu_sso/utils/ui.py:55 msgid "Type the characters above" msgstr "위 문ìžë“¤ì„ 입력하십시오" #: ../ubuntu_sso/utils/ui.py:56 msgid "There was a problem getting the captcha, reloading..." msgstr "Captcha를 ê°€ì ¸ì˜¤ëŠ”ë° ë¬¸ì œê°€ 있습니다. ìž¬ì‹œë„ ì¤‘..." #: ../ubuntu_sso/utils/ui.py:58 #, python-format msgid "If you can't read this then %(reload_link)s this page" msgstr "" #: ../ubuntu_sso/utils/ui.py:60 msgid "refresh" msgstr "" #: ../ubuntu_sso/utils/ui.py:61 msgid "Reload" msgstr "새로 고침" #: ../ubuntu_sso/utils/ui.py:62 msgid "The captcha is a required field" msgstr "" #: ../ubuntu_sso/utils/ui.py:63 msgid "Close window and set up later" msgstr "" #: ../ubuntu_sso/utils/ui.py:64 msgid "Congratulations, {app_name} is installed!" msgstr "" #: ../ubuntu_sso/utils/ui.py:65 #, python-format msgid "To connect this computer to %(app_name)s enter your details below." msgstr "%(app_name)sì— ì»´í“¨í„°ë¥¼ 연결하려면 아래 세부 정보를 입력하십시오." #: ../ubuntu_sso/utils/ui.py:67 msgid "Register with {app_name}." msgstr "" #: ../ubuntu_sso/utils/ui.py:68 ../ubuntu_sso/utils/ui.py:93 #: ../ubuntu_sso/utils/ui.py:143 msgid "Email address" msgstr "ì´ë©”ì¼ ì£¼ì†Œ" #: ../ubuntu_sso/utils/ui.py:69 msgid "Re-type Email address" msgstr "ì´ë©”ì¼ ì£¼ì†Œ 재입력" #: ../ubuntu_sso/utils/ui.py:70 msgid "The email must be a valid email address." msgstr "유효한 ì´ë©”ì¼ ì£¼ì†Œì—¬ì•¼ 합니다." #: ../ubuntu_sso/utils/ui.py:71 msgid "" "The email addresses don't match, please double check and try entering them " "again." msgstr "ì´ë©”ì¼ ì£¼ì†Œê°€ ì¼ì¹˜í•˜ì§€ 않습니다. 확ì¸í•´ 주시고 다시 입력해주십시오." #: ../ubuntu_sso/utils/ui.py:73 msgid "Email" msgstr "" #: ../ubuntu_sso/utils/ui.py:74 msgid "The email addresses do not match" msgstr "" #: ../ubuntu_sso/utils/ui.py:75 msgid "Enter code verification here" msgstr "í™•ì¸ ì½”ë“œë¥¼ 여기 ìž…ë ¥" #: ../ubuntu_sso/utils/ui.py:76 msgid "Please enter your name" msgstr "" #: ../ubuntu_sso/utils/ui.py:77 msgid "The process did not finish successfully." msgstr "ê³¼ì •ì´ ì„±ê³µì ìœ¼ë¡œ ë나지 않았습니다." #: ../ubuntu_sso/utils/ui.py:79 msgid "Sign me in with my existing account" msgstr "" #: ../ubuntu_sso/utils/ui.py:80 msgid "This field is required." msgstr "필수 ìž…ë ¥ 항목입니다." #: ../ubuntu_sso/utils/ui.py:81 msgid "I've forgotten my password" msgstr "비밀번호 분실" #: ../ubuntu_sso/utils/ui.py:82 ../ubuntu_sso/utils/ui.py:130 msgid "Reset password" msgstr "비밀번호 재설정" #: ../ubuntu_sso/utils/ui.py:83 msgid "" "To reset your {app_name} password, enter your registered email address " "below. We will send instructions to reset your password." msgstr "" #: ../ubuntu_sso/utils/ui.py:86 msgid "Please enter a valid email address" msgstr "" #: ../ubuntu_sso/utils/ui.py:87 msgid "There was a problem accessing the Ubuntu Single Sign On backend." msgstr "" #: ../ubuntu_sso/utils/ui.py:89 #, python-format msgid "Create %(app_name)s account" msgstr "%(app_name)s 계정 ìƒì„±" #: ../ubuntu_sso/utils/ui.py:90 msgid "Loading..." msgstr "불러오기..." #: ../ubuntu_sso/utils/ui.py:91 msgid "Getting information, please wait..." msgstr "" #: ../ubuntu_sso/utils/ui.py:92 msgid "Already have an account? Click here to sign in" msgstr "ì´ë¯¸ ê³„ì •ì´ ìžˆìŠµë‹ˆê¹Œ? 로그ì¸í•˜ì‹œë ¤ë©´ ì´ê³³ì„ í´ë¦­í•˜ì‹­ì‹œì˜¤." #: ../ubuntu_sso/utils/ui.py:94 #, python-format msgid "Connect to %(app_name)s" msgstr "%(app_name)sì— ì—°ê²°" #: ../ubuntu_sso/utils/ui.py:95 ../ubuntu_sso/utils/ui.py:109 msgid "Password" msgstr "비밀번호" #: ../ubuntu_sso/utils/ui.py:97 msgid "Sign In to {app_name}" msgstr "" #: ../ubuntu_sso/utils/ui.py:99 msgid "Name" msgstr "ì´ë¦„" #: ../ubuntu_sso/utils/ui.py:100 msgid "The name must not be empty." msgstr "" #: ../ubuntu_sso/utils/ui.py:101 msgid "Next" msgstr "다ìŒ" #: ../ubuntu_sso/utils/ui.py:102 msgid "Network detection" msgstr "" #: ../ubuntu_sso/utils/ui.py:103 #, python-format msgid "" "Are you online? We can't detect an internet connection - you will need to be " "connected to set up %(app_name)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:105 msgid "One moment please..." msgstr "잠시만 기다려 주십시오..." #: ../ubuntu_sso/utils/ui.py:106 msgid "Create a password" msgstr "" #: ../ubuntu_sso/utils/ui.py:107 msgid "Your password was successfully changed." msgstr "비밀번호가 성공ì ìœ¼ë¡œ 변경ë˜ì—ˆìŠµë‹ˆë‹¤." #: ../ubuntu_sso/utils/ui.py:108 msgid "At least one number" msgstr "" #: ../ubuntu_sso/utils/ui.py:110 msgid "Re-type Password" msgstr "비밀번호 재입력" #: ../ubuntu_sso/utils/ui.py:111 msgid "" "The password must have a minimum of 8 characters and include one uppercase " "character and one number." msgstr "비멀번호는 최소 8글ìžì´ê³ , í•œê¸€ìž ì´ìƒì˜ 알파벳 대문ìž, í•œê¸€ìž ì´ìƒì˜ 숫ìžë¥¼ í¬í•¨í•´ì•¼ 합니다." #: ../ubuntu_sso/utils/ui.py:113 msgid "At least 8 characters" msgstr "" #: ../ubuntu_sso/utils/ui.py:114 msgid "Passwords don't match" msgstr "" #: ../ubuntu_sso/utils/ui.py:115 msgid "" "The passwords don't match, please double check and try entering them again." msgstr "비밀번호가 ì¼ì¹˜í•˜ì§€ 않습니다. 다시 한번 확ì¸í•˜ê³  다시 입력하십시오." #: ../ubuntu_sso/utils/ui.py:117 msgid "Your password must contain" msgstr "" #: ../ubuntu_sso/utils/ui.py:118 msgid "The password is too weak." msgstr "비밀번호가 너무 허술합니다." #: ../ubuntu_sso/utils/ui.py:119 msgid "At least one uppercase letter" msgstr "" #: ../ubuntu_sso/utils/ui.py:120 msgid "Privacy Policy" msgstr "" #: ../ubuntu_sso/utils/ui.py:121 msgid "Connecting to:" msgstr "" #: ../ubuntu_sso/utils/ui.py:122 msgid "Proxy Settings" msgstr "" #: ../ubuntu_sso/utils/ui.py:123 msgid "Incorrect login details. Please try again." msgstr "" #: ../ubuntu_sso/utils/ui.py:124 msgid "Please provide login details." msgstr "" #: ../ubuntu_sso/utils/ui.py:125 msgid "You are connecting through a proxy." msgstr "" #: ../ubuntu_sso/utils/ui.py:126 msgid "Get Help With Proxies" msgstr "" #: ../ubuntu_sso/utils/ui.py:127 msgid "Proxy password:" msgstr "" #: ../ubuntu_sso/utils/ui.py:128 msgid "Save and Connect" msgstr "" #: ../ubuntu_sso/utils/ui.py:129 msgid "Proxy username:" msgstr "" #: ../ubuntu_sso/utils/ui.py:131 msgid "" "A password reset code has been sent to your e-mail. Please enter the code " "below along with your new password." msgstr "" #: ../ubuntu_sso/utils/ui.py:133 msgid "Retype email" msgstr "" #: ../ubuntu_sso/utils/ui.py:134 msgid "Retype password" msgstr "" #: ../ubuntu_sso/utils/ui.py:135 #, python-format msgid "To reset your %(app_name)s password, enter your email address below:" msgstr "%(app_name)s 비밀번호를 재설정하기 위해서, ì´ë©”ì¼ ì£¼ì†Œë¥¼ 아래 입력하십시오:" #: ../ubuntu_sso/utils/ui.py:137 msgid "" "We are very Sorry! The service that signs you on is not responding right " "now\n" "Please try again or come back in a few minutes." msgstr "" #: ../ubuntu_sso/utils/ui.py:140 msgid "Sorry we did not recognize the email address." msgstr "" #: ../ubuntu_sso/utils/ui.py:142 msgid "Reset code" msgstr "코드 재설정" #: ../ubuntu_sso/utils/ui.py:145 #, python-format msgid "" "A password reset code has been sent to %(email)s.\n" "Please enter the code below along with your new password." msgstr "" "비밀번호 재설정 코드가 %(email)sì— ë°œì†¡ë˜ì—ˆìŠµë‹ˆë‹¤.\n" "ì•„ëž˜ì— ë¹„ë°€ë²ˆí˜¸ 재설정 코드와 새로운 비밀번호를 함께 입력하십시오." #: ../ubuntu_sso/utils/ui.py:147 msgid "Set Up Account" msgstr "" #: ../ubuntu_sso/utils/ui.py:148 msgid "I don't have an account yet - sign me up" msgstr "" #: ../ubuntu_sso/utils/ui.py:149 msgid "Sign In" msgstr "" #: ../ubuntu_sso/utils/ui.py:150 msgid "Log-in with my existing account." msgstr "" #: ../ubuntu_sso/utils/ui.py:151 msgid "the appname whose ssl error we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:152 msgid "Certificate details" msgstr "" #: ../ubuntu_sso/utils/ui.py:153 msgid "Connect" msgstr "" #: ../ubuntu_sso/utils/ui.py:154 msgid "the details ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:161 msgid "Open the SSL certificate UI." msgstr "" #: ../ubuntu_sso/utils/ui.py:162 msgid "SSL Certificate Not Valid" msgstr "" #: ../ubuntu_sso/utils/ui.py:163 msgid "the domain whose ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:164 #, python-format msgid "" "You are trying to connect to a proxy server on %(domain)s. This server uses " "a secure connection, and the SSL certificate is not valid because:" msgstr "" #: ../ubuntu_sso/utils/ui.py:167 msgid "The certificate has not been verified" msgstr "" #: ../ubuntu_sso/utils/ui.py:168 msgid "Do you want to connect to this server?" msgstr "" #: ../ubuntu_sso/utils/ui.py:169 msgid "Get Help With SSL" msgstr "" #: ../ubuntu_sso/utils/ui.py:170 #, python-format msgid "" "If you are not sure about this server, do not use it to connect to " "%(app_name)s." msgstr "" #: ../ubuntu_sso/utils/ui.py:172 msgid "Remember my settings for this certificate." msgstr "" #: ../ubuntu_sso/utils/ui.py:173 msgid "" "The name on the certificate isn't valid or doesn't match the name of the site" msgstr "" #: ../ubuntu_sso/utils/ui.py:175 msgid "The certificate has expired" msgstr "" #: ../ubuntu_sso/utils/ui.py:176 #, python-format msgid "You are now logged into %(app_name)s." msgstr "" #: ../ubuntu_sso/utils/ui.py:177 msgid "Surname" msgstr "" #: ../ubuntu_sso/utils/ui.py:178 msgid "Terms of Service" msgstr "" #: ../ubuntu_sso/utils/ui.py:179 msgid "Sign Up to {app_name}" msgstr "" #: ../ubuntu_sso/utils/ui.py:180 msgid "Show Terms & Conditions" msgstr "약관 보기" #: ../ubuntu_sso/utils/ui.py:181 #, python-format msgid "" "Agreeing to the %(app_name)s Terms & Conditions is required to subscribe." msgstr "" #: ../ubuntu_sso/utils/ui.py:183 #, python-format msgid "You can also find these terms at %(url)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:184 msgid "Try again" msgstr "" #: ../ubuntu_sso/utils/ui.py:185 msgid "" "There was an error when trying to complete the process. Please check the " "information and try again." msgstr "ê³¼ì •ì„ ì™„ì„±í•˜ëŠ”ë° ì˜¤ë¥˜ê°€ 있습니다. ë‚´ìš©ì„ í™•ì¸í•˜ê³  다시 시ë„하십시오." #: ../ubuntu_sso/utils/ui.py:187 msgid "Verification code" msgstr "" #: ../ubuntu_sso/utils/ui.py:188 #, python-format msgid "" "Check %(email)s for an email from Ubuntu Single Sign On. This message " "contains a verification code. Enter the code in the field below and click OK " "to complete creating your %(app_name)s account." msgstr "" #: ../ubuntu_sso/utils/ui.py:192 msgid "Enter verification code" msgstr "í™•ì¸ ì½”ë“œ ìž…ë ¥" #: ../ubuntu_sso/utils/ui.py:195 #, python-format msgid "I agree with the %(app_name)s terms and conditions" msgstr "나는 %(app_name)sì˜ ì•½ê´€ì— ë™ì˜í•©ë‹ˆë‹¤." #: ../ubuntu_sso/utils/ui.py:196 #, python-format msgid "Yes! Email me %(app_name)s tips and updates." msgstr "예! %(app_name)s íŒê³¼ ì—…ë°ì´íЏ 정보를 ì œ ì´ë©”ì¼ë¡œ 보내주십시오." ubuntu-sso-client-13.10/po/sr.po0000664000202700020270000003150512151461656016757 0ustar dobeydobey00000000000000# Serbian translation for ubuntu-sso-client # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the ubuntu-sso-client package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: ubuntu-sso-client\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-09-11 18:25+0000\n" "PO-Revision-Date: 2010-12-08 15:45+0000\n" "Last-Translator: МироÑлав Ðиколић \n" "Language-Team: Serbian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-09-17 18:24+0000\n" "X-Generator: Launchpad (build 15944)\n" #. Undefined variable '_', pylint: disable=E0602 #. all the text that is used in the gui #: ../ubuntu_sso/utils/ui.py:49 msgid "By signing up to {app_name} you agree to our {privacy_policy}" msgstr "" #: ../ubuntu_sso/utils/ui.py:51 msgid "By signing up to {app_name} you agree to our {terms_and_conditions}" msgstr "" #: ../ubuntu_sso/utils/ui.py:53 msgid " and {privacy_policy}" msgstr "" #: ../ubuntu_sso/utils/ui.py:54 msgid "Cancel" msgstr "" #: ../ubuntu_sso/utils/ui.py:55 msgid "Type the characters above" msgstr "Упишите знакове иÑпод" #: ../ubuntu_sso/utils/ui.py:56 msgid "There was a problem getting the captcha, reloading..." msgstr "Дошло је до проблема приликом преузимања, поново учитавам..." #: ../ubuntu_sso/utils/ui.py:58 #, python-format msgid "If you can't read this then %(reload_link)s this page" msgstr "" #: ../ubuntu_sso/utils/ui.py:60 msgid "refresh" msgstr "" #: ../ubuntu_sso/utils/ui.py:61 msgid "Reload" msgstr "Обнови" #: ../ubuntu_sso/utils/ui.py:62 msgid "The captcha is a required field" msgstr "" #: ../ubuntu_sso/utils/ui.py:63 msgid "Close window and set up later" msgstr "" #: ../ubuntu_sso/utils/ui.py:64 msgid "Congratulations, {app_name} is installed!" msgstr "" #: ../ubuntu_sso/utils/ui.py:65 #, python-format msgid "To connect this computer to %(app_name)s enter your details below." msgstr "Да повежете овај рачунар на %(app_name)s унеÑите Ваше детаље иÑпод." #: ../ubuntu_sso/utils/ui.py:67 msgid "Register with {app_name}." msgstr "" #: ../ubuntu_sso/utils/ui.py:68 ../ubuntu_sso/utils/ui.py:93 #: ../ubuntu_sso/utils/ui.py:143 msgid "Email address" msgstr "ÐдреÑа е-поште" #: ../ubuntu_sso/utils/ui.py:69 msgid "Re-type Email address" msgstr "Поново упишите адреÑу е-поште" #: ../ubuntu_sso/utils/ui.py:70 msgid "The email must be a valid email address." msgstr "Е-пошта мора бити иÑправна адреÑа е-поште." #: ../ubuntu_sso/utils/ui.py:71 msgid "" "The email addresses don't match, please double check and try entering them " "again." msgstr "" "ÐдреÑе е-поште Ñе не подударају, проверите два пута и покушајте да их поново " "упишете." #: ../ubuntu_sso/utils/ui.py:73 msgid "Email" msgstr "" #: ../ubuntu_sso/utils/ui.py:74 msgid "The email addresses do not match" msgstr "" #: ../ubuntu_sso/utils/ui.py:75 msgid "Enter code verification here" msgstr "Овде унеÑите шифру за проверу" #: ../ubuntu_sso/utils/ui.py:76 msgid "Please enter your name" msgstr "" #: ../ubuntu_sso/utils/ui.py:77 msgid "The process did not finish successfully." msgstr "ÐŸÑ€Ð¾Ñ†ÐµÑ Ð½Ð¸Ñ˜Ðµ уÑпешно завршен." #: ../ubuntu_sso/utils/ui.py:79 msgid "Sign me in with my existing account" msgstr "" #: ../ubuntu_sso/utils/ui.py:80 msgid "This field is required." msgstr "Ово поље је обавезно." #: ../ubuntu_sso/utils/ui.py:81 msgid "I've forgotten my password" msgstr "Заборавио Ñам моју лозинку" #: ../ubuntu_sso/utils/ui.py:82 ../ubuntu_sso/utils/ui.py:130 msgid "Reset password" msgstr "РеÑетуј лозинку" #: ../ubuntu_sso/utils/ui.py:83 msgid "" "To reset your {app_name} password, enter your registered email address " "below. We will send instructions to reset your password." msgstr "" #: ../ubuntu_sso/utils/ui.py:86 msgid "Please enter a valid email address" msgstr "" #: ../ubuntu_sso/utils/ui.py:87 msgid "There was a problem accessing the Ubuntu Single Sign On backend." msgstr "" #: ../ubuntu_sso/utils/ui.py:89 #, python-format msgid "Create %(app_name)s account" msgstr "Ðаправите налог за %(app_name)s" #: ../ubuntu_sso/utils/ui.py:90 msgid "Loading..." msgstr "Учитавам..." #: ../ubuntu_sso/utils/ui.py:91 msgid "Getting information, please wait..." msgstr "" #: ../ubuntu_sso/utils/ui.py:92 msgid "Already have an account? Click here to sign in" msgstr "Већ имате један налог? Кликните овде да Ñе пријавите" #: ../ubuntu_sso/utils/ui.py:94 #, python-format msgid "Connect to %(app_name)s" msgstr "Повежи Ñе на %(app_name)s" #: ../ubuntu_sso/utils/ui.py:95 ../ubuntu_sso/utils/ui.py:109 msgid "Password" msgstr "Лозинка" #: ../ubuntu_sso/utils/ui.py:97 msgid "Sign In to {app_name}" msgstr "" #: ../ubuntu_sso/utils/ui.py:99 msgid "Name" msgstr "Име" #: ../ubuntu_sso/utils/ui.py:100 msgid "The name must not be empty." msgstr "" #: ../ubuntu_sso/utils/ui.py:101 msgid "Next" msgstr "Даље" #: ../ubuntu_sso/utils/ui.py:102 msgid "Network detection" msgstr "" #: ../ubuntu_sso/utils/ui.py:103 #, python-format msgid "" "Are you online? We can't detect an internet connection - you will need to be " "connected to set up %(app_name)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:105 msgid "One moment please..." msgstr "Молим Ñачекајте мало..." #: ../ubuntu_sso/utils/ui.py:106 msgid "Create a password" msgstr "" #: ../ubuntu_sso/utils/ui.py:107 msgid "Your password was successfully changed." msgstr "Ваша лозинка је уÑпешно промењена." #: ../ubuntu_sso/utils/ui.py:108 msgid "At least one number" msgstr "" #: ../ubuntu_sso/utils/ui.py:110 msgid "Re-type Password" msgstr "Поново упишите лозинку" #: ../ubuntu_sso/utils/ui.py:111 msgid "" "The password must have a minimum of 8 characters and include one uppercase " "character and one number." msgstr "" "Лозинка мора имати најмање 8 знакова и Ñадржати један знак великог Ñлова и " "један број." #: ../ubuntu_sso/utils/ui.py:113 msgid "At least 8 characters" msgstr "" #: ../ubuntu_sso/utils/ui.py:114 msgid "Passwords don't match" msgstr "" #: ../ubuntu_sso/utils/ui.py:115 msgid "" "The passwords don't match, please double check and try entering them again." msgstr "" "Лозинке Ñе не подударају, проверите два пута и покушајте да их поново " "упишете." #: ../ubuntu_sso/utils/ui.py:117 msgid "Your password must contain" msgstr "" #: ../ubuntu_sso/utils/ui.py:118 msgid "The password is too weak." msgstr "Лозинка је иÑувише Ñлаба." #: ../ubuntu_sso/utils/ui.py:119 msgid "At least one uppercase letter" msgstr "" #: ../ubuntu_sso/utils/ui.py:120 msgid "Privacy Policy" msgstr "" #: ../ubuntu_sso/utils/ui.py:121 msgid "Connecting to:" msgstr "" #: ../ubuntu_sso/utils/ui.py:122 msgid "Proxy Settings" msgstr "" #: ../ubuntu_sso/utils/ui.py:123 msgid "Incorrect login details. Please try again." msgstr "" #: ../ubuntu_sso/utils/ui.py:124 msgid "Please provide login details." msgstr "" #: ../ubuntu_sso/utils/ui.py:125 msgid "You are connecting through a proxy." msgstr "" #: ../ubuntu_sso/utils/ui.py:126 msgid "Get Help With Proxies" msgstr "" #: ../ubuntu_sso/utils/ui.py:127 msgid "Proxy password:" msgstr "" #: ../ubuntu_sso/utils/ui.py:128 msgid "Save and Connect" msgstr "" #: ../ubuntu_sso/utils/ui.py:129 msgid "Proxy username:" msgstr "" #: ../ubuntu_sso/utils/ui.py:131 msgid "" "A password reset code has been sent to your e-mail. Please enter the code " "below along with your new password." msgstr "" #: ../ubuntu_sso/utils/ui.py:133 msgid "Retype email" msgstr "" #: ../ubuntu_sso/utils/ui.py:134 msgid "Retype password" msgstr "" #: ../ubuntu_sso/utils/ui.py:135 #, python-format msgid "To reset your %(app_name)s password, enter your email address below:" msgstr "" "Да реÑетујете Вашу %(app_name)s лозинку, иÑпод упишите адреÑу Ваше е-поште:" #: ../ubuntu_sso/utils/ui.py:137 msgid "" "We are very Sorry! The service that signs you on is not responding right " "now\n" "Please try again or come back in a few minutes." msgstr "" #: ../ubuntu_sso/utils/ui.py:140 msgid "Sorry we did not recognize the email address." msgstr "" #: ../ubuntu_sso/utils/ui.py:142 msgid "Reset code" msgstr "РеÑетуј шифру" #: ../ubuntu_sso/utils/ui.py:145 #, python-format msgid "" "A password reset code has been sent to %(email)s.\n" "Please enter the code below along with your new password." msgstr "" "Шифра за поништавање лозинке је поÑлата до %(email)s.\n" "ИÑпод упишите шифру заједно Ñа Вашом новом лозинком." #: ../ubuntu_sso/utils/ui.py:147 msgid "Set Up Account" msgstr "" #: ../ubuntu_sso/utils/ui.py:148 msgid "I don't have an account yet - sign me up" msgstr "" #: ../ubuntu_sso/utils/ui.py:149 msgid "Sign In" msgstr "" #: ../ubuntu_sso/utils/ui.py:150 msgid "Log-in with my existing account." msgstr "" #: ../ubuntu_sso/utils/ui.py:151 msgid "the appname whose ssl error we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:152 msgid "Certificate details" msgstr "" #: ../ubuntu_sso/utils/ui.py:153 msgid "Connect" msgstr "" #: ../ubuntu_sso/utils/ui.py:154 msgid "the details ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:161 msgid "Open the SSL certificate UI." msgstr "" #: ../ubuntu_sso/utils/ui.py:162 msgid "SSL Certificate Not Valid" msgstr "" #: ../ubuntu_sso/utils/ui.py:163 msgid "the domain whose ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:164 #, python-format msgid "" "You are trying to connect to a proxy server on %(domain)s. This server uses " "a secure connection, and the SSL certificate is not valid because:" msgstr "" #: ../ubuntu_sso/utils/ui.py:167 msgid "The certificate has not been verified" msgstr "" #: ../ubuntu_sso/utils/ui.py:168 msgid "Do you want to connect to this server?" msgstr "" #: ../ubuntu_sso/utils/ui.py:169 msgid "Get Help With SSL" msgstr "" #: ../ubuntu_sso/utils/ui.py:170 #, python-format msgid "" "If you are not sure about this server, do not use it to connect to " "%(app_name)s." msgstr "" #: ../ubuntu_sso/utils/ui.py:172 msgid "Remember my settings for this certificate." msgstr "" #: ../ubuntu_sso/utils/ui.py:173 msgid "" "The name on the certificate isn't valid or doesn't match the name of the site" msgstr "" #: ../ubuntu_sso/utils/ui.py:175 msgid "The certificate has expired" msgstr "" #: ../ubuntu_sso/utils/ui.py:176 #, python-format msgid "You are now logged into %(app_name)s." msgstr "" #: ../ubuntu_sso/utils/ui.py:177 msgid "Surname" msgstr "" #: ../ubuntu_sso/utils/ui.py:178 msgid "Terms of Service" msgstr "" #: ../ubuntu_sso/utils/ui.py:179 msgid "Sign Up to {app_name}" msgstr "" #: ../ubuntu_sso/utils/ui.py:180 msgid "Show Terms & Conditions" msgstr "Прикажи уÑлове и одредбе" #: ../ubuntu_sso/utils/ui.py:181 #, python-format msgid "" "Agreeing to the %(app_name)s Terms & Conditions is required to subscribe." msgstr "" #: ../ubuntu_sso/utils/ui.py:183 #, python-format msgid "You can also find these terms at %(url)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:184 msgid "Try again" msgstr "" #: ../ubuntu_sso/utils/ui.py:185 msgid "" "There was an error when trying to complete the process. Please check the " "information and try again." msgstr "" "Дошло је до грешке приликом покушаја обављања процеÑа. Проверите информације " "и пробајте опет." #: ../ubuntu_sso/utils/ui.py:187 msgid "Verification code" msgstr "" #: ../ubuntu_sso/utils/ui.py:188 #, python-format msgid "" "Check %(email)s for an email from Ubuntu Single Sign On. This message " "contains a verification code. Enter the code in the field below and click OK " "to complete creating your %(app_name)s account." msgstr "" #: ../ubuntu_sso/utils/ui.py:192 msgid "Enter verification code" msgstr "УнеÑите шифру за проверу" #: ../ubuntu_sso/utils/ui.py:195 #, python-format msgid "I agree with the %(app_name)s terms and conditions" msgstr "Слажем Ñе Ñа %(app_name)s правилима и уÑловима" #: ../ubuntu_sso/utils/ui.py:196 #, python-format msgid "Yes! Email me %(app_name)s tips and updates." msgstr "Да! Пошаљите ми %(app_name)s Ñавете и допуне." ubuntu-sso-client-13.10/po/LINGUAS0000664000202700020270000000043212151461656017013 0ustar dobeydobey00000000000000ace af am ar ary ast be bg bn bs ca ca@valencia ckb cs cy da de el en_AU en_CA en_GB eo es et eu fa fi fo fr fy gd gl he hi hr hu hy id is it ja ka kk km kn ko ky lt lv mi ml ms my nb ne nl nn oc pl pt pt_BR ro ru se shn si sk sl sq sr sv ta te th tr ug uk vec vi zh_CN zh_HK zh_TW ubuntu-sso-client-13.10/po/en_CA.po0000664000202700020270000002751112151461656017302 0ustar dobeydobey00000000000000# English (Canada) translation for ubuntu-sso-client # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the ubuntu-sso-client package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: ubuntu-sso-client\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-09-11 18:25+0000\n" "PO-Revision-Date: 2010-09-17 18:07+0000\n" "Last-Translator: Daniel LeBlanc \n" "Language-Team: English (Canada) \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-09-17 18:24+0000\n" "X-Generator: Launchpad (build 15944)\n" #. Undefined variable '_', pylint: disable=E0602 #. all the text that is used in the gui #: ../ubuntu_sso/utils/ui.py:49 msgid "By signing up to {app_name} you agree to our {privacy_policy}" msgstr "" #: ../ubuntu_sso/utils/ui.py:51 msgid "By signing up to {app_name} you agree to our {terms_and_conditions}" msgstr "" #: ../ubuntu_sso/utils/ui.py:53 msgid " and {privacy_policy}" msgstr "" #: ../ubuntu_sso/utils/ui.py:54 msgid "Cancel" msgstr "" #: ../ubuntu_sso/utils/ui.py:55 msgid "Type the characters above" msgstr "Type the characters above" #: ../ubuntu_sso/utils/ui.py:56 msgid "There was a problem getting the captcha, reloading..." msgstr "There was a problem getting the captcha, reloading..." #: ../ubuntu_sso/utils/ui.py:58 #, python-format msgid "If you can't read this then %(reload_link)s this page" msgstr "" #: ../ubuntu_sso/utils/ui.py:60 msgid "refresh" msgstr "" #: ../ubuntu_sso/utils/ui.py:61 msgid "Reload" msgstr "Reload" #: ../ubuntu_sso/utils/ui.py:62 msgid "The captcha is a required field" msgstr "" #: ../ubuntu_sso/utils/ui.py:63 msgid "Close window and set up later" msgstr "" #: ../ubuntu_sso/utils/ui.py:64 msgid "Congratulations, {app_name} is installed!" msgstr "" #: ../ubuntu_sso/utils/ui.py:65 #, python-format msgid "To connect this computer to %(app_name)s enter your details below." msgstr "To connect this computer to %(app_name)s enter your details below." #: ../ubuntu_sso/utils/ui.py:67 msgid "Register with {app_name}." msgstr "" #: ../ubuntu_sso/utils/ui.py:68 ../ubuntu_sso/utils/ui.py:93 #: ../ubuntu_sso/utils/ui.py:143 msgid "Email address" msgstr "Email address" #: ../ubuntu_sso/utils/ui.py:69 msgid "Re-type Email address" msgstr "Re-type Email address" #: ../ubuntu_sso/utils/ui.py:70 msgid "The email must be a valid email address." msgstr "The email must be a valid email address." #: ../ubuntu_sso/utils/ui.py:71 msgid "" "The email addresses don't match, please double check and try entering them " "again." msgstr "" "The email addresses don't match, please double check and try entering them " "again." #: ../ubuntu_sso/utils/ui.py:73 msgid "Email" msgstr "" #: ../ubuntu_sso/utils/ui.py:74 msgid "The email addresses do not match" msgstr "" #: ../ubuntu_sso/utils/ui.py:75 msgid "Enter code verification here" msgstr "Enter code verification here" #: ../ubuntu_sso/utils/ui.py:76 msgid "Please enter your name" msgstr "" #: ../ubuntu_sso/utils/ui.py:77 msgid "The process did not finish successfully." msgstr "The process did not finish successfully." #: ../ubuntu_sso/utils/ui.py:79 msgid "Sign me in with my existing account" msgstr "" #: ../ubuntu_sso/utils/ui.py:80 msgid "This field is required." msgstr "This field is required." #: ../ubuntu_sso/utils/ui.py:81 msgid "I've forgotten my password" msgstr "I've forgotten my password" #: ../ubuntu_sso/utils/ui.py:82 ../ubuntu_sso/utils/ui.py:130 msgid "Reset password" msgstr "Reset password" #: ../ubuntu_sso/utils/ui.py:83 msgid "" "To reset your {app_name} password, enter your registered email address " "below. We will send instructions to reset your password." msgstr "" #: ../ubuntu_sso/utils/ui.py:86 msgid "Please enter a valid email address" msgstr "" #: ../ubuntu_sso/utils/ui.py:87 msgid "There was a problem accessing the Ubuntu Single Sign On backend." msgstr "" #: ../ubuntu_sso/utils/ui.py:89 #, python-format msgid "Create %(app_name)s account" msgstr "Create %(app_name)s account" #: ../ubuntu_sso/utils/ui.py:90 msgid "Loading..." msgstr "Loading..." #: ../ubuntu_sso/utils/ui.py:91 msgid "Getting information, please wait..." msgstr "" #: ../ubuntu_sso/utils/ui.py:92 msgid "Already have an account? Click here to sign in" msgstr "Already have an account? Click here to sign in" #: ../ubuntu_sso/utils/ui.py:94 #, python-format msgid "Connect to %(app_name)s" msgstr "Connect to %(app_name)s" #: ../ubuntu_sso/utils/ui.py:95 ../ubuntu_sso/utils/ui.py:109 msgid "Password" msgstr "Password" #: ../ubuntu_sso/utils/ui.py:97 msgid "Sign In to {app_name}" msgstr "" #: ../ubuntu_sso/utils/ui.py:99 msgid "Name" msgstr "Name" #: ../ubuntu_sso/utils/ui.py:100 msgid "The name must not be empty." msgstr "" #: ../ubuntu_sso/utils/ui.py:101 msgid "Next" msgstr "Next" #: ../ubuntu_sso/utils/ui.py:102 msgid "Network detection" msgstr "" #: ../ubuntu_sso/utils/ui.py:103 #, python-format msgid "" "Are you online? We can't detect an internet connection - you will need to be " "connected to set up %(app_name)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:105 msgid "One moment please..." msgstr "One moment please..." #: ../ubuntu_sso/utils/ui.py:106 msgid "Create a password" msgstr "" #: ../ubuntu_sso/utils/ui.py:107 msgid "Your password was successfully changed." msgstr "Your password was successfully changed." #: ../ubuntu_sso/utils/ui.py:108 msgid "At least one number" msgstr "" #: ../ubuntu_sso/utils/ui.py:110 msgid "Re-type Password" msgstr "Re-type Password" #: ../ubuntu_sso/utils/ui.py:111 msgid "" "The password must have a minimum of 8 characters and include one uppercase " "character and one number." msgstr "" "The password must have a minimum of 8 characters and include one uppercase " "character and one number." #: ../ubuntu_sso/utils/ui.py:113 msgid "At least 8 characters" msgstr "" #: ../ubuntu_sso/utils/ui.py:114 msgid "Passwords don't match" msgstr "" #: ../ubuntu_sso/utils/ui.py:115 msgid "" "The passwords don't match, please double check and try entering them again." msgstr "" "The passwords don't match, please double check and try entering them again." #: ../ubuntu_sso/utils/ui.py:117 msgid "Your password must contain" msgstr "" #: ../ubuntu_sso/utils/ui.py:118 msgid "The password is too weak." msgstr "The password is too weak." #: ../ubuntu_sso/utils/ui.py:119 msgid "At least one uppercase letter" msgstr "" #: ../ubuntu_sso/utils/ui.py:120 msgid "Privacy Policy" msgstr "" #: ../ubuntu_sso/utils/ui.py:121 msgid "Connecting to:" msgstr "" #: ../ubuntu_sso/utils/ui.py:122 msgid "Proxy Settings" msgstr "" #: ../ubuntu_sso/utils/ui.py:123 msgid "Incorrect login details. Please try again." msgstr "" #: ../ubuntu_sso/utils/ui.py:124 msgid "Please provide login details." msgstr "" #: ../ubuntu_sso/utils/ui.py:125 msgid "You are connecting through a proxy." msgstr "" #: ../ubuntu_sso/utils/ui.py:126 msgid "Get Help With Proxies" msgstr "" #: ../ubuntu_sso/utils/ui.py:127 msgid "Proxy password:" msgstr "" #: ../ubuntu_sso/utils/ui.py:128 msgid "Save and Connect" msgstr "" #: ../ubuntu_sso/utils/ui.py:129 msgid "Proxy username:" msgstr "" #: ../ubuntu_sso/utils/ui.py:131 msgid "" "A password reset code has been sent to your e-mail. Please enter the code " "below along with your new password." msgstr "" #: ../ubuntu_sso/utils/ui.py:133 msgid "Retype email" msgstr "" #: ../ubuntu_sso/utils/ui.py:134 msgid "Retype password" msgstr "" #: ../ubuntu_sso/utils/ui.py:135 #, python-format msgid "To reset your %(app_name)s password, enter your email address below:" msgstr "To reset your %(app_name)s password, enter your email address below:" #: ../ubuntu_sso/utils/ui.py:137 msgid "" "We are very Sorry! The service that signs you on is not responding right " "now\n" "Please try again or come back in a few minutes." msgstr "" #: ../ubuntu_sso/utils/ui.py:140 msgid "Sorry we did not recognize the email address." msgstr "" #: ../ubuntu_sso/utils/ui.py:142 msgid "Reset code" msgstr "Reset code" #: ../ubuntu_sso/utils/ui.py:145 #, python-format msgid "" "A password reset code has been sent to %(email)s.\n" "Please enter the code below along with your new password." msgstr "" "A password reset code has been sent to %(email)s.\n" "Please enter the code below along with your new password." #: ../ubuntu_sso/utils/ui.py:147 msgid "Set Up Account" msgstr "" #: ../ubuntu_sso/utils/ui.py:148 msgid "I don't have an account yet - sign me up" msgstr "" #: ../ubuntu_sso/utils/ui.py:149 msgid "Sign In" msgstr "" #: ../ubuntu_sso/utils/ui.py:150 msgid "Log-in with my existing account." msgstr "" #: ../ubuntu_sso/utils/ui.py:151 msgid "the appname whose ssl error we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:152 msgid "Certificate details" msgstr "" #: ../ubuntu_sso/utils/ui.py:153 msgid "Connect" msgstr "" #: ../ubuntu_sso/utils/ui.py:154 msgid "the details ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:161 msgid "Open the SSL certificate UI." msgstr "" #: ../ubuntu_sso/utils/ui.py:162 msgid "SSL Certificate Not Valid" msgstr "" #: ../ubuntu_sso/utils/ui.py:163 msgid "the domain whose ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:164 #, python-format msgid "" "You are trying to connect to a proxy server on %(domain)s. This server uses " "a secure connection, and the SSL certificate is not valid because:" msgstr "" #: ../ubuntu_sso/utils/ui.py:167 msgid "The certificate has not been verified" msgstr "" #: ../ubuntu_sso/utils/ui.py:168 msgid "Do you want to connect to this server?" msgstr "" #: ../ubuntu_sso/utils/ui.py:169 msgid "Get Help With SSL" msgstr "" #: ../ubuntu_sso/utils/ui.py:170 #, python-format msgid "" "If you are not sure about this server, do not use it to connect to " "%(app_name)s." msgstr "" #: ../ubuntu_sso/utils/ui.py:172 msgid "Remember my settings for this certificate." msgstr "" #: ../ubuntu_sso/utils/ui.py:173 msgid "" "The name on the certificate isn't valid or doesn't match the name of the site" msgstr "" #: ../ubuntu_sso/utils/ui.py:175 msgid "The certificate has expired" msgstr "" #: ../ubuntu_sso/utils/ui.py:176 #, python-format msgid "You are now logged into %(app_name)s." msgstr "" #: ../ubuntu_sso/utils/ui.py:177 msgid "Surname" msgstr "" #: ../ubuntu_sso/utils/ui.py:178 msgid "Terms of Service" msgstr "" #: ../ubuntu_sso/utils/ui.py:179 msgid "Sign Up to {app_name}" msgstr "" #: ../ubuntu_sso/utils/ui.py:180 msgid "Show Terms & Conditions" msgstr "Show Terms & Conditions" #: ../ubuntu_sso/utils/ui.py:181 #, python-format msgid "" "Agreeing to the %(app_name)s Terms & Conditions is required to subscribe." msgstr "" #: ../ubuntu_sso/utils/ui.py:183 #, python-format msgid "You can also find these terms at %(url)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:184 msgid "Try again" msgstr "" #: ../ubuntu_sso/utils/ui.py:185 msgid "" "There was an error when trying to complete the process. Please check the " "information and try again." msgstr "" "There was an error when trying to complete the process. Please check the " "information and try again." #: ../ubuntu_sso/utils/ui.py:187 msgid "Verification code" msgstr "" #: ../ubuntu_sso/utils/ui.py:188 #, python-format msgid "" "Check %(email)s for an email from Ubuntu Single Sign On. This message " "contains a verification code. Enter the code in the field below and click OK " "to complete creating your %(app_name)s account." msgstr "" #: ../ubuntu_sso/utils/ui.py:192 msgid "Enter verification code" msgstr "Enter verification code" #: ../ubuntu_sso/utils/ui.py:195 #, python-format msgid "I agree with the %(app_name)s terms and conditions" msgstr "I agree with the %(app_name)s terms and conditions" #: ../ubuntu_sso/utils/ui.py:196 #, python-format msgid "Yes! Email me %(app_name)s tips and updates." msgstr "Yes! Email me %(app_name)s tips and updates." ubuntu-sso-client-13.10/po/cs.po0000664000202700020270000003565112151461656016746 0ustar dobeydobey00000000000000# Czech translation for ubuntu-sso-client # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the ubuntu-sso-client package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: ubuntu-sso-client\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-09-11 18:25+0000\n" "PO-Revision-Date: 2012-09-08 16:24+0000\n" "Last-Translator: Martin \"sachy\" Šácha \n" "Language-Team: Czech \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-09-17 18:24+0000\n" "X-Generator: Launchpad (build 15944)\n" #. Undefined variable '_', pylint: disable=E0602 #. all the text that is used in the gui #: ../ubuntu_sso/utils/ui.py:49 msgid "By signing up to {app_name} you agree to our {privacy_policy}" msgstr "PÅ™ihlášením do aplikace {app_name} souhlasíte s {privacy_policy}" #: ../ubuntu_sso/utils/ui.py:51 msgid "By signing up to {app_name} you agree to our {terms_and_conditions}" msgstr "" "PÅ™ihlášením do aplikace {app_name} souhlasíte s {terms_and_conditions}" #: ../ubuntu_sso/utils/ui.py:53 msgid " and {privacy_policy}" msgstr " a {privacy_policy}" #: ../ubuntu_sso/utils/ui.py:54 msgid "Cancel" msgstr "ZruÅ¡it" #: ../ubuntu_sso/utils/ui.py:55 msgid "Type the characters above" msgstr "OpiÅ¡te výše zobrazené znaky" #: ../ubuntu_sso/utils/ui.py:56 msgid "There was a problem getting the captcha, reloading..." msgstr "PÅ™i stahování captcha doÅ¡lo k chybÄ›" #: ../ubuntu_sso/utils/ui.py:58 #, python-format msgid "If you can't read this then %(reload_link)s this page" msgstr "Pokud to nemůžete pÅ™eÄíst %(reload_link)s tuto stránky" #: ../ubuntu_sso/utils/ui.py:60 msgid "refresh" msgstr "obnovit" #: ../ubuntu_sso/utils/ui.py:61 msgid "Reload" msgstr "Obnovit" #: ../ubuntu_sso/utils/ui.py:62 msgid "The captcha is a required field" msgstr "Captcha je vyžadována" #: ../ubuntu_sso/utils/ui.py:63 msgid "Close window and set up later" msgstr "Uzavřít okno a nastavit pozdÄ›ji" #: ../ubuntu_sso/utils/ui.py:64 msgid "Congratulations, {app_name} is installed!" msgstr "Gratulujeme, aplikace {app_name} je nainstalována!" #: ../ubuntu_sso/utils/ui.py:65 #, python-format msgid "To connect this computer to %(app_name)s enter your details below." msgstr "" "Pro pÅ™ipojení vaÅ¡eho poÄítaÄe k %(app_name)s vyplňte prosím níže uvedené " "údaje." #: ../ubuntu_sso/utils/ui.py:67 msgid "Register with {app_name}." msgstr "" #: ../ubuntu_sso/utils/ui.py:68 ../ubuntu_sso/utils/ui.py:93 #: ../ubuntu_sso/utils/ui.py:143 msgid "Email address" msgstr "Emailová adresa" #: ../ubuntu_sso/utils/ui.py:69 msgid "Re-type Email address" msgstr "Znovu zadejte emailovou adresu" #: ../ubuntu_sso/utils/ui.py:70 msgid "The email must be a valid email address." msgstr "Emailová adresa musí být platná." #: ../ubuntu_sso/utils/ui.py:71 msgid "" "The email addresses don't match, please double check and try entering them " "again." msgstr "" "Emailové adresy se neshodují, prosím znovu je zkontrolujte a zkuste je znovu " "zadat." #: ../ubuntu_sso/utils/ui.py:73 msgid "Email" msgstr "E-mail" #: ../ubuntu_sso/utils/ui.py:74 msgid "The email addresses do not match" msgstr "E-mailové adresy nesouhlasí" #: ../ubuntu_sso/utils/ui.py:75 msgid "Enter code verification here" msgstr "Zde zadejte ověřovací kód." #: ../ubuntu_sso/utils/ui.py:76 msgid "Please enter your name" msgstr "Zadejte prosím své jméno" #: ../ubuntu_sso/utils/ui.py:77 msgid "The process did not finish successfully." msgstr "Proces skonÄil neúspěšnÄ›" #: ../ubuntu_sso/utils/ui.py:79 msgid "Sign me in with my existing account" msgstr "PÅ™ihlásit se s existujícím úÄtem" #: ../ubuntu_sso/utils/ui.py:80 msgid "This field is required." msgstr "Toto pole je povinné." #: ../ubuntu_sso/utils/ui.py:81 msgid "I've forgotten my password" msgstr "ZapomnÄ›l jsem heslo" #: ../ubuntu_sso/utils/ui.py:82 ../ubuntu_sso/utils/ui.py:130 msgid "Reset password" msgstr "Znovu nastavení hesla" #: ../ubuntu_sso/utils/ui.py:83 msgid "" "To reset your {app_name} password, enter your registered email address " "below. We will send instructions to reset your password." msgstr "" "Pro resetování hesla pro {app_name} zadejte váš registraÄní email. PoÅ¡leme " "vám instrukce pro resetování hesla." #: ../ubuntu_sso/utils/ui.py:86 msgid "Please enter a valid email address" msgstr "Zadejte prosím platnou e-mailovou adresu" #: ../ubuntu_sso/utils/ui.py:87 msgid "There was a problem accessing the Ubuntu Single Sign On backend." msgstr "V backendu Jednotného pÅ™ihlášení Ubuntu doÅ¡lo k chybÄ›." #: ../ubuntu_sso/utils/ui.py:89 #, python-format msgid "Create %(app_name)s account" msgstr "VytvoÅ™it %(app_name)s úÄet" #: ../ubuntu_sso/utils/ui.py:90 msgid "Loading..." msgstr "NaÄítání..." #: ../ubuntu_sso/utils/ui.py:91 msgid "Getting information, please wait..." msgstr "Získávání informací, prosím Äekejte..." #: ../ubuntu_sso/utils/ui.py:92 msgid "Already have an account? Click here to sign in" msgstr "Již máte úÄet? KliknÄ›te zde pro pÅ™ihlášení" #: ../ubuntu_sso/utils/ui.py:94 #, python-format msgid "Connect to %(app_name)s" msgstr "PÅ™ipojit k %(app_name)s" #: ../ubuntu_sso/utils/ui.py:95 ../ubuntu_sso/utils/ui.py:109 msgid "Password" msgstr "Heslo" #: ../ubuntu_sso/utils/ui.py:97 msgid "Sign In to {app_name}" msgstr "PÅ™ihlásit se do aplikace {app_name}" #: ../ubuntu_sso/utils/ui.py:99 msgid "Name" msgstr "Jméno" #: ../ubuntu_sso/utils/ui.py:100 msgid "The name must not be empty." msgstr "Jméno nesmí být prázdné" #: ../ubuntu_sso/utils/ui.py:101 msgid "Next" msgstr "Další" #: ../ubuntu_sso/utils/ui.py:102 msgid "Network detection" msgstr "Detekce sítÄ›" #: ../ubuntu_sso/utils/ui.py:103 #, python-format msgid "" "Are you online? We can't detect an internet connection - you will need to be " "connected to set up %(app_name)s" msgstr "" "Jste pÅ™ipojeni k Internetu? NepodaÅ™ilo se nám detekovat internetové " "pÅ™ipojení - pro použití aplikace %(app_name)s musíte být pÅ™ipojeni k " "Internetu." #: ../ubuntu_sso/utils/ui.py:105 msgid "One moment please..." msgstr "Okamžik prosím ..." #: ../ubuntu_sso/utils/ui.py:106 msgid "Create a password" msgstr "VytvoÅ™it heslo" #: ../ubuntu_sso/utils/ui.py:107 msgid "Your password was successfully changed." msgstr "VaÅ¡e heslo bylo úspěšnÄ› zmÄ›nÄ›no." #: ../ubuntu_sso/utils/ui.py:108 msgid "At least one number" msgstr "Alespoň jedno Äíslo" #: ../ubuntu_sso/utils/ui.py:110 msgid "Re-type Password" msgstr "Zadejte heslo znovu" #: ../ubuntu_sso/utils/ui.py:111 msgid "" "The password must have a minimum of 8 characters and include one uppercase " "character and one number." msgstr "" "Heslo musí mít minimálnÄ› 8 znaků a musí obsahovat alespoň jedno velké " "písmeno a jedno Äíslo." #: ../ubuntu_sso/utils/ui.py:113 msgid "At least 8 characters" msgstr "Alespoň 8 znaků" #: ../ubuntu_sso/utils/ui.py:114 msgid "Passwords don't match" msgstr "Hesla se neshodují" #: ../ubuntu_sso/utils/ui.py:115 msgid "" "The passwords don't match, please double check and try entering them again." msgstr "" "Hesla se neshodují, znovu je prosím zkontrolujte a zkuste je znovu zadat." #: ../ubuntu_sso/utils/ui.py:117 msgid "Your password must contain" msgstr "VaÅ¡e heslo musí obsahovat" #: ../ubuntu_sso/utils/ui.py:118 msgid "The password is too weak." msgstr "Heslo je příliÅ¡ slabé." #: ../ubuntu_sso/utils/ui.py:119 msgid "At least one uppercase letter" msgstr "Alespoň jedno velké písmeno" #: ../ubuntu_sso/utils/ui.py:120 msgid "Privacy Policy" msgstr "Zásady pro ochranu osobních údajů" #: ../ubuntu_sso/utils/ui.py:121 msgid "Connecting to:" msgstr "PÅ™ipojování k:" #: ../ubuntu_sso/utils/ui.py:122 msgid "Proxy Settings" msgstr "Nastavení proxy" #: ../ubuntu_sso/utils/ui.py:123 msgid "Incorrect login details. Please try again." msgstr "Nesprávné pÅ™ihlaÅ¡ovací údaje. Zkuste to znovu prosím." #: ../ubuntu_sso/utils/ui.py:124 msgid "Please provide login details." msgstr "Zadejte prosím pÅ™ihlaÅ¡ovací údaje." #: ../ubuntu_sso/utils/ui.py:125 msgid "You are connecting through a proxy." msgstr "PÅ™ipojute se pÅ™es proxy." #: ../ubuntu_sso/utils/ui.py:126 msgid "Get Help With Proxies" msgstr "NápovÄ›da pro proxy sítÄ›" #: ../ubuntu_sso/utils/ui.py:127 msgid "Proxy password:" msgstr "Heslo proxy:" #: ../ubuntu_sso/utils/ui.py:128 msgid "Save and Connect" msgstr "Uložit a pÅ™ipojit" #: ../ubuntu_sso/utils/ui.py:129 msgid "Proxy username:" msgstr "Jméno uživatele proxy:" #: ../ubuntu_sso/utils/ui.py:131 msgid "" "A password reset code has been sent to your e-mail. Please enter the code " "below along with your new password." msgstr "" "Kód pro resetování hesla byl odeslán na váš email. Prosím zadejte níže tento " "kód spoleÄnÄ› s novým heslem." #: ../ubuntu_sso/utils/ui.py:133 msgid "Retype email" msgstr "Znovu zadejte e-mail" #: ../ubuntu_sso/utils/ui.py:134 msgid "Retype password" msgstr "Znovu zadejte heslo" #: ../ubuntu_sso/utils/ui.py:135 #, python-format msgid "To reset your %(app_name)s password, enter your email address below:" msgstr "" "Pro znovu nastavení vaÅ¡eho %(app_name)s hesla, prosím zadejte vaÅ¡i emailovou " "adresu:" #: ../ubuntu_sso/utils/ui.py:137 msgid "" "We are very Sorry! The service that signs you on is not responding right " "now\n" "Please try again or come back in a few minutes." msgstr "" "Omlouváme se! PÅ™ihlaÅ¡ovací služba neodpovídá\n" "Zkuste to prosím znovu za nÄ›kolik minut." #: ../ubuntu_sso/utils/ui.py:140 msgid "Sorry we did not recognize the email address." msgstr "Omlouváme se, ale nepovedlo se rozpoznat e-mailovou adresu." #: ../ubuntu_sso/utils/ui.py:142 msgid "Reset code" msgstr "Ověřovací kód" #: ../ubuntu_sso/utils/ui.py:145 #, python-format msgid "" "A password reset code has been sent to %(email)s.\n" "Please enter the code below along with your new password." msgstr "" "Ověřovací kód byl odeslán na adresu %(email)s.\n" "Zadejte prosím toto heslo spolu se svým novým heslem." #: ../ubuntu_sso/utils/ui.py:147 msgid "Set Up Account" msgstr "Nastavení úÄtu" #: ../ubuntu_sso/utils/ui.py:148 msgid "I don't have an account yet - sign me up" msgstr "Nemám úÄet - registrace" #: ../ubuntu_sso/utils/ui.py:149 msgid "Sign In" msgstr "PÅ™ihlásit se" #: ../ubuntu_sso/utils/ui.py:150 msgid "Log-in with my existing account." msgstr "PÅ™ipojit se existujícím úÄtem." #: ../ubuntu_sso/utils/ui.py:151 msgid "the appname whose ssl error we are going to show." msgstr "název aplikace, jejíž ssl chybu se bude zobrazovat." #: ../ubuntu_sso/utils/ui.py:152 msgid "Certificate details" msgstr "Podrobnosti certifikátu" #: ../ubuntu_sso/utils/ui.py:153 msgid "Connect" msgstr "PÅ™ipojit" #: ../ubuntu_sso/utils/ui.py:154 msgid "the details ssl certificate we are going to show." msgstr "podrobnosti ssl certifikátu, který se bude zobrazovat." #: ../ubuntu_sso/utils/ui.py:161 msgid "Open the SSL certificate UI." msgstr "Otevřít SSL certifikát." #: ../ubuntu_sso/utils/ui.py:162 msgid "SSL Certificate Not Valid" msgstr "SSL certifikát není platný" #: ../ubuntu_sso/utils/ui.py:163 msgid "the domain whose ssl certificate we are going to show." msgstr "doména, jejíž ssl certifikát se bude zobrazovat." #: ../ubuntu_sso/utils/ui.py:164 #, python-format msgid "" "You are trying to connect to a proxy server on %(domain)s. This server uses " "a secure connection, and the SSL certificate is not valid because:" msgstr "" "Pokoušíte se pÅ™ipojit k proxy serveru na %(domain)s. Tento server používá " "zabezpeÄené pÅ™ipojení, ale SSL certifikát není validní, protože:" #: ../ubuntu_sso/utils/ui.py:167 msgid "The certificate has not been verified" msgstr "Certifikát nebyl ověřen" #: ../ubuntu_sso/utils/ui.py:168 msgid "Do you want to connect to this server?" msgstr "PÅ™ejete si pÅ™ipojit se k tomuto serveru?" #: ../ubuntu_sso/utils/ui.py:169 msgid "Get Help With SSL" msgstr "NápovÄ›da pro SSL" #: ../ubuntu_sso/utils/ui.py:170 #, python-format msgid "" "If you are not sure about this server, do not use it to connect to " "%(app_name)s." msgstr "" "Pokud tomuto serveru nedůvěřujete, nepoužívejte jej pro pÅ™ipojení do " "aplikace %(app_name)s." #: ../ubuntu_sso/utils/ui.py:172 msgid "Remember my settings for this certificate." msgstr "Zapamatovat si nastavení pro tento certifikát." #: ../ubuntu_sso/utils/ui.py:173 msgid "" "The name on the certificate isn't valid or doesn't match the name of the site" msgstr "Jméno na certifikátu není platné nebo se neshoduje s jménem stránky" #: ../ubuntu_sso/utils/ui.py:175 msgid "The certificate has expired" msgstr "Platnost certifikátu vyprÅ¡ela" #: ../ubuntu_sso/utils/ui.py:176 #, python-format msgid "You are now logged into %(app_name)s." msgstr "Nyní jste pÅ™ihlášeni do aplikace %(app_name)s." #: ../ubuntu_sso/utils/ui.py:177 msgid "Surname" msgstr "Příjmení" #: ../ubuntu_sso/utils/ui.py:178 msgid "Terms of Service" msgstr "Podmínky použití" #: ../ubuntu_sso/utils/ui.py:179 msgid "Sign Up to {app_name}" msgstr "Registrace do aplikace {app_name}" #: ../ubuntu_sso/utils/ui.py:180 msgid "Show Terms & Conditions" msgstr "Zobrazit Obchodní podmínky" #: ../ubuntu_sso/utils/ui.py:181 #, python-format msgid "" "Agreeing to the %(app_name)s Terms & Conditions is required to subscribe." msgstr "" "Pro pÅ™ihlášení do aplikace %(app_name)s je vyžadován souhlas s Podmínkami " "použití." #: ../ubuntu_sso/utils/ui.py:183 #, python-format msgid "You can also find these terms at %(url)s" msgstr "Tyto podmínky můžete také najít na %(url)s" #: ../ubuntu_sso/utils/ui.py:184 msgid "Try again" msgstr "Zkusit znovu" #: ../ubuntu_sso/utils/ui.py:185 msgid "" "There was an error when trying to complete the process. Please check the " "information and try again." msgstr "" "PÅ™i dokonÄování akce doÅ¡lo k chybÄ›. Prosím zkontrolujte zadané informace a " "zkuste to znovu." #: ../ubuntu_sso/utils/ui.py:187 msgid "Verification code" msgstr "Ověřovací kód" #: ../ubuntu_sso/utils/ui.py:188 #, python-format msgid "" "Check %(email)s for an email from Ubuntu Single Sign On. This message " "contains a verification code. Enter the code in the field below and click OK " "to complete creating your %(app_name)s account." msgstr "" "Do poÅ¡tovní schránky %(email)s by vám mÄ›l pÅ™ijít email od jednotného " "pÅ™ihlášení Ubuntu. Tato zpráva obsahuje ověřovací kód. Zadejte tento kód " "níže a pro vytvoÅ™ení úÄtu pro %(app_name)s kliknÄ›te na OK." #: ../ubuntu_sso/utils/ui.py:192 msgid "Enter verification code" msgstr "Zadejte ověřovací kód" #: ../ubuntu_sso/utils/ui.py:195 #, python-format msgid "I agree with the %(app_name)s terms and conditions" msgstr "Souhlasím s obchodními podmínkami %(app_name)s" #: ../ubuntu_sso/utils/ui.py:196 #, python-format msgid "Yes! Email me %(app_name)s tips and updates." msgstr "Ano, posílejte mi %(app_name)s tipy a aktuality." ubuntu-sso-client-13.10/po/kk.po0000664000202700020270000003221112151461656016733 0ustar dobeydobey00000000000000# Kazakh translation for ubuntu-sso-client # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the ubuntu-sso-client package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: ubuntu-sso-client\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-09-11 18:25+0000\n" "PO-Revision-Date: 2011-03-23 11:57+0000\n" "Last-Translator: jmb_kz \n" "Language-Team: Kazakh \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-09-17 18:24+0000\n" "X-Generator: Launchpad (build 15944)\n" #. Undefined variable '_', pylint: disable=E0602 #. all the text that is used in the gui #: ../ubuntu_sso/utils/ui.py:49 msgid "By signing up to {app_name} you agree to our {privacy_policy}" msgstr "" #: ../ubuntu_sso/utils/ui.py:51 msgid "By signing up to {app_name} you agree to our {terms_and_conditions}" msgstr "" #: ../ubuntu_sso/utils/ui.py:53 msgid " and {privacy_policy}" msgstr "" #: ../ubuntu_sso/utils/ui.py:54 msgid "Cancel" msgstr "" #: ../ubuntu_sso/utils/ui.py:55 msgid "Type the characters above" msgstr "Суретте көрÑетілген Ñимволдарды енгізіңіз" #: ../ubuntu_sso/utils/ui.py:56 msgid "There was a problem getting the captcha, reloading..." msgstr "Капчаны алу кезінде қате туындады, қайта алу..." #: ../ubuntu_sso/utils/ui.py:58 #, python-format msgid "If you can't read this then %(reload_link)s this page" msgstr "" #: ../ubuntu_sso/utils/ui.py:60 msgid "refresh" msgstr "" #: ../ubuntu_sso/utils/ui.py:61 msgid "Reload" msgstr "Қайта жүктеу" #: ../ubuntu_sso/utils/ui.py:62 msgid "The captcha is a required field" msgstr "" #: ../ubuntu_sso/utils/ui.py:63 msgid "Close window and set up later" msgstr "" #: ../ubuntu_sso/utils/ui.py:64 msgid "Congratulations, {app_name} is installed!" msgstr "" #: ../ubuntu_sso/utils/ui.py:65 #, python-format msgid "To connect this computer to %(app_name)s enter your details below." msgstr "" "Сіздің компьютеріңізді %(app_name)s қоÑылу үшін, өздеріңіз туралы мәлімет " "енгізуіңіз қажет." #: ../ubuntu_sso/utils/ui.py:67 msgid "Register with {app_name}." msgstr "" #: ../ubuntu_sso/utils/ui.py:68 ../ubuntu_sso/utils/ui.py:93 #: ../ubuntu_sso/utils/ui.py:143 msgid "Email address" msgstr "Электрондық пошта" #: ../ubuntu_sso/utils/ui.py:69 msgid "Re-type Email address" msgstr "Электрондық поштаны қайта енгізіңіз" #: ../ubuntu_sso/utils/ui.py:70 msgid "The email must be a valid email address." msgstr "Электрондық пошта адреÑÑ– Ð´Ò±Ñ€Ñ‹Ñ ÐµÐ¼ÐµÑ." #: ../ubuntu_sso/utils/ui.py:71 msgid "" "The email addresses don't match, please double check and try entering them " "again." msgstr "" "Енгізілген Ñлектрондық пошта адреÑтері бір бірімен ÑÓ™Ð¹ÐºÐµÑ ÐºÐµÐ»Ð¼ÐµÐ¹ жатыр. " "Қайтадан мұқиÑÑ‚ енгізіңіз." #: ../ubuntu_sso/utils/ui.py:73 msgid "Email" msgstr "" #: ../ubuntu_sso/utils/ui.py:74 msgid "The email addresses do not match" msgstr "" #: ../ubuntu_sso/utils/ui.py:75 msgid "Enter code verification here" msgstr "РаÑтау кодын оÑÑ‹ жерге енгізіңіз" #: ../ubuntu_sso/utils/ui.py:76 msgid "Please enter your name" msgstr "" #: ../ubuntu_sso/utils/ui.py:77 msgid "The process did not finish successfully." msgstr "Ò®Ñ€Ð´Ñ–Ñ ÑәтÑіз аÑқталды." #: ../ubuntu_sso/utils/ui.py:79 msgid "Sign me in with my existing account" msgstr "" #: ../ubuntu_sso/utils/ui.py:80 msgid "This field is required." msgstr "Бұл міндетті толтырылатын мәлімет." #: ../ubuntu_sso/utils/ui.py:81 msgid "I've forgotten my password" msgstr "ÒšÒ±Ð¿Ð¸Ñ Ñөзімді ұмытып қалдым" #: ../ubuntu_sso/utils/ui.py:82 ../ubuntu_sso/utils/ui.py:130 msgid "Reset password" msgstr "ÒšÒ±Ð¿Ð¸Ñ Ñөзді күштеп қайта орнату" #: ../ubuntu_sso/utils/ui.py:83 msgid "" "To reset your {app_name} password, enter your registered email address " "below. We will send instructions to reset your password." msgstr "" #: ../ubuntu_sso/utils/ui.py:86 msgid "Please enter a valid email address" msgstr "" #: ../ubuntu_sso/utils/ui.py:87 msgid "There was a problem accessing the Ubuntu Single Sign On backend." msgstr "" #: ../ubuntu_sso/utils/ui.py:89 #, python-format msgid "Create %(app_name)s account" msgstr "%(app_name)s тіркемеÑін құру" #: ../ubuntu_sso/utils/ui.py:90 msgid "Loading..." msgstr "Жүктелуде..." #: ../ubuntu_sso/utils/ui.py:91 msgid "Getting information, please wait..." msgstr "" #: ../ubuntu_sso/utils/ui.py:92 msgid "Already have an account? Click here to sign in" msgstr "Тіркемеңіз бар еді ма? Оны қолданып кіру үшін оÑÑ‹ жерге баÑыңыз" #: ../ubuntu_sso/utils/ui.py:94 #, python-format msgid "Connect to %(app_name)s" msgstr "%(app_name)s қоÑылу" #: ../ubuntu_sso/utils/ui.py:95 ../ubuntu_sso/utils/ui.py:109 msgid "Password" msgstr "ÒšÒ±Ð¿Ð¸Ñ Ñөз" #: ../ubuntu_sso/utils/ui.py:97 msgid "Sign In to {app_name}" msgstr "" #: ../ubuntu_sso/utils/ui.py:99 msgid "Name" msgstr "Ðты" #: ../ubuntu_sso/utils/ui.py:100 msgid "The name must not be empty." msgstr "" #: ../ubuntu_sso/utils/ui.py:101 msgid "Next" msgstr "КелеÑÑ–" #: ../ubuntu_sso/utils/ui.py:102 msgid "Network detection" msgstr "" #: ../ubuntu_sso/utils/ui.py:103 #, python-format msgid "" "Are you online? We can't detect an internet connection - you will need to be " "connected to set up %(app_name)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:105 msgid "One moment please..." msgstr "Күте тұрыңыз..." #: ../ubuntu_sso/utils/ui.py:106 msgid "Create a password" msgstr "" #: ../ubuntu_sso/utils/ui.py:107 msgid "Your password was successfully changed." msgstr "ÒšÒ±Ð¿Ð¸Ñ Ñөзіңіз Ñәтті ауыÑтырылды." #: ../ubuntu_sso/utils/ui.py:108 msgid "At least one number" msgstr "" #: ../ubuntu_sso/utils/ui.py:110 msgid "Re-type Password" msgstr "ÒšÒ±Ð¿Ð¸Ñ Ñөзді қайталап енгізіңіз" #: ../ubuntu_sso/utils/ui.py:111 msgid "" "The password must have a minimum of 8 characters and include one uppercase " "character and one number." msgstr "" "ÒšÒ±Ð¿Ð¸Ñ Ñөз ұзындығы 8 таңбадан кем ÐµÐ¼ÐµÑ Ð¶Ó™Ð½Ðµ құрамында ең аз дегенде бір әріп " "пен бір Ñан болу керек." #: ../ubuntu_sso/utils/ui.py:113 msgid "At least 8 characters" msgstr "" #: ../ubuntu_sso/utils/ui.py:114 msgid "Passwords don't match" msgstr "" #: ../ubuntu_sso/utils/ui.py:115 msgid "" "The passwords don't match, please double check and try entering them again." msgstr "" "Енгізілген Ñлектрондық Ò›Ò±Ð¿Ð¸Ñ Ñөздер бір бірімен ÑÓ™Ð¹ÐºÐµÑ ÐºÐµÐ»Ð¼ÐµÐ¹ жатыр. " "Қайтадан мұқиÑÑ‚ енгізіңіз." #: ../ubuntu_sso/utils/ui.py:117 msgid "Your password must contain" msgstr "" #: ../ubuntu_sso/utils/ui.py:118 msgid "The password is too weak." msgstr "ÒšÒ±Ð¿Ð¸Ñ Ñөз тым әлÑіз." #: ../ubuntu_sso/utils/ui.py:119 msgid "At least one uppercase letter" msgstr "" #: ../ubuntu_sso/utils/ui.py:120 msgid "Privacy Policy" msgstr "" #: ../ubuntu_sso/utils/ui.py:121 msgid "Connecting to:" msgstr "" #: ../ubuntu_sso/utils/ui.py:122 msgid "Proxy Settings" msgstr "" #: ../ubuntu_sso/utils/ui.py:123 msgid "Incorrect login details. Please try again." msgstr "" #: ../ubuntu_sso/utils/ui.py:124 msgid "Please provide login details." msgstr "" #: ../ubuntu_sso/utils/ui.py:125 msgid "You are connecting through a proxy." msgstr "" #: ../ubuntu_sso/utils/ui.py:126 msgid "Get Help With Proxies" msgstr "" #: ../ubuntu_sso/utils/ui.py:127 msgid "Proxy password:" msgstr "" #: ../ubuntu_sso/utils/ui.py:128 msgid "Save and Connect" msgstr "" #: ../ubuntu_sso/utils/ui.py:129 msgid "Proxy username:" msgstr "" #: ../ubuntu_sso/utils/ui.py:131 msgid "" "A password reset code has been sent to your e-mail. Please enter the code " "below along with your new password." msgstr "" #: ../ubuntu_sso/utils/ui.py:133 msgid "Retype email" msgstr "" #: ../ubuntu_sso/utils/ui.py:134 msgid "Retype password" msgstr "" #: ../ubuntu_sso/utils/ui.py:135 #, python-format msgid "To reset your %(app_name)s password, enter your email address below:" msgstr "" "%(app_name)s Ò›Ò±Ð¿Ð¸Ñ Ñөзін күштеп қайта орнату үшін, өзіңіздің Ñлектрондық " "пошта адреÑін енгізіңіз:" #: ../ubuntu_sso/utils/ui.py:137 msgid "" "We are very Sorry! The service that signs you on is not responding right " "now\n" "Please try again or come back in a few minutes." msgstr "" #: ../ubuntu_sso/utils/ui.py:140 msgid "Sorry we did not recognize the email address." msgstr "" #: ../ubuntu_sso/utils/ui.py:142 msgid "Reset code" msgstr "ÒšÒ±Ð¿Ð¸Ñ Ñөзді қайта орнату коды" #: ../ubuntu_sso/utils/ui.py:145 #, python-format msgid "" "A password reset code has been sent to %(email)s.\n" "Please enter the code below along with your new password." msgstr "" "ÒšÒ±Ð¿Ð¸Ñ Ñөзді қайта орнату коды %(email)s Ñлектрондық поштаға жіберілді.\n" "Кодты және жаңа Ò›Ò±Ð¿Ð¸Ñ Ñөзді енгізіңіз." #: ../ubuntu_sso/utils/ui.py:147 msgid "Set Up Account" msgstr "" #: ../ubuntu_sso/utils/ui.py:148 msgid "I don't have an account yet - sign me up" msgstr "" #: ../ubuntu_sso/utils/ui.py:149 msgid "Sign In" msgstr "" #: ../ubuntu_sso/utils/ui.py:150 msgid "Log-in with my existing account." msgstr "" #: ../ubuntu_sso/utils/ui.py:151 msgid "the appname whose ssl error we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:152 msgid "Certificate details" msgstr "" #: ../ubuntu_sso/utils/ui.py:153 msgid "Connect" msgstr "" #: ../ubuntu_sso/utils/ui.py:154 msgid "the details ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:161 msgid "Open the SSL certificate UI." msgstr "" #: ../ubuntu_sso/utils/ui.py:162 msgid "SSL Certificate Not Valid" msgstr "" #: ../ubuntu_sso/utils/ui.py:163 msgid "the domain whose ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:164 #, python-format msgid "" "You are trying to connect to a proxy server on %(domain)s. This server uses " "a secure connection, and the SSL certificate is not valid because:" msgstr "" #: ../ubuntu_sso/utils/ui.py:167 msgid "The certificate has not been verified" msgstr "" #: ../ubuntu_sso/utils/ui.py:168 msgid "Do you want to connect to this server?" msgstr "" #: ../ubuntu_sso/utils/ui.py:169 msgid "Get Help With SSL" msgstr "" #: ../ubuntu_sso/utils/ui.py:170 #, python-format msgid "" "If you are not sure about this server, do not use it to connect to " "%(app_name)s." msgstr "" #: ../ubuntu_sso/utils/ui.py:172 msgid "Remember my settings for this certificate." msgstr "" #: ../ubuntu_sso/utils/ui.py:173 msgid "" "The name on the certificate isn't valid or doesn't match the name of the site" msgstr "" #: ../ubuntu_sso/utils/ui.py:175 msgid "The certificate has expired" msgstr "" #: ../ubuntu_sso/utils/ui.py:176 #, python-format msgid "You are now logged into %(app_name)s." msgstr "" #: ../ubuntu_sso/utils/ui.py:177 msgid "Surname" msgstr "" #: ../ubuntu_sso/utils/ui.py:178 msgid "Terms of Service" msgstr "" #: ../ubuntu_sso/utils/ui.py:179 msgid "Sign Up to {app_name}" msgstr "" #: ../ubuntu_sso/utils/ui.py:180 msgid "Show Terms & Conditions" msgstr "Пайдалану шарттарын көрÑету" #: ../ubuntu_sso/utils/ui.py:181 #, python-format msgid "" "Agreeing to the %(app_name)s Terms & Conditions is required to subscribe." msgstr "" #: ../ubuntu_sso/utils/ui.py:183 #, python-format msgid "You can also find these terms at %(url)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:184 msgid "Try again" msgstr "" #: ../ubuntu_sso/utils/ui.py:185 msgid "" "There was an error when trying to complete the process. Please check the " "information and try again." msgstr "" "ҮрдіÑті аÑқтау кезінде қате туындады. Енгізілген мәліметті текÑеріп, қайтада " "байқап көріңіз." #: ../ubuntu_sso/utils/ui.py:187 msgid "Verification code" msgstr "" #: ../ubuntu_sso/utils/ui.py:188 #, python-format msgid "" "Check %(email)s for an email from Ubuntu Single Sign On. This message " "contains a verification code. Enter the code in the field below and click OK " "to complete creating your %(app_name)s account." msgstr "" #: ../ubuntu_sso/utils/ui.py:192 msgid "Enter verification code" msgstr "РаÑтау кодын енгізіңіз" #: ../ubuntu_sso/utils/ui.py:195 #, python-format msgid "I agree with the %(app_name)s terms and conditions" msgstr "Мен %(app_name)s бағдарламаÑының пайдалану шарттарымен келіÑемін" #: ../ubuntu_sso/utils/ui.py:196 #, python-format msgid "Yes! Email me %(app_name)s tips and updates." msgstr "Иә! %(app_name)s көмек пен жаңалықтар жазылымына жазылу." ubuntu-sso-client-13.10/po/hi.po0000664000202700020270000003404512151461656016735 0ustar dobeydobey00000000000000# Hindi translation for ubuntu-sso-client # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the ubuntu-sso-client package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: ubuntu-sso-client\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-09-11 18:25+0000\n" "PO-Revision-Date: 2011-01-31 07:50+0000\n" "Last-Translator: Manish Kumar \n" "Language-Team: Hindi \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-09-17 18:24+0000\n" "X-Generator: Launchpad (build 15944)\n" #. Undefined variable '_', pylint: disable=E0602 #. all the text that is used in the gui #: ../ubuntu_sso/utils/ui.py:49 msgid "By signing up to {app_name} you agree to our {privacy_policy}" msgstr "" #: ../ubuntu_sso/utils/ui.py:51 msgid "By signing up to {app_name} you agree to our {terms_and_conditions}" msgstr "" #: ../ubuntu_sso/utils/ui.py:53 msgid " and {privacy_policy}" msgstr "" #: ../ubuntu_sso/utils/ui.py:54 msgid "Cancel" msgstr "" #: ../ubuntu_sso/utils/ui.py:55 msgid "Type the characters above" msgstr "उपरोकà¥à¤¤ में अकà¥à¤·à¤°à¥‹à¤‚ का टंकण करें" #: ../ubuntu_sso/utils/ui.py:56 msgid "There was a problem getting the captcha, reloading..." msgstr "Captcha को पà¥à¤°à¤¾à¤ªà¥à¤¤ करने में समसà¥à¤¯à¤¾ हà¥à¤ˆ, पà¥à¤¨à¤ƒà¤²à¥‹à¤¡ कर रहा है..." #: ../ubuntu_sso/utils/ui.py:58 #, python-format msgid "If you can't read this then %(reload_link)s this page" msgstr "" #: ../ubuntu_sso/utils/ui.py:60 msgid "refresh" msgstr "" #: ../ubuntu_sso/utils/ui.py:61 msgid "Reload" msgstr "पà¥à¤¨à¤ƒà¤²à¥‹à¤¡" #: ../ubuntu_sso/utils/ui.py:62 msgid "The captcha is a required field" msgstr "" #: ../ubuntu_sso/utils/ui.py:63 msgid "Close window and set up later" msgstr "" #: ../ubuntu_sso/utils/ui.py:64 msgid "Congratulations, {app_name} is installed!" msgstr "" #: ../ubuntu_sso/utils/ui.py:65 #, python-format msgid "To connect this computer to %(app_name)s enter your details below." msgstr "" "इस कंपà¥à¤¯à¥‚टर को %(app_name)s के साथ संयोजन के लिठनिमà¥à¤¨ में अपने विसà¥à¤¤à¥ƒà¤¤ " "विवरण की पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤¿ करें." #: ../ubuntu_sso/utils/ui.py:67 msgid "Register with {app_name}." msgstr "" #: ../ubuntu_sso/utils/ui.py:68 ../ubuntu_sso/utils/ui.py:93 #: ../ubuntu_sso/utils/ui.py:143 msgid "Email address" msgstr "ई-डाक पता" #: ../ubuntu_sso/utils/ui.py:69 msgid "Re-type Email address" msgstr "ई-डाक पता पà¥à¤¨à¤ƒà¤Ÿà¤‚कण करें" #: ../ubuntu_sso/utils/ui.py:70 msgid "The email must be a valid email address." msgstr "ई-डाक à¤à¤• वैदà¥à¤¯ पता होना चाहिà¤." #: ../ubuntu_sso/utils/ui.py:71 msgid "" "The email addresses don't match, please double check and try entering them " "again." msgstr "" "ई-डाक पता का मिलान नहीं हो पा रहा है, कृपया दोहरा जाà¤à¤š करें तथा उसे पà¥à¤¨à¤ƒ " "पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤¿ का पà¥à¤°à¤¯à¤¾à¤¸ करें." #: ../ubuntu_sso/utils/ui.py:73 msgid "Email" msgstr "" #: ../ubuntu_sso/utils/ui.py:74 msgid "The email addresses do not match" msgstr "" #: ../ubuntu_sso/utils/ui.py:75 msgid "Enter code verification here" msgstr "यहाठकोड पà¥à¤°à¤®à¤¾à¤£à¤¿à¤•रण की पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤¿ करें" #: ../ubuntu_sso/utils/ui.py:76 msgid "Please enter your name" msgstr "" #: ../ubuntu_sso/utils/ui.py:77 msgid "The process did not finish successfully." msgstr "यह पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ सफलतापà¥à¤°à¥à¤µà¤• समापà¥à¤¤ नहीं हà¥à¤†." #: ../ubuntu_sso/utils/ui.py:79 msgid "Sign me in with my existing account" msgstr "" #: ../ubuntu_sso/utils/ui.py:80 msgid "This field is required." msgstr "इस सà¥à¤¥à¤¾à¤¨ की आवशà¥à¤¯à¤•ता है." #: ../ubuntu_sso/utils/ui.py:81 msgid "I've forgotten my password" msgstr "मैं अपना कूटशबà¥à¤¦ भूल गया हà¥à¤" #: ../ubuntu_sso/utils/ui.py:82 ../ubuntu_sso/utils/ui.py:130 msgid "Reset password" msgstr "कूटशबà¥à¤¦ पà¥à¤¨à¤ƒà¤¨à¤¿à¤¯à¤¤ करें" #: ../ubuntu_sso/utils/ui.py:83 msgid "" "To reset your {app_name} password, enter your registered email address " "below. We will send instructions to reset your password." msgstr "" #: ../ubuntu_sso/utils/ui.py:86 msgid "Please enter a valid email address" msgstr "" #: ../ubuntu_sso/utils/ui.py:87 msgid "There was a problem accessing the Ubuntu Single Sign On backend." msgstr "" #: ../ubuntu_sso/utils/ui.py:89 #, python-format msgid "Create %(app_name)s account" msgstr "%(app_name)s खाता का सृजन करें" #: ../ubuntu_sso/utils/ui.py:90 msgid "Loading..." msgstr "लोड कर रहा है..." #: ../ubuntu_sso/utils/ui.py:91 msgid "Getting information, please wait..." msgstr "" #: ../ubuntu_sso/utils/ui.py:92 msgid "Already have an account? Click here to sign in" msgstr "पहले से à¤à¤• खाता है? साइन-इन करने हेतॠकà¥à¤²à¤¿à¤• करें" #: ../ubuntu_sso/utils/ui.py:94 #, python-format msgid "Connect to %(app_name)s" msgstr "%(app_name)s से संयोजन करें" #: ../ubuntu_sso/utils/ui.py:95 ../ubuntu_sso/utils/ui.py:109 msgid "Password" msgstr "कूटशबà¥à¤¦" #: ../ubuntu_sso/utils/ui.py:97 msgid "Sign In to {app_name}" msgstr "" #: ../ubuntu_sso/utils/ui.py:99 msgid "Name" msgstr "नाम" #: ../ubuntu_sso/utils/ui.py:100 msgid "The name must not be empty." msgstr "" #: ../ubuntu_sso/utils/ui.py:101 msgid "Next" msgstr "अगला" #: ../ubuntu_sso/utils/ui.py:102 msgid "Network detection" msgstr "" #: ../ubuntu_sso/utils/ui.py:103 #, python-format msgid "" "Are you online? We can't detect an internet connection - you will need to be " "connected to set up %(app_name)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:105 msgid "One moment please..." msgstr "कà¥à¤› कà¥à¤·à¤£ रà¥à¤•ें..." #: ../ubuntu_sso/utils/ui.py:106 msgid "Create a password" msgstr "" #: ../ubuntu_sso/utils/ui.py:107 msgid "Your password was successfully changed." msgstr "आपका कूटशबà¥à¤¦ सफलतापà¥à¤°à¥à¤µà¤• बदल गया है." #: ../ubuntu_sso/utils/ui.py:108 msgid "At least one number" msgstr "" #: ../ubuntu_sso/utils/ui.py:110 msgid "Re-type Password" msgstr "कूटशबà¥à¤¦ पà¥à¤¨à¤ƒà¤Ÿà¤‚कण करें" #: ../ubuntu_sso/utils/ui.py:111 msgid "" "The password must have a minimum of 8 characters and include one uppercase " "character and one number." msgstr "" "कूटशबà¥à¤¦ में नà¥à¤¯à¥‚नतम 8 चिहà¥à¤¨ होगा जिसमें à¤à¤• बड़ा अकà¥à¤·à¤° तथा à¤à¤• संखà¥à¤¯à¤¾ होना " "चाहिà¤." #: ../ubuntu_sso/utils/ui.py:113 msgid "At least 8 characters" msgstr "" #: ../ubuntu_sso/utils/ui.py:114 msgid "Passwords don't match" msgstr "" #: ../ubuntu_sso/utils/ui.py:115 msgid "" "The passwords don't match, please double check and try entering them again." msgstr "" "कूटशबà¥à¤¦ का मिलान नहीं हो सका, कृपया दोहरा जाà¤à¤š करें तथा उसे पà¥à¤¨à¤ƒ पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤¿ " "करें." #: ../ubuntu_sso/utils/ui.py:117 msgid "Your password must contain" msgstr "" #: ../ubuntu_sso/utils/ui.py:118 msgid "The password is too weak." msgstr "कूटशबà¥à¤¦ काफी कमजोर है." #: ../ubuntu_sso/utils/ui.py:119 msgid "At least one uppercase letter" msgstr "" #: ../ubuntu_sso/utils/ui.py:120 msgid "Privacy Policy" msgstr "" #: ../ubuntu_sso/utils/ui.py:121 msgid "Connecting to:" msgstr "" #: ../ubuntu_sso/utils/ui.py:122 msgid "Proxy Settings" msgstr "" #: ../ubuntu_sso/utils/ui.py:123 msgid "Incorrect login details. Please try again." msgstr "" #: ../ubuntu_sso/utils/ui.py:124 msgid "Please provide login details." msgstr "" #: ../ubuntu_sso/utils/ui.py:125 msgid "You are connecting through a proxy." msgstr "" #: ../ubuntu_sso/utils/ui.py:126 msgid "Get Help With Proxies" msgstr "" #: ../ubuntu_sso/utils/ui.py:127 msgid "Proxy password:" msgstr "" #: ../ubuntu_sso/utils/ui.py:128 msgid "Save and Connect" msgstr "" #: ../ubuntu_sso/utils/ui.py:129 msgid "Proxy username:" msgstr "" #: ../ubuntu_sso/utils/ui.py:131 msgid "" "A password reset code has been sent to your e-mail. Please enter the code " "below along with your new password." msgstr "" #: ../ubuntu_sso/utils/ui.py:133 msgid "Retype email" msgstr "" #: ../ubuntu_sso/utils/ui.py:134 msgid "Retype password" msgstr "" #: ../ubuntu_sso/utils/ui.py:135 #, python-format msgid "To reset your %(app_name)s password, enter your email address below:" msgstr "" "अपने कूटशबà¥à¤¦ %(app_name)s को पà¥à¤¨à¤ƒ नियत करने के लिà¤, नीचे दिठगठमें ई-डाक की " "पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿ करें:" #: ../ubuntu_sso/utils/ui.py:137 msgid "" "We are very Sorry! The service that signs you on is not responding right " "now\n" "Please try again or come back in a few minutes." msgstr "" #: ../ubuntu_sso/utils/ui.py:140 msgid "Sorry we did not recognize the email address." msgstr "" #: ../ubuntu_sso/utils/ui.py:142 msgid "Reset code" msgstr "कोड पà¥à¤¨à¤ƒà¤¨à¤¿à¤¯à¤¤ करें" #: ../ubuntu_sso/utils/ui.py:145 #, python-format msgid "" "A password reset code has been sent to %(email)s.\n" "Please enter the code below along with your new password." msgstr "" "à¤à¤• कूटशबà¥à¤¦ पà¥à¤¨à¤ƒà¤¨à¤¿à¤¯à¤¤ कोड आपको %(email)s पर भेज दिया गया है.\n" "कृपया कोड को अपने नठकूटशबà¥à¤¦ के साथ नीचे दिठगठमें पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤¿ करें." #: ../ubuntu_sso/utils/ui.py:147 msgid "Set Up Account" msgstr "" #: ../ubuntu_sso/utils/ui.py:148 msgid "I don't have an account yet - sign me up" msgstr "" #: ../ubuntu_sso/utils/ui.py:149 msgid "Sign In" msgstr "" #: ../ubuntu_sso/utils/ui.py:150 msgid "Log-in with my existing account." msgstr "" #: ../ubuntu_sso/utils/ui.py:151 msgid "the appname whose ssl error we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:152 msgid "Certificate details" msgstr "" #: ../ubuntu_sso/utils/ui.py:153 msgid "Connect" msgstr "" #: ../ubuntu_sso/utils/ui.py:154 msgid "the details ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:161 msgid "Open the SSL certificate UI." msgstr "" #: ../ubuntu_sso/utils/ui.py:162 msgid "SSL Certificate Not Valid" msgstr "" #: ../ubuntu_sso/utils/ui.py:163 msgid "the domain whose ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:164 #, python-format msgid "" "You are trying to connect to a proxy server on %(domain)s. This server uses " "a secure connection, and the SSL certificate is not valid because:" msgstr "" #: ../ubuntu_sso/utils/ui.py:167 msgid "The certificate has not been verified" msgstr "" #: ../ubuntu_sso/utils/ui.py:168 msgid "Do you want to connect to this server?" msgstr "" #: ../ubuntu_sso/utils/ui.py:169 msgid "Get Help With SSL" msgstr "" #: ../ubuntu_sso/utils/ui.py:170 #, python-format msgid "" "If you are not sure about this server, do not use it to connect to " "%(app_name)s." msgstr "" #: ../ubuntu_sso/utils/ui.py:172 msgid "Remember my settings for this certificate." msgstr "" #: ../ubuntu_sso/utils/ui.py:173 msgid "" "The name on the certificate isn't valid or doesn't match the name of the site" msgstr "" #: ../ubuntu_sso/utils/ui.py:175 msgid "The certificate has expired" msgstr "" #: ../ubuntu_sso/utils/ui.py:176 #, python-format msgid "You are now logged into %(app_name)s." msgstr "" #: ../ubuntu_sso/utils/ui.py:177 msgid "Surname" msgstr "" #: ../ubuntu_sso/utils/ui.py:178 msgid "Terms of Service" msgstr "" #: ../ubuntu_sso/utils/ui.py:179 msgid "Sign Up to {app_name}" msgstr "" #: ../ubuntu_sso/utils/ui.py:180 msgid "Show Terms & Conditions" msgstr "नियम व शरà¥à¤¤à¥‡à¤‚ दिखाà¤à¤" #: ../ubuntu_sso/utils/ui.py:181 #, python-format msgid "" "Agreeing to the %(app_name)s Terms & Conditions is required to subscribe." msgstr "" #: ../ubuntu_sso/utils/ui.py:183 #, python-format msgid "You can also find these terms at %(url)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:184 msgid "Try again" msgstr "" #: ../ubuntu_sso/utils/ui.py:185 msgid "" "There was an error when trying to complete the process. Please check the " "information and try again." msgstr "" "इस पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ को पà¥à¤°à¤¾ करने की कोशिश में कोई तà¥à¤°à¥à¤Ÿà¤¿ उतà¥à¤ªà¤¨à¥à¤¨ हो गई है. कृपया " "सूचनाओं की पà¥à¤¨à¤ƒ जाà¤à¤š करें तथा पà¥à¤¨à¤ƒ पà¥à¤°à¤¯à¤¾à¤¸ करें." #: ../ubuntu_sso/utils/ui.py:187 msgid "Verification code" msgstr "" #: ../ubuntu_sso/utils/ui.py:188 #, python-format msgid "" "Check %(email)s for an email from Ubuntu Single Sign On. This message " "contains a verification code. Enter the code in the field below and click OK " "to complete creating your %(app_name)s account." msgstr "" #: ../ubuntu_sso/utils/ui.py:192 msgid "Enter verification code" msgstr "सतà¥à¤¯à¤¾à¤ªà¤¨ कोड की पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤¿ करें" #: ../ubuntu_sso/utils/ui.py:195 #, python-format msgid "I agree with the %(app_name)s terms and conditions" msgstr "मैं %(app_name)s नियम तथा शरà¥à¤¤à¥‹à¤‚ से सहमत हà¥à¤" #: ../ubuntu_sso/utils/ui.py:196 #, python-format msgid "Yes! Email me %(app_name)s tips and updates." msgstr "" "हाà¤! मà¥à¤à¥‡ %(app_name)s पर सà¥à¤à¤¾à¤µ तथा अदà¥à¤¯à¤¤à¤¨ की जानकारी ई-डाक से भेजें." ubuntu-sso-client-13.10/po/nn.po0000664000202700020270000002747612151461656016762 0ustar dobeydobey00000000000000# Norwegian Nynorsk translation for ubuntu-sso-client # Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 # This file is distributed under the same license as the ubuntu-sso-client package. # FIRST AUTHOR , 2011. # msgid "" msgstr "" "Project-Id-Version: ubuntu-sso-client\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-09-11 18:25+0000\n" "PO-Revision-Date: 2011-05-09 02:30+0000\n" "Last-Translator: Ole Andreas Utstumo \n" "Language-Team: Norwegian Nynorsk \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-09-17 18:24+0000\n" "X-Generator: Launchpad (build 15944)\n" #. Undefined variable '_', pylint: disable=E0602 #. all the text that is used in the gui #: ../ubuntu_sso/utils/ui.py:49 msgid "By signing up to {app_name} you agree to our {privacy_policy}" msgstr "" #: ../ubuntu_sso/utils/ui.py:51 msgid "By signing up to {app_name} you agree to our {terms_and_conditions}" msgstr "" #: ../ubuntu_sso/utils/ui.py:53 msgid " and {privacy_policy}" msgstr "" #: ../ubuntu_sso/utils/ui.py:54 msgid "Cancel" msgstr "" #: ../ubuntu_sso/utils/ui.py:55 msgid "Type the characters above" msgstr "Skriv inn teikna ovanfor" #: ../ubuntu_sso/utils/ui.py:56 msgid "There was a problem getting the captcha, reloading..." msgstr "Hentinga av captcha-en var mislukka, lastar pÃ¥ nytt ..." #: ../ubuntu_sso/utils/ui.py:58 #, python-format msgid "If you can't read this then %(reload_link)s this page" msgstr "" #: ../ubuntu_sso/utils/ui.py:60 msgid "refresh" msgstr "" #: ../ubuntu_sso/utils/ui.py:61 msgid "Reload" msgstr "Last om att" #: ../ubuntu_sso/utils/ui.py:62 msgid "The captcha is a required field" msgstr "" #: ../ubuntu_sso/utils/ui.py:63 msgid "Close window and set up later" msgstr "" #: ../ubuntu_sso/utils/ui.py:64 msgid "Congratulations, {app_name} is installed!" msgstr "" #: ../ubuntu_sso/utils/ui.py:65 #, python-format msgid "To connect this computer to %(app_name)s enter your details below." msgstr "" "Skriv inn opplysningane dine nedanfor for Ã¥ kopla datamaskina til " "%(app_name)s." #: ../ubuntu_sso/utils/ui.py:67 msgid "Register with {app_name}." msgstr "" #: ../ubuntu_sso/utils/ui.py:68 ../ubuntu_sso/utils/ui.py:93 #: ../ubuntu_sso/utils/ui.py:143 msgid "Email address" msgstr "E-postadresse" #: ../ubuntu_sso/utils/ui.py:69 msgid "Re-type Email address" msgstr "Gjenta e-postadressa" #: ../ubuntu_sso/utils/ui.py:70 msgid "The email must be a valid email address." msgstr "E-posten mÃ¥ vere ei gyldig e-postadresse." #: ../ubuntu_sso/utils/ui.py:71 msgid "" "The email addresses don't match, please double check and try entering them " "again." msgstr "E-postadressene er ikkje like, dobbeltsjekk og skriv inn pÃ¥ nytt." #: ../ubuntu_sso/utils/ui.py:73 msgid "Email" msgstr "" #: ../ubuntu_sso/utils/ui.py:74 msgid "The email addresses do not match" msgstr "" #: ../ubuntu_sso/utils/ui.py:75 msgid "Enter code verification here" msgstr "Skriv inn stadfestingskoden her" #: ../ubuntu_sso/utils/ui.py:76 msgid "Please enter your name" msgstr "" #: ../ubuntu_sso/utils/ui.py:77 msgid "The process did not finish successfully." msgstr "Prosessen vart avslutta feil." #: ../ubuntu_sso/utils/ui.py:79 msgid "Sign me in with my existing account" msgstr "" #: ../ubuntu_sso/utils/ui.py:80 msgid "This field is required." msgstr "Dette feltet er pÃ¥kravd." #: ../ubuntu_sso/utils/ui.py:81 msgid "I've forgotten my password" msgstr "Eg har gløymt passordet mitt" #: ../ubuntu_sso/utils/ui.py:82 ../ubuntu_sso/utils/ui.py:130 msgid "Reset password" msgstr "Nullstill passord" #: ../ubuntu_sso/utils/ui.py:83 msgid "" "To reset your {app_name} password, enter your registered email address " "below. We will send instructions to reset your password." msgstr "" #: ../ubuntu_sso/utils/ui.py:86 msgid "Please enter a valid email address" msgstr "" #: ../ubuntu_sso/utils/ui.py:87 msgid "There was a problem accessing the Ubuntu Single Sign On backend." msgstr "" #: ../ubuntu_sso/utils/ui.py:89 #, python-format msgid "Create %(app_name)s account" msgstr "Oppretta konto for %(app_name)s" #: ../ubuntu_sso/utils/ui.py:90 msgid "Loading..." msgstr "Lastar …" #: ../ubuntu_sso/utils/ui.py:91 msgid "Getting information, please wait..." msgstr "" #: ../ubuntu_sso/utils/ui.py:92 msgid "Already have an account? Click here to sign in" msgstr "Har du allereie ein konto, kan du klikka her for Ã¥ logga inn" #: ../ubuntu_sso/utils/ui.py:94 #, python-format msgid "Connect to %(app_name)s" msgstr "Kopla til %(app_name)s" #: ../ubuntu_sso/utils/ui.py:95 ../ubuntu_sso/utils/ui.py:109 msgid "Password" msgstr "Passord" #: ../ubuntu_sso/utils/ui.py:97 msgid "Sign In to {app_name}" msgstr "" #: ../ubuntu_sso/utils/ui.py:99 msgid "Name" msgstr "Namn" #: ../ubuntu_sso/utils/ui.py:100 msgid "The name must not be empty." msgstr "" #: ../ubuntu_sso/utils/ui.py:101 msgid "Next" msgstr "Neste" #: ../ubuntu_sso/utils/ui.py:102 msgid "Network detection" msgstr "" #: ../ubuntu_sso/utils/ui.py:103 #, python-format msgid "" "Are you online? We can't detect an internet connection - you will need to be " "connected to set up %(app_name)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:105 msgid "One moment please..." msgstr "Vent litt …" #: ../ubuntu_sso/utils/ui.py:106 msgid "Create a password" msgstr "" #: ../ubuntu_sso/utils/ui.py:107 msgid "Your password was successfully changed." msgstr "Passordet vart endra." #: ../ubuntu_sso/utils/ui.py:108 msgid "At least one number" msgstr "" #: ../ubuntu_sso/utils/ui.py:110 msgid "Re-type Password" msgstr "Gjenta passordet" #: ../ubuntu_sso/utils/ui.py:111 msgid "" "The password must have a minimum of 8 characters and include one uppercase " "character and one number." msgstr "" "Passordet mÃ¥ ha minst 8 teikn og inkludera minst éin stor bokstav og eitt " "tall." #: ../ubuntu_sso/utils/ui.py:113 msgid "At least 8 characters" msgstr "" #: ../ubuntu_sso/utils/ui.py:114 msgid "Passwords don't match" msgstr "" #: ../ubuntu_sso/utils/ui.py:115 msgid "" "The passwords don't match, please double check and try entering them again." msgstr "" "Passorda samsvarer ikkje. Dobbeltsjekk, og prøv Ã¥ skrive dei pÃ¥ nytt." #: ../ubuntu_sso/utils/ui.py:117 msgid "Your password must contain" msgstr "" #: ../ubuntu_sso/utils/ui.py:118 msgid "The password is too weak." msgstr "Passordet er for svakt." #: ../ubuntu_sso/utils/ui.py:119 msgid "At least one uppercase letter" msgstr "" #: ../ubuntu_sso/utils/ui.py:120 msgid "Privacy Policy" msgstr "" #: ../ubuntu_sso/utils/ui.py:121 msgid "Connecting to:" msgstr "" #: ../ubuntu_sso/utils/ui.py:122 msgid "Proxy Settings" msgstr "" #: ../ubuntu_sso/utils/ui.py:123 msgid "Incorrect login details. Please try again." msgstr "" #: ../ubuntu_sso/utils/ui.py:124 msgid "Please provide login details." msgstr "" #: ../ubuntu_sso/utils/ui.py:125 msgid "You are connecting through a proxy." msgstr "" #: ../ubuntu_sso/utils/ui.py:126 msgid "Get Help With Proxies" msgstr "" #: ../ubuntu_sso/utils/ui.py:127 msgid "Proxy password:" msgstr "" #: ../ubuntu_sso/utils/ui.py:128 msgid "Save and Connect" msgstr "" #: ../ubuntu_sso/utils/ui.py:129 msgid "Proxy username:" msgstr "" #: ../ubuntu_sso/utils/ui.py:131 msgid "" "A password reset code has been sent to your e-mail. Please enter the code " "below along with your new password." msgstr "" #: ../ubuntu_sso/utils/ui.py:133 msgid "Retype email" msgstr "" #: ../ubuntu_sso/utils/ui.py:134 msgid "Retype password" msgstr "" #: ../ubuntu_sso/utils/ui.py:135 #, python-format msgid "To reset your %(app_name)s password, enter your email address below:" msgstr "" "Skriv e-postadressa di nedanfor for Ã¥ nullstille %(app_name) sitt passord:" #: ../ubuntu_sso/utils/ui.py:137 msgid "" "We are very Sorry! The service that signs you on is not responding right " "now\n" "Please try again or come back in a few minutes." msgstr "" #: ../ubuntu_sso/utils/ui.py:140 msgid "Sorry we did not recognize the email address." msgstr "" #: ../ubuntu_sso/utils/ui.py:142 msgid "Reset code" msgstr "Tilbakestillingskode" #: ../ubuntu_sso/utils/ui.py:145 #, python-format msgid "" "A password reset code has been sent to %(email)s.\n" "Please enter the code below along with your new password." msgstr "" "Ein tilbakestillingskode har vorte sendt til %(email)s.\n" "Skriv inn koden nedanfor saman med det nye passordet." #: ../ubuntu_sso/utils/ui.py:147 msgid "Set Up Account" msgstr "" #: ../ubuntu_sso/utils/ui.py:148 msgid "I don't have an account yet - sign me up" msgstr "" #: ../ubuntu_sso/utils/ui.py:149 msgid "Sign In" msgstr "" #: ../ubuntu_sso/utils/ui.py:150 msgid "Log-in with my existing account." msgstr "" #: ../ubuntu_sso/utils/ui.py:151 msgid "the appname whose ssl error we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:152 msgid "Certificate details" msgstr "" #: ../ubuntu_sso/utils/ui.py:153 msgid "Connect" msgstr "" #: ../ubuntu_sso/utils/ui.py:154 msgid "the details ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:161 msgid "Open the SSL certificate UI." msgstr "" #: ../ubuntu_sso/utils/ui.py:162 msgid "SSL Certificate Not Valid" msgstr "" #: ../ubuntu_sso/utils/ui.py:163 msgid "the domain whose ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:164 #, python-format msgid "" "You are trying to connect to a proxy server on %(domain)s. This server uses " "a secure connection, and the SSL certificate is not valid because:" msgstr "" #: ../ubuntu_sso/utils/ui.py:167 msgid "The certificate has not been verified" msgstr "" #: ../ubuntu_sso/utils/ui.py:168 msgid "Do you want to connect to this server?" msgstr "" #: ../ubuntu_sso/utils/ui.py:169 msgid "Get Help With SSL" msgstr "" #: ../ubuntu_sso/utils/ui.py:170 #, python-format msgid "" "If you are not sure about this server, do not use it to connect to " "%(app_name)s." msgstr "" #: ../ubuntu_sso/utils/ui.py:172 msgid "Remember my settings for this certificate." msgstr "" #: ../ubuntu_sso/utils/ui.py:173 msgid "" "The name on the certificate isn't valid or doesn't match the name of the site" msgstr "" #: ../ubuntu_sso/utils/ui.py:175 msgid "The certificate has expired" msgstr "" #: ../ubuntu_sso/utils/ui.py:176 #, python-format msgid "You are now logged into %(app_name)s." msgstr "" #: ../ubuntu_sso/utils/ui.py:177 msgid "Surname" msgstr "" #: ../ubuntu_sso/utils/ui.py:178 msgid "Terms of Service" msgstr "" #: ../ubuntu_sso/utils/ui.py:179 msgid "Sign Up to {app_name}" msgstr "" #: ../ubuntu_sso/utils/ui.py:180 msgid "Show Terms & Conditions" msgstr "Vis vilkÃ¥r" #: ../ubuntu_sso/utils/ui.py:181 #, python-format msgid "" "Agreeing to the %(app_name)s Terms & Conditions is required to subscribe." msgstr "" #: ../ubuntu_sso/utils/ui.py:183 #, python-format msgid "You can also find these terms at %(url)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:184 msgid "Try again" msgstr "" #: ../ubuntu_sso/utils/ui.py:185 msgid "" "There was an error when trying to complete the process. Please check the " "information and try again." msgstr "" "Ein feil oppstod da prosessen skulle avsluttast. Sjekk informasjonen og prøv " "om att." #: ../ubuntu_sso/utils/ui.py:187 msgid "Verification code" msgstr "" #: ../ubuntu_sso/utils/ui.py:188 #, python-format msgid "" "Check %(email)s for an email from Ubuntu Single Sign On. This message " "contains a verification code. Enter the code in the field below and click OK " "to complete creating your %(app_name)s account." msgstr "" #: ../ubuntu_sso/utils/ui.py:192 msgid "Enter verification code" msgstr "Skriv inn stadfestingskoden" #: ../ubuntu_sso/utils/ui.py:195 #, python-format msgid "I agree with the %(app_name)s terms and conditions" msgstr "Eg samtykkjer i %(app_name)s sine vilkÃ¥r for bruk" #: ../ubuntu_sso/utils/ui.py:196 #, python-format msgid "Yes! Email me %(app_name)s tips and updates." msgstr "Ja! Send meg tips og oppdateringar for %(app_name)s pÃ¥ e-post." ubuntu-sso-client-13.10/po/ca.po0000664000202700020270000003707612151461656016727 0ustar dobeydobey00000000000000# Catalan translation for ubuntu-sso-client # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the ubuntu-sso-client package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: ubuntu-sso-client\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-09-11 18:25+0000\n" "PO-Revision-Date: 2012-09-08 17:01+0000\n" "Last-Translator: David Planella \n" "Language-Team: Catalan \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-09-17 18:24+0000\n" "X-Generator: Launchpad (build 15944)\n" #. Undefined variable '_', pylint: disable=E0602 #. all the text that is used in the gui #: ../ubuntu_sso/utils/ui.py:49 msgid "By signing up to {app_name} you agree to our {privacy_policy}" msgstr "" "En registrar-vos a {app_name} esteu d'acord amb la nostra {privacy_policy}" #: ../ubuntu_sso/utils/ui.py:51 msgid "By signing up to {app_name} you agree to our {terms_and_conditions}" msgstr "" "En registrar-vos a {app_name} esteu d'acord amb els nostres " "{terms_and_conditions}" #: ../ubuntu_sso/utils/ui.py:53 msgid " and {privacy_policy}" msgstr " i la {privacy_policy}" #: ../ubuntu_sso/utils/ui.py:54 msgid "Cancel" msgstr "CanceÅ€la" #: ../ubuntu_sso/utils/ui.py:55 msgid "Type the characters above" msgstr "Introduïu els caràcters d'aquí sobre" #: ../ubuntu_sso/utils/ui.py:56 msgid "There was a problem getting the captcha, reloading..." msgstr "" "S'ha produït un problema en obtenir el captcha, s'està tornant a carregar..." #: ../ubuntu_sso/utils/ui.py:58 #, python-format msgid "If you can't read this then %(reload_link)s this page" msgstr "Si no podeu llegir-ho, %(reload_link)s aquesta pàgina" #: ../ubuntu_sso/utils/ui.py:60 msgid "refresh" msgstr "refresqueu" #: ../ubuntu_sso/utils/ui.py:61 msgid "Reload" msgstr "Torna a carregar" #: ../ubuntu_sso/utils/ui.py:62 msgid "The captcha is a required field" msgstr "La comprovació de captcha és un camp obligatori" #: ../ubuntu_sso/utils/ui.py:63 msgid "Close window and set up later" msgstr "Tanca la finestra i configura-ho més endavant" #: ../ubuntu_sso/utils/ui.py:64 msgid "Congratulations, {app_name} is installed!" msgstr "Felicitats, heu instal·lat l'aplicació {app_name}!" #: ../ubuntu_sso/utils/ui.py:65 #, python-format msgid "To connect this computer to %(app_name)s enter your details below." msgstr "" "Introduïu els vostres detalls aquí sota per connectar aquest ordinador a " "%(app_name)s." #: ../ubuntu_sso/utils/ui.py:67 msgid "Register with {app_name}." msgstr "Registra'm amb {app_name}." #: ../ubuntu_sso/utils/ui.py:68 ../ubuntu_sso/utils/ui.py:93 #: ../ubuntu_sso/utils/ui.py:143 msgid "Email address" msgstr "Adreça electrònica" #: ../ubuntu_sso/utils/ui.py:69 msgid "Re-type Email address" msgstr "Torneu a introduir l'adreça electrònica" #: ../ubuntu_sso/utils/ui.py:70 msgid "The email must be a valid email address." msgstr "L'adreça electrònica ha de ser una adreça de correu vàlida." #: ../ubuntu_sso/utils/ui.py:71 msgid "" "The email addresses don't match, please double check and try entering them " "again." msgstr "" "Les adreces de correu no coincideixen. Comproveu-les i torneu-les a " "introduir." #: ../ubuntu_sso/utils/ui.py:73 msgid "Email" msgstr "Adreça electrònica" #: ../ubuntu_sso/utils/ui.py:74 msgid "The email addresses do not match" msgstr "Les adreces electròniques no coincideixen" #: ../ubuntu_sso/utils/ui.py:75 msgid "Enter code verification here" msgstr "Introduïu el codi de verificació aquí" #: ../ubuntu_sso/utils/ui.py:76 msgid "Please enter your name" msgstr "Introduïu el vostre nom" #: ../ubuntu_sso/utils/ui.py:77 msgid "The process did not finish successfully." msgstr "El procés no ha finalitzat correctament." #: ../ubuntu_sso/utils/ui.py:79 msgid "Sign me in with my existing account" msgstr "Entra amb el meu compte existent" #: ../ubuntu_sso/utils/ui.py:80 msgid "This field is required." msgstr "Aquest camp és obligatori." #: ../ubuntu_sso/utils/ui.py:81 msgid "I've forgotten my password" msgstr "M'he oblidat de la contrasenya" #: ../ubuntu_sso/utils/ui.py:82 ../ubuntu_sso/utils/ui.py:130 msgid "Reset password" msgstr "Reinicialitza la contrasenya" #: ../ubuntu_sso/utils/ui.py:83 msgid "" "To reset your {app_name} password, enter your registered email address " "below. We will send instructions to reset your password." msgstr "" "Per reiniciar la contrasenya de l'aplicació {app_name}, introduïu l'adreça " "electrònica de registre a sota. Us enviarem instruccions per reiniciar la " "contrasenya." #: ../ubuntu_sso/utils/ui.py:86 msgid "Please enter a valid email address" msgstr "Heu d'introduir una adreça electrònica vàlida" #: ../ubuntu_sso/utils/ui.py:87 msgid "There was a problem accessing the Ubuntu Single Sign On backend." msgstr "" "S'ha produït un problema en accedir al rerefons de l'Ubuntu Single Sign On" #: ../ubuntu_sso/utils/ui.py:89 #, python-format msgid "Create %(app_name)s account" msgstr "Creació d'un compte %(app_name)s" #: ../ubuntu_sso/utils/ui.py:90 msgid "Loading..." msgstr "S'està carregant…" #: ../ubuntu_sso/utils/ui.py:91 msgid "Getting information, please wait..." msgstr "S'està obtenint informació, espereu un moment..." #: ../ubuntu_sso/utils/ui.py:92 msgid "Already have an account? Click here to sign in" msgstr "Ja teniu un compte? Feu clic aquí per entrar" #: ../ubuntu_sso/utils/ui.py:94 #, python-format msgid "Connect to %(app_name)s" msgstr "Connecta't a %(app_name)s" #: ../ubuntu_sso/utils/ui.py:95 ../ubuntu_sso/utils/ui.py:109 msgid "Password" msgstr "Contrasenya" #: ../ubuntu_sso/utils/ui.py:97 msgid "Sign In to {app_name}" msgstr "Entra a l'aplicació {app_name}" #: ../ubuntu_sso/utils/ui.py:99 msgid "Name" msgstr "Nom" #: ../ubuntu_sso/utils/ui.py:100 msgid "The name must not be empty." msgstr "El nom no pot ser buit." #: ../ubuntu_sso/utils/ui.py:101 msgid "Next" msgstr "Següent" #: ../ubuntu_sso/utils/ui.py:102 msgid "Network detection" msgstr "Detecció de xarxa" #: ../ubuntu_sso/utils/ui.py:103 #, python-format msgid "" "Are you online? We can't detect an internet connection - you will need to be " "connected to set up %(app_name)s" msgstr "" "Esteu en línia? No podem detectar una connexió a Internet. Cal que estigueu " "connectat per configurar l'aplicació %(app_name)s" #: ../ubuntu_sso/utils/ui.py:105 msgid "One moment please..." msgstr "Un moment, si us plau..." #: ../ubuntu_sso/utils/ui.py:106 msgid "Create a password" msgstr "Crea una contrasenya" #: ../ubuntu_sso/utils/ui.py:107 msgid "Your password was successfully changed." msgstr "S'ha canviat correctament la vostra contrasenya." #: ../ubuntu_sso/utils/ui.py:108 msgid "At least one number" msgstr "Com a mínim un número" #: ../ubuntu_sso/utils/ui.py:110 msgid "Re-type Password" msgstr "Torneu a escriure la contrasenya" #: ../ubuntu_sso/utils/ui.py:111 msgid "" "The password must have a minimum of 8 characters and include one uppercase " "character and one number." msgstr "" "La contrasenya ha de tenir un mínim de 8 caràcters i ha d'incloure un " "caràcter en majúscula i un nombre." #: ../ubuntu_sso/utils/ui.py:113 msgid "At least 8 characters" msgstr "Com a mínim 8 caràcters" #: ../ubuntu_sso/utils/ui.py:114 msgid "Passwords don't match" msgstr "Les contrasenyes no coincideixen" #: ../ubuntu_sso/utils/ui.py:115 msgid "" "The passwords don't match, please double check and try entering them again." msgstr "" "Les contrasenyes no coincideixen. Comproveu-les i torneu-les a introduir." #: ../ubuntu_sso/utils/ui.py:117 msgid "Your password must contain" msgstr "La contrasenya ha d'incloure" #: ../ubuntu_sso/utils/ui.py:118 msgid "The password is too weak." msgstr "La contrasenya és massa dèbil." #: ../ubuntu_sso/utils/ui.py:119 msgid "At least one uppercase letter" msgstr "Com a mínim una lletra majúscula" #: ../ubuntu_sso/utils/ui.py:120 msgid "Privacy Policy" msgstr "Política de privadesa" #: ../ubuntu_sso/utils/ui.py:121 msgid "Connecting to:" msgstr "S'està connectant a:" #: ../ubuntu_sso/utils/ui.py:122 msgid "Proxy Settings" msgstr "Configuració del servidor intermediari" #: ../ubuntu_sso/utils/ui.py:123 msgid "Incorrect login details. Please try again." msgstr "Els detalls d'entrada no són correctes. Torneu-ho a intentar." #: ../ubuntu_sso/utils/ui.py:124 msgid "Please provide login details." msgstr "Proporcioneu els detalls d'entrada." #: ../ubuntu_sso/utils/ui.py:125 msgid "You are connecting through a proxy." msgstr "Us esteu connectant a través d'un servidor intermediari." #: ../ubuntu_sso/utils/ui.py:126 msgid "Get Help With Proxies" msgstr "Obteniu ajuda per a servidors intermediaris" #: ../ubuntu_sso/utils/ui.py:127 msgid "Proxy password:" msgstr "Contrasenya del servidor intermediari:" #: ../ubuntu_sso/utils/ui.py:128 msgid "Save and Connect" msgstr "Desa-ho i connecta't" #: ../ubuntu_sso/utils/ui.py:129 msgid "Proxy username:" msgstr "Nom d'usuari al servidor intermediari:" #: ../ubuntu_sso/utils/ui.py:131 msgid "" "A password reset code has been sent to your e-mail. Please enter the code " "below along with your new password." msgstr "" "S'ha enviat un codi per reiniciar la contrasenya al vostre correu " "electrònic. Introduïu el codi a sota amb la contrasenya nova." #: ../ubuntu_sso/utils/ui.py:133 msgid "Retype email" msgstr "Torneu a escriure l'adreça electrònica" #: ../ubuntu_sso/utils/ui.py:134 msgid "Retype password" msgstr "Torneu a escriure la contrasenya" #: ../ubuntu_sso/utils/ui.py:135 #, python-format msgid "To reset your %(app_name)s password, enter your email address below:" msgstr "" "Introduïu la vostra adreça electrònica aquí sota per reinicialitzar la " "contrasenya a %(app_name)s:" #: ../ubuntu_sso/utils/ui.py:137 msgid "" "We are very Sorry! The service that signs you on is not responding right " "now\n" "Please try again or come back in a few minutes." msgstr "" "Ho sentim però el servei per entrar no respon ara mateix\n" "Torneu-ho a intentar o torneu d'aquí uns minuts." #: ../ubuntu_sso/utils/ui.py:140 msgid "Sorry we did not recognize the email address." msgstr "No s'ha reconegut l'adreça electrònica." #: ../ubuntu_sso/utils/ui.py:142 msgid "Reset code" msgstr "Reinicialitza el codi" #: ../ubuntu_sso/utils/ui.py:145 #, python-format msgid "" "A password reset code has been sent to %(email)s.\n" "Please enter the code below along with your new password." msgstr "" "S'ha enviat un codi de reinicialització a l'adreça %(email)s.\n" "Introduïu el codi aquí sota juntament amb la vostra contrasenya nova." #: ../ubuntu_sso/utils/ui.py:147 msgid "Set Up Account" msgstr "Configura el compte" #: ../ubuntu_sso/utils/ui.py:148 msgid "I don't have an account yet - sign me up" msgstr "Encara no tinc cap compte, crea'n un de nou" #: ../ubuntu_sso/utils/ui.py:149 msgid "Sign In" msgstr "Entra" #: ../ubuntu_sso/utils/ui.py:150 msgid "Log-in with my existing account." msgstr "Entra amb el meu compte existent." #: ../ubuntu_sso/utils/ui.py:151 msgid "the appname whose ssl error we are going to show." msgstr "el nom de l'aplicació de la qual mostrarem l'error SSL." #: ../ubuntu_sso/utils/ui.py:152 msgid "Certificate details" msgstr "Detalls del certificat" #: ../ubuntu_sso/utils/ui.py:153 msgid "Connect" msgstr "Connecta't" #: ../ubuntu_sso/utils/ui.py:154 msgid "the details ssl certificate we are going to show." msgstr "els detalls del certificat SSL que mostrarem." #: ../ubuntu_sso/utils/ui.py:161 msgid "Open the SSL certificate UI." msgstr "Obre la interfície d'usuari del certificat SSL." #: ../ubuntu_sso/utils/ui.py:162 msgid "SSL Certificate Not Valid" msgstr "El certificat SSL no és vàlid" #: ../ubuntu_sso/utils/ui.py:163 msgid "the domain whose ssl certificate we are going to show." msgstr "el domini del qual mostrarem el certificat SSL." #: ../ubuntu_sso/utils/ui.py:164 #, python-format msgid "" "You are trying to connect to a proxy server on %(domain)s. This server uses " "a secure connection, and the SSL certificate is not valid because:" msgstr "" "Esteu intentat connectar-vos a un servidor intermediari a %(domain)s. Aquest " "servidor utilitza una connexió segura i el certificat SSL no és vàlid perquè:" #: ../ubuntu_sso/utils/ui.py:167 msgid "The certificate has not been verified" msgstr "El certificat no s'ha verificat" #: ../ubuntu_sso/utils/ui.py:168 msgid "Do you want to connect to this server?" msgstr "Voleu connectar-vos a aquest servidor?" #: ../ubuntu_sso/utils/ui.py:169 msgid "Get Help With SSL" msgstr "Obteniu ajuda sobre SSL" #: ../ubuntu_sso/utils/ui.py:170 #, python-format msgid "" "If you are not sure about this server, do not use it to connect to " "%(app_name)s." msgstr "" "Si no esteu segur sobre aquest servidor, no l'utilitzeu per connectar-vos a " "l'aplicació %(app_name)s." #: ../ubuntu_sso/utils/ui.py:172 msgid "Remember my settings for this certificate." msgstr "Recorda els paràmetres per a aquest certificat." #: ../ubuntu_sso/utils/ui.py:173 msgid "" "The name on the certificate isn't valid or doesn't match the name of the site" msgstr "" "El nom del certificat no és vàlid o no coincideix amb el nom del lloc" #: ../ubuntu_sso/utils/ui.py:175 msgid "The certificate has expired" msgstr "El certificat ha vençut" #: ../ubuntu_sso/utils/ui.py:176 #, python-format msgid "You are now logged into %(app_name)s." msgstr "Heu iniciat la sessió a l'aplicació %(app_name)s." #: ../ubuntu_sso/utils/ui.py:177 msgid "Surname" msgstr "Cognoms" #: ../ubuntu_sso/utils/ui.py:178 msgid "Terms of Service" msgstr "Termes del servei" #: ../ubuntu_sso/utils/ui.py:179 msgid "Sign Up to {app_name}" msgstr "Entra a l'aplicació {app_name}" #: ../ubuntu_sso/utils/ui.py:180 msgid "Show Terms & Conditions" msgstr "Mostra els termes i les condicions" #: ../ubuntu_sso/utils/ui.py:181 #, python-format msgid "" "Agreeing to the %(app_name)s Terms & Conditions is required to subscribe." msgstr "" "Cal acceptar els termes i condicions de l'aplicació %(app_name)s per " "registrar-vos." #: ../ubuntu_sso/utils/ui.py:183 #, python-format msgid "You can also find these terms at %(url)s" msgstr "També podeu trobar aquests termes a %(url)s" #: ../ubuntu_sso/utils/ui.py:184 msgid "Try again" msgstr "Torneu-ho a provar" #: ../ubuntu_sso/utils/ui.py:185 msgid "" "There was an error when trying to complete the process. Please check the " "information and try again." msgstr "" "S'ha produït un error en intentar completar el procés. Comproveu la " "informació i torneu-ho a intentar." #: ../ubuntu_sso/utils/ui.py:187 msgid "Verification code" msgstr "Codi de verificació" #: ../ubuntu_sso/utils/ui.py:188 #, python-format msgid "" "Check %(email)s for an email from Ubuntu Single Sign On. This message " "contains a verification code. Enter the code in the field below and click OK " "to complete creating your %(app_name)s account." msgstr "" "Comproveu si heu rebut un correu de l'Ubuntu Single Sign On a l'adreça " "%(email)s. Aquest missatge conté un codi de verificació, el qual haureu " "d'introduir en el camp de sota i fer clic a «Accepta» per finalitzar la " "creació del vostre compte de l'aplicació %(app_name)s." #: ../ubuntu_sso/utils/ui.py:192 msgid "Enter verification code" msgstr "Introduïu el codi de verificació" #: ../ubuntu_sso/utils/ui.py:195 #, python-format msgid "I agree with the %(app_name)s terms and conditions" msgstr "Estic d'acord amb els termes i les condicions del %(app_name)s" #: ../ubuntu_sso/utils/ui.py:196 #, python-format msgid "Yes! Email me %(app_name)s tips and updates." msgstr "" "Sí, vull que m'envieu informació i actualitzacions sobre %(app_name)s." ubuntu-sso-client-13.10/po/hu.po0000664000202700020270000003623712151461656016756 0ustar dobeydobey00000000000000# Hungarian translation for ubuntu-sso-client # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the ubuntu-sso-client package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: ubuntu-sso-client\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-09-11 18:25+0000\n" "PO-Revision-Date: 2012-04-07 12:54+0000\n" "Last-Translator: Gabor Kelemen \n" "Language-Team: Hungarian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-09-17 18:24+0000\n" "X-Generator: Launchpad (build 15944)\n" #. Undefined variable '_', pylint: disable=E0602 #. all the text that is used in the gui #: ../ubuntu_sso/utils/ui.py:49 msgid "By signing up to {app_name} you agree to our {privacy_policy}" msgstr "" "A(z) {app_name} szolgáltatásra feliratkozással elfogadja a {privacy_policy}" #: ../ubuntu_sso/utils/ui.py:51 msgid "By signing up to {app_name} you agree to our {terms_and_conditions}" msgstr "" "A(z) {app_name} szolgáltatásra feliratkozással elfogadja a " "{terms_and_conditions}" #: ../ubuntu_sso/utils/ui.py:53 msgid " and {privacy_policy}" msgstr " és a {privacy_policy}" #: ../ubuntu_sso/utils/ui.py:54 msgid "Cancel" msgstr "Mégse" #: ../ubuntu_sso/utils/ui.py:55 msgid "Type the characters above" msgstr "Ãrja be a fenti karaktereket" #: ../ubuntu_sso/utils/ui.py:56 msgid "There was a problem getting the captcha, reloading..." msgstr "Hiba történt a captcha lekérésekor, újratöltés…" #: ../ubuntu_sso/utils/ui.py:58 #, python-format msgid "If you can't read this then %(reload_link)s this page" msgstr "Ha ezt nem tudja elolvasni, akkor %(reload_link)s az oldalt" #: ../ubuntu_sso/utils/ui.py:60 msgid "refresh" msgstr "frissítse" #: ../ubuntu_sso/utils/ui.py:61 msgid "Reload" msgstr "Frissítés" #: ../ubuntu_sso/utils/ui.py:62 msgid "The captcha is a required field" msgstr "A captcha egy kötelezÅ‘ mezÅ‘" #: ../ubuntu_sso/utils/ui.py:63 msgid "Close window and set up later" msgstr "Ablak bezárása és beállítás késÅ‘bb" #: ../ubuntu_sso/utils/ui.py:64 msgid "Congratulations, {app_name} is installed!" msgstr "Gratulálunk, a(z) {app_name} telepítve lett!" #: ../ubuntu_sso/utils/ui.py:65 #, python-format msgid "To connect this computer to %(app_name)s enter your details below." msgstr "" "A számítógép és a(z) %(app_name)s összekapcsolásához adja meg lejjebb az " "adatait." #: ../ubuntu_sso/utils/ui.py:67 msgid "Register with {app_name}." msgstr "" #: ../ubuntu_sso/utils/ui.py:68 ../ubuntu_sso/utils/ui.py:93 #: ../ubuntu_sso/utils/ui.py:143 msgid "Email address" msgstr "E-mail cím" #: ../ubuntu_sso/utils/ui.py:69 msgid "Re-type Email address" msgstr "Ãrja be újra az e-mail címet" #: ../ubuntu_sso/utils/ui.py:70 msgid "The email must be a valid email address." msgstr "Az e-mail címnek érvényesnek kell lennie." #: ../ubuntu_sso/utils/ui.py:71 msgid "" "The email addresses don't match, please double check and try entering them " "again." msgstr "" "Az e-mail címek nem egyeznek. EllenÅ‘rizze azokat, majd próbálja újra." #: ../ubuntu_sso/utils/ui.py:73 msgid "Email" msgstr "E-mail" #: ../ubuntu_sso/utils/ui.py:74 msgid "The email addresses do not match" msgstr "Az e-mail címek nem egyeznek" #: ../ubuntu_sso/utils/ui.py:75 msgid "Enter code verification here" msgstr "Adja meg itt az ellenÅ‘rzÅ‘ kódot" #: ../ubuntu_sso/utils/ui.py:76 msgid "Please enter your name" msgstr "Adja meg a nevét" #: ../ubuntu_sso/utils/ui.py:77 msgid "The process did not finish successfully." msgstr "A folyamat nem fejezÅ‘dött be sikeresen." #: ../ubuntu_sso/utils/ui.py:79 msgid "Sign me in with my existing account" msgstr "Bejelentkezés meglévÅ‘ fiókkal" #: ../ubuntu_sso/utils/ui.py:80 msgid "This field is required." msgstr "Ezen mezÅ‘ kitöltése szükséges." #: ../ubuntu_sso/utils/ui.py:81 msgid "I've forgotten my password" msgstr "Elfelejtettem a jelszavam" #: ../ubuntu_sso/utils/ui.py:82 ../ubuntu_sso/utils/ui.py:130 msgid "Reset password" msgstr "Jelszó visszaállítása" #: ../ubuntu_sso/utils/ui.py:83 msgid "" "To reset your {app_name} password, enter your registered email address " "below. We will send instructions to reset your password." msgstr "" "A(z) {app_name} jelszó visszaállításához adja meg alább a regisztrált e-mail " "címét, amelyre elküldhetjük a szükséges utasításokat." #: ../ubuntu_sso/utils/ui.py:86 msgid "Please enter a valid email address" msgstr "Érvényes e-mail címet adjon meg" #: ../ubuntu_sso/utils/ui.py:87 msgid "There was a problem accessing the Ubuntu Single Sign On backend." msgstr "Hiba történt az Ubuntu Single Sign On háttérprogram elérésekor." #: ../ubuntu_sso/utils/ui.py:89 #, python-format msgid "Create %(app_name)s account" msgstr "%(app_name)s fiók létrehozása" #: ../ubuntu_sso/utils/ui.py:90 msgid "Loading..." msgstr "Betöltés…" #: ../ubuntu_sso/utils/ui.py:91 msgid "Getting information, please wait..." msgstr "Információk lekérése, kis türelmet…" #: ../ubuntu_sso/utils/ui.py:92 msgid "Already have an account? Click here to sign in" msgstr "Már van fiókja? Kattintson ide a bejelentkezéshez" #: ../ubuntu_sso/utils/ui.py:94 #, python-format msgid "Connect to %(app_name)s" msgstr "Csatlakozás ehhez: %(app_name)s" #: ../ubuntu_sso/utils/ui.py:95 ../ubuntu_sso/utils/ui.py:109 msgid "Password" msgstr "Jelszó" #: ../ubuntu_sso/utils/ui.py:97 msgid "Sign In to {app_name}" msgstr "Bejelentkezés ebbe: {app_name}" #: ../ubuntu_sso/utils/ui.py:99 msgid "Name" msgstr "Név" #: ../ubuntu_sso/utils/ui.py:100 msgid "The name must not be empty." msgstr "A név nem lehet üres." #: ../ubuntu_sso/utils/ui.py:101 msgid "Next" msgstr "KövetkezÅ‘" #: ../ubuntu_sso/utils/ui.py:102 msgid "Network detection" msgstr "Hálózatfelismerés" #: ../ubuntu_sso/utils/ui.py:103 #, python-format msgid "" "Are you online? We can't detect an internet connection - you will need to be " "connected to set up %(app_name)s" msgstr "" "Működik az internetkapcsolata? A(z) %(app_name)s beállításához működÅ‘ " "internetkapcsolat szükséges, de az nem található." #: ../ubuntu_sso/utils/ui.py:105 msgid "One moment please..." msgstr "Egy pillanat…" #: ../ubuntu_sso/utils/ui.py:106 msgid "Create a password" msgstr "Jelszó létrehozása" #: ../ubuntu_sso/utils/ui.py:107 msgid "Your password was successfully changed." msgstr "A jelszó megváltoztatása sikerült." #: ../ubuntu_sso/utils/ui.py:108 msgid "At least one number" msgstr "Legalább egy számot" #: ../ubuntu_sso/utils/ui.py:110 msgid "Re-type Password" msgstr "Jelszó újra" #: ../ubuntu_sso/utils/ui.py:111 msgid "" "The password must have a minimum of 8 characters and include one uppercase " "character and one number." msgstr "" "A jelszónak legalább 8 karakter hosszúnak kell lennie, és tartalmaznia kell " "legalább egy nagybetűt és egy számjegyet." #: ../ubuntu_sso/utils/ui.py:113 msgid "At least 8 characters" msgstr "Legalább 8 karaktert" #: ../ubuntu_sso/utils/ui.py:114 msgid "Passwords don't match" msgstr "A jelszavak nem egyeznek" #: ../ubuntu_sso/utils/ui.py:115 msgid "" "The passwords don't match, please double check and try entering them again." msgstr "A jelszavak nem egyeznek. EllenÅ‘rizze azokat, majd próbálja újra." #: ../ubuntu_sso/utils/ui.py:117 msgid "Your password must contain" msgstr "A jelszónak tartalmaznia kell" #: ../ubuntu_sso/utils/ui.py:118 msgid "The password is too weak." msgstr "A jelszó túl gyenge." #: ../ubuntu_sso/utils/ui.py:119 msgid "At least one uppercase letter" msgstr "Legalább egy nagybetűt" #: ../ubuntu_sso/utils/ui.py:120 msgid "Privacy Policy" msgstr "Adatvédelmi irányelveket" #: ../ubuntu_sso/utils/ui.py:121 msgid "Connecting to:" msgstr "Csatlakozás ehhez:" #: ../ubuntu_sso/utils/ui.py:122 msgid "Proxy Settings" msgstr "Proxy beállításai" #: ../ubuntu_sso/utils/ui.py:123 msgid "Incorrect login details. Please try again." msgstr "Hibás bejelentkezési adatok. Próbálja újra." #: ../ubuntu_sso/utils/ui.py:124 msgid "Please provide login details." msgstr "Adja meg a bejelentkezési adatokat." #: ../ubuntu_sso/utils/ui.py:125 msgid "You are connecting through a proxy." msgstr "Proxyn keresztül csatlakozik." #: ../ubuntu_sso/utils/ui.py:126 msgid "Get Help With Proxies" msgstr "Segítség proxyk használatához" #: ../ubuntu_sso/utils/ui.py:127 msgid "Proxy password:" msgstr "Jelszó a proxyhoz:" #: ../ubuntu_sso/utils/ui.py:128 msgid "Save and Connect" msgstr "Mentés és csatlakozás" #: ../ubuntu_sso/utils/ui.py:129 msgid "Proxy username:" msgstr "Felhasználónév a proxyhoz:" #: ../ubuntu_sso/utils/ui.py:131 msgid "" "A password reset code has been sent to your e-mail. Please enter the code " "below along with your new password." msgstr "" "A jelszó-visszaállítási kód elküldve az e-mail címére. Adja meg alább a " "kódot az új jelszavával együtt." #: ../ubuntu_sso/utils/ui.py:133 msgid "Retype email" msgstr "E-mail cím megerÅ‘sítése" #: ../ubuntu_sso/utils/ui.py:134 msgid "Retype password" msgstr "Jelszó megerÅ‘sítése" #: ../ubuntu_sso/utils/ui.py:135 #, python-format msgid "To reset your %(app_name)s password, enter your email address below:" msgstr "" "A(z) %(app_name)s jelszó visszaállításához adja meg alább az e-mail címét." #: ../ubuntu_sso/utils/ui.py:137 msgid "" "We are very Sorry! The service that signs you on is not responding right " "now\n" "Please try again or come back in a few minutes." msgstr "" "Elnézést, a bejelentkezési szolgáltatás jelenleg nem válaszol\n" "Próbálja újra egy kicsit késÅ‘bb." #: ../ubuntu_sso/utils/ui.py:140 msgid "Sorry we did not recognize the email address." msgstr "Elnézést, az e-mail cím ismeretlen." #: ../ubuntu_sso/utils/ui.py:142 msgid "Reset code" msgstr "Visszaállító kód" #: ../ubuntu_sso/utils/ui.py:145 #, python-format msgid "" "A password reset code has been sent to %(email)s.\n" "Please enter the code below along with your new password." msgstr "" "A jelszó-visszaállító kód elküldésre került erre a címre: %(email)s.\n" "Adja meg alább a kódot az új jelszóval együtt." #: ../ubuntu_sso/utils/ui.py:147 msgid "Set Up Account" msgstr "Fiók létrehozása" #: ../ubuntu_sso/utils/ui.py:148 msgid "I don't have an account yet - sign me up" msgstr "Még nincs fiókom – újat szeretnék" #: ../ubuntu_sso/utils/ui.py:149 msgid "Sign In" msgstr "Bejelentkezés" #: ../ubuntu_sso/utils/ui.py:150 msgid "Log-in with my existing account." msgstr "" #: ../ubuntu_sso/utils/ui.py:151 msgid "the appname whose ssl error we are going to show." msgstr "Az alkalmazásnév, amelynek SSL hibája megjelenítésre kerül." #: ../ubuntu_sso/utils/ui.py:152 msgid "Certificate details" msgstr "A tanúsítvány részletei" #: ../ubuntu_sso/utils/ui.py:153 msgid "Connect" msgstr "Csatlakozás" #: ../ubuntu_sso/utils/ui.py:154 msgid "the details ssl certificate we are going to show." msgstr "Az SSL-tanúsítvány, amelynek részletei megjelenítésre kerülnek." #: ../ubuntu_sso/utils/ui.py:161 msgid "Open the SSL certificate UI." msgstr "Az SSL-tanúsítvány felület megjelenítése." #: ../ubuntu_sso/utils/ui.py:162 msgid "SSL Certificate Not Valid" msgstr "Az SSL-tanúsítvány nem érvényes." #: ../ubuntu_sso/utils/ui.py:163 msgid "the domain whose ssl certificate we are going to show." msgstr "A tartomány, amelynek SSL-tanúsítványa megjelenítésre kerül." #: ../ubuntu_sso/utils/ui.py:164 #, python-format msgid "" "You are trying to connect to a proxy server on %(domain)s. This server uses " "a secure connection, and the SSL certificate is not valid because:" msgstr "" "Proxy kiszolgálóhoz próbál kapcsolódni ezen: %(domain)s. Ez a kiszolgáló " "biztonságos kapcsolatot használ, és az SSL-tanúsítványa érvénytelen, mert:" #: ../ubuntu_sso/utils/ui.py:167 msgid "The certificate has not been verified" msgstr "A tanúsítvány nincs ellenÅ‘rizve" #: ../ubuntu_sso/utils/ui.py:168 msgid "Do you want to connect to this server?" msgstr "Csatlakozni szeretne ehhez a kiszolgálóhoz?" #: ../ubuntu_sso/utils/ui.py:169 msgid "Get Help With SSL" msgstr "Segítség az SSL-hez" #: ../ubuntu_sso/utils/ui.py:170 #, python-format msgid "" "If you are not sure about this server, do not use it to connect to " "%(app_name)s." msgstr "" "Ha nem bízik meg teljesen a kiszolgálóban, akkor ne használja a következÅ‘höz " "csatlakozásra: %(app_name)s." #: ../ubuntu_sso/utils/ui.py:172 msgid "Remember my settings for this certificate." msgstr "Beállításaim megjegyzése ehhez a tanúsítványhoz." #: ../ubuntu_sso/utils/ui.py:173 msgid "" "The name on the certificate isn't valid or doesn't match the name of the site" msgstr "" "A név a tanúsítványon nem érvényes, vagy nem egyezik az oldal nevével" #: ../ubuntu_sso/utils/ui.py:175 msgid "The certificate has expired" msgstr "A tanúsítvány lejárt" #: ../ubuntu_sso/utils/ui.py:176 #, python-format msgid "You are now logged into %(app_name)s." msgstr "Bejelentkezett ebbe: %(app_name)s." #: ../ubuntu_sso/utils/ui.py:177 msgid "Surname" msgstr "Vezetéknév" #: ../ubuntu_sso/utils/ui.py:178 msgid "Terms of Service" msgstr "SzerzÅ‘dési feltételeket" #: ../ubuntu_sso/utils/ui.py:179 msgid "Sign Up to {app_name}" msgstr "Feliratkozás erre: {app_name}" #: ../ubuntu_sso/utils/ui.py:180 msgid "Show Terms & Conditions" msgstr "Felhasználási feltételek megjelenítése" #: ../ubuntu_sso/utils/ui.py:181 #, python-format msgid "" "Agreeing to the %(app_name)s Terms & Conditions is required to subscribe." msgstr "" "A feliratkozáshoz el kell fogadnia a(z) %(app_name)s felhasználási " "feltételeit." #: ../ubuntu_sso/utils/ui.py:183 #, python-format msgid "You can also find these terms at %(url)s" msgstr "Ezek a feltételek itt is elérhetÅ‘k: %(url)s" #: ../ubuntu_sso/utils/ui.py:184 msgid "Try again" msgstr "Próbálja újra" #: ../ubuntu_sso/utils/ui.py:185 msgid "" "There was an error when trying to complete the process. Please check the " "information and try again." msgstr "" "Hiba történt a folyamat befejezése közben. EllenÅ‘rizze az információkat, és " "próbálja újra." #: ../ubuntu_sso/utils/ui.py:187 msgid "Verification code" msgstr "EllenÅ‘rzÅ‘kód" #: ../ubuntu_sso/utils/ui.py:188 #, python-format msgid "" "Check %(email)s for an email from Ubuntu Single Sign On. This message " "contains a verification code. Enter the code in the field below and click OK " "to complete creating your %(app_name)s account." msgstr "" "A(z) %(email)s címre küldtünk egy levelet az Ubuntu Single Sign On nevében. " "A levél tartalmaz egy ellenÅ‘rzÅ‘kódot. Az alábbi mezÅ‘be írja be ezt a kódot, " "és nyomja meg az OK gombot a(z) %(app_name)s fiók létrehozásának " "befejezéséhez." #: ../ubuntu_sso/utils/ui.py:192 msgid "Enter verification code" msgstr "Adja meg az ellenÅ‘rzÅ‘ kódot" #: ../ubuntu_sso/utils/ui.py:195 #, python-format msgid "I agree with the %(app_name)s terms and conditions" msgstr "Elfogadom a(z) %(app_name)s felhasználási feltételeit" #: ../ubuntu_sso/utils/ui.py:196 #, python-format msgid "Yes! Email me %(app_name)s tips and updates." msgstr "Igen! Kérek e-mailben %(app_name)s tippeket és frissítéseket." ubuntu-sso-client-13.10/po/vi.po0000664000202700020270000003034312151461656016750 0ustar dobeydobey00000000000000# Vietnamese translation for ubuntu-sso-client # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the ubuntu-sso-client package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: ubuntu-sso-client\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-09-11 18:25+0000\n" "PO-Revision-Date: 2011-03-11 01:46+0000\n" "Last-Translator: Nguyá»…n Anh \n" "Language-Team: Vietnamese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-09-17 18:24+0000\n" "X-Generator: Launchpad (build 15944)\n" #. Undefined variable '_', pylint: disable=E0602 #. all the text that is used in the gui #: ../ubuntu_sso/utils/ui.py:49 msgid "By signing up to {app_name} you agree to our {privacy_policy}" msgstr "" #: ../ubuntu_sso/utils/ui.py:51 msgid "By signing up to {app_name} you agree to our {terms_and_conditions}" msgstr "" #: ../ubuntu_sso/utils/ui.py:53 msgid " and {privacy_policy}" msgstr "" #: ../ubuntu_sso/utils/ui.py:54 msgid "Cancel" msgstr "" #: ../ubuntu_sso/utils/ui.py:55 msgid "Type the characters above" msgstr "Gõ những ký tá»± trên đây" #: ../ubuntu_sso/utils/ui.py:56 msgid "There was a problem getting the captcha, reloading..." msgstr "Gặp vấn đỠkhi lấy ảnh xác thá»±c, Ä‘ang nạp lại..." #: ../ubuntu_sso/utils/ui.py:58 #, python-format msgid "If you can't read this then %(reload_link)s this page" msgstr "" #: ../ubuntu_sso/utils/ui.py:60 msgid "refresh" msgstr "" #: ../ubuntu_sso/utils/ui.py:61 msgid "Reload" msgstr "Nạp lại" #: ../ubuntu_sso/utils/ui.py:62 msgid "The captcha is a required field" msgstr "" #: ../ubuntu_sso/utils/ui.py:63 msgid "Close window and set up later" msgstr "" #: ../ubuntu_sso/utils/ui.py:64 msgid "Congratulations, {app_name} is installed!" msgstr "" #: ../ubuntu_sso/utils/ui.py:65 #, python-format msgid "To connect this computer to %(app_name)s enter your details below." msgstr "" "Äể nối máy tình này đến %(app_name)s vui lòng cung cấp các thông tin dưới " "đây." #: ../ubuntu_sso/utils/ui.py:67 msgid "Register with {app_name}." msgstr "" #: ../ubuntu_sso/utils/ui.py:68 ../ubuntu_sso/utils/ui.py:93 #: ../ubuntu_sso/utils/ui.py:143 msgid "Email address" msgstr "Äịa chỉ thư Ä‘iện tá»­" #: ../ubuntu_sso/utils/ui.py:69 msgid "Re-type Email address" msgstr "Gõ lại địa chỉ thư Ä‘iện tá»­" #: ../ubuntu_sso/utils/ui.py:70 msgid "The email must be a valid email address." msgstr "Äịa chỉ thư Ä‘iện tá»­ phải có thật." #: ../ubuntu_sso/utils/ui.py:71 msgid "" "The email addresses don't match, please double check and try entering them " "again." msgstr "" "Các địa chỉ thư Ä‘iện tá»­ không giống nhau, vui lòng kiểm tra kỹ và thá»­ lại." #: ../ubuntu_sso/utils/ui.py:73 msgid "Email" msgstr "" #: ../ubuntu_sso/utils/ui.py:74 msgid "The email addresses do not match" msgstr "" #: ../ubuntu_sso/utils/ui.py:75 msgid "Enter code verification here" msgstr "Vui lòng gõ mã kiểm tra ở đây" #: ../ubuntu_sso/utils/ui.py:76 msgid "Please enter your name" msgstr "" #: ../ubuntu_sso/utils/ui.py:77 msgid "The process did not finish successfully." msgstr "Tiến trình kết thúc không thành công." #: ../ubuntu_sso/utils/ui.py:79 msgid "Sign me in with my existing account" msgstr "" #: ../ubuntu_sso/utils/ui.py:80 msgid "This field is required." msgstr "Trưá»ng này bắt buá»™c." #: ../ubuntu_sso/utils/ui.py:81 msgid "I've forgotten my password" msgstr "Tôi đã quên mật khẩu" #: ../ubuntu_sso/utils/ui.py:82 ../ubuntu_sso/utils/ui.py:130 msgid "Reset password" msgstr "Thiết lập lại mật khẩu" #: ../ubuntu_sso/utils/ui.py:83 msgid "" "To reset your {app_name} password, enter your registered email address " "below. We will send instructions to reset your password." msgstr "" #: ../ubuntu_sso/utils/ui.py:86 msgid "Please enter a valid email address" msgstr "" #: ../ubuntu_sso/utils/ui.py:87 msgid "There was a problem accessing the Ubuntu Single Sign On backend." msgstr "" #: ../ubuntu_sso/utils/ui.py:89 #, python-format msgid "Create %(app_name)s account" msgstr "Tạo tài khoản %(app_name)s" #: ../ubuntu_sso/utils/ui.py:90 msgid "Loading..." msgstr "Äang nạp..." #: ../ubuntu_sso/utils/ui.py:91 msgid "Getting information, please wait..." msgstr "" #: ../ubuntu_sso/utils/ui.py:92 msgid "Already have an account? Click here to sign in" msgstr "Bạn đã có tài khoản? Nhấn vào đây để đăng nhập" #: ../ubuntu_sso/utils/ui.py:94 #, python-format msgid "Connect to %(app_name)s" msgstr "Kết nối đến %(app_name)s" #: ../ubuntu_sso/utils/ui.py:95 ../ubuntu_sso/utils/ui.py:109 msgid "Password" msgstr "Mật khẩu" #: ../ubuntu_sso/utils/ui.py:97 msgid "Sign In to {app_name}" msgstr "" #: ../ubuntu_sso/utils/ui.py:99 msgid "Name" msgstr "Tên" #: ../ubuntu_sso/utils/ui.py:100 msgid "The name must not be empty." msgstr "" #: ../ubuntu_sso/utils/ui.py:101 msgid "Next" msgstr "Tiếp" #: ../ubuntu_sso/utils/ui.py:102 msgid "Network detection" msgstr "" #: ../ubuntu_sso/utils/ui.py:103 #, python-format msgid "" "Are you online? We can't detect an internet connection - you will need to be " "connected to set up %(app_name)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:105 msgid "One moment please..." msgstr "Hãy đợi má»™t lát..." #: ../ubuntu_sso/utils/ui.py:106 msgid "Create a password" msgstr "" #: ../ubuntu_sso/utils/ui.py:107 msgid "Your password was successfully changed." msgstr "Äã đổi mật khẩu." #: ../ubuntu_sso/utils/ui.py:108 msgid "At least one number" msgstr "" #: ../ubuntu_sso/utils/ui.py:110 msgid "Re-type Password" msgstr "Gõ lại Mật khẩu" #: ../ubuntu_sso/utils/ui.py:111 msgid "" "The password must have a minimum of 8 characters and include one uppercase " "character and one number." msgstr "" "Mật khẩu phải có tối thiểu 8 ký tá»±, có ít nhất má»™t chữ in hoa và má»™t chữ số." #: ../ubuntu_sso/utils/ui.py:113 msgid "At least 8 characters" msgstr "" #: ../ubuntu_sso/utils/ui.py:114 msgid "Passwords don't match" msgstr "" #: ../ubuntu_sso/utils/ui.py:115 msgid "" "The passwords don't match, please double check and try entering them again." msgstr "Các mật khẩu không khá»›p, vui lòng kiểm tra kỹ và thá»­ gõ lại." #: ../ubuntu_sso/utils/ui.py:117 msgid "Your password must contain" msgstr "" #: ../ubuntu_sso/utils/ui.py:118 msgid "The password is too weak." msgstr "Mật khẩu quá yếu." #: ../ubuntu_sso/utils/ui.py:119 msgid "At least one uppercase letter" msgstr "" #: ../ubuntu_sso/utils/ui.py:120 msgid "Privacy Policy" msgstr "" #: ../ubuntu_sso/utils/ui.py:121 msgid "Connecting to:" msgstr "" #: ../ubuntu_sso/utils/ui.py:122 msgid "Proxy Settings" msgstr "" #: ../ubuntu_sso/utils/ui.py:123 msgid "Incorrect login details. Please try again." msgstr "" #: ../ubuntu_sso/utils/ui.py:124 msgid "Please provide login details." msgstr "" #: ../ubuntu_sso/utils/ui.py:125 msgid "You are connecting through a proxy." msgstr "" #: ../ubuntu_sso/utils/ui.py:126 msgid "Get Help With Proxies" msgstr "" #: ../ubuntu_sso/utils/ui.py:127 msgid "Proxy password:" msgstr "" #: ../ubuntu_sso/utils/ui.py:128 msgid "Save and Connect" msgstr "" #: ../ubuntu_sso/utils/ui.py:129 msgid "Proxy username:" msgstr "" #: ../ubuntu_sso/utils/ui.py:131 msgid "" "A password reset code has been sent to your e-mail. Please enter the code " "below along with your new password." msgstr "" #: ../ubuntu_sso/utils/ui.py:133 msgid "Retype email" msgstr "" #: ../ubuntu_sso/utils/ui.py:134 msgid "Retype password" msgstr "" #: ../ubuntu_sso/utils/ui.py:135 #, python-format msgid "To reset your %(app_name)s password, enter your email address below:" msgstr "" "Äể thiết lập lại mật khẩu %(app_name)s, nhập địa chỉ email cá»§a bạn dưới đây:" #: ../ubuntu_sso/utils/ui.py:137 msgid "" "We are very Sorry! The service that signs you on is not responding right " "now\n" "Please try again or come back in a few minutes." msgstr "" #: ../ubuntu_sso/utils/ui.py:140 msgid "Sorry we did not recognize the email address." msgstr "" #: ../ubuntu_sso/utils/ui.py:142 msgid "Reset code" msgstr "Thiết lập lại mã" #: ../ubuntu_sso/utils/ui.py:145 #, python-format msgid "" "A password reset code has been sent to %(email)s.\n" "Please enter the code below along with your new password." msgstr "" "Má»™t Ä‘oạn mã để thiết lập lại mật khẩu đã được gá»­i đến địa chỉ %(email)s.\n" "Vui lòng nhập Ä‘oạn mã đó vào đây cùng mật khẩu má»›i cá»§a bạn." #: ../ubuntu_sso/utils/ui.py:147 msgid "Set Up Account" msgstr "" #: ../ubuntu_sso/utils/ui.py:148 msgid "I don't have an account yet - sign me up" msgstr "" #: ../ubuntu_sso/utils/ui.py:149 msgid "Sign In" msgstr "" #: ../ubuntu_sso/utils/ui.py:150 msgid "Log-in with my existing account." msgstr "" #: ../ubuntu_sso/utils/ui.py:151 msgid "the appname whose ssl error we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:152 msgid "Certificate details" msgstr "" #: ../ubuntu_sso/utils/ui.py:153 msgid "Connect" msgstr "" #: ../ubuntu_sso/utils/ui.py:154 msgid "the details ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:161 msgid "Open the SSL certificate UI." msgstr "" #: ../ubuntu_sso/utils/ui.py:162 msgid "SSL Certificate Not Valid" msgstr "" #: ../ubuntu_sso/utils/ui.py:163 msgid "the domain whose ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:164 #, python-format msgid "" "You are trying to connect to a proxy server on %(domain)s. This server uses " "a secure connection, and the SSL certificate is not valid because:" msgstr "" #: ../ubuntu_sso/utils/ui.py:167 msgid "The certificate has not been verified" msgstr "" #: ../ubuntu_sso/utils/ui.py:168 msgid "Do you want to connect to this server?" msgstr "" #: ../ubuntu_sso/utils/ui.py:169 msgid "Get Help With SSL" msgstr "" #: ../ubuntu_sso/utils/ui.py:170 #, python-format msgid "" "If you are not sure about this server, do not use it to connect to " "%(app_name)s." msgstr "" #: ../ubuntu_sso/utils/ui.py:172 msgid "Remember my settings for this certificate." msgstr "" #: ../ubuntu_sso/utils/ui.py:173 msgid "" "The name on the certificate isn't valid or doesn't match the name of the site" msgstr "" #: ../ubuntu_sso/utils/ui.py:175 msgid "The certificate has expired" msgstr "" #: ../ubuntu_sso/utils/ui.py:176 #, python-format msgid "You are now logged into %(app_name)s." msgstr "" #: ../ubuntu_sso/utils/ui.py:177 msgid "Surname" msgstr "" #: ../ubuntu_sso/utils/ui.py:178 msgid "Terms of Service" msgstr "" #: ../ubuntu_sso/utils/ui.py:179 msgid "Sign Up to {app_name}" msgstr "" #: ../ubuntu_sso/utils/ui.py:180 msgid "Show Terms & Conditions" msgstr "Hiển thị Äiá»u khoản và Äiá»u kiện" #: ../ubuntu_sso/utils/ui.py:181 #, python-format msgid "" "Agreeing to the %(app_name)s Terms & Conditions is required to subscribe." msgstr "" #: ../ubuntu_sso/utils/ui.py:183 #, python-format msgid "You can also find these terms at %(url)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:184 msgid "Try again" msgstr "" #: ../ubuntu_sso/utils/ui.py:185 msgid "" "There was an error when trying to complete the process. Please check the " "information and try again." msgstr "" "Äã gặp lá»—i trong khi hoàn thành quá trình. Vui lòng kiểm tra lại thông tin " "và thá»­ lại." #: ../ubuntu_sso/utils/ui.py:187 msgid "Verification code" msgstr "" #: ../ubuntu_sso/utils/ui.py:188 #, python-format msgid "" "Check %(email)s for an email from Ubuntu Single Sign On. This message " "contains a verification code. Enter the code in the field below and click OK " "to complete creating your %(app_name)s account." msgstr "" #: ../ubuntu_sso/utils/ui.py:192 msgid "Enter verification code" msgstr "Nhập mã xác nhận" #: ../ubuntu_sso/utils/ui.py:195 #, python-format msgid "I agree with the %(app_name)s terms and conditions" msgstr "Tôi đồng ý vá»›i Ä‘iá»u khoản và Ä‘iá»u kiện sá»­ dụng cá»§a %(app_name)s" #: ../ubuntu_sso/utils/ui.py:196 #, python-format msgid "Yes! Email me %(app_name)s tips and updates." msgstr "Vâng! Gá»­i cho tôi các mẹo và tin cập nhật cho %(app_name)s" ubuntu-sso-client-13.10/po/et.po0000664000202700020270000003463312151461656016750 0ustar dobeydobey00000000000000# Estonian translation for ubuntu-sso-client # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the ubuntu-sso-client package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: ubuntu-sso-client\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-09-11 18:25+0000\n" "PO-Revision-Date: 2011-04-04 22:22+0000\n" "Last-Translator: Kristjan Vool \n" "Language-Team: Estonian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-09-17 18:24+0000\n" "X-Generator: Launchpad (build 15944)\n" #. Undefined variable '_', pylint: disable=E0602 #. all the text that is used in the gui #: ../ubuntu_sso/utils/ui.py:49 msgid "By signing up to {app_name} you agree to our {privacy_policy}" msgstr "Liitudes teenusega {app_name} nõustud sa meie {privacy_policy}" #: ../ubuntu_sso/utils/ui.py:51 msgid "By signing up to {app_name} you agree to our {terms_and_conditions}" msgstr "Liitudes teenusega {app_name} nõustud sa meie {terms_and_conditions}" #: ../ubuntu_sso/utils/ui.py:53 msgid " and {privacy_policy}" msgstr " ja {privacy_policy}" #: ../ubuntu_sso/utils/ui.py:54 msgid "Cancel" msgstr "Loobu" #: ../ubuntu_sso/utils/ui.py:55 msgid "Type the characters above" msgstr "Sisesta ülalasuvad märgid" #: ../ubuntu_sso/utils/ui.py:56 msgid "There was a problem getting the captcha, reloading..." msgstr "Captcha saamisel tekkis probleem, taaslaadimine..." #: ../ubuntu_sso/utils/ui.py:58 #, python-format msgid "If you can't read this then %(reload_link)s this page" msgstr "Kui sa ei saa seda lugeda, siis %(reload_link)s see leht" #: ../ubuntu_sso/utils/ui.py:60 msgid "refresh" msgstr "värskenda" #: ../ubuntu_sso/utils/ui.py:61 msgid "Reload" msgstr "Laadi uuesti" #: ../ubuntu_sso/utils/ui.py:62 msgid "The captcha is a required field" msgstr "Captcha on nõutud väli" #: ../ubuntu_sso/utils/ui.py:63 msgid "Close window and set up later" msgstr "Sule aken ja seadista hiljem" #: ../ubuntu_sso/utils/ui.py:64 msgid "Congratulations, {app_name} is installed!" msgstr "Õnnitlused, {app_name} on paigaldatud!" #: ../ubuntu_sso/utils/ui.py:65 #, python-format msgid "To connect this computer to %(app_name)s enter your details below." msgstr "Sisesta vajalikud andmed, et ühendada see arvuti %(app_name)s'ga" #: ../ubuntu_sso/utils/ui.py:67 msgid "Register with {app_name}." msgstr "" #: ../ubuntu_sso/utils/ui.py:68 ../ubuntu_sso/utils/ui.py:93 #: ../ubuntu_sso/utils/ui.py:143 msgid "Email address" msgstr "Meiliaadress" #: ../ubuntu_sso/utils/ui.py:69 msgid "Re-type Email address" msgstr "Sisesta meiliaadress uuesti" #: ../ubuntu_sso/utils/ui.py:70 msgid "The email must be a valid email address." msgstr "Meiliaadress peab olema korrektne." #: ../ubuntu_sso/utils/ui.py:71 msgid "" "The email addresses don't match, please double check and try entering them " "again." msgstr "" "Meiliaadressid ei kattu, kontrolli need veelkord üle või proovi uuesti " "sisestada." #: ../ubuntu_sso/utils/ui.py:73 msgid "Email" msgstr "Meil" #: ../ubuntu_sso/utils/ui.py:74 msgid "The email addresses do not match" msgstr "Meiliaadressid ei kattu" #: ../ubuntu_sso/utils/ui.py:75 msgid "Enter code verification here" msgstr "Sisesta siia kinnituskood" #: ../ubuntu_sso/utils/ui.py:76 msgid "Please enter your name" msgstr "Sisesta oma nimi" #: ../ubuntu_sso/utils/ui.py:77 msgid "The process did not finish successfully." msgstr "Protsess ei lõppenud edukalt." #: ../ubuntu_sso/utils/ui.py:79 msgid "Sign me in with my existing account" msgstr "Logi sisse mu olemasoleva kontoga" #: ../ubuntu_sso/utils/ui.py:80 msgid "This field is required." msgstr "See väli on kohustuslik." #: ../ubuntu_sso/utils/ui.py:81 msgid "I've forgotten my password" msgstr "Ma olen oma parooli unustanud." #: ../ubuntu_sso/utils/ui.py:82 ../ubuntu_sso/utils/ui.py:130 msgid "Reset password" msgstr "Lähtesta parool" #: ../ubuntu_sso/utils/ui.py:83 msgid "" "To reset your {app_name} password, enter your registered email address " "below. We will send instructions to reset your password." msgstr "" "Oma {app_name} parooli lähtestamiseks sisesta siia alla oma meiliaadress. Me " "saadame sulle juhised parooli uuestimääramiseks." #: ../ubuntu_sso/utils/ui.py:86 msgid "Please enter a valid email address" msgstr "Palun, sisesta kehtiv meiliaadress" #: ../ubuntu_sso/utils/ui.py:87 msgid "There was a problem accessing the Ubuntu Single Sign On backend." msgstr "Ubuntu Single Sign On liidesele ligipääsemisega oli probleeme." #: ../ubuntu_sso/utils/ui.py:89 #, python-format msgid "Create %(app_name)s account" msgstr "Loo %(app_name)s konto" #: ../ubuntu_sso/utils/ui.py:90 msgid "Loading..." msgstr "Laadimine..." #: ../ubuntu_sso/utils/ui.py:91 msgid "Getting information, please wait..." msgstr "Andmete hankimine, palun, oota..." #: ../ubuntu_sso/utils/ui.py:92 msgid "Already have an account? Click here to sign in" msgstr "Kas sul on juba konto? Klõpsa siia, et sisse logida" #: ../ubuntu_sso/utils/ui.py:94 #, python-format msgid "Connect to %(app_name)s" msgstr "Ühendu %(app_name)s'ga" #: ../ubuntu_sso/utils/ui.py:95 ../ubuntu_sso/utils/ui.py:109 msgid "Password" msgstr "Parool" #: ../ubuntu_sso/utils/ui.py:97 msgid "Sign In to {app_name}" msgstr "Logi sisse {app_name}" #: ../ubuntu_sso/utils/ui.py:99 msgid "Name" msgstr "Nimi" #: ../ubuntu_sso/utils/ui.py:100 msgid "The name must not be empty." msgstr "Nimi ei tohi tühi olla." #: ../ubuntu_sso/utils/ui.py:101 msgid "Next" msgstr "Edasi" #: ../ubuntu_sso/utils/ui.py:102 msgid "Network detection" msgstr "Võrgu tuvastamine" #: ../ubuntu_sso/utils/ui.py:103 #, python-format msgid "" "Are you online? We can't detect an internet connection - you will need to be " "connected to set up %(app_name)s" msgstr "" "Oled sa ikka netis? Me ei suuda tuvastada netiühendust, aga %(app_name)s " "ülesseadmiseks pead sa olema ühendatud." #: ../ubuntu_sso/utils/ui.py:105 msgid "One moment please..." msgstr "Üks hetk, palun..." #: ../ubuntu_sso/utils/ui.py:106 msgid "Create a password" msgstr "Loo parool" #: ../ubuntu_sso/utils/ui.py:107 msgid "Your password was successfully changed." msgstr "Sinu parool on edukalt muudetud." #: ../ubuntu_sso/utils/ui.py:108 msgid "At least one number" msgstr "Vähemalt üks number" #: ../ubuntu_sso/utils/ui.py:110 msgid "Re-type Password" msgstr "Parooli kordamine" #: ../ubuntu_sso/utils/ui.py:111 msgid "" "The password must have a minimum of 8 characters and include one uppercase " "character and one number." msgstr "" "Parool peab olema vähemalt 8 märki pikk ning sisaldava ühte suurtähte ja " "ühte numbrit." #: ../ubuntu_sso/utils/ui.py:113 msgid "At least 8 characters" msgstr "Vähemalt 8 tärki" #: ../ubuntu_sso/utils/ui.py:114 msgid "Passwords don't match" msgstr "Paroolid ei kattu" #: ../ubuntu_sso/utils/ui.py:115 msgid "" "The passwords don't match, please double check and try entering them again." msgstr "Paroolid ei kattu, kontrolli need üle või proovi uuesti sisestada." #: ../ubuntu_sso/utils/ui.py:117 msgid "Your password must contain" msgstr "Sinu parool peab sisaldama" #: ../ubuntu_sso/utils/ui.py:118 msgid "The password is too weak." msgstr "Parool on liiga nõrk." #: ../ubuntu_sso/utils/ui.py:119 msgid "At least one uppercase letter" msgstr "Vähemalt ühte suurtähte" #: ../ubuntu_sso/utils/ui.py:120 msgid "Privacy Policy" msgstr "Privaatsuseeskirjad" #: ../ubuntu_sso/utils/ui.py:121 msgid "Connecting to:" msgstr "Ühendumine:" #: ../ubuntu_sso/utils/ui.py:122 msgid "Proxy Settings" msgstr "Proksi sätted" #: ../ubuntu_sso/utils/ui.py:123 msgid "Incorrect login details. Please try again." msgstr "Kehtetud logimisandmed. Proovi uuesti!" #: ../ubuntu_sso/utils/ui.py:124 msgid "Please provide login details." msgstr "Sisesta logimisandmed." #: ../ubuntu_sso/utils/ui.py:125 msgid "You are connecting through a proxy." msgstr "Ühendud üle proksi." #: ../ubuntu_sso/utils/ui.py:126 msgid "Get Help With Proxies" msgstr "Abi seoses proksidega" #: ../ubuntu_sso/utils/ui.py:127 msgid "Proxy password:" msgstr "Proksi parool:" #: ../ubuntu_sso/utils/ui.py:128 msgid "Save and Connect" msgstr "Salvesta ja ühendu" #: ../ubuntu_sso/utils/ui.py:129 msgid "Proxy username:" msgstr "Proksi kasutaja:" #: ../ubuntu_sso/utils/ui.py:131 msgid "" "A password reset code has been sent to your e-mail. Please enter the code " "below along with your new password." msgstr "" "Parooli algväärtustamise kood saadeti sulle meilile. Sisesta see kood ja oma " "uus parool siiasamma allapoole." #: ../ubuntu_sso/utils/ui.py:133 msgid "Retype email" msgstr "Meili kordus" #: ../ubuntu_sso/utils/ui.py:134 msgid "Retype password" msgstr "Parooli kordus" #: ../ubuntu_sso/utils/ui.py:135 #, python-format msgid "To reset your %(app_name)s password, enter your email address below:" msgstr "" "Oma %(app_name)s'i parooli lähtestamiseks sisesta siia oma meiliaadress:" #: ../ubuntu_sso/utils/ui.py:137 msgid "" "We are very Sorry! The service that signs you on is not responding right " "now\n" "Please try again or come back in a few minutes." msgstr "" "Meil on südamest kahju! Teenus, mis sind allkirjastab, ei vasta hetkel.\n" "Proovi uuesti või tule mõne minuti pärast tagasi." #: ../ubuntu_sso/utils/ui.py:140 msgid "Sorry we did not recognize the email address." msgstr "Vabandust, me ei tea sellist meiliaadressi" #: ../ubuntu_sso/utils/ui.py:142 msgid "Reset code" msgstr "Lähtesta kinntuskood" #: ../ubuntu_sso/utils/ui.py:145 #, python-format msgid "" "A password reset code has been sent to %(email)s.\n" "Please enter the code below along with your new password." msgstr "" "Parooli lähtestamise kinnituskood on saadetud aadressile %(email)s.\n" "Palun, sisesta see kood siia koos oma uue parooliga." #: ../ubuntu_sso/utils/ui.py:147 msgid "Set Up Account" msgstr "Loo konto" #: ../ubuntu_sso/utils/ui.py:148 msgid "I don't have an account yet - sign me up" msgstr "Mul pole veel kontot - panen end kirja" #: ../ubuntu_sso/utils/ui.py:149 msgid "Sign In" msgstr "Logi sisse" #: ../ubuntu_sso/utils/ui.py:150 msgid "Log-in with my existing account." msgstr "" #: ../ubuntu_sso/utils/ui.py:151 msgid "the appname whose ssl error we are going to show." msgstr "rakenduse nimi, mille SSL-viga me hakkame näitama." #: ../ubuntu_sso/utils/ui.py:152 msgid "Certificate details" msgstr "Sertifikaadi üksikasjad" #: ../ubuntu_sso/utils/ui.py:153 msgid "Connect" msgstr "Ühendu" #: ../ubuntu_sso/utils/ui.py:154 msgid "the details ssl certificate we are going to show." msgstr "SSL-serdi andmed, mida me hakkame näitama." #: ../ubuntu_sso/utils/ui.py:161 msgid "Open the SSL certificate UI." msgstr "Avab SSL-serdi liidese." #: ../ubuntu_sso/utils/ui.py:162 msgid "SSL Certificate Not Valid" msgstr "SSL-i sert on kehtetu" #: ../ubuntu_sso/utils/ui.py:163 msgid "the domain whose ssl certificate we are going to show." msgstr "domeen, mille SSL-serti me hakkame näitama." #: ../ubuntu_sso/utils/ui.py:164 #, python-format msgid "" "You are trying to connect to a proxy server on %(domain)s. This server uses " "a secure connection, and the SSL certificate is not valid because:" msgstr "" "Sa üritad ühenduda proksiserveriga %(domain)s. See server kasutab turvalist " "ühendust, kuid SSL-sert on kehtetu järgneval põhjusel:" #: ../ubuntu_sso/utils/ui.py:167 msgid "The certificate has not been verified" msgstr "Serti pole verifitseeritud." #: ../ubuntu_sso/utils/ui.py:168 msgid "Do you want to connect to this server?" msgstr "Soovid sa selle serveriga ühenduda?" #: ../ubuntu_sso/utils/ui.py:169 msgid "Get Help With SSL" msgstr "Küsi SSL-iga seoses abi" #: ../ubuntu_sso/utils/ui.py:170 #, python-format msgid "" "If you are not sure about this server, do not use it to connect to " "%(app_name)s." msgstr "" "Kui sa pole selle serveri osas kindel, siis ära seda %(app_name)s ühenduseks " "kasuta." #: ../ubuntu_sso/utils/ui.py:172 msgid "Remember my settings for this certificate." msgstr "Seadete meeldejätmine selle serdi tarvis." #: ../ubuntu_sso/utils/ui.py:173 msgid "" "The name on the certificate isn't valid or doesn't match the name of the site" msgstr "Serdi nimi pole korrektne või ei vasta saidi nimele." #: ../ubuntu_sso/utils/ui.py:175 msgid "The certificate has expired" msgstr "Sertifikaat on aegunud" #: ../ubuntu_sso/utils/ui.py:176 #, python-format msgid "You are now logged into %(app_name)s." msgstr "Oled nüüd sisse logitud rakendusse %(app_name)s." #: ../ubuntu_sso/utils/ui.py:177 msgid "Surname" msgstr "Perekonnanimi" #: ../ubuntu_sso/utils/ui.py:178 msgid "Terms of Service" msgstr "Kasutustingimused" #: ../ubuntu_sso/utils/ui.py:179 msgid "Sign Up to {app_name}" msgstr "Anna end üles {app_name} kasutamiseks" #: ../ubuntu_sso/utils/ui.py:180 msgid "Show Terms & Conditions" msgstr "Näita kasutustingimusi" #: ../ubuntu_sso/utils/ui.py:181 #, python-format msgid "" "Agreeing to the %(app_name)s Terms & Conditions is required to subscribe." msgstr "Tellimiseks on vajalik %(app_name)s kasutustingimustega nõustuda." #: ../ubuntu_sso/utils/ui.py:183 #, python-format msgid "You can also find these terms at %(url)s" msgstr "Need tingimused leiab ka aadressilt %(url)s" #: ../ubuntu_sso/utils/ui.py:184 msgid "Try again" msgstr "Proovi uuesti" #: ../ubuntu_sso/utils/ui.py:185 msgid "" "There was an error when trying to complete the process. Please check the " "information and try again." msgstr "" "Toimingu lõpetamine ei läinud läbi. Palun, kontrolli üle esitatud andmed ja " "proovi uuesti!" #: ../ubuntu_sso/utils/ui.py:187 msgid "Verification code" msgstr "Kontrollkood" #: ../ubuntu_sso/utils/ui.py:188 #, python-format msgid "" "Check %(email)s for an email from Ubuntu Single Sign On. This message " "contains a verification code. Enter the code in the field below and click OK " "to complete creating your %(app_name)s account." msgstr "" "Vaata %(email)s kontole, kas Ubuntu Single Sign On on sulle meilinud. Sõnumi " "sisaldab kontrollkoodi. Sisesta kood allolevale väljale ja vajuta Olgu, et " "viia lõpule %(app_name)s konto loomine." #: ../ubuntu_sso/utils/ui.py:192 msgid "Enter verification code" msgstr "Sisesta kinnituskood" #: ../ubuntu_sso/utils/ui.py:195 #, python-format msgid "I agree with the %(app_name)s terms and conditions" msgstr "Nõustun rakenduse %(app_name)s kasutustingimustega" #: ../ubuntu_sso/utils/ui.py:196 #, python-format msgid "Yes! Email me %(app_name)s tips and updates." msgstr "Jah, palun meilida mulle %(app_name)s'i juhtnööre ja uuendusi." ubuntu-sso-client-13.10/po/se.po0000664000202700020270000002547212151461656016750 0ustar dobeydobey00000000000000# Northern Sami translation for ubuntu-sso-client # Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 # This file is distributed under the same license as the ubuntu-sso-client package. # FIRST AUTHOR , 2012. # msgid "" msgstr "" "Project-Id-Version: ubuntu-sso-client\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-09-11 18:25+0000\n" "PO-Revision-Date: 2012-08-18 10:19+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Northern Sami \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-09-17 18:24+0000\n" "X-Generator: Launchpad (build 15944)\n" #. Undefined variable '_', pylint: disable=E0602 #. all the text that is used in the gui #: ../ubuntu_sso/utils/ui.py:49 msgid "By signing up to {app_name} you agree to our {privacy_policy}" msgstr "" #: ../ubuntu_sso/utils/ui.py:51 msgid "By signing up to {app_name} you agree to our {terms_and_conditions}" msgstr "" #: ../ubuntu_sso/utils/ui.py:53 msgid " and {privacy_policy}" msgstr "" #: ../ubuntu_sso/utils/ui.py:54 msgid "Cancel" msgstr "Gaskkalduhte" #: ../ubuntu_sso/utils/ui.py:55 msgid "Type the characters above" msgstr "" #: ../ubuntu_sso/utils/ui.py:56 msgid "There was a problem getting the captcha, reloading..." msgstr "" #: ../ubuntu_sso/utils/ui.py:58 #, python-format msgid "If you can't read this then %(reload_link)s this page" msgstr "" #: ../ubuntu_sso/utils/ui.py:60 msgid "refresh" msgstr "oÄ‘asmahte" #: ../ubuntu_sso/utils/ui.py:61 msgid "Reload" msgstr "VieÄÄa ođđasit" #: ../ubuntu_sso/utils/ui.py:62 msgid "The captcha is a required field" msgstr "" #: ../ubuntu_sso/utils/ui.py:63 msgid "Close window and set up later" msgstr "" #: ../ubuntu_sso/utils/ui.py:64 msgid "Congratulations, {app_name} is installed!" msgstr "" #: ../ubuntu_sso/utils/ui.py:65 #, python-format msgid "To connect this computer to %(app_name)s enter your details below." msgstr "" #: ../ubuntu_sso/utils/ui.py:67 msgid "Register with {app_name}." msgstr "" #: ../ubuntu_sso/utils/ui.py:68 ../ubuntu_sso/utils/ui.py:93 #: ../ubuntu_sso/utils/ui.py:143 msgid "Email address" msgstr "E-boastaÄujuhus" #: ../ubuntu_sso/utils/ui.py:69 msgid "Re-type Email address" msgstr "" #: ../ubuntu_sso/utils/ui.py:70 msgid "The email must be a valid email address." msgstr "" #: ../ubuntu_sso/utils/ui.py:71 msgid "" "The email addresses don't match, please double check and try entering them " "again." msgstr "" #: ../ubuntu_sso/utils/ui.py:73 msgid "Email" msgstr "E-boasta" #: ../ubuntu_sso/utils/ui.py:74 msgid "The email addresses do not match" msgstr "" #: ../ubuntu_sso/utils/ui.py:75 msgid "Enter code verification here" msgstr "" #: ../ubuntu_sso/utils/ui.py:76 msgid "Please enter your name" msgstr "" #: ../ubuntu_sso/utils/ui.py:77 msgid "The process did not finish successfully." msgstr "" #: ../ubuntu_sso/utils/ui.py:79 msgid "Sign me in with my existing account" msgstr "" #: ../ubuntu_sso/utils/ui.py:80 msgid "This field is required." msgstr "" #: ../ubuntu_sso/utils/ui.py:81 msgid "I've forgotten my password" msgstr "" #: ../ubuntu_sso/utils/ui.py:82 ../ubuntu_sso/utils/ui.py:130 msgid "Reset password" msgstr "" #: ../ubuntu_sso/utils/ui.py:83 msgid "" "To reset your {app_name} password, enter your registered email address " "below. We will send instructions to reset your password." msgstr "" #: ../ubuntu_sso/utils/ui.py:86 msgid "Please enter a valid email address" msgstr "" #: ../ubuntu_sso/utils/ui.py:87 msgid "There was a problem accessing the Ubuntu Single Sign On backend." msgstr "" #: ../ubuntu_sso/utils/ui.py:89 #, python-format msgid "Create %(app_name)s account" msgstr "" #: ../ubuntu_sso/utils/ui.py:90 msgid "Loading..." msgstr "Viežžamin …" #: ../ubuntu_sso/utils/ui.py:91 msgid "Getting information, please wait..." msgstr "" #: ../ubuntu_sso/utils/ui.py:92 msgid "Already have an account? Click here to sign in" msgstr "" #: ../ubuntu_sso/utils/ui.py:94 #, python-format msgid "Connect to %(app_name)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:95 ../ubuntu_sso/utils/ui.py:109 msgid "Password" msgstr "Beassansátni" #: ../ubuntu_sso/utils/ui.py:97 msgid "Sign In to {app_name}" msgstr "" #: ../ubuntu_sso/utils/ui.py:99 msgid "Name" msgstr "Namma" #: ../ubuntu_sso/utils/ui.py:100 msgid "The name must not be empty." msgstr "" #: ../ubuntu_sso/utils/ui.py:101 msgid "Next" msgstr "Boahtte" #: ../ubuntu_sso/utils/ui.py:102 msgid "Network detection" msgstr "" #: ../ubuntu_sso/utils/ui.py:103 #, python-format msgid "" "Are you online? We can't detect an internet connection - you will need to be " "connected to set up %(app_name)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:105 msgid "One moment please..." msgstr "" #: ../ubuntu_sso/utils/ui.py:106 msgid "Create a password" msgstr "" #: ../ubuntu_sso/utils/ui.py:107 msgid "Your password was successfully changed." msgstr "" #: ../ubuntu_sso/utils/ui.py:108 msgid "At least one number" msgstr "" #: ../ubuntu_sso/utils/ui.py:110 msgid "Re-type Password" msgstr "" #: ../ubuntu_sso/utils/ui.py:111 msgid "" "The password must have a minimum of 8 characters and include one uppercase " "character and one number." msgstr "" #: ../ubuntu_sso/utils/ui.py:113 msgid "At least 8 characters" msgstr "" #: ../ubuntu_sso/utils/ui.py:114 msgid "Passwords don't match" msgstr "" #: ../ubuntu_sso/utils/ui.py:115 msgid "" "The passwords don't match, please double check and try entering them again." msgstr "" #: ../ubuntu_sso/utils/ui.py:117 msgid "Your password must contain" msgstr "" #: ../ubuntu_sso/utils/ui.py:118 msgid "The password is too weak." msgstr "" #: ../ubuntu_sso/utils/ui.py:119 msgid "At least one uppercase letter" msgstr "" #: ../ubuntu_sso/utils/ui.py:120 msgid "Privacy Policy" msgstr "Iežassuodjaleapmi njuolggadusat" #: ../ubuntu_sso/utils/ui.py:121 msgid "Connecting to:" msgstr "" #: ../ubuntu_sso/utils/ui.py:122 msgid "Proxy Settings" msgstr "Gaskabálváheivehusat" #: ../ubuntu_sso/utils/ui.py:123 msgid "Incorrect login details. Please try again." msgstr "" #: ../ubuntu_sso/utils/ui.py:124 msgid "Please provide login details." msgstr "" #: ../ubuntu_sso/utils/ui.py:125 msgid "You are connecting through a proxy." msgstr "" #: ../ubuntu_sso/utils/ui.py:126 msgid "Get Help With Proxies" msgstr "" #: ../ubuntu_sso/utils/ui.py:127 msgid "Proxy password:" msgstr "Gaskabálvá beassansátni:" #: ../ubuntu_sso/utils/ui.py:128 msgid "Save and Connect" msgstr "" #: ../ubuntu_sso/utils/ui.py:129 msgid "Proxy username:" msgstr "Gaskabálvá geavaheaddjinamma:" #: ../ubuntu_sso/utils/ui.py:131 msgid "" "A password reset code has been sent to your e-mail. Please enter the code " "below along with your new password." msgstr "" #: ../ubuntu_sso/utils/ui.py:133 msgid "Retype email" msgstr "" #: ../ubuntu_sso/utils/ui.py:134 msgid "Retype password" msgstr "" #: ../ubuntu_sso/utils/ui.py:135 #, python-format msgid "To reset your %(app_name)s password, enter your email address below:" msgstr "" #: ../ubuntu_sso/utils/ui.py:137 msgid "" "We are very Sorry! The service that signs you on is not responding right " "now\n" "Please try again or come back in a few minutes." msgstr "" #: ../ubuntu_sso/utils/ui.py:140 msgid "Sorry we did not recognize the email address." msgstr "" #: ../ubuntu_sso/utils/ui.py:142 msgid "Reset code" msgstr "" #: ../ubuntu_sso/utils/ui.py:145 #, python-format msgid "" "A password reset code has been sent to %(email)s.\n" "Please enter the code below along with your new password." msgstr "" #: ../ubuntu_sso/utils/ui.py:147 msgid "Set Up Account" msgstr "" #: ../ubuntu_sso/utils/ui.py:148 msgid "I don't have an account yet - sign me up" msgstr "" #: ../ubuntu_sso/utils/ui.py:149 msgid "Sign In" msgstr "" #: ../ubuntu_sso/utils/ui.py:150 msgid "Log-in with my existing account." msgstr "" #: ../ubuntu_sso/utils/ui.py:151 msgid "the appname whose ssl error we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:152 msgid "Certificate details" msgstr "" #: ../ubuntu_sso/utils/ui.py:153 msgid "Connect" msgstr "LaktaÅ¡eamen" #: ../ubuntu_sso/utils/ui.py:154 msgid "the details ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:161 msgid "Open the SSL certificate UI." msgstr "" #: ../ubuntu_sso/utils/ui.py:162 msgid "SSL Certificate Not Valid" msgstr "" #: ../ubuntu_sso/utils/ui.py:163 msgid "the domain whose ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:164 #, python-format msgid "" "You are trying to connect to a proxy server on %(domain)s. This server uses " "a secure connection, and the SSL certificate is not valid because:" msgstr "" #: ../ubuntu_sso/utils/ui.py:167 msgid "The certificate has not been verified" msgstr "" #: ../ubuntu_sso/utils/ui.py:168 msgid "Do you want to connect to this server?" msgstr "" #: ../ubuntu_sso/utils/ui.py:169 msgid "Get Help With SSL" msgstr "" #: ../ubuntu_sso/utils/ui.py:170 #, python-format msgid "" "If you are not sure about this server, do not use it to connect to " "%(app_name)s." msgstr "" #: ../ubuntu_sso/utils/ui.py:172 msgid "Remember my settings for this certificate." msgstr "" #: ../ubuntu_sso/utils/ui.py:173 msgid "" "The name on the certificate isn't valid or doesn't match the name of the site" msgstr "" #: ../ubuntu_sso/utils/ui.py:175 msgid "The certificate has expired" msgstr "DuoÄ‘aÅ¡tus lea boarásmuvvon" #: ../ubuntu_sso/utils/ui.py:176 #, python-format msgid "You are now logged into %(app_name)s." msgstr "" #: ../ubuntu_sso/utils/ui.py:177 msgid "Surname" msgstr "Goargu" #: ../ubuntu_sso/utils/ui.py:178 msgid "Terms of Service" msgstr "" #: ../ubuntu_sso/utils/ui.py:179 msgid "Sign Up to {app_name}" msgstr "" #: ../ubuntu_sso/utils/ui.py:180 msgid "Show Terms & Conditions" msgstr "" #: ../ubuntu_sso/utils/ui.py:181 #, python-format msgid "" "Agreeing to the %(app_name)s Terms & Conditions is required to subscribe." msgstr "" #: ../ubuntu_sso/utils/ui.py:183 #, python-format msgid "You can also find these terms at %(url)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:184 msgid "Try again" msgstr "" #: ../ubuntu_sso/utils/ui.py:185 msgid "" "There was an error when trying to complete the process. Please check the " "information and try again." msgstr "" #: ../ubuntu_sso/utils/ui.py:187 msgid "Verification code" msgstr "" #: ../ubuntu_sso/utils/ui.py:188 #, python-format msgid "" "Check %(email)s for an email from Ubuntu Single Sign On. This message " "contains a verification code. Enter the code in the field below and click OK " "to complete creating your %(app_name)s account." msgstr "" #: ../ubuntu_sso/utils/ui.py:192 msgid "Enter verification code" msgstr "" #: ../ubuntu_sso/utils/ui.py:195 #, python-format msgid "I agree with the %(app_name)s terms and conditions" msgstr "" #: ../ubuntu_sso/utils/ui.py:196 #, python-format msgid "Yes! Email me %(app_name)s tips and updates." msgstr "" ubuntu-sso-client-13.10/po/cy.po0000664000202700020270000002511312151461656016744 0ustar dobeydobey00000000000000# Welsh translation for ubuntu-sso-client # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the ubuntu-sso-client package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: ubuntu-sso-client\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-09-11 18:25+0000\n" "PO-Revision-Date: 2011-01-18 07:47+0000\n" "Last-Translator: David Jones \n" "Language-Team: Welsh \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-09-17 18:24+0000\n" "X-Generator: Launchpad (build 15944)\n" #. Undefined variable '_', pylint: disable=E0602 #. all the text that is used in the gui #: ../ubuntu_sso/utils/ui.py:49 msgid "By signing up to {app_name} you agree to our {privacy_policy}" msgstr "" #: ../ubuntu_sso/utils/ui.py:51 msgid "By signing up to {app_name} you agree to our {terms_and_conditions}" msgstr "" #: ../ubuntu_sso/utils/ui.py:53 msgid " and {privacy_policy}" msgstr "" #: ../ubuntu_sso/utils/ui.py:54 msgid "Cancel" msgstr "" #: ../ubuntu_sso/utils/ui.py:55 msgid "Type the characters above" msgstr "" #: ../ubuntu_sso/utils/ui.py:56 msgid "There was a problem getting the captcha, reloading..." msgstr "" #: ../ubuntu_sso/utils/ui.py:58 #, python-format msgid "If you can't read this then %(reload_link)s this page" msgstr "" #: ../ubuntu_sso/utils/ui.py:60 msgid "refresh" msgstr "" #: ../ubuntu_sso/utils/ui.py:61 msgid "Reload" msgstr "" #: ../ubuntu_sso/utils/ui.py:62 msgid "The captcha is a required field" msgstr "" #: ../ubuntu_sso/utils/ui.py:63 msgid "Close window and set up later" msgstr "" #: ../ubuntu_sso/utils/ui.py:64 msgid "Congratulations, {app_name} is installed!" msgstr "" #: ../ubuntu_sso/utils/ui.py:65 #, python-format msgid "To connect this computer to %(app_name)s enter your details below." msgstr "" #: ../ubuntu_sso/utils/ui.py:67 msgid "Register with {app_name}." msgstr "" #: ../ubuntu_sso/utils/ui.py:68 ../ubuntu_sso/utils/ui.py:93 #: ../ubuntu_sso/utils/ui.py:143 msgid "Email address" msgstr "Cyfeiriad ebost" #: ../ubuntu_sso/utils/ui.py:69 msgid "Re-type Email address" msgstr "" #: ../ubuntu_sso/utils/ui.py:70 msgid "The email must be a valid email address." msgstr "" #: ../ubuntu_sso/utils/ui.py:71 msgid "" "The email addresses don't match, please double check and try entering them " "again." msgstr "" #: ../ubuntu_sso/utils/ui.py:73 msgid "Email" msgstr "" #: ../ubuntu_sso/utils/ui.py:74 msgid "The email addresses do not match" msgstr "" #: ../ubuntu_sso/utils/ui.py:75 msgid "Enter code verification here" msgstr "" #: ../ubuntu_sso/utils/ui.py:76 msgid "Please enter your name" msgstr "" #: ../ubuntu_sso/utils/ui.py:77 msgid "The process did not finish successfully." msgstr "" #: ../ubuntu_sso/utils/ui.py:79 msgid "Sign me in with my existing account" msgstr "" #: ../ubuntu_sso/utils/ui.py:80 msgid "This field is required." msgstr "" #: ../ubuntu_sso/utils/ui.py:81 msgid "I've forgotten my password" msgstr "" #: ../ubuntu_sso/utils/ui.py:82 ../ubuntu_sso/utils/ui.py:130 msgid "Reset password" msgstr "" #: ../ubuntu_sso/utils/ui.py:83 msgid "" "To reset your {app_name} password, enter your registered email address " "below. We will send instructions to reset your password." msgstr "" #: ../ubuntu_sso/utils/ui.py:86 msgid "Please enter a valid email address" msgstr "" #: ../ubuntu_sso/utils/ui.py:87 msgid "There was a problem accessing the Ubuntu Single Sign On backend." msgstr "" #: ../ubuntu_sso/utils/ui.py:89 #, python-format msgid "Create %(app_name)s account" msgstr "" #: ../ubuntu_sso/utils/ui.py:90 msgid "Loading..." msgstr "Yn Llwytho..." #: ../ubuntu_sso/utils/ui.py:91 msgid "Getting information, please wait..." msgstr "" #: ../ubuntu_sso/utils/ui.py:92 msgid "Already have an account? Click here to sign in" msgstr "" #: ../ubuntu_sso/utils/ui.py:94 #, python-format msgid "Connect to %(app_name)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:95 ../ubuntu_sso/utils/ui.py:109 msgid "Password" msgstr "Cyfrinair" #: ../ubuntu_sso/utils/ui.py:97 msgid "Sign In to {app_name}" msgstr "" #: ../ubuntu_sso/utils/ui.py:99 msgid "Name" msgstr "Enw" #: ../ubuntu_sso/utils/ui.py:100 msgid "The name must not be empty." msgstr "" #: ../ubuntu_sso/utils/ui.py:101 msgid "Next" msgstr "Nesaf" #: ../ubuntu_sso/utils/ui.py:102 msgid "Network detection" msgstr "" #: ../ubuntu_sso/utils/ui.py:103 #, python-format msgid "" "Are you online? We can't detect an internet connection - you will need to be " "connected to set up %(app_name)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:105 msgid "One moment please..." msgstr "" #: ../ubuntu_sso/utils/ui.py:106 msgid "Create a password" msgstr "" #: ../ubuntu_sso/utils/ui.py:107 msgid "Your password was successfully changed." msgstr "" #: ../ubuntu_sso/utils/ui.py:108 msgid "At least one number" msgstr "" #: ../ubuntu_sso/utils/ui.py:110 msgid "Re-type Password" msgstr "" #: ../ubuntu_sso/utils/ui.py:111 msgid "" "The password must have a minimum of 8 characters and include one uppercase " "character and one number." msgstr "" #: ../ubuntu_sso/utils/ui.py:113 msgid "At least 8 characters" msgstr "" #: ../ubuntu_sso/utils/ui.py:114 msgid "Passwords don't match" msgstr "" #: ../ubuntu_sso/utils/ui.py:115 msgid "" "The passwords don't match, please double check and try entering them again." msgstr "" #: ../ubuntu_sso/utils/ui.py:117 msgid "Your password must contain" msgstr "" #: ../ubuntu_sso/utils/ui.py:118 msgid "The password is too weak." msgstr "" #: ../ubuntu_sso/utils/ui.py:119 msgid "At least one uppercase letter" msgstr "" #: ../ubuntu_sso/utils/ui.py:120 msgid "Privacy Policy" msgstr "" #: ../ubuntu_sso/utils/ui.py:121 msgid "Connecting to:" msgstr "" #: ../ubuntu_sso/utils/ui.py:122 msgid "Proxy Settings" msgstr "" #: ../ubuntu_sso/utils/ui.py:123 msgid "Incorrect login details. Please try again." msgstr "" #: ../ubuntu_sso/utils/ui.py:124 msgid "Please provide login details." msgstr "" #: ../ubuntu_sso/utils/ui.py:125 msgid "You are connecting through a proxy." msgstr "" #: ../ubuntu_sso/utils/ui.py:126 msgid "Get Help With Proxies" msgstr "" #: ../ubuntu_sso/utils/ui.py:127 msgid "Proxy password:" msgstr "" #: ../ubuntu_sso/utils/ui.py:128 msgid "Save and Connect" msgstr "" #: ../ubuntu_sso/utils/ui.py:129 msgid "Proxy username:" msgstr "" #: ../ubuntu_sso/utils/ui.py:131 msgid "" "A password reset code has been sent to your e-mail. Please enter the code " "below along with your new password." msgstr "" #: ../ubuntu_sso/utils/ui.py:133 msgid "Retype email" msgstr "" #: ../ubuntu_sso/utils/ui.py:134 msgid "Retype password" msgstr "" #: ../ubuntu_sso/utils/ui.py:135 #, python-format msgid "To reset your %(app_name)s password, enter your email address below:" msgstr "" #: ../ubuntu_sso/utils/ui.py:137 msgid "" "We are very Sorry! The service that signs you on is not responding right " "now\n" "Please try again or come back in a few minutes." msgstr "" #: ../ubuntu_sso/utils/ui.py:140 msgid "Sorry we did not recognize the email address." msgstr "" #: ../ubuntu_sso/utils/ui.py:142 msgid "Reset code" msgstr "" #: ../ubuntu_sso/utils/ui.py:145 #, python-format msgid "" "A password reset code has been sent to %(email)s.\n" "Please enter the code below along with your new password." msgstr "" #: ../ubuntu_sso/utils/ui.py:147 msgid "Set Up Account" msgstr "" #: ../ubuntu_sso/utils/ui.py:148 msgid "I don't have an account yet - sign me up" msgstr "" #: ../ubuntu_sso/utils/ui.py:149 msgid "Sign In" msgstr "" #: ../ubuntu_sso/utils/ui.py:150 msgid "Log-in with my existing account." msgstr "" #: ../ubuntu_sso/utils/ui.py:151 msgid "the appname whose ssl error we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:152 msgid "Certificate details" msgstr "" #: ../ubuntu_sso/utils/ui.py:153 msgid "Connect" msgstr "" #: ../ubuntu_sso/utils/ui.py:154 msgid "the details ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:161 msgid "Open the SSL certificate UI." msgstr "" #: ../ubuntu_sso/utils/ui.py:162 msgid "SSL Certificate Not Valid" msgstr "" #: ../ubuntu_sso/utils/ui.py:163 msgid "the domain whose ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:164 #, python-format msgid "" "You are trying to connect to a proxy server on %(domain)s. This server uses " "a secure connection, and the SSL certificate is not valid because:" msgstr "" #: ../ubuntu_sso/utils/ui.py:167 msgid "The certificate has not been verified" msgstr "" #: ../ubuntu_sso/utils/ui.py:168 msgid "Do you want to connect to this server?" msgstr "" #: ../ubuntu_sso/utils/ui.py:169 msgid "Get Help With SSL" msgstr "" #: ../ubuntu_sso/utils/ui.py:170 #, python-format msgid "" "If you are not sure about this server, do not use it to connect to " "%(app_name)s." msgstr "" #: ../ubuntu_sso/utils/ui.py:172 msgid "Remember my settings for this certificate." msgstr "" #: ../ubuntu_sso/utils/ui.py:173 msgid "" "The name on the certificate isn't valid or doesn't match the name of the site" msgstr "" #: ../ubuntu_sso/utils/ui.py:175 msgid "The certificate has expired" msgstr "" #: ../ubuntu_sso/utils/ui.py:176 #, python-format msgid "You are now logged into %(app_name)s." msgstr "" #: ../ubuntu_sso/utils/ui.py:177 msgid "Surname" msgstr "" #: ../ubuntu_sso/utils/ui.py:178 msgid "Terms of Service" msgstr "" #: ../ubuntu_sso/utils/ui.py:179 msgid "Sign Up to {app_name}" msgstr "" #: ../ubuntu_sso/utils/ui.py:180 msgid "Show Terms & Conditions" msgstr "" #: ../ubuntu_sso/utils/ui.py:181 #, python-format msgid "" "Agreeing to the %(app_name)s Terms & Conditions is required to subscribe." msgstr "" #: ../ubuntu_sso/utils/ui.py:183 #, python-format msgid "You can also find these terms at %(url)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:184 msgid "Try again" msgstr "" #: ../ubuntu_sso/utils/ui.py:185 msgid "" "There was an error when trying to complete the process. Please check the " "information and try again." msgstr "" #: ../ubuntu_sso/utils/ui.py:187 msgid "Verification code" msgstr "" #: ../ubuntu_sso/utils/ui.py:188 #, python-format msgid "" "Check %(email)s for an email from Ubuntu Single Sign On. This message " "contains a verification code. Enter the code in the field below and click OK " "to complete creating your %(app_name)s account." msgstr "" #: ../ubuntu_sso/utils/ui.py:192 msgid "Enter verification code" msgstr "" #: ../ubuntu_sso/utils/ui.py:195 #, python-format msgid "I agree with the %(app_name)s terms and conditions" msgstr "" #: ../ubuntu_sso/utils/ui.py:196 #, python-format msgid "Yes! Email me %(app_name)s tips and updates." msgstr "" ubuntu-sso-client-13.10/po/nb.po0000664000202700020270000003131612151461656016732 0ustar dobeydobey00000000000000# Norwegian Bokmal translation for ubuntu-sso-client # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the ubuntu-sso-client package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: ubuntu-sso-client\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-09-11 18:25+0000\n" "PO-Revision-Date: 2012-09-05 17:59+0000\n" "Last-Translator: Kenneth Jenssen \n" "Language-Team: Norwegian Bokmal \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-09-17 18:24+0000\n" "X-Generator: Launchpad (build 15944)\n" #. Undefined variable '_', pylint: disable=E0602 #. all the text that is used in the gui #: ../ubuntu_sso/utils/ui.py:49 msgid "By signing up to {app_name} you agree to our {privacy_policy}" msgstr "" #: ../ubuntu_sso/utils/ui.py:51 msgid "By signing up to {app_name} you agree to our {terms_and_conditions}" msgstr "" #: ../ubuntu_sso/utils/ui.py:53 msgid " and {privacy_policy}" msgstr "" #: ../ubuntu_sso/utils/ui.py:54 msgid "Cancel" msgstr "Avbryt" #: ../ubuntu_sso/utils/ui.py:55 msgid "Type the characters above" msgstr "Skriv inn tegnene ovenfor" #: ../ubuntu_sso/utils/ui.py:56 msgid "There was a problem getting the captcha, reloading..." msgstr "Problem ved henting av captcha, laster pÃ¥ nytt..." #: ../ubuntu_sso/utils/ui.py:58 #, python-format msgid "If you can't read this then %(reload_link)s this page" msgstr "" #: ../ubuntu_sso/utils/ui.py:60 msgid "refresh" msgstr "oppdater" #: ../ubuntu_sso/utils/ui.py:61 msgid "Reload" msgstr "Last pÃ¥ nytt" #: ../ubuntu_sso/utils/ui.py:62 msgid "The captcha is a required field" msgstr "" #: ../ubuntu_sso/utils/ui.py:63 msgid "Close window and set up later" msgstr "Lukk vindu og fullfør senere" #: ../ubuntu_sso/utils/ui.py:64 msgid "Congratulations, {app_name} is installed!" msgstr "Gratulerer, {app_name} er installert!" #: ../ubuntu_sso/utils/ui.py:65 #, python-format msgid "To connect this computer to %(app_name)s enter your details below." msgstr "" "Skriv inn dine detaljer nedenfor for Ã¥ koble denne maskinen til %(app_name)s." #: ../ubuntu_sso/utils/ui.py:67 msgid "Register with {app_name}." msgstr "" #: ../ubuntu_sso/utils/ui.py:68 ../ubuntu_sso/utils/ui.py:93 #: ../ubuntu_sso/utils/ui.py:143 msgid "Email address" msgstr "E-postadresse" #: ../ubuntu_sso/utils/ui.py:69 msgid "Re-type Email address" msgstr "Gjenta e-postadresse" #: ../ubuntu_sso/utils/ui.py:70 msgid "The email must be a valid email address." msgstr "E-posten mÃ¥ være en gyldig e-postadresse." #: ../ubuntu_sso/utils/ui.py:71 msgid "" "The email addresses don't match, please double check and try entering them " "again." msgstr "" "E-postadressene er ikke like, vennligst dobbeltsjekk og prøv Ã¥ skrive dem pÃ¥ " "nytt." #: ../ubuntu_sso/utils/ui.py:73 msgid "Email" msgstr "E-post" #: ../ubuntu_sso/utils/ui.py:74 msgid "The email addresses do not match" msgstr "E-postadressene er ikke like" #: ../ubuntu_sso/utils/ui.py:75 msgid "Enter code verification here" msgstr "Skriv inn bekreftelsekoden her" #: ../ubuntu_sso/utils/ui.py:76 msgid "Please enter your name" msgstr "Vennligst skriv inn ditt navn" #: ../ubuntu_sso/utils/ui.py:77 msgid "The process did not finish successfully." msgstr "Prosessen ble avsluttet pÃ¥ feil mÃ¥te." #: ../ubuntu_sso/utils/ui.py:79 msgid "Sign me in with my existing account" msgstr "Logg inn med min eksisterende konto" #: ../ubuntu_sso/utils/ui.py:80 msgid "This field is required." msgstr "Dette feltet er obligatorisk." #: ../ubuntu_sso/utils/ui.py:81 msgid "I've forgotten my password" msgstr "Jeg har glemt passordet mitt" #: ../ubuntu_sso/utils/ui.py:82 ../ubuntu_sso/utils/ui.py:130 msgid "Reset password" msgstr "Nytt passord" #: ../ubuntu_sso/utils/ui.py:83 msgid "" "To reset your {app_name} password, enter your registered email address " "below. We will send instructions to reset your password." msgstr "" #: ../ubuntu_sso/utils/ui.py:86 msgid "Please enter a valid email address" msgstr "Vennligst skriv inn en gyldig e-postadresse" #: ../ubuntu_sso/utils/ui.py:87 msgid "There was a problem accessing the Ubuntu Single Sign On backend." msgstr "" #: ../ubuntu_sso/utils/ui.py:89 #, python-format msgid "Create %(app_name)s account" msgstr "Opprette konto for %(app_name)s" #: ../ubuntu_sso/utils/ui.py:90 msgid "Loading..." msgstr "Laster…" #: ../ubuntu_sso/utils/ui.py:91 msgid "Getting information, please wait..." msgstr "Henter informasjon, vennligst vent..." #: ../ubuntu_sso/utils/ui.py:92 msgid "Already have an account? Click here to sign in" msgstr "Har du allerede en konto? Klikk her for Ã¥ logge inn" #: ../ubuntu_sso/utils/ui.py:94 #, python-format msgid "Connect to %(app_name)s" msgstr "Koble til %(app_name)s" #: ../ubuntu_sso/utils/ui.py:95 ../ubuntu_sso/utils/ui.py:109 msgid "Password" msgstr "Passord" #: ../ubuntu_sso/utils/ui.py:97 msgid "Sign In to {app_name}" msgstr "" #: ../ubuntu_sso/utils/ui.py:99 msgid "Name" msgstr "Navn" #: ../ubuntu_sso/utils/ui.py:100 msgid "The name must not be empty." msgstr "Navnet mÃ¥ ikke være tomt." #: ../ubuntu_sso/utils/ui.py:101 msgid "Next" msgstr "Neste" #: ../ubuntu_sso/utils/ui.py:102 msgid "Network detection" msgstr "" #: ../ubuntu_sso/utils/ui.py:103 #, python-format msgid "" "Are you online? We can't detect an internet connection - you will need to be " "connected to set up %(app_name)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:105 msgid "One moment please..." msgstr "Et øyeblikk…" #: ../ubuntu_sso/utils/ui.py:106 msgid "Create a password" msgstr "Opprett et passord" #: ../ubuntu_sso/utils/ui.py:107 msgid "Your password was successfully changed." msgstr "Ditt passord ble endret." #: ../ubuntu_sso/utils/ui.py:108 msgid "At least one number" msgstr "Minst ett nummer" #: ../ubuntu_sso/utils/ui.py:110 msgid "Re-type Password" msgstr "Gjenta passord" #: ../ubuntu_sso/utils/ui.py:111 msgid "" "The password must have a minimum of 8 characters and include one uppercase " "character and one number." msgstr "" "Passordet mÃ¥ ha minst 8 tegn hvorav minst én stor bokstav og ett tall." #: ../ubuntu_sso/utils/ui.py:113 msgid "At least 8 characters" msgstr "Minst 8 tegn" #: ../ubuntu_sso/utils/ui.py:114 msgid "Passwords don't match" msgstr "Passordene er ikke like" #: ../ubuntu_sso/utils/ui.py:115 msgid "" "The passwords don't match, please double check and try entering them again." msgstr "" "Passordene samsvarer ikke, vennligst dobbeltsjekk og prøv Ã¥ skrive dem pÃ¥ " "nytt." #: ../ubuntu_sso/utils/ui.py:117 msgid "Your password must contain" msgstr "Ditt passord mÃ¥ inneholde" #: ../ubuntu_sso/utils/ui.py:118 msgid "The password is too weak." msgstr "Passordet er for svakt." #: ../ubuntu_sso/utils/ui.py:119 msgid "At least one uppercase letter" msgstr "Minst én stor bokstav" #: ../ubuntu_sso/utils/ui.py:120 msgid "Privacy Policy" msgstr "" #: ../ubuntu_sso/utils/ui.py:121 msgid "Connecting to:" msgstr "Kobler til:" #: ../ubuntu_sso/utils/ui.py:122 msgid "Proxy Settings" msgstr "" #: ../ubuntu_sso/utils/ui.py:123 msgid "Incorrect login details. Please try again." msgstr "" #: ../ubuntu_sso/utils/ui.py:124 msgid "Please provide login details." msgstr "Vennligst oppgi innloggingsdetaljer" #: ../ubuntu_sso/utils/ui.py:125 msgid "You are connecting through a proxy." msgstr "" #: ../ubuntu_sso/utils/ui.py:126 msgid "Get Help With Proxies" msgstr "FÃ¥ hjelp med mellomtjenere" #: ../ubuntu_sso/utils/ui.py:127 msgid "Proxy password:" msgstr "Proxypassord:" #: ../ubuntu_sso/utils/ui.py:128 msgid "Save and Connect" msgstr "Lagre og koble til" #: ../ubuntu_sso/utils/ui.py:129 msgid "Proxy username:" msgstr "Proxy-brukernavn" #: ../ubuntu_sso/utils/ui.py:131 msgid "" "A password reset code has been sent to your e-mail. Please enter the code " "below along with your new password." msgstr "" #: ../ubuntu_sso/utils/ui.py:133 msgid "Retype email" msgstr "Skriv inn e-post pÃ¥ nytt" #: ../ubuntu_sso/utils/ui.py:134 msgid "Retype password" msgstr "Skriv inn passord pÃ¥ nytt" #: ../ubuntu_sso/utils/ui.py:135 #, python-format msgid "To reset your %(app_name)s password, enter your email address below:" msgstr "" "Skriv din e-postadresse under for Ã¥ nullstille ditt %(app_name)s passord:" #: ../ubuntu_sso/utils/ui.py:137 msgid "" "We are very Sorry! The service that signs you on is not responding right " "now\n" "Please try again or come back in a few minutes." msgstr "" #: ../ubuntu_sso/utils/ui.py:140 msgid "Sorry we did not recognize the email address." msgstr "" #: ../ubuntu_sso/utils/ui.py:142 msgid "Reset code" msgstr "Tilbakestillingskode" #: ../ubuntu_sso/utils/ui.py:145 #, python-format msgid "" "A password reset code has been sent to %(email)s.\n" "Please enter the code below along with your new password." msgstr "" "En passord-tilbakestillingskode er blitt sendt til %(email)s.\n" "Vennligst skriv inn koden nedenfor sammen med ditt nye passord." #: ../ubuntu_sso/utils/ui.py:147 msgid "Set Up Account" msgstr "" #: ../ubuntu_sso/utils/ui.py:148 msgid "I don't have an account yet - sign me up" msgstr "" #: ../ubuntu_sso/utils/ui.py:149 msgid "Sign In" msgstr "Logg Inn" #: ../ubuntu_sso/utils/ui.py:150 msgid "Log-in with my existing account." msgstr "" #: ../ubuntu_sso/utils/ui.py:151 msgid "the appname whose ssl error we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:152 msgid "Certificate details" msgstr "Detaljer om sertifikat" #: ../ubuntu_sso/utils/ui.py:153 msgid "Connect" msgstr "Koble til" #: ../ubuntu_sso/utils/ui.py:154 msgid "the details ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:161 msgid "Open the SSL certificate UI." msgstr "" #: ../ubuntu_sso/utils/ui.py:162 msgid "SSL Certificate Not Valid" msgstr "SSL-sertifikat ugyldig" #: ../ubuntu_sso/utils/ui.py:163 msgid "the domain whose ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:164 #, python-format msgid "" "You are trying to connect to a proxy server on %(domain)s. This server uses " "a secure connection, and the SSL certificate is not valid because:" msgstr "" #: ../ubuntu_sso/utils/ui.py:167 msgid "The certificate has not been verified" msgstr "Sertifikatet ble ikke verifisert" #: ../ubuntu_sso/utils/ui.py:168 msgid "Do you want to connect to this server?" msgstr "Ønsker du Ã¥ koble til denne serveren?" #: ../ubuntu_sso/utils/ui.py:169 msgid "Get Help With SSL" msgstr "FÃ¥ hjelp med SSL" #: ../ubuntu_sso/utils/ui.py:170 #, python-format msgid "" "If you are not sure about this server, do not use it to connect to " "%(app_name)s." msgstr "" #: ../ubuntu_sso/utils/ui.py:172 msgid "Remember my settings for this certificate." msgstr "Husk mine innstillinger for dette sertifikatet." #: ../ubuntu_sso/utils/ui.py:173 msgid "" "The name on the certificate isn't valid or doesn't match the name of the site" msgstr "" #: ../ubuntu_sso/utils/ui.py:175 msgid "The certificate has expired" msgstr "Sertifikatet har utløpt" #: ../ubuntu_sso/utils/ui.py:176 #, python-format msgid "You are now logged into %(app_name)s." msgstr "" #: ../ubuntu_sso/utils/ui.py:177 msgid "Surname" msgstr "Etternavn" #: ../ubuntu_sso/utils/ui.py:178 msgid "Terms of Service" msgstr "TjenestevilkÃ¥r" #: ../ubuntu_sso/utils/ui.py:179 msgid "Sign Up to {app_name}" msgstr "Registrer deg pÃ¥ {app_name}" #: ../ubuntu_sso/utils/ui.py:180 msgid "Show Terms & Conditions" msgstr "Vis betingelser" #: ../ubuntu_sso/utils/ui.py:181 #, python-format msgid "" "Agreeing to the %(app_name)s Terms & Conditions is required to subscribe." msgstr "" #: ../ubuntu_sso/utils/ui.py:183 #, python-format msgid "You can also find these terms at %(url)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:184 msgid "Try again" msgstr "Prøv igjen" #: ../ubuntu_sso/utils/ui.py:185 msgid "" "There was an error when trying to complete the process. Please check the " "information and try again." msgstr "" "Det oppstod en feil ved forsøk pÃ¥ Ã¥ fullføre prosessen. Vennligst sjekk " "informasjonen og prøv igjen." #: ../ubuntu_sso/utils/ui.py:187 msgid "Verification code" msgstr "Verifiseringskode" #: ../ubuntu_sso/utils/ui.py:188 #, python-format msgid "" "Check %(email)s for an email from Ubuntu Single Sign On. This message " "contains a verification code. Enter the code in the field below and click OK " "to complete creating your %(app_name)s account." msgstr "" #: ../ubuntu_sso/utils/ui.py:192 msgid "Enter verification code" msgstr "Skriv inn din bekreftelsekode" #: ../ubuntu_sso/utils/ui.py:195 #, python-format msgid "I agree with the %(app_name)s terms and conditions" msgstr "Jeg godtar %(app_name) sine vilkÃ¥r" #: ../ubuntu_sso/utils/ui.py:196 #, python-format msgid "Yes! Email me %(app_name)s tips and updates." msgstr "Ja! Send meg tips og oppdateringer for %(app_name)s pÃ¥ e-post." ubuntu-sso-client-13.10/po/ms.po0000664000202700020270000003536412151461656016761 0ustar dobeydobey00000000000000# Malay translation for ubuntu-sso-client # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the ubuntu-sso-client package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: ubuntu-sso-client\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-09-11 18:25+0000\n" "PO-Revision-Date: 2012-09-08 02:24+0000\n" "Last-Translator: abuyop \n" "Language-Team: Malay \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-09-17 18:24+0000\n" "X-Generator: Launchpad (build 15944)\n" #. Undefined variable '_', pylint: disable=E0602 #. all the text that is used in the gui #: ../ubuntu_sso/utils/ui.py:49 msgid "By signing up to {app_name} you agree to our {privacy_policy}" msgstr "" "Dengan mendaftar baru {app_name}, anda setuju pada {privacy_policy} kami" #: ../ubuntu_sso/utils/ui.py:51 msgid "By signing up to {app_name} you agree to our {terms_and_conditions}" msgstr "" "Dengan mendaftar baru {app_name} , anda setuju pada {terms_and_conditions} " "kami" #: ../ubuntu_sso/utils/ui.py:53 msgid " and {privacy_policy}" msgstr " dan {privacy_policy}" #: ../ubuntu_sso/utils/ui.py:54 msgid "Cancel" msgstr "Batal" #: ../ubuntu_sso/utils/ui.py:55 msgid "Type the characters above" msgstr "Taip aksara diatas" #: ../ubuntu_sso/utils/ui.py:56 msgid "There was a problem getting the captcha, reloading..." msgstr "Terdapat masalah untuk peroleh captcha, memuatkan semula..." #: ../ubuntu_sso/utils/ui.py:58 #, python-format msgid "If you can't read this then %(reload_link)s this page" msgstr "Jika anda tidak dapat baca ini maka %(reload_link)s halaman ini" #: ../ubuntu_sso/utils/ui.py:60 msgid "refresh" msgstr "segar semula" #: ../ubuntu_sso/utils/ui.py:61 msgid "Reload" msgstr "Muat semula" #: ../ubuntu_sso/utils/ui.py:62 msgid "The captcha is a required field" msgstr "Captcha adalah medan diperlukan" #: ../ubuntu_sso/utils/ui.py:63 msgid "Close window and set up later" msgstr "Tutup tetingkap dan tetapkannya kemudian" #: ../ubuntu_sso/utils/ui.py:64 msgid "Congratulations, {app_name} is installed!" msgstr "Tahniah, {app_name} telah dipasang!" #: ../ubuntu_sso/utils/ui.py:65 #, python-format msgid "To connect this computer to %(app_name)s enter your details below." msgstr "" "untuk sambungkan komputer ini ke %(app_name)s masukkan perincian anda " "dibawah." #: ../ubuntu_sso/utils/ui.py:67 msgid "Register with {app_name}." msgstr "Daftar dengan {app_name}." #: ../ubuntu_sso/utils/ui.py:68 ../ubuntu_sso/utils/ui.py:93 #: ../ubuntu_sso/utils/ui.py:143 msgid "Email address" msgstr "Alamat emel" #: ../ubuntu_sso/utils/ui.py:69 msgid "Re-type Email address" msgstr "Taip semula alamat Emel" #: ../ubuntu_sso/utils/ui.py:70 msgid "The email must be a valid email address." msgstr "Emel mestilah alamat emel yang sah." #: ../ubuntu_sso/utils/ui.py:71 msgid "" "The email addresses don't match, please double check and try entering them " "again." msgstr "" "Alamat emel tidak sepadan, sila semak lagi dan cuba masukkannya semula." #: ../ubuntu_sso/utils/ui.py:73 msgid "Email" msgstr "E-Mel" #: ../ubuntu_sso/utils/ui.py:74 msgid "The email addresses do not match" msgstr "Alamat e-mel tidak sepadan" #: ../ubuntu_sso/utils/ui.py:75 msgid "Enter code verification here" msgstr "Masukkan kod pengesahan disini" #: ../ubuntu_sso/utils/ui.py:76 msgid "Please enter your name" msgstr "Sila masukkan nama anda" #: ../ubuntu_sso/utils/ui.py:77 msgid "The process did not finish successfully." msgstr "Proses tidak berjaya diselesaikan." #: ../ubuntu_sso/utils/ui.py:79 msgid "Sign me in with my existing account" msgstr "Daftar masukk menggunakan akaun sedia ada saya" #: ../ubuntu_sso/utils/ui.py:80 msgid "This field is required." msgstr "Ruang ini diperlukan." #: ../ubuntu_sso/utils/ui.py:81 msgid "I've forgotten my password" msgstr "Saya terlupa kata laluan saya" #: ../ubuntu_sso/utils/ui.py:82 ../ubuntu_sso/utils/ui.py:130 msgid "Reset password" msgstr "Tetap semula kata laluan" #: ../ubuntu_sso/utils/ui.py:83 msgid "" "To reset your {app_name} password, enter your registered email address " "below. We will send instructions to reset your password." msgstr "" "Untuk tetap semula kata laluan {app_name} anda, masukkan alamat e-mel " "berdaftar anda dibawah. Kami akan hantar arahan untuk tetap semua kata " "laluan anda." #: ../ubuntu_sso/utils/ui.py:86 msgid "Please enter a valid email address" msgstr "Sila masukkan alamat e-mel yang sah" #: ../ubuntu_sso/utils/ui.py:87 msgid "There was a problem accessing the Ubuntu Single Sign On backend." msgstr "Terdapat masalah mencapai bahagian belakang Single Sign On Ubuntu" #: ../ubuntu_sso/utils/ui.py:89 #, python-format msgid "Create %(app_name)s account" msgstr "Cipta akaun %(app_name)s" #: ../ubuntu_sso/utils/ui.py:90 msgid "Loading..." msgstr "Memuatkan..." #: ../ubuntu_sso/utils/ui.py:91 msgid "Getting information, please wait..." msgstr "Mendapatkan maklumat, tunggu sebentar..." #: ../ubuntu_sso/utils/ui.py:92 msgid "Already have an account? Click here to sign in" msgstr "Sudah mempunyai akaun? Klik disini untuk mendaftar masuk" #: ../ubuntu_sso/utils/ui.py:94 #, python-format msgid "Connect to %(app_name)s" msgstr "Sambung ke %(app_name)s" #: ../ubuntu_sso/utils/ui.py:95 ../ubuntu_sso/utils/ui.py:109 msgid "Password" msgstr "Kata Laluan" #: ../ubuntu_sso/utils/ui.py:97 msgid "Sign In to {app_name}" msgstr "Daftar Masuk ke {app_name}" #: ../ubuntu_sso/utils/ui.py:99 msgid "Name" msgstr "Nama" #: ../ubuntu_sso/utils/ui.py:100 msgid "The name must not be empty." msgstr "Nama tidak boleh kosong." #: ../ubuntu_sso/utils/ui.py:101 msgid "Next" msgstr "Berikutnya" #: ../ubuntu_sso/utils/ui.py:102 msgid "Network detection" msgstr "Pengesanan rangkaian" #: ../ubuntu_sso/utils/ui.py:103 #, python-format msgid "" "Are you online? We can't detect an internet connection - you will need to be " "connected to set up %(app_name)s" msgstr "" "Anda berada diatas talian? Kami boleh kesan sambungan internet - anda perlu " "bersambung untuk tetapkan %(app_name)s" #: ../ubuntu_sso/utils/ui.py:105 msgid "One moment please..." msgstr "Tunggu sebentar..." #: ../ubuntu_sso/utils/ui.py:106 msgid "Create a password" msgstr "Cipta kata laluan" #: ../ubuntu_sso/utils/ui.py:107 msgid "Your password was successfully changed." msgstr "Kata laluan anda berjaya diubahkan." #: ../ubuntu_sso/utils/ui.py:108 msgid "At least one number" msgstr "Sekurang-kurangnya satu nombor" #: ../ubuntu_sso/utils/ui.py:110 msgid "Re-type Password" msgstr "Taip Semula Kata Laluan" #: ../ubuntu_sso/utils/ui.py:111 msgid "" "The password must have a minimum of 8 characters and include one uppercase " "character and one number." msgstr "" "Kata laluan mesti mempunyai seminimum 8 aksara dan termasuklah satu akasara " "huruf besar dan satu nombor." #: ../ubuntu_sso/utils/ui.py:113 msgid "At least 8 characters" msgstr "Sekurang-kurangnya 8 aksara" #: ../ubuntu_sso/utils/ui.py:114 msgid "Passwords don't match" msgstr "Kata laluan tidak sepadan" #: ../ubuntu_sso/utils/ui.py:115 msgid "" "The passwords don't match, please double check and try entering them again." msgstr "" "Kata laluan tidak sepadan, sila semak sekali lagi dan masukkannya semula." #: ../ubuntu_sso/utils/ui.py:117 msgid "Your password must contain" msgstr "Kata laluan mesti mengandungi" #: ../ubuntu_sso/utils/ui.py:118 msgid "The password is too weak." msgstr "Kata laluan lemah." #: ../ubuntu_sso/utils/ui.py:119 msgid "At least one uppercase letter" msgstr "Sekurang-kurangnya satu huruf besar" #: ../ubuntu_sso/utils/ui.py:120 msgid "Privacy Policy" msgstr "Polisi Kerahsiaan" #: ../ubuntu_sso/utils/ui.py:121 msgid "Connecting to:" msgstr "Menyambung ke:" #: ../ubuntu_sso/utils/ui.py:122 msgid "Proxy Settings" msgstr "Tetapan Proksi" #: ../ubuntu_sso/utils/ui.py:123 msgid "Incorrect login details. Please try again." msgstr "Perincian daftar masuk tidak betul. Sila cuba lagi." #: ../ubuntu_sso/utils/ui.py:124 msgid "Please provide login details." msgstr "Sila sediakan perincian daftar masuk." #: ../ubuntu_sso/utils/ui.py:125 msgid "You are connecting through a proxy." msgstr "Ada sedang menyambung melalui proksi." #: ../ubuntu_sso/utils/ui.py:126 msgid "Get Help With Proxies" msgstr "Dapatkan Banuan Melalui Proksi" #: ../ubuntu_sso/utils/ui.py:127 msgid "Proxy password:" msgstr "Kata laluan proksi:" #: ../ubuntu_sso/utils/ui.py:128 msgid "Save and Connect" msgstr "Simpan dan Sambung" #: ../ubuntu_sso/utils/ui.py:129 msgid "Proxy username:" msgstr "Nama pengguna proksi:" #: ../ubuntu_sso/utils/ui.py:131 msgid "" "A password reset code has been sent to your e-mail. Please enter the code " "below along with your new password." msgstr "" "Kod tetap semula kata laluan telah dihantar ke e-mel anda. Sila masukkan kod " "dibawah bersama-sama kata laluan baru anda." #: ../ubuntu_sso/utils/ui.py:133 msgid "Retype email" msgstr "Taip semula e-mel." #: ../ubuntu_sso/utils/ui.py:134 msgid "Retype password" msgstr "Taip semula kata laluan" #: ../ubuntu_sso/utils/ui.py:135 #, python-format msgid "To reset your %(app_name)s password, enter your email address below:" msgstr "" "Untuk tetapkan semula kata laluan %(app_name)s anda, masukkan alamat emel " "anda dibawah:" #: ../ubuntu_sso/utils/ui.py:137 msgid "" "We are very Sorry! The service that signs you on is not responding right " "now\n" "Please try again or come back in a few minutes." msgstr "" "Minta Maaf! Perkhidmatan yang daftarkan anda tidak memberi balasan sekarang\n" "Sila cuba sekali lagi atau datang balik beberapa minit nanti." #: ../ubuntu_sso/utils/ui.py:140 msgid "Sorry we did not recognize the email address." msgstr "Maaf kami tidak mengenalpasti alamat e-mel." #: ../ubuntu_sso/utils/ui.py:142 msgid "Reset code" msgstr "Tetap semula kod" #: ../ubuntu_sso/utils/ui.py:145 #, python-format msgid "" "A password reset code has been sent to %(email)s.\n" "Please enter the code below along with your new password." msgstr "" "Kod tetap semula bagi kata laluan telah dihantar ke %(email)s.\n" "Sila masukkan kod dibawah bersama-sama kata laluan baru anda." #: ../ubuntu_sso/utils/ui.py:147 msgid "Set Up Account" msgstr "Tetapkan Akaun" #: ../ubuntu_sso/utils/ui.py:148 msgid "I don't have an account yet - sign me up" msgstr "Saya tidak mempunyai akaun lagi - daftar baru" #: ../ubuntu_sso/utils/ui.py:149 msgid "Sign In" msgstr "Daftar Masuk" #: ../ubuntu_sso/utils/ui.py:150 msgid "Log-in with my existing account." msgstr "Daftar masuk dengan akaun sedia ada saya." #: ../ubuntu_sso/utils/ui.py:151 msgid "the appname whose ssl error we are going to show." msgstr "nama aplikasi yang mana ralat ssl yang dipaparkan." #: ../ubuntu_sso/utils/ui.py:152 msgid "Certificate details" msgstr "Perincian sijil" #: ../ubuntu_sso/utils/ui.py:153 msgid "Connect" msgstr "Sambung" #: ../ubuntu_sso/utils/ui.py:154 msgid "the details ssl certificate we are going to show." msgstr "perincian sijil ssl yang dipaparkan." #: ../ubuntu_sso/utils/ui.py:161 msgid "Open the SSL certificate UI." msgstr "Buka UI sijil SSL." #: ../ubuntu_sso/utils/ui.py:162 msgid "SSL Certificate Not Valid" msgstr "Sijil SSL Tidak Sah" #: ../ubuntu_sso/utils/ui.py:163 msgid "the domain whose ssl certificate we are going to show." msgstr "domain yang mana sijil ssl yang dipaparkan." #: ../ubuntu_sso/utils/ui.py:164 #, python-format msgid "" "You are trying to connect to a proxy server on %(domain)s. This server uses " "a secure connection, and the SSL certificate is not valid because:" msgstr "" "Anda cuba menyambung ke pelayan proksi pada %(domain)s. Pelayan ini " "menggunakan sambungan selamat, dan sijil SSL tidak sah kerana:" #: ../ubuntu_sso/utils/ui.py:167 msgid "The certificate has not been verified" msgstr "Sijil belum lagi disahkan" #: ../ubuntu_sso/utils/ui.py:168 msgid "Do you want to connect to this server?" msgstr "Anda hendak sambung ke pelayan ini?" #: ../ubuntu_sso/utils/ui.py:169 msgid "Get Help With SSL" msgstr "Dapatkan Bantuan Dengan SSL" #: ../ubuntu_sso/utils/ui.py:170 #, python-format msgid "" "If you are not sure about this server, do not use it to connect to " "%(app_name)s." msgstr "" "Jika anda tidak pasti mengenai pelayan ini, jangan guna ia untuk sambungkan " "ke %(app_name)s." #: ../ubuntu_sso/utils/ui.py:172 msgid "Remember my settings for this certificate." msgstr "Ingat tetapan saya untuk sijil ini." #: ../ubuntu_sso/utils/ui.py:173 msgid "" "The name on the certificate isn't valid or doesn't match the name of the site" msgstr "" "Nama pada sijil tidak sah atau tidak sepadan dengan nama laman sesawang" #: ../ubuntu_sso/utils/ui.py:175 msgid "The certificate has expired" msgstr "Sijil telah tamat tempoh" #: ../ubuntu_sso/utils/ui.py:176 #, python-format msgid "You are now logged into %(app_name)s." msgstr "Anda kini mendaftar masuk ke dalam %(app_name)s." #: ../ubuntu_sso/utils/ui.py:177 msgid "Surname" msgstr "Nama Keluarga" #: ../ubuntu_sso/utils/ui.py:178 msgid "Terms of Service" msgstr "Terma Perkhidmatan" #: ../ubuntu_sso/utils/ui.py:179 msgid "Sign Up to {app_name}" msgstr "Daftar Baru ke {app_name}" #: ../ubuntu_sso/utils/ui.py:180 msgid "Show Terms & Conditions" msgstr "Papar Terma & Syarat" #: ../ubuntu_sso/utils/ui.py:181 #, python-format msgid "" "Agreeing to the %(app_name)s Terms & Conditions is required to subscribe." msgstr "Persetujui Terma & Syarat %(app_name)s diperlukan untuk langganan." #: ../ubuntu_sso/utils/ui.py:183 #, python-format msgid "You can also find these terms at %(url)s" msgstr "Anda juag boleh mencari terma ini di %(url)s" #: ../ubuntu_sso/utils/ui.py:184 msgid "Try again" msgstr "Cuba lagi" #: ../ubuntu_sso/utils/ui.py:185 msgid "" "There was an error when trying to complete the process. Please check the " "information and try again." msgstr "" "Terdapat ralat semasa cuba melengkapkan proses. Sila semak maklumat dan cuba " "lagi." #: ../ubuntu_sso/utils/ui.py:187 msgid "Verification code" msgstr "Kod pengesahan" #: ../ubuntu_sso/utils/ui.py:188 #, python-format msgid "" "Check %(email)s for an email from Ubuntu Single Sign On. This message " "contains a verification code. Enter the code in the field below and click OK " "to complete creating your %(app_name)s account." msgstr "" "Periksa %(email)s untuk e-me dari Single Sign On Ubuntu. Mesej ini " "mengandungi kod pengesahan. Masukkan kod dalam medan dibawah dan klik OK " "untuk lengkapkan penciptaan akaun %(app_name)s." #: ../ubuntu_sso/utils/ui.py:192 msgid "Enter verification code" msgstr "Masukkan kod pengesahan" #: ../ubuntu_sso/utils/ui.py:195 #, python-format msgid "I agree with the %(app_name)s terms and conditions" msgstr "Saya setuju dengan terma dan syarat %(app_name)s" #: ../ubuntu_sso/utils/ui.py:196 #, python-format msgid "Yes! Email me %(app_name)s tips and updates." msgstr "Ya! Emelkan saya tip dan kemaskini %(app_name)s." ubuntu-sso-client-13.10/po/ug.po0000664000202700020270000004363612151461656016756 0ustar dobeydobey00000000000000# Uyghur translation for ubuntu-sso-client # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the ubuntu-sso-client package. # Gheyret T.Kenji , 2010. # msgid "" msgstr "" "Project-Id-Version: ubuntu-sso-client\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-09-11 18:25+0000\n" "PO-Revision-Date: 2012-09-12 03:49+0000\n" "Last-Translator: Gheyret T.Kenji \n" "Language-Team: Uyghur Computer Science Association \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-09-17 18:24+0000\n" "X-Generator: Launchpad (build 15944)\n" #. Undefined variable '_', pylint: disable=E0602 #. all the text that is used in the gui #: ../ubuntu_sso/utils/ui.py:49 msgid "By signing up to {app_name} you agree to our {privacy_policy}" msgstr "" "سىز {app_name} غا تىزىمغا كىرگەندە {privacy_policy} غا قوشۇلدى دەپ قارايمىز" #: ../ubuntu_sso/utils/ui.py:51 msgid "By signing up to {app_name} you agree to our {terms_and_conditions}" msgstr "" "سىز {app_name} غا تىزىمغا كىرگەندە {terms_and_conditions} غا قوشۇلدى دەپ " "قارايمىز" #: ../ubuntu_sso/utils/ui.py:53 msgid " and {privacy_policy}" msgstr " Û‹Û• {privacy_policy}" #: ../ubuntu_sso/utils/ui.py:54 msgid "Cancel" msgstr "ۋاز ÙƒÛ•Ú†" #: ../ubuntu_sso/utils/ui.py:55 msgid "Type the characters above" msgstr "ئۇستىدىكى ھەرپلەرنى كىرگۈزۈڭ" #: ../ubuntu_sso/utils/ui.py:56 msgid "There was a problem getting the captcha, reloading..." msgstr "captcha نى ئÛلىشتا مەسىلە كۆرۈلدى، قايتا ئوقۇۋاتىدۇ…" #: ../ubuntu_sso/utils/ui.py:58 #, python-format msgid "If you can't read this then %(reload_link)s this page" msgstr "ئەگەر ئوقۇيالمىسىڭىز، بۇ %(reload_link)s بەتنى زىيارەت قىلىڭ." #: ../ubuntu_sso/utils/ui.py:60 msgid "refresh" msgstr "ÙŠÛڭىلا" #: ../ubuntu_sso/utils/ui.py:61 msgid "Reload" msgstr "قايتا ئوقۇ" #: ../ubuntu_sso/utils/ui.py:62 msgid "The captcha is a required field" msgstr "بۇ captcha سۆز بۆلىكىنى چوقۇم تولدۇرۇش ÙƒÛØ±Û•Ùƒ" #: ../ubuntu_sso/utils/ui.py:63 msgid "Close window and set up later" msgstr "كۆزنەكنى تاقاپ ÙƒÛيىن تەڭشەي" #: ../ubuntu_sso/utils/ui.py:64 msgid "Congratulations, {app_name} is installed!" msgstr "مۇبارەك بولسۇن، {app_name} مۇۋەپپەقىيەتلىك ئورنىتىلدى!" #: ../ubuntu_sso/utils/ui.py:65 #, python-format msgid "To connect this computer to %(app_name)s enter your details below." msgstr "" "بۇ ÙƒÙˆÙ…Ù¾ÙŠÛ‡ØªÛØ±Ù†Ù‰ %(app_name)s غا ئۇلاش ئۈچۈن ئۆزىڭىز ھەققىدىكى تۆۋەندىكى " "ئۇچۇرلارنى كىرگۈزۈڭ" #: ../ubuntu_sso/utils/ui.py:67 msgid "Register with {app_name}." msgstr "{app_name} غا خەتلىتىش." #: ../ubuntu_sso/utils/ui.py:68 ../ubuntu_sso/utils/ui.py:93 #: ../ubuntu_sso/utils/ui.py:143 msgid "Email address" msgstr "ئÛلخەت Ø¦Ø§Ø¯Ø±ÛØ³Ù‰" #: ../ubuntu_sso/utils/ui.py:69 msgid "Re-type Email address" msgstr "ئÛلخەت Ø¦Ø§Ø¯Ø±ÛØ³Ù‰Ú­Ù‰Ø²(قايتا)" #: ../ubuntu_sso/utils/ui.py:70 msgid "The email must be a valid email address." msgstr "ئÛلخەت Ø¦Ø§Ø¯Ø±ÛØ³Ù‰ چوقۇم ئىناۋەتلىك بولسۇن." #: ../ubuntu_sso/utils/ui.py:71 msgid "" "The email addresses don't match, please double check and try entering them " "again." msgstr "ئىككى ئÛلخەت Ø¦Ø§Ø¯Ø±ÛØ³Ù‰ ئوخشىماي قالدى، قايتا كىرگۈزۈڭ" #: ../ubuntu_sso/utils/ui.py:73 msgid "Email" msgstr "ئÛلخەت" #: ../ubuntu_sso/utils/ui.py:74 msgid "The email addresses do not match" msgstr "ئÛلخەت Ø¦Ø§Ø¯Ø±ÛØ³Ù‰ ماس كەلمىدى" #: ../ubuntu_sso/utils/ui.py:75 msgid "Enter code verification here" msgstr "دەلىللەش كودىنى كىرگۈزۈڭ" #: ../ubuntu_sso/utils/ui.py:76 msgid "Please enter your name" msgstr "ئىسمىڭىزنى كىرگۈزۈڭ" #: ../ubuntu_sso/utils/ui.py:77 msgid "The process did not finish successfully." msgstr "بۇ ئىجرا مۇۋەپپەقىيەتلىك تاماملانمىدى." #: ../ubuntu_sso/utils/ui.py:79 msgid "Sign me in with my existing account" msgstr "مەۋجۇت Ú¾ÛØ³Ø§Ø¨Ø§ØªÙ‰Ù…دا تىزىمغا كىرەي" #: ../ubuntu_sso/utils/ui.py:80 msgid "This field is required." msgstr "بۇ زۆرۈر مەزمۇندۇر" #: ../ubuntu_sso/utils/ui.py:81 msgid "I've forgotten my password" msgstr "ئىمنى ئۇنتۇپتىمەن" #: ../ubuntu_sso/utils/ui.py:82 ../ubuntu_sso/utils/ui.py:130 msgid "Reset password" msgstr "ئىمنى ئەسلىگە قايتۇر" #: ../ubuntu_sso/utils/ui.py:83 msgid "" "To reset your {app_name} password, enter your registered email address " "below. We will send instructions to reset your password." msgstr "" "ئەگەر {app_name} نىڭ ئىمنى ئەسلىگە قايتۇرسىڭىز، تۆۋەندە خەتلەتكەن چاغدىكى " "ئÛلخەت Ø¦Ø§Ø¯Ø±ÛØ³Ù‰Ú­Ù‰Ø²Ù†Ù‰ كىرگۈزۈڭ. سىزگە ئىمنى ئەسلىگە قايتۇرىدىغان ئÛلخەت " "ئەۋەتىمىز." #: ../ubuntu_sso/utils/ui.py:86 msgid "Please enter a valid email address" msgstr "ئىناۋەتلىك ئÛلخەت Ø¦Ø§Ø¯Ø±ÛØ³Ù‰Ø¯Ù‰Ù† بىرنى كىرگۈزۈڭ" #: ../ubuntu_sso/utils/ui.py:87 msgid "There was a problem accessing the Ubuntu Single Sign On backend." msgstr "" "يەككە Ú¾ÛØ³Ø§Ø¨Ø§ØªØªØ§ ئۇبۇنتۇغا تىزىمغا كىرىشنى ساقلاۋاتقاندا ئارقا ئۇچ خاتالىقى " "كۆرۈلدى." #: ../ubuntu_sso/utils/ui.py:89 #, python-format msgid "Create %(app_name)s account" msgstr "%(app_name)s Ú¾ÛØ³Ø§Ø¨Ø§ØªÙ‰ قۇرۇش" #: ../ubuntu_sso/utils/ui.py:90 msgid "Loading..." msgstr "ئوقۇۋاتىدۇ…" #: ../ubuntu_sso/utils/ui.py:91 msgid "Getting information, please wait..." msgstr "ئۇچۇرلارغا Ø¦ÛØ±Ù‰Ø´Ù‰Û‹Ø§ØªÙ‰Ø¯Û‡ØŒ بىرئاز كۈتۈڭ…" #: ../ubuntu_sso/utils/ui.py:92 msgid "Already have an account? Click here to sign in" msgstr "Ú¾ÛØ³Ø§Ø¨Ø§Øª ئÛچىپ بولغانمۇ؟ تىزىمغا كىرىش ئۈچۈن بۇ يەرنى Ú†Ûكىڭ" #: ../ubuntu_sso/utils/ui.py:94 #, python-format msgid "Connect to %(app_name)s" msgstr "%(app_name)s غا باغلان" #: ../ubuntu_sso/utils/ui.py:95 ../ubuntu_sso/utils/ui.py:109 msgid "Password" msgstr "ئىم" #: ../ubuntu_sso/utils/ui.py:97 msgid "Sign In to {app_name}" msgstr "پروگرامما {app_name} غا تىزىملىتىش" #: ../ubuntu_sso/utils/ui.py:99 msgid "Name" msgstr "ئاتى" #: ../ubuntu_sso/utils/ui.py:100 msgid "The name must not be empty." msgstr "ئات بوش بولسا بولمايدۇ." #: ../ubuntu_sso/utils/ui.py:101 msgid "Next" msgstr "ÙƒÛيىنكى" #: ../ubuntu_sso/utils/ui.py:102 msgid "Network detection" msgstr "تورنى تÛپىش" #: ../ubuntu_sso/utils/ui.py:103 #, python-format msgid "" "Are you online? We can't detect an internet connection - you will need to be " "connected to set up %(app_name)s" msgstr "" "سىز توردىمۇ؟ بىز Ú¾Ûچقانداق تور باغلىنىشىنى بايقىمىدۇق - سىز تورغا " "باغلانغاندىلا ئاندىن %(app_name)s نى تەڭشىيەلەيسىز." #: ../ubuntu_sso/utils/ui.py:105 msgid "One moment please..." msgstr "بىر دەقىقە ساقلاڭ..." #: ../ubuntu_sso/utils/ui.py:106 msgid "Create a password" msgstr "ئىم قۇر" #: ../ubuntu_sso/utils/ui.py:107 msgid "Your password was successfully changed." msgstr "ئىمىڭىز مۇۋەپپەقىيەتلىك ئۆزگەرتىلدى." #: ../ubuntu_sso/utils/ui.py:108 msgid "At least one number" msgstr "ئاز دÛگەندە بىر رەقەم" #: ../ubuntu_sso/utils/ui.py:110 msgid "Re-type Password" msgstr "ئىمنى قايتا كىرگۈزۈڭ" #: ../ubuntu_sso/utils/ui.py:111 msgid "" "The password must have a minimum of 8 characters and include one uppercase " "character and one number." msgstr "" "ئىمنىڭ ئۇزۇنلۇقى 8 ياكى 8 ھەرپتىن Ú†ÙˆÚ­ بولۇشى، تەركىبىدە ئاز دÛگەندە بىر " "رەقەم Û‹Û• بىر Ú†ÙˆÚ­ ÙŠÛØ²Ù‰Ù„ىشتىكى ھەرپ بولۇشى ÙƒÛØ±Û•Ùƒ." #: ../ubuntu_sso/utils/ui.py:113 msgid "At least 8 characters" msgstr "ئاز دÛگەندە 8 ھەرپ" #: ../ubuntu_sso/utils/ui.py:114 msgid "Passwords don't match" msgstr "ئىم ماسلاشمىدى" #: ../ubuntu_sso/utils/ui.py:115 msgid "" "The passwords don't match, please double check and try entering them again." msgstr "ئىملار ماسلاشمىدى، تەپسىلىي تەكشۈرۈپ قايتا كىرگۈزۈڭ." #: ../ubuntu_sso/utils/ui.py:117 msgid "Your password must contain" msgstr "ئىمدا چوقۇم بولىدىغانلىرى" #: ../ubuntu_sso/utils/ui.py:118 msgid "The password is too weak." msgstr "ئىم بەك ئاجىز." #: ../ubuntu_sso/utils/ui.py:119 msgid "At least one uppercase letter" msgstr "ئاز دÛگەندە بىر Ú†ÙˆÚ­ ھەرپ" #: ../ubuntu_sso/utils/ui.py:120 msgid "Privacy Policy" msgstr "شەخسىيەت سىياسىتى" #: ../ubuntu_sso/utils/ui.py:121 msgid "Connecting to:" msgstr "باغلىنىدىغىنى:" #: ../ubuntu_sso/utils/ui.py:122 msgid "Proxy Settings" msgstr "ۋاكالەتچى تەڭشىكى" #: ../ubuntu_sso/utils/ui.py:123 msgid "Incorrect login details. Please try again." msgstr "تىزىمغا كىرىش تەپسىلاتى خاتا. قايتا سىناڭ." #: ../ubuntu_sso/utils/ui.py:124 msgid "Please provide login details." msgstr "تىزىمغا كىرىش تەپسىلاتىنى تەمىنلەڭ." #: ../ubuntu_sso/utils/ui.py:125 msgid "You are connecting through a proxy." msgstr "سىز ۋاكالەتچى Ù…Û‡Ù„Ø§Ø²Ù‰Ù…ÛØªÙ‰Ø± ئارقىلىق باغلىنىۋاتىسىز." #: ../ubuntu_sso/utils/ui.py:126 msgid "Get Help With Proxies" msgstr "ۋاكالەتچى Ù…Û‡Ù„Ø§Ø²Ù‰Ù…ÛØªÙ‰Ø± ياردىمىگە Ø¦ÛØ±Ù‰Ø´Ù‰Ú­" #: ../ubuntu_sso/utils/ui.py:127 msgid "Proxy password:" msgstr "ۋاكالەتچى ئىمى:" #: ../ubuntu_sso/utils/ui.py:128 msgid "Save and Connect" msgstr "ساقلاپ باغلان" #: ../ubuntu_sso/utils/ui.py:129 msgid "Proxy username:" msgstr "ۋاكالەتچى ئىشلەتكۈچى ئاتى:" #: ../ubuntu_sso/utils/ui.py:131 msgid "" "A password reset code has been sent to your e-mail. Please enter the code " "below along with your new password." msgstr "" "ئىمنى ئەسلىگە قايتۇرىدىغان كود ئÛلخەت Ø¦Ø§Ø¯Ø±ÛØ³Ù‰Ú­Ù‰Ø²ØºØ§ ئەۋەتىلدى. تۆۋەندە Ø´Û‡ " "كودنى Û‹Û• ÙŠÛÚ­Ù‰ ئىمنى كىرگۈزۈڭ." #: ../ubuntu_sso/utils/ui.py:133 msgid "Retype email" msgstr "ئÛلخەتنى قايتا كىرگۈزۈڭ" #: ../ubuntu_sso/utils/ui.py:134 msgid "Retype password" msgstr "ئىمنى قايتا كىرگۈزۈڭ" #: ../ubuntu_sso/utils/ui.py:135 #, python-format msgid "To reset your %(app_name)s password, enter your email address below:" msgstr "" "%(app_name)s نىڭ ئىمىنى ئەسلىگە قايتۇرۇش ئۈچۈن، ئÛلخەت Ø¦Ø§Ø¯Ø±ÛØ³Ù‰Ú­Ù‰Ø²Ù†Ù‰ كىرگۈزۈڭ." #: ../ubuntu_sso/utils/ui.py:137 msgid "" "We are very Sorry! The service that signs you on is not responding right " "now\n" "Please try again or come back in a few minutes." msgstr "" "ناھايىتى ئەپسۇس بىزنى كەچۈرۈڭ! تىزىمغا كىرىش مۇلازىمىتىدە ئىنكاس يوق، قايتا " "سىناڭ ياكى بىر قانچە مىنۇتتىن ÙƒÛيىن قايتا سىناڭ." #: ../ubuntu_sso/utils/ui.py:140 msgid "Sorry we did not recognize the email address." msgstr "كەچۈرۈڭ، بۇ ئÛلخەت Ø¦Ø§Ø¯Ø±ÛØ³Ù‰Ù†Ù‰ پەرقلەندۈرەلمىدۇق." #: ../ubuntu_sso/utils/ui.py:142 msgid "Reset code" msgstr "كودنى ئەسلىگە قايتۇر" #: ../ubuntu_sso/utils/ui.py:145 #, python-format msgid "" "A password reset code has been sent to %(email)s.\n" "Please enter the code below along with your new password." msgstr "" "ئىمنى ئەسلىك ئەسلىگە قايتۇرۇش كودى %(email)s غا ئەۋەتىلدى.\n" "تۆۋەندىكى كودنى Û‹Û• ÙŠÛÚ­Ù‰ ئىمنى كىرگۈزۈڭ." #: ../ubuntu_sso/utils/ui.py:147 msgid "Set Up Account" msgstr "Ú¾ÛØ³Ø§Ø¨Ø§Øª قۇرۇش" #: ../ubuntu_sso/utils/ui.py:148 msgid "I don't have an account yet - sign me up" msgstr "ØªÛØ®Ù‰ Ú¾ÛØ³Ø§Ø¨Ù‰Ù… يوق - خەتلىتەي" #: ../ubuntu_sso/utils/ui.py:149 msgid "Sign In" msgstr "كىر" #: ../ubuntu_sso/utils/ui.py:150 msgid "Log-in with my existing account." msgstr "" #: ../ubuntu_sso/utils/ui.py:151 msgid "the appname whose ssl error we are going to show." msgstr "بىز كۆرسەتمەكچى بولغان ئەپ ئاتىنىڭ ssl خاتالىقى." #: ../ubuntu_sso/utils/ui.py:152 msgid "Certificate details" msgstr "گۇۋاھنامە تەپسىلاتى" #: ../ubuntu_sso/utils/ui.py:153 msgid "Connect" msgstr "باغلان" #: ../ubuntu_sso/utils/ui.py:154 msgid "the details ssl certificate we are going to show." msgstr "بىز كۆرسىتىدىغان ssl گۇۋاھنامە تەپسىلاتى" #: ../ubuntu_sso/utils/ui.py:161 msgid "Open the SSL certificate UI." msgstr "بۇ SSL گۇۋاھنامىنىڭ ئارايۈزىنى ئاچىدۇ." #: ../ubuntu_sso/utils/ui.py:162 msgid "SSL Certificate Not Valid" msgstr "SSL گۇۋاھنامە ئىناۋەتسىز" #: ../ubuntu_sso/utils/ui.py:163 msgid "the domain whose ssl certificate we are going to show." msgstr "بىز كۆرسەتمەكچى بولغان SSL گۇۋاھنامىنىڭ دائىرىسى" #: ../ubuntu_sso/utils/ui.py:164 #, python-format msgid "" "You are trying to connect to a proxy server on %(domain)s. This server uses " "a secure connection, and the SSL certificate is not valid because:" msgstr "" "سىز %(domain)s دىكى ۋاكالەتچى Ù…Û‡Ù„Ø§Ø²Ù‰Ù…ÛØªÙ‰Ø±ØºØ§ باغلانماقچى بولۇۋاتىسىز. بۇ " "Ù…Û‡Ù„Ø§Ø²Ù‰Ù…ÛØªÙ‰Ø± بىخەتەر باغلىنىش ئىشلەتكەن، SSL گۇۋاھنامىنىڭ ئىناۋەتسىز بولۇش " "سەۋەبى:" #: ../ubuntu_sso/utils/ui.py:167 msgid "The certificate has not been verified" msgstr "بۇ گۇۋاھنامە دەلىللەنمىگەن" #: ../ubuntu_sso/utils/ui.py:168 msgid "Do you want to connect to this server?" msgstr "بۇ Ù…Û‡Ù„Ø§Ø²Ù‰Ù…ÛØªÙ‰Ø±ØºØ§ باغلىنامسىز؟" #: ../ubuntu_sso/utils/ui.py:169 msgid "Get Help With SSL" msgstr "مۇناسىۋەتلىك SSL ياردىمىگە Ø¦ÛØ±Ù‰Ø´Ù‰Ú­" #: ../ubuntu_sso/utils/ui.py:170 #, python-format msgid "" "If you are not sure about this server, do not use it to connect to " "%(app_name)s." msgstr "" "ئەگەر بۇ Ù…Û‡Ù„Ø§Ø²Ù‰Ù…ÛØªÙ‰Ø±ØºØ§ ئىشەنمىسىڭىز، ئۇنى ئىشلىتىپ %(app_name)s غا باغلانماڭ." #: ../ubuntu_sso/utils/ui.py:172 msgid "Remember my settings for this certificate." msgstr "بۇ گۇۋاھنامىگە بولغان تەڭشەكلىرىمنى ئەستە تۇتىدۇ." #: ../ubuntu_sso/utils/ui.py:173 msgid "" "The name on the certificate isn't valid or doesn't match the name of the site" msgstr "گۇۋاھنامە ئاتى ئىناۋەتسىز ياكى تورتۇرا ئاتى بىلەن ماسلاشمىدى" #: ../ubuntu_sso/utils/ui.py:175 msgid "The certificate has expired" msgstr "بۇ گۇۋاھنامىنىڭ ۋاقتى ئۆتكەن" #: ../ubuntu_sso/utils/ui.py:176 #, python-format msgid "You are now logged into %(app_name)s." msgstr "سىز %(app_name)s غا تىزىمغا كىرمىدىڭىز." #: ../ubuntu_sso/utils/ui.py:177 msgid "Surname" msgstr "تەگئات" #: ../ubuntu_sso/utils/ui.py:178 msgid "Terms of Service" msgstr "مۇلازىمەت ماددىلىرى" #: ../ubuntu_sso/utils/ui.py:179 msgid "Sign Up to {app_name}" msgstr "{app_name} خەتلىتىڭ" #: ../ubuntu_sso/utils/ui.py:180 msgid "Show Terms & Conditions" msgstr "قائىدە Û‹Û• شەرتلەرنى كۆرسەت" #: ../ubuntu_sso/utils/ui.py:181 #, python-format msgid "" "Agreeing to the %(app_name)s Terms & Conditions is required to subscribe." msgstr "" "ئەگەر مۇشتەرى بولسىڭىز، %(app_name)s نىڭ ماددىلىرى Û‹Û• شەرتلىرىگە قوشۇلۇڭ." #: ../ubuntu_sso/utils/ui.py:183 #, python-format msgid "You can also find these terms at %(url)s" msgstr "سىز %(url)s دىن بۇ ماددىلارنى تاپالايسىز." #: ../ubuntu_sso/utils/ui.py:184 msgid "Try again" msgstr "قايتا سىنا" #: ../ubuntu_sso/utils/ui.py:185 msgid "" "There was an error when trying to complete the process. Please check the " "information and try again." msgstr "" "بىرتەرەپ قىلىش جەريانىدا خاتالىق كۆرۈلدى. ئۇچۇرلارنى كۆرۈپ قايتا سىناڭ." #: ../ubuntu_sso/utils/ui.py:187 msgid "Verification code" msgstr "دەلىللەش كودى" #: ../ubuntu_sso/utils/ui.py:188 #, python-format msgid "" "Check %(email)s for an email from Ubuntu Single Sign On. This message " "contains a verification code. Enter the code in the field below and click OK " "to complete creating your %(app_name)s account." msgstr "" "سىز %(email)s نى تەكشۈرۈپ ئۇبۇنتۇ Single Sign On دىن ÙƒÛ•Ù„Ú¯Û•Ù† خەت بار " "يوقلۇقىنى تەكشۈرۈڭ. بۇ خەتتە بىر دەلىللەش كودى بار. تۆۋەندە Ø´Û‡ دەلىللەش " "كودىنى كىرگۈزگەندىن ÙƒÛيىن «جەزملە»نى Ú†Ûكىپ، %(app_name)s Ú¾ÛØ³Ø§Ø¨Ø§ØªÙ‰ قۇرۇشنى " "تاماملايسىز." #: ../ubuntu_sso/utils/ui.py:192 msgid "Enter verification code" msgstr "ئىسپاتلاش كودىنى كىرگۈزۈڭ" #: ../ubuntu_sso/utils/ui.py:195 #, python-format msgid "I agree with the %(app_name)s terms and conditions" msgstr "Ù…Û•Ù† %(app_name)s نىڭ قائىدە Û‹Û• شەرتلىرىگە قوشۇلىمەن" #: ../ubuntu_sso/utils/ui.py:196 #, python-format msgid "Yes! Email me %(app_name)s tips and updates." msgstr "" "ھەئە! %(app_name)s ھەققىدىكى كۆرسەتمە Û‹Û• ÙŠÛڭىلانمىلارنى ئÛلخەتتە ئەۋەتسۇن." ubuntu-sso-client-13.10/po/mi.po0000664000202700020270000002532012151461656016736 0ustar dobeydobey00000000000000# Maori translation for ubuntu-sso-client # Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 # This file is distributed under the same license as the ubuntu-sso-client package. # FIRST AUTHOR , 2012. # msgid "" msgstr "" "Project-Id-Version: ubuntu-sso-client\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-09-11 18:25+0000\n" "PO-Revision-Date: 2012-07-27 03:16+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Maori \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-09-17 18:24+0000\n" "X-Generator: Launchpad (build 15944)\n" #. Undefined variable '_', pylint: disable=E0602 #. all the text that is used in the gui #: ../ubuntu_sso/utils/ui.py:49 msgid "By signing up to {app_name} you agree to our {privacy_policy}" msgstr "" #: ../ubuntu_sso/utils/ui.py:51 msgid "By signing up to {app_name} you agree to our {terms_and_conditions}" msgstr "" #: ../ubuntu_sso/utils/ui.py:53 msgid " and {privacy_policy}" msgstr " me {privacy_policy}" #: ../ubuntu_sso/utils/ui.py:54 msgid "Cancel" msgstr "Whakakore" #: ../ubuntu_sso/utils/ui.py:55 msgid "Type the characters above" msgstr "" #: ../ubuntu_sso/utils/ui.py:56 msgid "There was a problem getting the captcha, reloading..." msgstr "" #: ../ubuntu_sso/utils/ui.py:58 #, python-format msgid "If you can't read this then %(reload_link)s this page" msgstr "" #: ../ubuntu_sso/utils/ui.py:60 msgid "refresh" msgstr "whakÄrahina" #: ../ubuntu_sso/utils/ui.py:61 msgid "Reload" msgstr "" #: ../ubuntu_sso/utils/ui.py:62 msgid "The captcha is a required field" msgstr "" #: ../ubuntu_sso/utils/ui.py:63 msgid "Close window and set up later" msgstr "" #: ../ubuntu_sso/utils/ui.py:64 msgid "Congratulations, {app_name} is installed!" msgstr "" #: ../ubuntu_sso/utils/ui.py:65 #, python-format msgid "To connect this computer to %(app_name)s enter your details below." msgstr "" #: ../ubuntu_sso/utils/ui.py:67 msgid "Register with {app_name}." msgstr "" #: ../ubuntu_sso/utils/ui.py:68 ../ubuntu_sso/utils/ui.py:93 #: ../ubuntu_sso/utils/ui.py:143 msgid "Email address" msgstr "WÄhitau Ä«mÄ“ra" #: ../ubuntu_sso/utils/ui.py:69 msgid "Re-type Email address" msgstr "" #: ../ubuntu_sso/utils/ui.py:70 msgid "The email must be a valid email address." msgstr "" #: ../ubuntu_sso/utils/ui.py:71 msgid "" "The email addresses don't match, please double check and try entering them " "again." msgstr "" #: ../ubuntu_sso/utils/ui.py:73 msgid "Email" msgstr "ĪmÄ“ra" #: ../ubuntu_sso/utils/ui.py:74 msgid "The email addresses do not match" msgstr "" #: ../ubuntu_sso/utils/ui.py:75 msgid "Enter code verification here" msgstr "" #: ../ubuntu_sso/utils/ui.py:76 msgid "Please enter your name" msgstr "" #: ../ubuntu_sso/utils/ui.py:77 msgid "The process did not finish successfully." msgstr "" #: ../ubuntu_sso/utils/ui.py:79 msgid "Sign me in with my existing account" msgstr "" #: ../ubuntu_sso/utils/ui.py:80 msgid "This field is required." msgstr "Kei te hiahiatia tÄ“nei Äpure." #: ../ubuntu_sso/utils/ui.py:81 msgid "I've forgotten my password" msgstr "" #: ../ubuntu_sso/utils/ui.py:82 ../ubuntu_sso/utils/ui.py:130 msgid "Reset password" msgstr "Tatutuhi kupuhipa anÅ" #: ../ubuntu_sso/utils/ui.py:83 msgid "" "To reset your {app_name} password, enter your registered email address " "below. We will send instructions to reset your password." msgstr "" #: ../ubuntu_sso/utils/ui.py:86 msgid "Please enter a valid email address" msgstr "" #: ../ubuntu_sso/utils/ui.py:87 msgid "There was a problem accessing the Ubuntu Single Sign On backend." msgstr "" #: ../ubuntu_sso/utils/ui.py:89 #, python-format msgid "Create %(app_name)s account" msgstr "" #: ../ubuntu_sso/utils/ui.py:90 msgid "Loading..." msgstr "E tÄuta ana..." #: ../ubuntu_sso/utils/ui.py:91 msgid "Getting information, please wait..." msgstr "" #: ../ubuntu_sso/utils/ui.py:92 msgid "Already have an account? Click here to sign in" msgstr "" #: ../ubuntu_sso/utils/ui.py:94 #, python-format msgid "Connect to %(app_name)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:95 ../ubuntu_sso/utils/ui.py:109 msgid "Password" msgstr "Kupuhipa" #: ../ubuntu_sso/utils/ui.py:97 msgid "Sign In to {app_name}" msgstr "" #: ../ubuntu_sso/utils/ui.py:99 msgid "Name" msgstr "Ingoa" #: ../ubuntu_sso/utils/ui.py:100 msgid "The name must not be empty." msgstr "" #: ../ubuntu_sso/utils/ui.py:101 msgid "Next" msgstr "Panuku" #: ../ubuntu_sso/utils/ui.py:102 msgid "Network detection" msgstr "" #: ../ubuntu_sso/utils/ui.py:103 #, python-format msgid "" "Are you online? We can't detect an internet connection - you will need to be " "connected to set up %(app_name)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:105 msgid "One moment please..." msgstr "" #: ../ubuntu_sso/utils/ui.py:106 msgid "Create a password" msgstr "" #: ../ubuntu_sso/utils/ui.py:107 msgid "Your password was successfully changed." msgstr "" #: ../ubuntu_sso/utils/ui.py:108 msgid "At least one number" msgstr "" #: ../ubuntu_sso/utils/ui.py:110 msgid "Re-type Password" msgstr "" #: ../ubuntu_sso/utils/ui.py:111 msgid "" "The password must have a minimum of 8 characters and include one uppercase " "character and one number." msgstr "" #: ../ubuntu_sso/utils/ui.py:113 msgid "At least 8 characters" msgstr "" #: ../ubuntu_sso/utils/ui.py:114 msgid "Passwords don't match" msgstr "" #: ../ubuntu_sso/utils/ui.py:115 msgid "" "The passwords don't match, please double check and try entering them again." msgstr "" #: ../ubuntu_sso/utils/ui.py:117 msgid "Your password must contain" msgstr "" #: ../ubuntu_sso/utils/ui.py:118 msgid "The password is too weak." msgstr "" #: ../ubuntu_sso/utils/ui.py:119 msgid "At least one uppercase letter" msgstr "" #: ../ubuntu_sso/utils/ui.py:120 msgid "Privacy Policy" msgstr "" #: ../ubuntu_sso/utils/ui.py:121 msgid "Connecting to:" msgstr "" #: ../ubuntu_sso/utils/ui.py:122 msgid "Proxy Settings" msgstr "" #: ../ubuntu_sso/utils/ui.py:123 msgid "Incorrect login details. Please try again." msgstr "" #: ../ubuntu_sso/utils/ui.py:124 msgid "Please provide login details." msgstr "" #: ../ubuntu_sso/utils/ui.py:125 msgid "You are connecting through a proxy." msgstr "" #: ../ubuntu_sso/utils/ui.py:126 msgid "Get Help With Proxies" msgstr "" #: ../ubuntu_sso/utils/ui.py:127 msgid "Proxy password:" msgstr "" #: ../ubuntu_sso/utils/ui.py:128 msgid "Save and Connect" msgstr "" #: ../ubuntu_sso/utils/ui.py:129 msgid "Proxy username:" msgstr "" #: ../ubuntu_sso/utils/ui.py:131 msgid "" "A password reset code has been sent to your e-mail. Please enter the code " "below along with your new password." msgstr "" #: ../ubuntu_sso/utils/ui.py:133 msgid "Retype email" msgstr "" #: ../ubuntu_sso/utils/ui.py:134 msgid "Retype password" msgstr "" #: ../ubuntu_sso/utils/ui.py:135 #, python-format msgid "To reset your %(app_name)s password, enter your email address below:" msgstr "" #: ../ubuntu_sso/utils/ui.py:137 msgid "" "We are very Sorry! The service that signs you on is not responding right " "now\n" "Please try again or come back in a few minutes." msgstr "" #: ../ubuntu_sso/utils/ui.py:140 msgid "Sorry we did not recognize the email address." msgstr "" #: ../ubuntu_sso/utils/ui.py:142 msgid "Reset code" msgstr "" #: ../ubuntu_sso/utils/ui.py:145 #, python-format msgid "" "A password reset code has been sent to %(email)s.\n" "Please enter the code below along with your new password." msgstr "" #: ../ubuntu_sso/utils/ui.py:147 msgid "Set Up Account" msgstr "" #: ../ubuntu_sso/utils/ui.py:148 msgid "I don't have an account yet - sign me up" msgstr "" #: ../ubuntu_sso/utils/ui.py:149 msgid "Sign In" msgstr "" #: ../ubuntu_sso/utils/ui.py:150 msgid "Log-in with my existing account." msgstr "" #: ../ubuntu_sso/utils/ui.py:151 msgid "the appname whose ssl error we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:152 msgid "Certificate details" msgstr "" #: ../ubuntu_sso/utils/ui.py:153 msgid "Connect" msgstr "" #: ../ubuntu_sso/utils/ui.py:154 msgid "the details ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:161 msgid "Open the SSL certificate UI." msgstr "" #: ../ubuntu_sso/utils/ui.py:162 msgid "SSL Certificate Not Valid" msgstr "" #: ../ubuntu_sso/utils/ui.py:163 msgid "the domain whose ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:164 #, python-format msgid "" "You are trying to connect to a proxy server on %(domain)s. This server uses " "a secure connection, and the SSL certificate is not valid because:" msgstr "" #: ../ubuntu_sso/utils/ui.py:167 msgid "The certificate has not been verified" msgstr "" #: ../ubuntu_sso/utils/ui.py:168 msgid "Do you want to connect to this server?" msgstr "" #: ../ubuntu_sso/utils/ui.py:169 msgid "Get Help With SSL" msgstr "" #: ../ubuntu_sso/utils/ui.py:170 #, python-format msgid "" "If you are not sure about this server, do not use it to connect to " "%(app_name)s." msgstr "" #: ../ubuntu_sso/utils/ui.py:172 msgid "Remember my settings for this certificate." msgstr "" #: ../ubuntu_sso/utils/ui.py:173 msgid "" "The name on the certificate isn't valid or doesn't match the name of the site" msgstr "" #: ../ubuntu_sso/utils/ui.py:175 msgid "The certificate has expired" msgstr "" #: ../ubuntu_sso/utils/ui.py:176 #, python-format msgid "You are now logged into %(app_name)s." msgstr "" #: ../ubuntu_sso/utils/ui.py:177 msgid "Surname" msgstr "Ingoa WhÄnau" #: ../ubuntu_sso/utils/ui.py:178 msgid "Terms of Service" msgstr "" #: ../ubuntu_sso/utils/ui.py:179 msgid "Sign Up to {app_name}" msgstr "" #: ../ubuntu_sso/utils/ui.py:180 msgid "Show Terms & Conditions" msgstr "" #: ../ubuntu_sso/utils/ui.py:181 #, python-format msgid "" "Agreeing to the %(app_name)s Terms & Conditions is required to subscribe." msgstr "" #: ../ubuntu_sso/utils/ui.py:183 #, python-format msgid "You can also find these terms at %(url)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:184 msgid "Try again" msgstr "Ngana anÅ" #: ../ubuntu_sso/utils/ui.py:185 msgid "" "There was an error when trying to complete the process. Please check the " "information and try again." msgstr "" #: ../ubuntu_sso/utils/ui.py:187 msgid "Verification code" msgstr "" #: ../ubuntu_sso/utils/ui.py:188 #, python-format msgid "" "Check %(email)s for an email from Ubuntu Single Sign On. This message " "contains a verification code. Enter the code in the field below and click OK " "to complete creating your %(app_name)s account." msgstr "" #: ../ubuntu_sso/utils/ui.py:192 msgid "Enter verification code" msgstr "" #: ../ubuntu_sso/utils/ui.py:195 #, python-format msgid "I agree with the %(app_name)s terms and conditions" msgstr "" #: ../ubuntu_sso/utils/ui.py:196 #, python-format msgid "Yes! Email me %(app_name)s tips and updates." msgstr "" ubuntu-sso-client-13.10/po/shn.po0000664000202700020270000002504112151461656017121 0ustar dobeydobey00000000000000# Shan translation for ubuntu-sso-client # Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 # This file is distributed under the same license as the ubuntu-sso-client package. # FIRST AUTHOR , 2012. # msgid "" msgstr "" "Project-Id-Version: ubuntu-sso-client\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-09-11 18:25+0000\n" "PO-Revision-Date: 2012-01-18 13:19+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Shan \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-09-17 18:24+0000\n" "X-Generator: Launchpad (build 15944)\n" #. Undefined variable '_', pylint: disable=E0602 #. all the text that is used in the gui #: ../ubuntu_sso/utils/ui.py:49 msgid "By signing up to {app_name} you agree to our {privacy_policy}" msgstr "" #: ../ubuntu_sso/utils/ui.py:51 msgid "By signing up to {app_name} you agree to our {terms_and_conditions}" msgstr "" #: ../ubuntu_sso/utils/ui.py:53 msgid " and {privacy_policy}" msgstr "" #: ../ubuntu_sso/utils/ui.py:54 msgid "Cancel" msgstr "" #: ../ubuntu_sso/utils/ui.py:55 msgid "Type the characters above" msgstr "" #: ../ubuntu_sso/utils/ui.py:56 msgid "There was a problem getting the captcha, reloading..." msgstr "" #: ../ubuntu_sso/utils/ui.py:58 #, python-format msgid "If you can't read this then %(reload_link)s this page" msgstr "" #: ../ubuntu_sso/utils/ui.py:60 msgid "refresh" msgstr "" #: ../ubuntu_sso/utils/ui.py:61 msgid "Reload" msgstr "" #: ../ubuntu_sso/utils/ui.py:62 msgid "The captcha is a required field" msgstr "" #: ../ubuntu_sso/utils/ui.py:63 msgid "Close window and set up later" msgstr "" #: ../ubuntu_sso/utils/ui.py:64 msgid "Congratulations, {app_name} is installed!" msgstr "" #: ../ubuntu_sso/utils/ui.py:65 #, python-format msgid "To connect this computer to %(app_name)s enter your details below." msgstr "" #: ../ubuntu_sso/utils/ui.py:67 msgid "Register with {app_name}." msgstr "" #: ../ubuntu_sso/utils/ui.py:68 ../ubuntu_sso/utils/ui.py:93 #: ../ubuntu_sso/utils/ui.py:143 msgid "Email address" msgstr "" #: ../ubuntu_sso/utils/ui.py:69 msgid "Re-type Email address" msgstr "" #: ../ubuntu_sso/utils/ui.py:70 msgid "The email must be a valid email address." msgstr "" #: ../ubuntu_sso/utils/ui.py:71 msgid "" "The email addresses don't match, please double check and try entering them " "again." msgstr "" #: ../ubuntu_sso/utils/ui.py:73 msgid "Email" msgstr "" #: ../ubuntu_sso/utils/ui.py:74 msgid "The email addresses do not match" msgstr "" #: ../ubuntu_sso/utils/ui.py:75 msgid "Enter code verification here" msgstr "" #: ../ubuntu_sso/utils/ui.py:76 msgid "Please enter your name" msgstr "" #: ../ubuntu_sso/utils/ui.py:77 msgid "The process did not finish successfully." msgstr "" #: ../ubuntu_sso/utils/ui.py:79 msgid "Sign me in with my existing account" msgstr "" #: ../ubuntu_sso/utils/ui.py:80 msgid "This field is required." msgstr "" #: ../ubuntu_sso/utils/ui.py:81 msgid "I've forgotten my password" msgstr "" #: ../ubuntu_sso/utils/ui.py:82 ../ubuntu_sso/utils/ui.py:130 msgid "Reset password" msgstr "" #: ../ubuntu_sso/utils/ui.py:83 msgid "" "To reset your {app_name} password, enter your registered email address " "below. We will send instructions to reset your password." msgstr "" #: ../ubuntu_sso/utils/ui.py:86 msgid "Please enter a valid email address" msgstr "" #: ../ubuntu_sso/utils/ui.py:87 msgid "There was a problem accessing the Ubuntu Single Sign On backend." msgstr "" #: ../ubuntu_sso/utils/ui.py:89 #, python-format msgid "Create %(app_name)s account" msgstr "" #: ../ubuntu_sso/utils/ui.py:90 msgid "Loading..." msgstr "" #: ../ubuntu_sso/utils/ui.py:91 msgid "Getting information, please wait..." msgstr "" #: ../ubuntu_sso/utils/ui.py:92 msgid "Already have an account? Click here to sign in" msgstr "" #: ../ubuntu_sso/utils/ui.py:94 #, python-format msgid "Connect to %(app_name)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:95 ../ubuntu_sso/utils/ui.py:109 msgid "Password" msgstr "" #: ../ubuntu_sso/utils/ui.py:97 msgid "Sign In to {app_name}" msgstr "" #: ../ubuntu_sso/utils/ui.py:99 msgid "Name" msgstr "" #: ../ubuntu_sso/utils/ui.py:100 msgid "The name must not be empty." msgstr "" #: ../ubuntu_sso/utils/ui.py:101 msgid "Next" msgstr "" #: ../ubuntu_sso/utils/ui.py:102 msgid "Network detection" msgstr "" #: ../ubuntu_sso/utils/ui.py:103 #, python-format msgid "" "Are you online? We can't detect an internet connection - you will need to be " "connected to set up %(app_name)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:105 msgid "One moment please..." msgstr "" #: ../ubuntu_sso/utils/ui.py:106 msgid "Create a password" msgstr "" #: ../ubuntu_sso/utils/ui.py:107 msgid "Your password was successfully changed." msgstr "" #: ../ubuntu_sso/utils/ui.py:108 msgid "At least one number" msgstr "" #: ../ubuntu_sso/utils/ui.py:110 msgid "Re-type Password" msgstr "" #: ../ubuntu_sso/utils/ui.py:111 msgid "" "The password must have a minimum of 8 characters and include one uppercase " "character and one number." msgstr "" #: ../ubuntu_sso/utils/ui.py:113 msgid "At least 8 characters" msgstr "" #: ../ubuntu_sso/utils/ui.py:114 msgid "Passwords don't match" msgstr "" #: ../ubuntu_sso/utils/ui.py:115 msgid "" "The passwords don't match, please double check and try entering them again." msgstr "" #: ../ubuntu_sso/utils/ui.py:117 msgid "Your password must contain" msgstr "" #: ../ubuntu_sso/utils/ui.py:118 msgid "The password is too weak." msgstr "" #: ../ubuntu_sso/utils/ui.py:119 msgid "At least one uppercase letter" msgstr "" #: ../ubuntu_sso/utils/ui.py:120 msgid "Privacy Policy" msgstr "" #: ../ubuntu_sso/utils/ui.py:121 msgid "Connecting to:" msgstr "" #: ../ubuntu_sso/utils/ui.py:122 msgid "Proxy Settings" msgstr "" #: ../ubuntu_sso/utils/ui.py:123 msgid "Incorrect login details. Please try again." msgstr "" #: ../ubuntu_sso/utils/ui.py:124 msgid "Please provide login details." msgstr "" #: ../ubuntu_sso/utils/ui.py:125 msgid "You are connecting through a proxy." msgstr "" #: ../ubuntu_sso/utils/ui.py:126 msgid "Get Help With Proxies" msgstr "" #: ../ubuntu_sso/utils/ui.py:127 msgid "Proxy password:" msgstr "" #: ../ubuntu_sso/utils/ui.py:128 msgid "Save and Connect" msgstr "" #: ../ubuntu_sso/utils/ui.py:129 msgid "Proxy username:" msgstr "" #: ../ubuntu_sso/utils/ui.py:131 msgid "" "A password reset code has been sent to your e-mail. Please enter the code " "below along with your new password." msgstr "" #: ../ubuntu_sso/utils/ui.py:133 msgid "Retype email" msgstr "" #: ../ubuntu_sso/utils/ui.py:134 msgid "Retype password" msgstr "" #: ../ubuntu_sso/utils/ui.py:135 #, python-format msgid "To reset your %(app_name)s password, enter your email address below:" msgstr "" #: ../ubuntu_sso/utils/ui.py:137 msgid "" "We are very Sorry! The service that signs you on is not responding right " "now\n" "Please try again or come back in a few minutes." msgstr "" #: ../ubuntu_sso/utils/ui.py:140 msgid "Sorry we did not recognize the email address." msgstr "" #: ../ubuntu_sso/utils/ui.py:142 msgid "Reset code" msgstr "" #: ../ubuntu_sso/utils/ui.py:145 #, python-format msgid "" "A password reset code has been sent to %(email)s.\n" "Please enter the code below along with your new password." msgstr "" #: ../ubuntu_sso/utils/ui.py:147 msgid "Set Up Account" msgstr "" #: ../ubuntu_sso/utils/ui.py:148 msgid "I don't have an account yet - sign me up" msgstr "" #: ../ubuntu_sso/utils/ui.py:149 msgid "Sign In" msgstr "" #: ../ubuntu_sso/utils/ui.py:150 msgid "Log-in with my existing account." msgstr "" #: ../ubuntu_sso/utils/ui.py:151 msgid "the appname whose ssl error we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:152 msgid "Certificate details" msgstr "" #: ../ubuntu_sso/utils/ui.py:153 msgid "Connect" msgstr "" #: ../ubuntu_sso/utils/ui.py:154 msgid "the details ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:161 msgid "Open the SSL certificate UI." msgstr "" #: ../ubuntu_sso/utils/ui.py:162 msgid "SSL Certificate Not Valid" msgstr "" #: ../ubuntu_sso/utils/ui.py:163 msgid "the domain whose ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:164 #, python-format msgid "" "You are trying to connect to a proxy server on %(domain)s. This server uses " "a secure connection, and the SSL certificate is not valid because:" msgstr "" #: ../ubuntu_sso/utils/ui.py:167 msgid "The certificate has not been verified" msgstr "" #: ../ubuntu_sso/utils/ui.py:168 msgid "Do you want to connect to this server?" msgstr "" #: ../ubuntu_sso/utils/ui.py:169 msgid "Get Help With SSL" msgstr "" #: ../ubuntu_sso/utils/ui.py:170 #, python-format msgid "" "If you are not sure about this server, do not use it to connect to " "%(app_name)s." msgstr "" #: ../ubuntu_sso/utils/ui.py:172 msgid "Remember my settings for this certificate." msgstr "" #: ../ubuntu_sso/utils/ui.py:173 msgid "" "The name on the certificate isn't valid or doesn't match the name of the site" msgstr "" #: ../ubuntu_sso/utils/ui.py:175 msgid "The certificate has expired" msgstr "" #: ../ubuntu_sso/utils/ui.py:176 #, python-format msgid "You are now logged into %(app_name)s." msgstr "" #: ../ubuntu_sso/utils/ui.py:177 msgid "Surname" msgstr "" #: ../ubuntu_sso/utils/ui.py:178 msgid "Terms of Service" msgstr "" #: ../ubuntu_sso/utils/ui.py:179 msgid "Sign Up to {app_name}" msgstr "" #: ../ubuntu_sso/utils/ui.py:180 msgid "Show Terms & Conditions" msgstr "" #: ../ubuntu_sso/utils/ui.py:181 #, python-format msgid "" "Agreeing to the %(app_name)s Terms & Conditions is required to subscribe." msgstr "" #: ../ubuntu_sso/utils/ui.py:183 #, python-format msgid "You can also find these terms at %(url)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:184 msgid "Try again" msgstr "" #: ../ubuntu_sso/utils/ui.py:185 msgid "" "There was an error when trying to complete the process. Please check the " "information and try again." msgstr "" #: ../ubuntu_sso/utils/ui.py:187 msgid "Verification code" msgstr "" #: ../ubuntu_sso/utils/ui.py:188 #, python-format msgid "" "Check %(email)s for an email from Ubuntu Single Sign On. This message " "contains a verification code. Enter the code in the field below and click OK " "to complete creating your %(app_name)s account." msgstr "" #: ../ubuntu_sso/utils/ui.py:192 msgid "Enter verification code" msgstr "" #: ../ubuntu_sso/utils/ui.py:195 #, python-format msgid "I agree with the %(app_name)s terms and conditions" msgstr "" #: ../ubuntu_sso/utils/ui.py:196 #, python-format msgid "Yes! Email me %(app_name)s tips and updates." msgstr "" ubuntu-sso-client-13.10/po/lt.po0000664000202700020270000003631212151461656016753 0ustar dobeydobey00000000000000# Lithuanian translation for ubuntu-sso-client # Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 # This file is distributed under the same license as the ubuntu-sso-client package. # FIRST AUTHOR , 2011. # msgid "" msgstr "" "Project-Id-Version: ubuntu-sso-client\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-09-11 18:25+0000\n" "PO-Revision-Date: 2012-09-09 08:53+0000\n" "Last-Translator: Aurimas FiÅ¡eras \n" "Language-Team: Lithuanian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-09-17 18:24+0000\n" "X-Generator: Launchpad (build 15944)\n" #. Undefined variable '_', pylint: disable=E0602 #. all the text that is used in the gui #: ../ubuntu_sso/utils/ui.py:49 msgid "By signing up to {app_name} you agree to our {privacy_policy}" msgstr "Prisijungdami prie {app_name} jÅ«s sutinkate su mÅ«sų {privacy_policy}" #: ../ubuntu_sso/utils/ui.py:51 msgid "By signing up to {app_name} you agree to our {terms_and_conditions}" msgstr "" "Prisijungdami prie {app_name} jÅ«s sutinkate su mÅ«sų {terms_and_conditions}" #: ../ubuntu_sso/utils/ui.py:53 msgid " and {privacy_policy}" msgstr " ir {privacy_policy}" #: ../ubuntu_sso/utils/ui.py:54 msgid "Cancel" msgstr "Atsisakyti" #: ../ubuntu_sso/utils/ui.py:55 msgid "Type the characters above" msgstr "Ä®veskite aukÅ¡Äiau parodytus simbolius" #: ../ubuntu_sso/utils/ui.py:56 msgid "There was a problem getting the captcha, reloading..." msgstr "Ä®vyko klaida gaunant „captcha“, įkeliama iÅ¡ naujo..." #: ../ubuntu_sso/utils/ui.py:58 #, python-format msgid "If you can't read this then %(reload_link)s this page" msgstr "" "Jei Å¡ito negalite perskaityti, tada reikia %(reload_link)s šį puslapį" #: ../ubuntu_sso/utils/ui.py:60 msgid "refresh" msgstr "atnaujinti" #: ../ubuntu_sso/utils/ui.py:61 msgid "Reload" msgstr "Ä®kelti iÅ¡ naujo" #: ../ubuntu_sso/utils/ui.py:62 msgid "The captcha is a required field" msgstr "„Captcha“ yra privalomas laukas" #: ../ubuntu_sso/utils/ui.py:63 msgid "Close window and set up later" msgstr "Užverti langÄ… ir įdiegti vÄ—liau" #: ../ubuntu_sso/utils/ui.py:64 msgid "Congratulations, {app_name} is installed!" msgstr "Sveikiname, {app_name} yra įdiegta!" #: ../ubuntu_sso/utils/ui.py:65 #, python-format msgid "To connect this computer to %(app_name)s enter your details below." msgstr "" "NorÄ—dami prijungti šį kompiuterį prie %(app_name)s įveskite savo duomenis " "žemiau." #: ../ubuntu_sso/utils/ui.py:67 msgid "Register with {app_name}." msgstr "Registruotis su {app_name}." #: ../ubuntu_sso/utils/ui.py:68 ../ubuntu_sso/utils/ui.py:93 #: ../ubuntu_sso/utils/ui.py:143 msgid "Email address" msgstr "El. paÅ¡to adresas" #: ../ubuntu_sso/utils/ui.py:69 msgid "Re-type Email address" msgstr "Pakartokite el. paÅ¡to adresÄ…" #: ../ubuntu_sso/utils/ui.py:70 msgid "The email must be a valid email address." msgstr "El. paÅ¡to adresas turi bÅ«ti galiojantis." #: ../ubuntu_sso/utils/ui.py:71 msgid "" "The email addresses don't match, please double check and try entering them " "again." msgstr "" "El. paÅ¡to adresai nesutampa, dar kartÄ… patikrinkite ir mÄ—ginkite juos įvesti " "iÅ¡ naujo." #: ../ubuntu_sso/utils/ui.py:73 msgid "Email" msgstr "El. paÅ¡tas" #: ../ubuntu_sso/utils/ui.py:74 msgid "The email addresses do not match" msgstr "Elektroninio paÅ¡to adresai nesutampa" #: ../ubuntu_sso/utils/ui.py:75 msgid "Enter code verification here" msgstr "Ä®veskite verifikavimo kodÄ… Äia" #: ../ubuntu_sso/utils/ui.py:76 msgid "Please enter your name" msgstr "Ä®veskite savo vardÄ…" #: ../ubuntu_sso/utils/ui.py:77 msgid "The process did not finish successfully." msgstr "Procesas nebaigtas sÄ—kmingai." #: ../ubuntu_sso/utils/ui.py:79 msgid "Sign me in with my existing account" msgstr "Prijungti mane su egzistuojanÄia paskyra" #: ../ubuntu_sso/utils/ui.py:80 msgid "This field is required." msgstr "Å is laukas yra privalomas." #: ../ubuntu_sso/utils/ui.py:81 msgid "I've forgotten my password" msgstr "AÅ¡ užmirÅ¡au savo slaptažodį" #: ../ubuntu_sso/utils/ui.py:82 ../ubuntu_sso/utils/ui.py:130 msgid "Reset password" msgstr "Atkurti slaptažodį" #: ../ubuntu_sso/utils/ui.py:83 msgid "" "To reset your {app_name} password, enter your registered email address " "below. We will send instructions to reset your password." msgstr "" "NorÄ—dami atkurti {app_name} slaptažodį, įveskite jÅ«sų registruotÄ… " "elektroninio paÅ¡to adresÄ… žemiau. Mes atsiųsime instrukcijas kaip atkurti " "jÅ«sų slaptažodį." #: ../ubuntu_sso/utils/ui.py:86 msgid "Please enter a valid email address" msgstr "Ä®veskite teisingÄ… elektroninio paÅ¡to adresÄ…" #: ../ubuntu_sso/utils/ui.py:87 msgid "There was a problem accessing the Ubuntu Single Sign On backend." msgstr "IÅ¡kilo problema kreipiantis į Ubuntu „Single Sign On“ posistemÄ™." #: ../ubuntu_sso/utils/ui.py:89 #, python-format msgid "Create %(app_name)s account" msgstr "Sukurti %(app_name)s paskyrÄ…" #: ../ubuntu_sso/utils/ui.py:90 msgid "Loading..." msgstr "Ä®keliama…" #: ../ubuntu_sso/utils/ui.py:91 msgid "Getting information, please wait..." msgstr "Informacija gaunama, palaukite..." #: ../ubuntu_sso/utils/ui.py:92 msgid "Already have an account? Click here to sign in" msgstr "Jau turite paskyrÄ…? Spauskite Äia prisijungimui" #: ../ubuntu_sso/utils/ui.py:94 #, python-format msgid "Connect to %(app_name)s" msgstr "Prisijungti prie %(app_name)s" #: ../ubuntu_sso/utils/ui.py:95 ../ubuntu_sso/utils/ui.py:109 msgid "Password" msgstr "Slaptažodis" #: ../ubuntu_sso/utils/ui.py:97 msgid "Sign In to {app_name}" msgstr "Prisijungti prie {app_name}" #: ../ubuntu_sso/utils/ui.py:99 msgid "Name" msgstr "Vardas" #: ../ubuntu_sso/utils/ui.py:100 msgid "The name must not be empty." msgstr "Vardas privalo bÅ«ti ne tuÅ¡Äias." #: ../ubuntu_sso/utils/ui.py:101 msgid "Next" msgstr "Pirmyn" #: ../ubuntu_sso/utils/ui.py:102 msgid "Network detection" msgstr "Tinklo aptikimas" #: ../ubuntu_sso/utils/ui.py:103 #, python-format msgid "" "Are you online? We can't detect an internet connection - you will need to be " "connected to set up %(app_name)s" msgstr "" "Ar jÅ«s prisijungÄ™? Negalime aptikti prisijungimo prie interneto – jums " "reikia bÅ«ti prisijungus norint nustatyti %(app_name)s" #: ../ubuntu_sso/utils/ui.py:105 msgid "One moment please..." msgstr "PraÅ¡ome palaukti..." #: ../ubuntu_sso/utils/ui.py:106 msgid "Create a password" msgstr "Sukurti slaptažodį" #: ../ubuntu_sso/utils/ui.py:107 msgid "Your password was successfully changed." msgstr "JÅ«sų slaptažodis sÄ—kmingai pakeistas." #: ../ubuntu_sso/utils/ui.py:108 msgid "At least one number" msgstr "Mažiausiai vienas skaitmuo" #: ../ubuntu_sso/utils/ui.py:110 msgid "Re-type Password" msgstr "Pakartokite slaptažodį" #: ../ubuntu_sso/utils/ui.py:111 msgid "" "The password must have a minimum of 8 characters and include one uppercase " "character and one number." msgstr "" "Slaptažodis privalo bÅ«ti mažiausiai 8 simbolių ilgio ir turÄ—ti vienÄ… " "didžiÄ…jÄ… raidÄ™ ir vienÄ… skaiÄių." #: ../ubuntu_sso/utils/ui.py:113 msgid "At least 8 characters" msgstr "Mažiausiai 8 simboliai" #: ../ubuntu_sso/utils/ui.py:114 msgid "Passwords don't match" msgstr "Slaptažodžiai nesutampa" #: ../ubuntu_sso/utils/ui.py:115 msgid "" "The passwords don't match, please double check and try entering them again." msgstr "" "Slaptažodžiai nesutampa, patikrinkite dar kartÄ… ir mÄ—ginkite įvesti juos iÅ¡ " "naujo." #: ../ubuntu_sso/utils/ui.py:117 msgid "Your password must contain" msgstr "JÅ«sų slaptažodis privalo turÄ—ti" #: ../ubuntu_sso/utils/ui.py:118 msgid "The password is too weak." msgstr "Slaptažodis per silpnas." #: ../ubuntu_sso/utils/ui.py:119 msgid "At least one uppercase letter" msgstr "Mažiausiai vienÄ… didžiÄ…jÄ… raidÄ™" #: ../ubuntu_sso/utils/ui.py:120 msgid "Privacy Policy" msgstr "Privatumo politika" #: ../ubuntu_sso/utils/ui.py:121 msgid "Connecting to:" msgstr "Jungiamasi prie:" #: ../ubuntu_sso/utils/ui.py:122 msgid "Proxy Settings" msgstr "Tarpinio serverio nustatymai" #: ../ubuntu_sso/utils/ui.py:123 msgid "Incorrect login details. Please try again." msgstr "Neteisingi prisijungimo duomenys. Bandykite dar kartÄ…." #: ../ubuntu_sso/utils/ui.py:124 msgid "Please provide login details." msgstr "Pateikite prisijungimo duomenis." #: ../ubuntu_sso/utils/ui.py:125 msgid "You are connecting through a proxy." msgstr "JÅ«s jungiatÄ—s per tarpinį serverį." #: ../ubuntu_sso/utils/ui.py:126 msgid "Get Help With Proxies" msgstr "Pagalba apie tarpinius serverius" #: ../ubuntu_sso/utils/ui.py:127 msgid "Proxy password:" msgstr "Tarpinio serverio slaptažodis:" #: ../ubuntu_sso/utils/ui.py:128 msgid "Save and Connect" msgstr "IÅ¡saugoti ir jungtis" #: ../ubuntu_sso/utils/ui.py:129 msgid "Proxy username:" msgstr "Tarpinio serverio naudotojo vardas:" #: ../ubuntu_sso/utils/ui.py:131 msgid "" "A password reset code has been sent to your e-mail. Please enter the code " "below along with your new password." msgstr "" "Slaptažodžio atkÅ«rimo kodas buvo iÅ¡siųstas jums elektroniniu paÅ¡tu. Ä®veskite " "kodÄ… žemiau kartu su naujuoju slaptažodžiu." #: ../ubuntu_sso/utils/ui.py:133 msgid "Retype email" msgstr "Pakartokite elektroninį paÅ¡tÄ…" #: ../ubuntu_sso/utils/ui.py:134 msgid "Retype password" msgstr "Pakartokite slaptažodį" #: ../ubuntu_sso/utils/ui.py:135 #, python-format msgid "To reset your %(app_name)s password, enter your email address below:" msgstr "" "Savo %(app_name)s slaptažodžiui atkurti įveskite savo el. paÅ¡to adresÄ… " "žemiau:" #: ../ubuntu_sso/utils/ui.py:137 msgid "" "We are very Sorry! The service that signs you on is not responding right " "now\n" "Please try again or come back in a few minutes." msgstr "" "Labai atsipraÅ¡ome! Paslauga, kuri jus prijungia, dabar neatsako\n" "MÄ—ginkite dar kartÄ… arba grįžkite po kelių minuÄių." #: ../ubuntu_sso/utils/ui.py:140 msgid "Sorry we did not recognize the email address." msgstr "AtsipraÅ¡ome, mes neatpažinome elektroninio paÅ¡to adreso." #: ../ubuntu_sso/utils/ui.py:142 msgid "Reset code" msgstr "AtkÅ«rimo kodas" #: ../ubuntu_sso/utils/ui.py:145 #, python-format msgid "" "A password reset code has been sent to %(email)s.\n" "Please enter the code below along with your new password." msgstr "" "Slaptažodžio atkÅ«rimo kodas buvo iÅ¡siųstas į %(email)s.\n" "Ä®veskite kodÄ… žemiau kartu su naujuoju slaptažodžiu." #: ../ubuntu_sso/utils/ui.py:147 msgid "Set Up Account" msgstr "Nustatyti paskyrÄ…" #: ../ubuntu_sso/utils/ui.py:148 msgid "I don't have an account yet - sign me up" msgstr "AÅ¡ dar neturiu paskyros – užregistruokite mane" #: ../ubuntu_sso/utils/ui.py:149 msgid "Sign In" msgstr "Prisijungti" #: ../ubuntu_sso/utils/ui.py:150 msgid "Log-in with my existing account." msgstr "Prisijungti su egzistuojanÄia paskyra." #: ../ubuntu_sso/utils/ui.py:151 msgid "the appname whose ssl error we are going to show." msgstr "programa, kurios ssl klaidÄ… ketiname parodyti." #: ../ubuntu_sso/utils/ui.py:152 msgid "Certificate details" msgstr "Liudijimo informacija" #: ../ubuntu_sso/utils/ui.py:153 msgid "Connect" msgstr "Prisijungti" #: ../ubuntu_sso/utils/ui.py:154 msgid "the details ssl certificate we are going to show." msgstr "ssl liudijimo detalÄ—s, kurias ketiname parodyti." #: ../ubuntu_sso/utils/ui.py:161 msgid "Open the SSL certificate UI." msgstr "Atverti SSL liudijimo sÄ…sajÄ…." #: ../ubuntu_sso/utils/ui.py:162 msgid "SSL Certificate Not Valid" msgstr "SSL liudijimas neteisingas" #: ../ubuntu_sso/utils/ui.py:163 msgid "the domain whose ssl certificate we are going to show." msgstr "sritis, kurios ssl liudijimÄ… ketiname parodyti." #: ../ubuntu_sso/utils/ui.py:164 #, python-format msgid "" "You are trying to connect to a proxy server on %(domain)s. This server uses " "a secure connection, and the SSL certificate is not valid because:" msgstr "" "JÅ«s mÄ—ginate prisijungti prie tarpinio serverio adresu %(domain)s. Å is " "serveris naudojÄ… saugų susijungimÄ…, o SSL liudijimas yra neteisingas nes:" #: ../ubuntu_sso/utils/ui.py:167 msgid "The certificate has not been verified" msgstr "Liudijimas nebuvo patikrintas" #: ../ubuntu_sso/utils/ui.py:168 msgid "Do you want to connect to this server?" msgstr "Ar norite prisijungti prie Å¡io serverio?" #: ../ubuntu_sso/utils/ui.py:169 msgid "Get Help With SSL" msgstr "Pagalba apie SSL" #: ../ubuntu_sso/utils/ui.py:170 #, python-format msgid "" "If you are not sure about this server, do not use it to connect to " "%(app_name)s." msgstr "" "Jei nesate tikri dÄ—l Å¡io serverio, nenaudokite jo prisijungimui prie " "%(app_name)s." #: ../ubuntu_sso/utils/ui.py:172 msgid "Remember my settings for this certificate." msgstr "Prisiminti mano nustatymus Å¡iam liudijimui." #: ../ubuntu_sso/utils/ui.py:173 msgid "" "The name on the certificate isn't valid or doesn't match the name of the site" msgstr "Liudijimo vardas yra neteisingas arba neatitinka svetainÄ—s vardo" #: ../ubuntu_sso/utils/ui.py:175 msgid "The certificate has expired" msgstr "Liudijimas nebegalioja" #: ../ubuntu_sso/utils/ui.py:176 #, python-format msgid "You are now logged into %(app_name)s." msgstr "JÅ«s dabar prisijungÄ™ prie %(app_name)s." #: ../ubuntu_sso/utils/ui.py:177 msgid "Surname" msgstr "PavardÄ—" #: ../ubuntu_sso/utils/ui.py:178 msgid "Terms of Service" msgstr "Paslaugos sÄ…lygos" #: ../ubuntu_sso/utils/ui.py:179 msgid "Sign Up to {app_name}" msgstr "Prisijungti prie Sign Up to {app_name}" #: ../ubuntu_sso/utils/ui.py:180 msgid "Show Terms & Conditions" msgstr "Parodyti naudojimo sÄ…lygas" #: ../ubuntu_sso/utils/ui.py:181 #, python-format msgid "" "Agreeing to the %(app_name)s Terms & Conditions is required to subscribe." msgstr "" "Reikalingas sutikimas su %(app_name)s naudojimo sÄ…lygomis norint " "registruotis." #: ../ubuntu_sso/utils/ui.py:183 #, python-format msgid "You can also find these terms at %(url)s" msgstr "Å ias sÄ…lygas taip pat galite rasti %(url)s" #: ../ubuntu_sso/utils/ui.py:184 msgid "Try again" msgstr "Bandyti dar kartÄ…" #: ../ubuntu_sso/utils/ui.py:185 msgid "" "There was an error when trying to complete the process. Please check the " "information and try again." msgstr "" "Ä®vyko klaida bandant užbaigti procesÄ…. Patikrinkite informacijÄ… ir mÄ—ginkite " "dar kartÄ…." #: ../ubuntu_sso/utils/ui.py:187 msgid "Verification code" msgstr "Tikrinimo kodas" #: ../ubuntu_sso/utils/ui.py:188 #, python-format msgid "" "Check %(email)s for an email from Ubuntu Single Sign On. This message " "contains a verification code. Enter the code in the field below and click OK " "to complete creating your %(app_name)s account." msgstr "" "Tikrinkite %(email)s dÄ—l elektroninio laiÅ¡ko iÅ¡ Ubuntu „Single Sign On“. " "Å ioje žinutÄ—je yra tikrinimo kodas. Ä®veskite kodÄ… laukelyje žemiau ir " "spauskite „Gerai“ jÅ«sų %(app_name)s paskyros kÅ«rimui užbaigti." #: ../ubuntu_sso/utils/ui.py:192 msgid "Enter verification code" msgstr "Ä®veskite verifikavimo kodÄ…" #: ../ubuntu_sso/utils/ui.py:195 #, python-format msgid "I agree with the %(app_name)s terms and conditions" msgstr "AÅ¡ sutinku su %(app_name)s naudojimo sÄ…lygomis" #: ../ubuntu_sso/utils/ui.py:196 #, python-format msgid "Yes! Email me %(app_name)s tips and updates." msgstr "" "Taip! Siųsti man el. laiÅ¡kus su %(app_name)s patarimais ir atnaujinimais." ubuntu-sso-client-13.10/po/is.po0000664000202700020270000002505212151461656016746 0ustar dobeydobey00000000000000# Icelandic translation for ubuntu-sso-client # Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 # This file is distributed under the same license as the ubuntu-sso-client package. # FIRST AUTHOR , 2011. # msgid "" msgstr "" "Project-Id-Version: ubuntu-sso-client\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-09-11 18:25+0000\n" "PO-Revision-Date: 2011-06-03 00:29+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Icelandic \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-09-17 18:24+0000\n" "X-Generator: Launchpad (build 15944)\n" #. Undefined variable '_', pylint: disable=E0602 #. all the text that is used in the gui #: ../ubuntu_sso/utils/ui.py:49 msgid "By signing up to {app_name} you agree to our {privacy_policy}" msgstr "" #: ../ubuntu_sso/utils/ui.py:51 msgid "By signing up to {app_name} you agree to our {terms_and_conditions}" msgstr "" #: ../ubuntu_sso/utils/ui.py:53 msgid " and {privacy_policy}" msgstr "" #: ../ubuntu_sso/utils/ui.py:54 msgid "Cancel" msgstr "" #: ../ubuntu_sso/utils/ui.py:55 msgid "Type the characters above" msgstr "" #: ../ubuntu_sso/utils/ui.py:56 msgid "There was a problem getting the captcha, reloading..." msgstr "" #: ../ubuntu_sso/utils/ui.py:58 #, python-format msgid "If you can't read this then %(reload_link)s this page" msgstr "" #: ../ubuntu_sso/utils/ui.py:60 msgid "refresh" msgstr "" #: ../ubuntu_sso/utils/ui.py:61 msgid "Reload" msgstr "" #: ../ubuntu_sso/utils/ui.py:62 msgid "The captcha is a required field" msgstr "" #: ../ubuntu_sso/utils/ui.py:63 msgid "Close window and set up later" msgstr "" #: ../ubuntu_sso/utils/ui.py:64 msgid "Congratulations, {app_name} is installed!" msgstr "" #: ../ubuntu_sso/utils/ui.py:65 #, python-format msgid "To connect this computer to %(app_name)s enter your details below." msgstr "" #: ../ubuntu_sso/utils/ui.py:67 msgid "Register with {app_name}." msgstr "" #: ../ubuntu_sso/utils/ui.py:68 ../ubuntu_sso/utils/ui.py:93 #: ../ubuntu_sso/utils/ui.py:143 msgid "Email address" msgstr "" #: ../ubuntu_sso/utils/ui.py:69 msgid "Re-type Email address" msgstr "" #: ../ubuntu_sso/utils/ui.py:70 msgid "The email must be a valid email address." msgstr "" #: ../ubuntu_sso/utils/ui.py:71 msgid "" "The email addresses don't match, please double check and try entering them " "again." msgstr "" #: ../ubuntu_sso/utils/ui.py:73 msgid "Email" msgstr "" #: ../ubuntu_sso/utils/ui.py:74 msgid "The email addresses do not match" msgstr "" #: ../ubuntu_sso/utils/ui.py:75 msgid "Enter code verification here" msgstr "" #: ../ubuntu_sso/utils/ui.py:76 msgid "Please enter your name" msgstr "" #: ../ubuntu_sso/utils/ui.py:77 msgid "The process did not finish successfully." msgstr "" #: ../ubuntu_sso/utils/ui.py:79 msgid "Sign me in with my existing account" msgstr "" #: ../ubuntu_sso/utils/ui.py:80 msgid "This field is required." msgstr "" #: ../ubuntu_sso/utils/ui.py:81 msgid "I've forgotten my password" msgstr "" #: ../ubuntu_sso/utils/ui.py:82 ../ubuntu_sso/utils/ui.py:130 msgid "Reset password" msgstr "" #: ../ubuntu_sso/utils/ui.py:83 msgid "" "To reset your {app_name} password, enter your registered email address " "below. We will send instructions to reset your password." msgstr "" #: ../ubuntu_sso/utils/ui.py:86 msgid "Please enter a valid email address" msgstr "" #: ../ubuntu_sso/utils/ui.py:87 msgid "There was a problem accessing the Ubuntu Single Sign On backend." msgstr "" #: ../ubuntu_sso/utils/ui.py:89 #, python-format msgid "Create %(app_name)s account" msgstr "" #: ../ubuntu_sso/utils/ui.py:90 msgid "Loading..." msgstr "" #: ../ubuntu_sso/utils/ui.py:91 msgid "Getting information, please wait..." msgstr "" #: ../ubuntu_sso/utils/ui.py:92 msgid "Already have an account? Click here to sign in" msgstr "" #: ../ubuntu_sso/utils/ui.py:94 #, python-format msgid "Connect to %(app_name)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:95 ../ubuntu_sso/utils/ui.py:109 msgid "Password" msgstr "" #: ../ubuntu_sso/utils/ui.py:97 msgid "Sign In to {app_name}" msgstr "" #: ../ubuntu_sso/utils/ui.py:99 msgid "Name" msgstr "" #: ../ubuntu_sso/utils/ui.py:100 msgid "The name must not be empty." msgstr "" #: ../ubuntu_sso/utils/ui.py:101 msgid "Next" msgstr "" #: ../ubuntu_sso/utils/ui.py:102 msgid "Network detection" msgstr "" #: ../ubuntu_sso/utils/ui.py:103 #, python-format msgid "" "Are you online? We can't detect an internet connection - you will need to be " "connected to set up %(app_name)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:105 msgid "One moment please..." msgstr "" #: ../ubuntu_sso/utils/ui.py:106 msgid "Create a password" msgstr "" #: ../ubuntu_sso/utils/ui.py:107 msgid "Your password was successfully changed." msgstr "" #: ../ubuntu_sso/utils/ui.py:108 msgid "At least one number" msgstr "" #: ../ubuntu_sso/utils/ui.py:110 msgid "Re-type Password" msgstr "" #: ../ubuntu_sso/utils/ui.py:111 msgid "" "The password must have a minimum of 8 characters and include one uppercase " "character and one number." msgstr "" #: ../ubuntu_sso/utils/ui.py:113 msgid "At least 8 characters" msgstr "" #: ../ubuntu_sso/utils/ui.py:114 msgid "Passwords don't match" msgstr "" #: ../ubuntu_sso/utils/ui.py:115 msgid "" "The passwords don't match, please double check and try entering them again." msgstr "" #: ../ubuntu_sso/utils/ui.py:117 msgid "Your password must contain" msgstr "" #: ../ubuntu_sso/utils/ui.py:118 msgid "The password is too weak." msgstr "" #: ../ubuntu_sso/utils/ui.py:119 msgid "At least one uppercase letter" msgstr "" #: ../ubuntu_sso/utils/ui.py:120 msgid "Privacy Policy" msgstr "" #: ../ubuntu_sso/utils/ui.py:121 msgid "Connecting to:" msgstr "" #: ../ubuntu_sso/utils/ui.py:122 msgid "Proxy Settings" msgstr "" #: ../ubuntu_sso/utils/ui.py:123 msgid "Incorrect login details. Please try again." msgstr "" #: ../ubuntu_sso/utils/ui.py:124 msgid "Please provide login details." msgstr "" #: ../ubuntu_sso/utils/ui.py:125 msgid "You are connecting through a proxy." msgstr "" #: ../ubuntu_sso/utils/ui.py:126 msgid "Get Help With Proxies" msgstr "" #: ../ubuntu_sso/utils/ui.py:127 msgid "Proxy password:" msgstr "" #: ../ubuntu_sso/utils/ui.py:128 msgid "Save and Connect" msgstr "" #: ../ubuntu_sso/utils/ui.py:129 msgid "Proxy username:" msgstr "" #: ../ubuntu_sso/utils/ui.py:131 msgid "" "A password reset code has been sent to your e-mail. Please enter the code " "below along with your new password." msgstr "" #: ../ubuntu_sso/utils/ui.py:133 msgid "Retype email" msgstr "" #: ../ubuntu_sso/utils/ui.py:134 msgid "Retype password" msgstr "" #: ../ubuntu_sso/utils/ui.py:135 #, python-format msgid "To reset your %(app_name)s password, enter your email address below:" msgstr "" #: ../ubuntu_sso/utils/ui.py:137 msgid "" "We are very Sorry! The service that signs you on is not responding right " "now\n" "Please try again or come back in a few minutes." msgstr "" #: ../ubuntu_sso/utils/ui.py:140 msgid "Sorry we did not recognize the email address." msgstr "" #: ../ubuntu_sso/utils/ui.py:142 msgid "Reset code" msgstr "" #: ../ubuntu_sso/utils/ui.py:145 #, python-format msgid "" "A password reset code has been sent to %(email)s.\n" "Please enter the code below along with your new password." msgstr "" #: ../ubuntu_sso/utils/ui.py:147 msgid "Set Up Account" msgstr "" #: ../ubuntu_sso/utils/ui.py:148 msgid "I don't have an account yet - sign me up" msgstr "" #: ../ubuntu_sso/utils/ui.py:149 msgid "Sign In" msgstr "" #: ../ubuntu_sso/utils/ui.py:150 msgid "Log-in with my existing account." msgstr "" #: ../ubuntu_sso/utils/ui.py:151 msgid "the appname whose ssl error we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:152 msgid "Certificate details" msgstr "" #: ../ubuntu_sso/utils/ui.py:153 msgid "Connect" msgstr "" #: ../ubuntu_sso/utils/ui.py:154 msgid "the details ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:161 msgid "Open the SSL certificate UI." msgstr "" #: ../ubuntu_sso/utils/ui.py:162 msgid "SSL Certificate Not Valid" msgstr "" #: ../ubuntu_sso/utils/ui.py:163 msgid "the domain whose ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:164 #, python-format msgid "" "You are trying to connect to a proxy server on %(domain)s. This server uses " "a secure connection, and the SSL certificate is not valid because:" msgstr "" #: ../ubuntu_sso/utils/ui.py:167 msgid "The certificate has not been verified" msgstr "" #: ../ubuntu_sso/utils/ui.py:168 msgid "Do you want to connect to this server?" msgstr "" #: ../ubuntu_sso/utils/ui.py:169 msgid "Get Help With SSL" msgstr "" #: ../ubuntu_sso/utils/ui.py:170 #, python-format msgid "" "If you are not sure about this server, do not use it to connect to " "%(app_name)s." msgstr "" #: ../ubuntu_sso/utils/ui.py:172 msgid "Remember my settings for this certificate." msgstr "" #: ../ubuntu_sso/utils/ui.py:173 msgid "" "The name on the certificate isn't valid or doesn't match the name of the site" msgstr "" #: ../ubuntu_sso/utils/ui.py:175 msgid "The certificate has expired" msgstr "" #: ../ubuntu_sso/utils/ui.py:176 #, python-format msgid "You are now logged into %(app_name)s." msgstr "" #: ../ubuntu_sso/utils/ui.py:177 msgid "Surname" msgstr "" #: ../ubuntu_sso/utils/ui.py:178 msgid "Terms of Service" msgstr "" #: ../ubuntu_sso/utils/ui.py:179 msgid "Sign Up to {app_name}" msgstr "" #: ../ubuntu_sso/utils/ui.py:180 msgid "Show Terms & Conditions" msgstr "" #: ../ubuntu_sso/utils/ui.py:181 #, python-format msgid "" "Agreeing to the %(app_name)s Terms & Conditions is required to subscribe." msgstr "" #: ../ubuntu_sso/utils/ui.py:183 #, python-format msgid "You can also find these terms at %(url)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:184 msgid "Try again" msgstr "" #: ../ubuntu_sso/utils/ui.py:185 msgid "" "There was an error when trying to complete the process. Please check the " "information and try again." msgstr "" #: ../ubuntu_sso/utils/ui.py:187 msgid "Verification code" msgstr "" #: ../ubuntu_sso/utils/ui.py:188 #, python-format msgid "" "Check %(email)s for an email from Ubuntu Single Sign On. This message " "contains a verification code. Enter the code in the field below and click OK " "to complete creating your %(app_name)s account." msgstr "" #: ../ubuntu_sso/utils/ui.py:192 msgid "Enter verification code" msgstr "" #: ../ubuntu_sso/utils/ui.py:195 #, python-format msgid "I agree with the %(app_name)s terms and conditions" msgstr "" #: ../ubuntu_sso/utils/ui.py:196 #, python-format msgid "Yes! Email me %(app_name)s tips and updates." msgstr "" ubuntu-sso-client-13.10/po/it.po0000664000202700020270000003565212151461656016756 0ustar dobeydobey00000000000000# Italian translation for ubuntu-sso-client # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the ubuntu-sso-client package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: ubuntu-sso-client\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-09-11 18:25+0000\n" "PO-Revision-Date: 2012-09-10 06:03+0000\n" "Last-Translator: Milo Casagrande \n" "Language-Team: Italian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-09-17 18:24+0000\n" "X-Generator: Launchpad (build 15944)\n" #. Undefined variable '_', pylint: disable=E0602 #. all the text that is used in the gui #: ../ubuntu_sso/utils/ui.py:49 msgid "By signing up to {app_name} you agree to our {privacy_policy}" msgstr "Iscrivendosi a {app_name} si accetta la {privacy_policy}" #: ../ubuntu_sso/utils/ui.py:51 msgid "By signing up to {app_name} you agree to our {terms_and_conditions}" msgstr "Iscrivendosi a {app_name}, si accettano le {terms_and_conditions}" #: ../ubuntu_sso/utils/ui.py:53 msgid " and {privacy_policy}" msgstr " e la {privacy_policy}" #: ../ubuntu_sso/utils/ui.py:54 msgid "Cancel" msgstr "Annulla" #: ../ubuntu_sso/utils/ui.py:55 msgid "Type the characters above" msgstr "Digitare i caratteri indicati sopra" #: ../ubuntu_sso/utils/ui.py:56 msgid "There was a problem getting the captcha, reloading..." msgstr "" "Si è verificato un problema nel recuperare il captcha. Aggiornamento..." #: ../ubuntu_sso/utils/ui.py:58 #, python-format msgid "If you can't read this then %(reload_link)s this page" msgstr "Se non è possibile leggere, %(reload_link)s questa pagina" #: ../ubuntu_sso/utils/ui.py:60 msgid "refresh" msgstr "ricaricare" #: ../ubuntu_sso/utils/ui.py:61 msgid "Reload" msgstr "Ricarica" #: ../ubuntu_sso/utils/ui.py:62 msgid "The captcha is a required field" msgstr "Il captcha è un campo richiesto" #: ../ubuntu_sso/utils/ui.py:63 msgid "Close window and set up later" msgstr "Chiudi e configura successivamente" #: ../ubuntu_sso/utils/ui.py:64 msgid "Congratulations, {app_name} is installed!" msgstr "Congratulazioni, {app_name} è stato installato." #: ../ubuntu_sso/utils/ui.py:65 #, python-format msgid "To connect this computer to %(app_name)s enter your details below." msgstr "" "Per connettere questo computer a %(app_name)s inserire i propri dettagli qui " "sotto." #: ../ubuntu_sso/utils/ui.py:67 msgid "Register with {app_name}." msgstr "Registra con {app_name}" #: ../ubuntu_sso/utils/ui.py:68 ../ubuntu_sso/utils/ui.py:93 #: ../ubuntu_sso/utils/ui.py:143 msgid "Email address" msgstr "Indirizzo email" #: ../ubuntu_sso/utils/ui.py:69 msgid "Re-type Email address" msgstr "Indirizzo email (reinserire)" #: ../ubuntu_sso/utils/ui.py:70 msgid "The email must be a valid email address." msgstr "L'email deve essere un indirizzo email valido." #: ../ubuntu_sso/utils/ui.py:71 msgid "" "The email addresses don't match, please double check and try entering them " "again." msgstr "" "Gli indirizzi email non corrispondono, controllare e provare a inserirli di " "nuovo." #: ../ubuntu_sso/utils/ui.py:73 msgid "Email" msgstr "Email" #: ../ubuntu_sso/utils/ui.py:74 msgid "The email addresses do not match" msgstr "Gli indirizzi email non corrispondono" #: ../ubuntu_sso/utils/ui.py:75 msgid "Enter code verification here" msgstr "Inserire qui il codice di verifica" #: ../ubuntu_sso/utils/ui.py:76 msgid "Please enter your name" msgstr "Inserire il proprio nome" #: ../ubuntu_sso/utils/ui.py:77 msgid "The process did not finish successfully." msgstr "Il processo non è terminato con successo." #: ../ubuntu_sso/utils/ui.py:79 msgid "Sign me in with my existing account" msgstr "Accedi con un account già esistente" #: ../ubuntu_sso/utils/ui.py:80 msgid "This field is required." msgstr "Questo campo è richiesto." #: ../ubuntu_sso/utils/ui.py:81 msgid "I've forgotten my password" msgstr "Ho dimenticato la mia password" #: ../ubuntu_sso/utils/ui.py:82 ../ubuntu_sso/utils/ui.py:130 msgid "Reset password" msgstr "Azzera password" #: ../ubuntu_sso/utils/ui.py:83 msgid "" "To reset your {app_name} password, enter your registered email address " "below. We will send instructions to reset your password." msgstr "" "Per ripristinare la password di {app_name}, inserire qui sotto il proprio " "indirizzo email: le istruzioni per reimpostare la password verranno inviate " "via email." #: ../ubuntu_sso/utils/ui.py:86 msgid "Please enter a valid email address" msgstr "Inserire un indirizzo email valido" #: ../ubuntu_sso/utils/ui.py:87 msgid "There was a problem accessing the Ubuntu Single Sign On backend." msgstr "" "Si è verificato un problema nell'accedere al server di Ubuntu Single Sign On." #: ../ubuntu_sso/utils/ui.py:89 #, python-format msgid "Create %(app_name)s account" msgstr "Crea un account per %(app_name)s" #: ../ubuntu_sso/utils/ui.py:90 msgid "Loading..." msgstr "Caricamento..." #: ../ubuntu_sso/utils/ui.py:91 msgid "Getting information, please wait..." msgstr "Recupero informazioni, attendere..." #: ../ubuntu_sso/utils/ui.py:92 msgid "Already have an account? Click here to sign in" msgstr "Disponi già di un account? Fai clic qui per accedere" #: ../ubuntu_sso/utils/ui.py:94 #, python-format msgid "Connect to %(app_name)s" msgstr "Connetti a %(app_name)s" #: ../ubuntu_sso/utils/ui.py:95 ../ubuntu_sso/utils/ui.py:109 msgid "Password" msgstr "Password" #: ../ubuntu_sso/utils/ui.py:97 msgid "Sign In to {app_name}" msgstr "Accedi a {app_name}" #: ../ubuntu_sso/utils/ui.py:99 msgid "Name" msgstr "Nome" #: ../ubuntu_sso/utils/ui.py:100 msgid "The name must not be empty." msgstr "Il nome non deve essere vuoto." #: ../ubuntu_sso/utils/ui.py:101 msgid "Next" msgstr "Avanti" #: ../ubuntu_sso/utils/ui.py:102 msgid "Network detection" msgstr "Rilevamento rete" #: ../ubuntu_sso/utils/ui.py:103 #, python-format msgid "" "Are you online? We can't detect an internet connection - you will need to be " "connected to set up %(app_name)s" msgstr "" "Impossibile rilevare una connessione a Internet: per configurare " "%(app_name)s è necessario essere collegati." #: ../ubuntu_sso/utils/ui.py:105 msgid "One moment please..." msgstr "Attendere..." #: ../ubuntu_sso/utils/ui.py:106 msgid "Create a password" msgstr "Crea password" #: ../ubuntu_sso/utils/ui.py:107 msgid "Your password was successfully changed." msgstr "Cambio della password riuscito" #: ../ubuntu_sso/utils/ui.py:108 msgid "At least one number" msgstr "Almeno un numero" #: ../ubuntu_sso/utils/ui.py:110 msgid "Re-type Password" msgstr "Password (reinserire)" #: ../ubuntu_sso/utils/ui.py:111 msgid "" "The password must have a minimum of 8 characters and include one uppercase " "character and one number." msgstr "" "La password deve avere un minimo di 8 caratteri e includere una lettera " "maiuscola e un numero." #: ../ubuntu_sso/utils/ui.py:113 msgid "At least 8 characters" msgstr "Almeno otto caratteri" #: ../ubuntu_sso/utils/ui.py:114 msgid "Passwords don't match" msgstr "Le password non corrispondono" #: ../ubuntu_sso/utils/ui.py:115 msgid "" "The passwords don't match, please double check and try entering them again." msgstr "" "Le password non corrispondono, verificare e provare a inserirle nuovamente." #: ../ubuntu_sso/utils/ui.py:117 msgid "Your password must contain" msgstr "La password deve contenere" #: ../ubuntu_sso/utils/ui.py:118 msgid "The password is too weak." msgstr "La password è troppo debole." #: ../ubuntu_sso/utils/ui.py:119 msgid "At least one uppercase letter" msgstr "Almeno una lettera maiuscola" #: ../ubuntu_sso/utils/ui.py:120 msgid "Privacy Policy" msgstr "Informativa sulla privacy" #: ../ubuntu_sso/utils/ui.py:121 msgid "Connecting to:" msgstr "Connessione a:" #: ../ubuntu_sso/utils/ui.py:122 msgid "Proxy Settings" msgstr "Impostazioni proxy" #: ../ubuntu_sso/utils/ui.py:123 msgid "Incorrect login details. Please try again." msgstr "Informazioni di accesso non corrette. Riprovare." #: ../ubuntu_sso/utils/ui.py:124 msgid "Please provide login details." msgstr "Fornire le informazioni di accesso." #: ../ubuntu_sso/utils/ui.py:125 msgid "You are connecting through a proxy." msgstr "Connessione in corso attraverso un proxy." #: ../ubuntu_sso/utils/ui.py:126 msgid "Get Help With Proxies" msgstr "Aiuto sui proxy" #: ../ubuntu_sso/utils/ui.py:127 msgid "Proxy password:" msgstr "Password per il proxy:" #: ../ubuntu_sso/utils/ui.py:128 msgid "Save and Connect" msgstr "Salva e connetti" #: ../ubuntu_sso/utils/ui.py:129 msgid "Proxy username:" msgstr "Nome utente proxy:" #: ../ubuntu_sso/utils/ui.py:131 msgid "" "A password reset code has been sent to your e-mail. Please enter the code " "below along with your new password." msgstr "" "Un codice per ripristinare la password è stato inviato al proprio indirizzo " "email. Inserire qui sotto il codice assieme alla nuova password." #: ../ubuntu_sso/utils/ui.py:133 msgid "Retype email" msgstr "Ripetere l'email" #: ../ubuntu_sso/utils/ui.py:134 msgid "Retype password" msgstr "Ripetere la password" #: ../ubuntu_sso/utils/ui.py:135 #, python-format msgid "To reset your %(app_name)s password, enter your email address below:" msgstr "" "Per azzerare la propria password %(app_name)s inserire il proprio indirizzo " "email qui sotto:" #: ../ubuntu_sso/utils/ui.py:137 msgid "" "We are very Sorry! The service that signs you on is not responding right " "now\n" "Please try again or come back in a few minutes." msgstr "" "Il servizio di accesso sembra non funzionare al momento.\n" "Riprovare tra alcuni minuti." #: ../ubuntu_sso/utils/ui.py:140 msgid "Sorry we did not recognize the email address." msgstr "Indirizzo email non riconosciuto." #: ../ubuntu_sso/utils/ui.py:142 msgid "Reset code" msgstr "Codice di azzeramento" #: ../ubuntu_sso/utils/ui.py:145 #, python-format msgid "" "A password reset code has been sent to %(email)s.\n" "Please enter the code below along with your new password." msgstr "" "È stato inviato a %(email)s un codice per azzerare la password.\n" "Inserire il codice qui sotto assieme alla propria nuova password." #: ../ubuntu_sso/utils/ui.py:147 msgid "Set Up Account" msgstr "Configura account" #: ../ubuntu_sso/utils/ui.py:148 msgid "I don't have an account yet - sign me up" msgstr "Account non disponibile, iscrivimi" #: ../ubuntu_sso/utils/ui.py:149 msgid "Sign In" msgstr "Accedi" #: ../ubuntu_sso/utils/ui.py:150 msgid "Log-in with my existing account." msgstr "Accesso con account esistente" #: ../ubuntu_sso/utils/ui.py:151 msgid "the appname whose ssl error we are going to show." msgstr "il nome dell'applicazione il cui errore SSL sarà mostrato." #: ../ubuntu_sso/utils/ui.py:152 msgid "Certificate details" msgstr "Dettagli del certificato" #: ../ubuntu_sso/utils/ui.py:153 msgid "Connect" msgstr "Connnetti" #: ../ubuntu_sso/utils/ui.py:154 msgid "the details ssl certificate we are going to show." msgstr "i dettagli del certificato SSL che sarà mostrato." #: ../ubuntu_sso/utils/ui.py:161 msgid "Open the SSL certificate UI." msgstr "Apre l'interfaccia grafica per il certificato SSL" #: ../ubuntu_sso/utils/ui.py:162 msgid "SSL Certificate Not Valid" msgstr "Certificato SSL non valido" #: ../ubuntu_sso/utils/ui.py:163 msgid "the domain whose ssl certificate we are going to show." msgstr "il dominio del certificato SSL che sarà mostrato." #: ../ubuntu_sso/utils/ui.py:164 #, python-format msgid "" "You are trying to connect to a proxy server on %(domain)s. This server uses " "a secure connection, and the SSL certificate is not valid because:" msgstr "" "È in corso la connessione a un server proxy su %(domain)s. Questo server " "utilizzare una connessione sicura e il certificato SSL non è valido perché:" #: ../ubuntu_sso/utils/ui.py:167 msgid "The certificate has not been verified" msgstr "Il certificato non è stato verificato" #: ../ubuntu_sso/utils/ui.py:168 msgid "Do you want to connect to this server?" msgstr "Connettersi a questo server?" #: ../ubuntu_sso/utils/ui.py:169 msgid "Get Help With SSL" msgstr "Aiuto su SSL" #: ../ubuntu_sso/utils/ui.py:170 #, python-format msgid "" "If you are not sure about this server, do not use it to connect to " "%(app_name)s." msgstr "" "Se non ci si fida di questo server, non utilizzarlo per connettersi a " "%(app_name)s." #: ../ubuntu_sso/utils/ui.py:172 msgid "Remember my settings for this certificate." msgstr "Ricordare le impostazioni per questo certificato" #: ../ubuntu_sso/utils/ui.py:173 msgid "" "The name on the certificate isn't valid or doesn't match the name of the site" msgstr "" "Il nome presente nel certificato non è valido o non corrispondo a quello del " "sito web" #: ../ubuntu_sso/utils/ui.py:175 msgid "The certificate has expired" msgstr "Il certificato è scaduto" #: ../ubuntu_sso/utils/ui.py:176 #, python-format msgid "You are now logged into %(app_name)s." msgstr "Connessi a %(app_name)s." #: ../ubuntu_sso/utils/ui.py:177 msgid "Surname" msgstr "Cognome" #: ../ubuntu_sso/utils/ui.py:178 msgid "Terms of Service" msgstr "Condizioni del servizio" #: ../ubuntu_sso/utils/ui.py:179 msgid "Sign Up to {app_name}" msgstr "Iscrizione a {app_name}" #: ../ubuntu_sso/utils/ui.py:180 msgid "Show Terms & Conditions" msgstr "Mostra Condizioni d'uso" #: ../ubuntu_sso/utils/ui.py:181 #, python-format msgid "" "Agreeing to the %(app_name)s Terms & Conditions is required to subscribe." msgstr "" "Per iscriversi è necessario accettare le «Condizioni d'uso» di %(app_name)s." #: ../ubuntu_sso/utils/ui.py:183 #, python-format msgid "You can also find these terms at %(url)s" msgstr "" "È possibile leggere queste stesse condizioni presso: %(url)s" #: ../ubuntu_sso/utils/ui.py:184 msgid "Try again" msgstr "Riprova" #: ../ubuntu_sso/utils/ui.py:185 msgid "" "There was an error when trying to complete the process. Please check the " "information and try again." msgstr "" "Si è verificato un errore nel tentativo di completare il processo. " "Controllare le informazioni e provare nuovamente." #: ../ubuntu_sso/utils/ui.py:187 msgid "Verification code" msgstr "Codice di verifica" #: ../ubuntu_sso/utils/ui.py:188 #, python-format msgid "" "Check %(email)s for an email from Ubuntu Single Sign On. This message " "contains a verification code. Enter the code in the field below and click OK " "to complete creating your %(app_name)s account." msgstr "" "Controllare %(email)s per un'email da Ubuntu Single Sign On contenente un " "codice di verifica. Inserire tale codice nel campo sottostante e premere OK " "per completare la creazione dell'account %(app_name)s." #: ../ubuntu_sso/utils/ui.py:192 msgid "Enter verification code" msgstr "Inserire il codice di verifica" #: ../ubuntu_sso/utils/ui.py:195 #, python-format msgid "I agree with the %(app_name)s terms and conditions" msgstr "Accetto le condizioni d'uso di %(app_name)s" #: ../ubuntu_sso/utils/ui.py:196 #, python-format msgid "Yes! Email me %(app_name)s tips and updates." msgstr "" "Sì, inviatemi per email suggerimenti e aggiornamenti per %(app_name)s" ubuntu-sso-client-13.10/po/id.po0000664000202700020270000002761312151461656016734 0ustar dobeydobey00000000000000# Indonesian translation for ubuntu-sso-client # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the ubuntu-sso-client package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: ubuntu-sso-client\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-09-11 18:25+0000\n" "PO-Revision-Date: 2011-01-19 07:22+0000\n" "Last-Translator: Abdul Munif Hanafi \n" "Language-Team: Indonesian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-09-17 18:24+0000\n" "X-Generator: Launchpad (build 15944)\n" #. Undefined variable '_', pylint: disable=E0602 #. all the text that is used in the gui #: ../ubuntu_sso/utils/ui.py:49 msgid "By signing up to {app_name} you agree to our {privacy_policy}" msgstr "" #: ../ubuntu_sso/utils/ui.py:51 msgid "By signing up to {app_name} you agree to our {terms_and_conditions}" msgstr "" #: ../ubuntu_sso/utils/ui.py:53 msgid " and {privacy_policy}" msgstr "" #: ../ubuntu_sso/utils/ui.py:54 msgid "Cancel" msgstr "" #: ../ubuntu_sso/utils/ui.py:55 msgid "Type the characters above" msgstr "Ketik karakter diatas" #: ../ubuntu_sso/utils/ui.py:56 msgid "There was a problem getting the captcha, reloading..." msgstr "Ada masalah mendapatkan captcha, memuat ulang..." #: ../ubuntu_sso/utils/ui.py:58 #, python-format msgid "If you can't read this then %(reload_link)s this page" msgstr "" #: ../ubuntu_sso/utils/ui.py:60 msgid "refresh" msgstr "" #: ../ubuntu_sso/utils/ui.py:61 msgid "Reload" msgstr "Muat ulang" #: ../ubuntu_sso/utils/ui.py:62 msgid "The captcha is a required field" msgstr "" #: ../ubuntu_sso/utils/ui.py:63 msgid "Close window and set up later" msgstr "" #: ../ubuntu_sso/utils/ui.py:64 msgid "Congratulations, {app_name} is installed!" msgstr "" #: ../ubuntu_sso/utils/ui.py:65 #, python-format msgid "To connect this computer to %(app_name)s enter your details below." msgstr "" "Untuk menhubungkan komputer ini dengan %(app_name)s masukkan rincian anda " "dibawah ini." #: ../ubuntu_sso/utils/ui.py:67 msgid "Register with {app_name}." msgstr "" #: ../ubuntu_sso/utils/ui.py:68 ../ubuntu_sso/utils/ui.py:93 #: ../ubuntu_sso/utils/ui.py:143 msgid "Email address" msgstr "Alamat surel" #: ../ubuntu_sso/utils/ui.py:69 msgid "Re-type Email address" msgstr "Ketik ulang alamat Surel" #: ../ubuntu_sso/utils/ui.py:70 msgid "The email must be a valid email address." msgstr "Alamat surel harus alamat surel yang valid." #: ../ubuntu_sso/utils/ui.py:71 msgid "" "The email addresses don't match, please double check and try entering them " "again." msgstr "" "Alamat surel tidak cocok, silakan periksa dua kali dan coba memasukkannya " "lagi." #: ../ubuntu_sso/utils/ui.py:73 msgid "Email" msgstr "" #: ../ubuntu_sso/utils/ui.py:74 msgid "The email addresses do not match" msgstr "" #: ../ubuntu_sso/utils/ui.py:75 msgid "Enter code verification here" msgstr "Masukkan kode verifikasi disini" #: ../ubuntu_sso/utils/ui.py:76 msgid "Please enter your name" msgstr "" #: ../ubuntu_sso/utils/ui.py:77 msgid "The process did not finish successfully." msgstr "Proses tidak berhasil." #: ../ubuntu_sso/utils/ui.py:79 msgid "Sign me in with my existing account" msgstr "" #: ../ubuntu_sso/utils/ui.py:80 msgid "This field is required." msgstr "Kolom ini diperlukan." #: ../ubuntu_sso/utils/ui.py:81 msgid "I've forgotten my password" msgstr "Saya lupa kata sandi saya" #: ../ubuntu_sso/utils/ui.py:82 ../ubuntu_sso/utils/ui.py:130 msgid "Reset password" msgstr "Atur ulang kata sandi" #: ../ubuntu_sso/utils/ui.py:83 msgid "" "To reset your {app_name} password, enter your registered email address " "below. We will send instructions to reset your password." msgstr "" #: ../ubuntu_sso/utils/ui.py:86 msgid "Please enter a valid email address" msgstr "" #: ../ubuntu_sso/utils/ui.py:87 msgid "There was a problem accessing the Ubuntu Single Sign On backend." msgstr "" #: ../ubuntu_sso/utils/ui.py:89 #, python-format msgid "Create %(app_name)s account" msgstr "Buat akun %(app_name)s" #: ../ubuntu_sso/utils/ui.py:90 msgid "Loading..." msgstr "Memuat..." #: ../ubuntu_sso/utils/ui.py:91 msgid "Getting information, please wait..." msgstr "" #: ../ubuntu_sso/utils/ui.py:92 msgid "Already have an account? Click here to sign in" msgstr "Sudah memiliki akun? Klik disini untuk masuk" #: ../ubuntu_sso/utils/ui.py:94 #, python-format msgid "Connect to %(app_name)s" msgstr "Terhubung ke %(app_name)s" #: ../ubuntu_sso/utils/ui.py:95 ../ubuntu_sso/utils/ui.py:109 msgid "Password" msgstr "Kata Sandi" #: ../ubuntu_sso/utils/ui.py:97 msgid "Sign In to {app_name}" msgstr "" #: ../ubuntu_sso/utils/ui.py:99 msgid "Name" msgstr "Nama" #: ../ubuntu_sso/utils/ui.py:100 msgid "The name must not be empty." msgstr "" #: ../ubuntu_sso/utils/ui.py:101 msgid "Next" msgstr "Selanjutnya" #: ../ubuntu_sso/utils/ui.py:102 msgid "Network detection" msgstr "" #: ../ubuntu_sso/utils/ui.py:103 #, python-format msgid "" "Are you online? We can't detect an internet connection - you will need to be " "connected to set up %(app_name)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:105 msgid "One moment please..." msgstr "Mohon tunggu sebentar..." #: ../ubuntu_sso/utils/ui.py:106 msgid "Create a password" msgstr "" #: ../ubuntu_sso/utils/ui.py:107 msgid "Your password was successfully changed." msgstr "Kata sandi anda berhasil diubah." #: ../ubuntu_sso/utils/ui.py:108 msgid "At least one number" msgstr "" #: ../ubuntu_sso/utils/ui.py:110 msgid "Re-type Password" msgstr "Ketik ulang Kata Sandi" #: ../ubuntu_sso/utils/ui.py:111 msgid "" "The password must have a minimum of 8 characters and include one uppercase " "character and one number." msgstr "" "Kata sandi harus memiliki minimal 8 karakter dan termasuk satu huruf besar " "dan satu angka." #: ../ubuntu_sso/utils/ui.py:113 msgid "At least 8 characters" msgstr "" #: ../ubuntu_sso/utils/ui.py:114 msgid "Passwords don't match" msgstr "" #: ../ubuntu_sso/utils/ui.py:115 msgid "" "The passwords don't match, please double check and try entering them again." msgstr "" "Kata sandi tidak cocok, silakan periksa dua kali dan coba memasukkannya lagi." #: ../ubuntu_sso/utils/ui.py:117 msgid "Your password must contain" msgstr "" #: ../ubuntu_sso/utils/ui.py:118 msgid "The password is too weak." msgstr "Kata sandi terlalu lemah." #: ../ubuntu_sso/utils/ui.py:119 msgid "At least one uppercase letter" msgstr "" #: ../ubuntu_sso/utils/ui.py:120 msgid "Privacy Policy" msgstr "" #: ../ubuntu_sso/utils/ui.py:121 msgid "Connecting to:" msgstr "" #: ../ubuntu_sso/utils/ui.py:122 msgid "Proxy Settings" msgstr "" #: ../ubuntu_sso/utils/ui.py:123 msgid "Incorrect login details. Please try again." msgstr "" #: ../ubuntu_sso/utils/ui.py:124 msgid "Please provide login details." msgstr "" #: ../ubuntu_sso/utils/ui.py:125 msgid "You are connecting through a proxy." msgstr "" #: ../ubuntu_sso/utils/ui.py:126 msgid "Get Help With Proxies" msgstr "" #: ../ubuntu_sso/utils/ui.py:127 msgid "Proxy password:" msgstr "" #: ../ubuntu_sso/utils/ui.py:128 msgid "Save and Connect" msgstr "" #: ../ubuntu_sso/utils/ui.py:129 msgid "Proxy username:" msgstr "" #: ../ubuntu_sso/utils/ui.py:131 msgid "" "A password reset code has been sent to your e-mail. Please enter the code " "below along with your new password." msgstr "" #: ../ubuntu_sso/utils/ui.py:133 msgid "Retype email" msgstr "" #: ../ubuntu_sso/utils/ui.py:134 msgid "Retype password" msgstr "" #: ../ubuntu_sso/utils/ui.py:135 #, python-format msgid "To reset your %(app_name)s password, enter your email address below:" msgstr "" "Untuk mengatur ulang kata sandi %(app_name)s, masukkan alamat surel Anda " "dibawah ini:" #: ../ubuntu_sso/utils/ui.py:137 msgid "" "We are very Sorry! The service that signs you on is not responding right " "now\n" "Please try again or come back in a few minutes." msgstr "" #: ../ubuntu_sso/utils/ui.py:140 msgid "Sorry we did not recognize the email address." msgstr "" #: ../ubuntu_sso/utils/ui.py:142 msgid "Reset code" msgstr "Kode atur ulang" #: ../ubuntu_sso/utils/ui.py:145 #, python-format msgid "" "A password reset code has been sent to %(email)s.\n" "Please enter the code below along with your new password." msgstr "" "Kode atur ulang kata sandi telah dikirim ke %(email)s.\n" "Silakan masukkan kode yang tercantum beserta kata sandi Anda yang baru." #: ../ubuntu_sso/utils/ui.py:147 msgid "Set Up Account" msgstr "" #: ../ubuntu_sso/utils/ui.py:148 msgid "I don't have an account yet - sign me up" msgstr "" #: ../ubuntu_sso/utils/ui.py:149 msgid "Sign In" msgstr "" #: ../ubuntu_sso/utils/ui.py:150 msgid "Log-in with my existing account." msgstr "" #: ../ubuntu_sso/utils/ui.py:151 msgid "the appname whose ssl error we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:152 msgid "Certificate details" msgstr "" #: ../ubuntu_sso/utils/ui.py:153 msgid "Connect" msgstr "" #: ../ubuntu_sso/utils/ui.py:154 msgid "the details ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:161 msgid "Open the SSL certificate UI." msgstr "" #: ../ubuntu_sso/utils/ui.py:162 msgid "SSL Certificate Not Valid" msgstr "" #: ../ubuntu_sso/utils/ui.py:163 msgid "the domain whose ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:164 #, python-format msgid "" "You are trying to connect to a proxy server on %(domain)s. This server uses " "a secure connection, and the SSL certificate is not valid because:" msgstr "" #: ../ubuntu_sso/utils/ui.py:167 msgid "The certificate has not been verified" msgstr "" #: ../ubuntu_sso/utils/ui.py:168 msgid "Do you want to connect to this server?" msgstr "" #: ../ubuntu_sso/utils/ui.py:169 msgid "Get Help With SSL" msgstr "" #: ../ubuntu_sso/utils/ui.py:170 #, python-format msgid "" "If you are not sure about this server, do not use it to connect to " "%(app_name)s." msgstr "" #: ../ubuntu_sso/utils/ui.py:172 msgid "Remember my settings for this certificate." msgstr "" #: ../ubuntu_sso/utils/ui.py:173 msgid "" "The name on the certificate isn't valid or doesn't match the name of the site" msgstr "" #: ../ubuntu_sso/utils/ui.py:175 msgid "The certificate has expired" msgstr "" #: ../ubuntu_sso/utils/ui.py:176 #, python-format msgid "You are now logged into %(app_name)s." msgstr "" #: ../ubuntu_sso/utils/ui.py:177 msgid "Surname" msgstr "" #: ../ubuntu_sso/utils/ui.py:178 msgid "Terms of Service" msgstr "" #: ../ubuntu_sso/utils/ui.py:179 msgid "Sign Up to {app_name}" msgstr "" #: ../ubuntu_sso/utils/ui.py:180 msgid "Show Terms & Conditions" msgstr "Tampilkan Syarat & Ketentuan" #: ../ubuntu_sso/utils/ui.py:181 #, python-format msgid "" "Agreeing to the %(app_name)s Terms & Conditions is required to subscribe." msgstr "" #: ../ubuntu_sso/utils/ui.py:183 #, python-format msgid "You can also find these terms at %(url)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:184 msgid "Try again" msgstr "" #: ../ubuntu_sso/utils/ui.py:185 msgid "" "There was an error when trying to complete the process. Please check the " "information and try again." msgstr "" "Terdapat kesalahan ketika mencoba menyelesaikan proses. Silakan periksa " "informasinya dan coba kembali." #: ../ubuntu_sso/utils/ui.py:187 msgid "Verification code" msgstr "" #: ../ubuntu_sso/utils/ui.py:188 #, python-format msgid "" "Check %(email)s for an email from Ubuntu Single Sign On. This message " "contains a verification code. Enter the code in the field below and click OK " "to complete creating your %(app_name)s account." msgstr "" #: ../ubuntu_sso/utils/ui.py:192 msgid "Enter verification code" msgstr "Masukkan kode verifikasi" #: ../ubuntu_sso/utils/ui.py:195 #, python-format msgid "I agree with the %(app_name)s terms and conditions" msgstr "Saya setuju dengan syarat dan ketentuan %(app_name)s" #: ../ubuntu_sso/utils/ui.py:196 #, python-format msgid "Yes! Email me %(app_name)s tips and updates." msgstr "Ya! Kirimi saya surel tentang tip dan pembaruan %(app_name)s ." ubuntu-sso-client-13.10/po/hr.po0000664000202700020270000003521012151461656016741 0ustar dobeydobey00000000000000# Croatian translation for ubuntu-sso-client # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the ubuntu-sso-client package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: ubuntu-sso-client\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-09-11 18:25+0000\n" "PO-Revision-Date: 2012-04-23 12:49+0000\n" "Last-Translator: gogo \n" "Language-Team: Croatian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-09-17 18:24+0000\n" "X-Generator: Launchpad (build 15944)\n" #. Undefined variable '_', pylint: disable=E0602 #. all the text that is used in the gui #: ../ubuntu_sso/utils/ui.py:49 msgid "By signing up to {app_name} you agree to our {privacy_policy}" msgstr "Prijavljivanjem na {app_name} prihvaćate naÅ¡e {privacy_policy}" #: ../ubuntu_sso/utils/ui.py:51 msgid "By signing up to {app_name} you agree to our {terms_and_conditions}" msgstr "Prijavljivanjem na {app_name} prihvaćate naÅ¡e {terms_and_conditions}" #: ../ubuntu_sso/utils/ui.py:53 msgid " and {privacy_policy}" msgstr " i {privacy_policy}" #: ../ubuntu_sso/utils/ui.py:54 msgid "Cancel" msgstr "Otkaži" #: ../ubuntu_sso/utils/ui.py:55 msgid "Type the characters above" msgstr "UpiÅ¡ite gornje znakove" #: ../ubuntu_sso/utils/ui.py:56 msgid "There was a problem getting the captcha, reloading..." msgstr "" "DoÅ¡lo je do greÅ¡ke pri uÄitavanju sigurnosno kôda. Ponovno uÄitavanje..." #: ../ubuntu_sso/utils/ui.py:58 #, python-format msgid "If you can't read this then %(reload_link)s this page" msgstr "Ako ovo možete proÄitati onda %(reload_link)s ovu stranicu" #: ../ubuntu_sso/utils/ui.py:60 msgid "refresh" msgstr "osvježi" #: ../ubuntu_sso/utils/ui.py:61 msgid "Reload" msgstr "Ponovo uÄitaj" #: ../ubuntu_sso/utils/ui.py:62 msgid "The captcha is a required field" msgstr "Polja zahtjevaju sigurnosni kôd" #: ../ubuntu_sso/utils/ui.py:63 msgid "Close window and set up later" msgstr "Zatvori prozor i podesi kasnije" #: ../ubuntu_sso/utils/ui.py:64 msgid "Congratulations, {app_name} is installed!" msgstr "ÄŒestitamo, {app_name} je instaliran!" #: ../ubuntu_sso/utils/ui.py:65 #, python-format msgid "To connect this computer to %(app_name)s enter your details below." msgstr "" "Za spajanje ovog raÄunala na %(app_name)s, u nastavku upiÅ¡ite svoje " "pojedinosti." #: ../ubuntu_sso/utils/ui.py:67 msgid "Register with {app_name}." msgstr "" #: ../ubuntu_sso/utils/ui.py:68 ../ubuntu_sso/utils/ui.py:93 #: ../ubuntu_sso/utils/ui.py:143 msgid "Email address" msgstr "Adresa e-poÅ¡te" #: ../ubuntu_sso/utils/ui.py:69 msgid "Re-type Email address" msgstr "Ponovo upiÅ¡ite adresu e-poÅ¡te" #: ../ubuntu_sso/utils/ui.py:70 msgid "The email must be a valid email address." msgstr "Adresa e-poÅ¡ta mora biti ispravna." #: ../ubuntu_sso/utils/ui.py:71 msgid "" "The email addresses don't match, please double check and try entering them " "again." msgstr "" "Adrese e-poÅ¡te se ne podudaraju, molim provjerite da ste ih ispravno upisali." #: ../ubuntu_sso/utils/ui.py:73 msgid "Email" msgstr "E-poÅ¡ta" #: ../ubuntu_sso/utils/ui.py:74 msgid "The email addresses do not match" msgstr "Adrese e-poÅ¡te se ne podudaraju" #: ../ubuntu_sso/utils/ui.py:75 msgid "Enter code verification here" msgstr "UpiÅ¡ite kôd provjere ovdje" #: ../ubuntu_sso/utils/ui.py:76 msgid "Please enter your name" msgstr "UpiÅ¡ite vaÅ¡e ime" #: ../ubuntu_sso/utils/ui.py:77 msgid "The process did not finish successfully." msgstr "Proces nije uspjeÅ¡no zavrÅ¡io." #: ../ubuntu_sso/utils/ui.py:79 msgid "Sign me in with my existing account" msgstr "Prijavi me na moj postojeći raÄun" #: ../ubuntu_sso/utils/ui.py:80 msgid "This field is required." msgstr "Ovo polje je obavezno." #: ../ubuntu_sso/utils/ui.py:81 msgid "I've forgotten my password" msgstr "Zaboravio/la sam lozinku" #: ../ubuntu_sso/utils/ui.py:82 ../ubuntu_sso/utils/ui.py:130 msgid "Reset password" msgstr "Ponovo postavite lozinku" #: ../ubuntu_sso/utils/ui.py:83 msgid "" "To reset your {app_name} password, enter your registered email address " "below. We will send instructions to reset your password." msgstr "" "Za ponovno postavljanje vaÅ¡e {app_name} lozinke, upiÅ¡ite ispod vaÅ¡u e-poÅ¡tu " "registracije. Poslat ćemo vam upute za ponovno postavljanje vaÅ¡e lozinke." #: ../ubuntu_sso/utils/ui.py:86 msgid "Please enter a valid email address" msgstr "UpiÅ¡ite valjanu adresu e-poÅ¡te" #: ../ubuntu_sso/utils/ui.py:87 msgid "There was a problem accessing the Ubuntu Single Sign On backend." msgstr "" "Dogodio se problem kod pozadinskog pristupa Ubuntu jednokratne prijave." #: ../ubuntu_sso/utils/ui.py:89 #, python-format msgid "Create %(app_name)s account" msgstr "Stvorite %(app_name)s korisniÄki raÄun" #: ../ubuntu_sso/utils/ui.py:90 msgid "Loading..." msgstr "UÄitavanje..." #: ../ubuntu_sso/utils/ui.py:91 msgid "Getting information, please wait..." msgstr "Dobivanje informacija, molim priÄekajte..." #: ../ubuntu_sso/utils/ui.py:92 msgid "Already have an account? Click here to sign in" msgstr "Već imate korisniÄki raÄun? Kliknite ovdje za prijavu." #: ../ubuntu_sso/utils/ui.py:94 #, python-format msgid "Connect to %(app_name)s" msgstr "Spoji se na %(app_name)s" #: ../ubuntu_sso/utils/ui.py:95 ../ubuntu_sso/utils/ui.py:109 msgid "Password" msgstr "Lozinka" #: ../ubuntu_sso/utils/ui.py:97 msgid "Sign In to {app_name}" msgstr "Prijavi se na {app_name}" #: ../ubuntu_sso/utils/ui.py:99 msgid "Name" msgstr "Ime" #: ../ubuntu_sso/utils/ui.py:100 msgid "The name must not be empty." msgstr "Ime ne smije biti prazno." #: ../ubuntu_sso/utils/ui.py:101 msgid "Next" msgstr "Dalje" #: ../ubuntu_sso/utils/ui.py:102 msgid "Network detection" msgstr "Otkrivanje mreže" #: ../ubuntu_sso/utils/ui.py:103 #, python-format msgid "" "Are you online? We can't detect an internet connection - you will need to be " "connected to set up %(app_name)s" msgstr "" "Jeste li online? Ne možemo otkriti internet vezu - morate se povezati na " "internet za podeÅ¡avanje %(app_name)s" #: ../ubuntu_sso/utils/ui.py:105 msgid "One moment please..." msgstr "Trenutak molim..." #: ../ubuntu_sso/utils/ui.py:106 msgid "Create a password" msgstr "Napravi lozinku" #: ../ubuntu_sso/utils/ui.py:107 msgid "Your password was successfully changed." msgstr "VaÅ¡a je lozinka uspjeÅ¡no promijenjena." #: ../ubuntu_sso/utils/ui.py:108 msgid "At least one number" msgstr "Najmanje jedan broj" #: ../ubuntu_sso/utils/ui.py:110 msgid "Re-type Password" msgstr "Ponovo upiÅ¡ite lozinku" #: ../ubuntu_sso/utils/ui.py:111 msgid "" "The password must have a minimum of 8 characters and include one uppercase " "character and one number." msgstr "" "Lozinka mora imati najmanje 8 znakova, ukljuÄujući jedno veliko slovo i " "jedan broj." #: ../ubuntu_sso/utils/ui.py:113 msgid "At least 8 characters" msgstr "Najmanje 8 znamenki" #: ../ubuntu_sso/utils/ui.py:114 msgid "Passwords don't match" msgstr "Lozinke se ne podudaraju" #: ../ubuntu_sso/utils/ui.py:115 msgid "" "The passwords don't match, please double check and try entering them again." msgstr "" "Lozinke se ne podudaraju, provjerite jesu li dobro upisane i pokuÅ¡ajte " "ponovo." #: ../ubuntu_sso/utils/ui.py:117 msgid "Your password must contain" msgstr "VaÅ¡a lozinka mora sadržavati" #: ../ubuntu_sso/utils/ui.py:118 msgid "The password is too weak." msgstr "Lozinka je preslaba." #: ../ubuntu_sso/utils/ui.py:119 msgid "At least one uppercase letter" msgstr "Najmanje jedno veliko slovo" #: ../ubuntu_sso/utils/ui.py:120 msgid "Privacy Policy" msgstr "Pravila privatnosti" #: ../ubuntu_sso/utils/ui.py:121 msgid "Connecting to:" msgstr "Spajanje na:" #: ../ubuntu_sso/utils/ui.py:122 msgid "Proxy Settings" msgstr "Proxy postavke" #: ../ubuntu_sso/utils/ui.py:123 msgid "Incorrect login details. Please try again." msgstr "Neispravne pojedinosti spajanja. PokuÅ¡ajte ponovo." #: ../ubuntu_sso/utils/ui.py:124 msgid "Please provide login details." msgstr "UpiÅ¡ite pojedinosti prijave." #: ../ubuntu_sso/utils/ui.py:125 msgid "You are connecting through a proxy." msgstr "Spajate se kroz proxy." #: ../ubuntu_sso/utils/ui.py:126 msgid "Get Help With Proxies" msgstr "Potražite pomoć za proxy" #: ../ubuntu_sso/utils/ui.py:127 msgid "Proxy password:" msgstr "Proxy lozinka:" #: ../ubuntu_sso/utils/ui.py:128 msgid "Save and Connect" msgstr "Spremi i poveži se" #: ../ubuntu_sso/utils/ui.py:129 msgid "Proxy username:" msgstr "Proxy korisniÄko ime:" #: ../ubuntu_sso/utils/ui.py:131 msgid "" "A password reset code has been sent to your e-mail. Please enter the code " "below along with your new password." msgstr "" "Kôd za ponovno obnavljanje lozinke poslan je na vaÅ¡u e-poÅ¡tu. UpiÅ¡ite kôd " "ispod zajedno sa vaÅ¡om novom lozinkom." #: ../ubuntu_sso/utils/ui.py:133 msgid "Retype email" msgstr "Ponovo piÅ¡ite e-poÅ¡tu" #: ../ubuntu_sso/utils/ui.py:134 msgid "Retype password" msgstr "Ponovo upiÅ¡ite lozinku" #: ../ubuntu_sso/utils/ui.py:135 #, python-format msgid "To reset your %(app_name)s password, enter your email address below:" msgstr "" "Za ponovno vraćanje svoje %(app_name)s lozinke, upiÅ¡ite ispod adresu svoje e-" "poÅ¡te:" #: ../ubuntu_sso/utils/ui.py:137 msgid "" "We are very Sorry! The service that signs you on is not responding right " "now\n" "Please try again or come back in a few minutes." msgstr "" "Žao nam je! Usluga prijavljivanja trenutno ne reagira.\n" "PokuÅ¡ajte ponovno odmah ili za nekoliko minuta." #: ../ubuntu_sso/utils/ui.py:140 msgid "Sorry we did not recognize the email address." msgstr "Žalimo, nepoznata adresa e-poÅ¡te." #: ../ubuntu_sso/utils/ui.py:142 msgid "Reset code" msgstr "Resetiraj kôd" #: ../ubuntu_sso/utils/ui.py:145 #, python-format msgid "" "A password reset code has been sent to %(email)s.\n" "Please enter the code below along with your new password." msgstr "" "Kôd za ponovno obnavljanje lozinke poslan je na %(email)s.\n" "UpiÅ¡ite kôd ispod zajedno sa vaÅ¡om novom lozinkom." #: ../ubuntu_sso/utils/ui.py:147 msgid "Set Up Account" msgstr "Podesite raÄun" #: ../ubuntu_sso/utils/ui.py:148 msgid "I don't have an account yet - sign me up" msgstr "JoÅ¡ nemam raÄun - prijavi me" #: ../ubuntu_sso/utils/ui.py:149 msgid "Sign In" msgstr "Prijava" #: ../ubuntu_sso/utils/ui.py:150 msgid "Log-in with my existing account." msgstr "" #: ../ubuntu_sso/utils/ui.py:151 msgid "the appname whose ssl error we are going to show." msgstr "naziv aplikacije Äiju ssl greÅ¡ku ćemo prikazati." #: ../ubuntu_sso/utils/ui.py:152 msgid "Certificate details" msgstr "Pojedinosti potvrde" #: ../ubuntu_sso/utils/ui.py:153 msgid "Connect" msgstr "Povezivanje" #: ../ubuntu_sso/utils/ui.py:154 msgid "the details ssl certificate we are going to show." msgstr "pojedinosti ssl potvrde koju ćemo prikazati." #: ../ubuntu_sso/utils/ui.py:161 msgid "Open the SSL certificate UI." msgstr "Otvori korisniÄko suÄelje SSl potvrde." #: ../ubuntu_sso/utils/ui.py:162 msgid "SSL Certificate Not Valid" msgstr "SSL potvrda nije valjana" #: ../ubuntu_sso/utils/ui.py:163 msgid "the domain whose ssl certificate we are going to show." msgstr "domena Äiju ssl potvrdu ćemo prikazati." #: ../ubuntu_sso/utils/ui.py:164 #, python-format msgid "" "You are trying to connect to a proxy server on %(domain)s. This server uses " "a secure connection, and the SSL certificate is not valid because:" msgstr "" "PokuÅ¡avate se spojiti na proxy poslužitelj na %(domain)s. Ovaj poslužitelj " "koristi sigurnu vezu i SSL potvrda nije valjana zbog:" #: ../ubuntu_sso/utils/ui.py:167 msgid "The certificate has not been verified" msgstr "Potvrda nije provjerena" #: ../ubuntu_sso/utils/ui.py:168 msgid "Do you want to connect to this server?" msgstr "Želite li se povezati na ovaj poslužitelj?" #: ../ubuntu_sso/utils/ui.py:169 msgid "Get Help With SSL" msgstr "Potražite pomoć za SSL" #: ../ubuntu_sso/utils/ui.py:170 #, python-format msgid "" "If you are not sure about this server, do not use it to connect to " "%(app_name)s." msgstr "" "Ako niste sigurni o ovom poslužitelju, nemojte ga koristiti za spajanje na " "%(app_name)s." #: ../ubuntu_sso/utils/ui.py:172 msgid "Remember my settings for this certificate." msgstr "Zapamti moje postavke za ovu potvrdu." #: ../ubuntu_sso/utils/ui.py:173 msgid "" "The name on the certificate isn't valid or doesn't match the name of the site" msgstr "Naziv na potvrdi nije valjan ili se ne podudara sa nazivom stranice." #: ../ubuntu_sso/utils/ui.py:175 msgid "The certificate has expired" msgstr "Potvrda je istekla" #: ../ubuntu_sso/utils/ui.py:176 #, python-format msgid "You are now logged into %(app_name)s." msgstr "Sada ste prijavljeni na %(app_name)s." #: ../ubuntu_sso/utils/ui.py:177 msgid "Surname" msgstr "Prezime" #: ../ubuntu_sso/utils/ui.py:178 msgid "Terms of Service" msgstr "Pravila koriÅ¡tenja" #: ../ubuntu_sso/utils/ui.py:179 msgid "Sign Up to {app_name}" msgstr "Prijavite se na {app_name}" #: ../ubuntu_sso/utils/ui.py:180 msgid "Show Terms & Conditions" msgstr "Prikaži pravila i uvjete koriÅ¡tenja" #: ../ubuntu_sso/utils/ui.py:181 #, python-format msgid "" "Agreeing to the %(app_name)s Terms & Conditions is required to subscribe." msgstr "" "Prihvaćanje %(app_name)s pravila i uvjeta koriÅ¡tenja potrebno je za " "pretplatu." #: ../ubuntu_sso/utils/ui.py:183 #, python-format msgid "You can also find these terms at %(url)s" msgstr "Ta pravila možete pronaći na %(url)s" #: ../ubuntu_sso/utils/ui.py:184 msgid "Try again" msgstr "PokuÅ¡aj ponovo" #: ../ubuntu_sso/utils/ui.py:185 msgid "" "There was an error when trying to complete the process. Please check the " "information and try again." msgstr "" "DoÅ¡lo je do greÅ¡ke prilikom dovrÅ¡avanja procesa. Provjerite informacije i " "pokuÅ¡ajte ponovno." #: ../ubuntu_sso/utils/ui.py:187 msgid "Verification code" msgstr "Kôd potvrde" #: ../ubuntu_sso/utils/ui.py:188 #, python-format msgid "" "Check %(email)s for an email from Ubuntu Single Sign On. This message " "contains a verification code. Enter the code in the field below and click OK " "to complete creating your %(app_name)s account." msgstr "" "Provjeri %(email)s za e-poÅ¡tu poslanu od Ubuntu jednokratne prijave. Ova " "poruka sadrži kôd potvrde. UpiÅ¡ite kôd u polje ispod i kliknite 'U redu' za " "dovrÅ¡etak stvaranja %(app_name)s raÄuna." #: ../ubuntu_sso/utils/ui.py:192 msgid "Enter verification code" msgstr "UpiÅ¡ite kôd provjere" #: ../ubuntu_sso/utils/ui.py:195 #, python-format msgid "I agree with the %(app_name)s terms and conditions" msgstr "Slažem se s %(app_name)s uvjetima koriÅ¡tenja" #: ../ubuntu_sso/utils/ui.py:196 #, python-format msgid "Yes! Email me %(app_name)s tips and updates." msgstr "Da! Å aljite mi %(app_name)s savjete i novosti." ubuntu-sso-client-13.10/po/sq.po0000664000202700020270000003631512151461656016762 0ustar dobeydobey00000000000000# Albanian translation for ubuntu-sso-client # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the ubuntu-sso-client package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: ubuntu-sso-client\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-09-11 18:25+0000\n" "PO-Revision-Date: 2012-09-09 12:15+0000\n" "Last-Translator: Vilson Gjeci \n" "Language-Team: Albanian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-09-17 18:24+0000\n" "X-Generator: Launchpad (build 15944)\n" #. Undefined variable '_', pylint: disable=E0602 #. all the text that is used in the gui #: ../ubuntu_sso/utils/ui.py:49 msgid "By signing up to {app_name} you agree to our {privacy_policy}" msgstr "Duke u regjistruar tek {app_name} ju bini dakord me {privacy_policy}" #: ../ubuntu_sso/utils/ui.py:51 msgid "By signing up to {app_name} you agree to our {terms_and_conditions}" msgstr "" "Duke u regjistruar tek {app_name} ju bini dakord me {terms_and_conditions}" #: ../ubuntu_sso/utils/ui.py:53 msgid " and {privacy_policy}" msgstr " dhe {privacy_policy}" #: ../ubuntu_sso/utils/ui.py:54 msgid "Cancel" msgstr "Anullo" #: ../ubuntu_sso/utils/ui.py:55 msgid "Type the characters above" msgstr "Shtypni gërmat e mësipërme" #: ../ubuntu_sso/utils/ui.py:56 msgid "There was a problem getting the captcha, reloading..." msgstr "Pati një problem në marrjen a captcha, duke ringarkuar..." #: ../ubuntu_sso/utils/ui.py:58 #, python-format msgid "If you can't read this then %(reload_link)s this page" msgstr "Nëse nuk mund ta lexoni këtë atëherë %(reload_link)s këtë faqe" #: ../ubuntu_sso/utils/ui.py:60 msgid "refresh" msgstr "rifresko" #: ../ubuntu_sso/utils/ui.py:61 msgid "Reload" msgstr "Ringarko" #: ../ubuntu_sso/utils/ui.py:62 msgid "The captcha is a required field" msgstr "Gërmat e përthyera kërkohen për këtë fushë" #: ../ubuntu_sso/utils/ui.py:63 msgid "Close window and set up later" msgstr "Mbylle dritaren dhe vendose më vonë" #: ../ubuntu_sso/utils/ui.py:64 msgid "Congratulations, {app_name} is installed!" msgstr "Urime, {app_name} u instalua!" #: ../ubuntu_sso/utils/ui.py:65 #, python-format msgid "To connect this computer to %(app_name)s enter your details below." msgstr "" "Për ta lidhur këtë kompjuter me %(app_name)s vendosni detajet tuaja më " "poshtë." #: ../ubuntu_sso/utils/ui.py:67 msgid "Register with {app_name}." msgstr "Regjistrohu me {app_name}." #: ../ubuntu_sso/utils/ui.py:68 ../ubuntu_sso/utils/ui.py:93 #: ../ubuntu_sso/utils/ui.py:143 msgid "Email address" msgstr "Adresa Email" #: ../ubuntu_sso/utils/ui.py:69 msgid "Re-type Email address" msgstr "Ri-shtypni adresën email" #: ../ubuntu_sso/utils/ui.py:70 msgid "The email must be a valid email address." msgstr "Email duhet të jetë një adresë e vlefshme." #: ../ubuntu_sso/utils/ui.py:71 msgid "" "The email addresses don't match, please double check and try entering them " "again." msgstr "" "Adresat email nuk përputhen, ju lutemi t'i kontrolloni dhe provoni t'i " "vendosni përsëri ato." #: ../ubuntu_sso/utils/ui.py:73 msgid "Email" msgstr "Email" #: ../ubuntu_sso/utils/ui.py:74 msgid "The email addresses do not match" msgstr "Adresat e email nuk përputhen" #: ../ubuntu_sso/utils/ui.py:75 msgid "Enter code verification here" msgstr "Vendosni kodin e verifikimit këtu" #: ../ubuntu_sso/utils/ui.py:76 msgid "Please enter your name" msgstr "Ju lutemi të vendosni emrin" #: ../ubuntu_sso/utils/ui.py:77 msgid "The process did not finish successfully." msgstr "Proçesi nuk mbaroi me sukses." #: ../ubuntu_sso/utils/ui.py:79 msgid "Sign me in with my existing account" msgstr "Më regjistro me llogarinë time ekzistuese" #: ../ubuntu_sso/utils/ui.py:80 msgid "This field is required." msgstr "Kjo fushë është e domosdoshme." #: ../ubuntu_sso/utils/ui.py:81 msgid "I've forgotten my password" msgstr "Kam harruar fjalëkalimin tim" #: ../ubuntu_sso/utils/ui.py:82 ../ubuntu_sso/utils/ui.py:130 msgid "Reset password" msgstr "Rivendos fjalëkalimin" #: ../ubuntu_sso/utils/ui.py:83 msgid "" "To reset your {app_name} password, enter your registered email address " "below. We will send instructions to reset your password." msgstr "" "Për të hequr fjalëkalimin e {app_name}, vendosni adresën email me të cilën " "jeni regjstruar këtu. Do t'iu dërgojmë udhëzime se si ta fshini fjalëkalimin." #: ../ubuntu_sso/utils/ui.py:86 msgid "Please enter a valid email address" msgstr "Ju lutemi të vendosni një adresë email të vlefshme" #: ../ubuntu_sso/utils/ui.py:87 msgid "There was a problem accessing the Ubuntu Single Sign On backend." msgstr "Pati një problem në hyrjen tek programthi Ubuntu Single Sign On." #: ../ubuntu_sso/utils/ui.py:89 #, python-format msgid "Create %(app_name)s account" msgstr "Krijoni llogari për %(app_name)s" #: ../ubuntu_sso/utils/ui.py:90 msgid "Loading..." msgstr "Duke Ngarkuar..." #: ../ubuntu_sso/utils/ui.py:91 msgid "Getting information, please wait..." msgstr "Duke marrë informacion, ju lutemi të prisni..." #: ../ubuntu_sso/utils/ui.py:92 msgid "Already have an account? Click here to sign in" msgstr "Keni një llogari tashmë? Klikoni këtu për tu regjistruar" #: ../ubuntu_sso/utils/ui.py:94 #, python-format msgid "Connect to %(app_name)s" msgstr "Lidhu me %(app_name)s" #: ../ubuntu_sso/utils/ui.py:95 ../ubuntu_sso/utils/ui.py:109 msgid "Password" msgstr "Fjalëkalimi" #: ../ubuntu_sso/utils/ui.py:97 msgid "Sign In to {app_name}" msgstr "Futu tek {app_name}" #: ../ubuntu_sso/utils/ui.py:99 msgid "Name" msgstr "Emri" #: ../ubuntu_sso/utils/ui.py:100 msgid "The name must not be empty." msgstr "Emri nuk duhet të jetë bosh" #: ../ubuntu_sso/utils/ui.py:101 msgid "Next" msgstr "Tjetër" #: ../ubuntu_sso/utils/ui.py:102 msgid "Network detection" msgstr "Dallimi i rrjetit" #: ../ubuntu_sso/utils/ui.py:103 #, python-format msgid "" "Are you online? We can't detect an internet connection - you will need to be " "connected to set up %(app_name)s" msgstr "" "Jeni në linjë? Nuk munda të dalloj një lidhje interneti - nevojitet të jeni " "të lidhur për të rregulluar %(app_name)s" #: ../ubuntu_sso/utils/ui.py:105 msgid "One moment please..." msgstr "Një moment ju lutem..." #: ../ubuntu_sso/utils/ui.py:106 msgid "Create a password" msgstr "Krijo një fjalëkalim" #: ../ubuntu_sso/utils/ui.py:107 msgid "Your password was successfully changed." msgstr "Fjalëkalimi juaj u ndryshua me sukses." #: ../ubuntu_sso/utils/ui.py:108 msgid "At least one number" msgstr "Të paktën një numër" #: ../ubuntu_sso/utils/ui.py:110 msgid "Re-type Password" msgstr "Ri-shtypni fjalëkalimin" #: ../ubuntu_sso/utils/ui.py:111 msgid "" "The password must have a minimum of 8 characters and include one uppercase " "character and one number." msgstr "" "Fjalëkalimi duhet të ketë një minimum prej 8 gërmash dhe të përfshijë një " "gërmë me shkronjë kapitale dhe një numbër." #: ../ubuntu_sso/utils/ui.py:113 msgid "At least 8 characters" msgstr "Të paktën 8 karaktere" #: ../ubuntu_sso/utils/ui.py:114 msgid "Passwords don't match" msgstr "Fjalëkalimet nuk përputhen" #: ../ubuntu_sso/utils/ui.py:115 msgid "" "The passwords don't match, please double check and try entering them again." msgstr "" "Fjalëkalimet nuk janë të njëjtë, ju lutem kontrollojini dhe shkruajini " "përsëri ato." #: ../ubuntu_sso/utils/ui.py:117 msgid "Your password must contain" msgstr "Fjalëkalimi juaj duhet të përmbajë" #: ../ubuntu_sso/utils/ui.py:118 msgid "The password is too weak." msgstr "Fjalëkalimi është shumë i dobët." #: ../ubuntu_sso/utils/ui.py:119 msgid "At least one uppercase letter" msgstr "Të paktën një gërmë kapitale" #: ../ubuntu_sso/utils/ui.py:120 msgid "Privacy Policy" msgstr "Politika e Intimitetit" #: ../ubuntu_sso/utils/ui.py:121 msgid "Connecting to:" msgstr "Duke u lidhur tek:" #: ../ubuntu_sso/utils/ui.py:122 msgid "Proxy Settings" msgstr "Konfigurimi i Proxy" #: ../ubuntu_sso/utils/ui.py:123 msgid "Incorrect login details. Please try again." msgstr "Detaje të pasakta hyrjeje. Ju lutemi ta provoni përsëri." #: ../ubuntu_sso/utils/ui.py:124 msgid "Please provide login details." msgstr "Ju lutemi të jepni detajet e hyrjes." #: ../ubuntu_sso/utils/ui.py:125 msgid "You are connecting through a proxy." msgstr "Ju po lidheni me anë të një proxy." #: ../ubuntu_sso/utils/ui.py:126 msgid "Get Help With Proxies" msgstr "Merrni ndihmë me Proksit" #: ../ubuntu_sso/utils/ui.py:127 msgid "Proxy password:" msgstr "Fjalëkalimi i proksit:" #: ../ubuntu_sso/utils/ui.py:128 msgid "Save and Connect" msgstr "Ruaje dhe Lidhu" #: ../ubuntu_sso/utils/ui.py:129 msgid "Proxy username:" msgstr "Emri i përdoruesit të proksit:" #: ../ubuntu_sso/utils/ui.py:131 msgid "" "A password reset code has been sent to your e-mail. Please enter the code " "below along with your new password." msgstr "" "Një kod për heqjen e fjalëkalimit është dërguar në emailin tuaj. Ju lutemi " "ta vendosni kodin poshtë sëbashku me fjalëkalimin tuaj të ri." #: ../ubuntu_sso/utils/ui.py:133 msgid "Retype email" msgstr "Rishtype email-in" #: ../ubuntu_sso/utils/ui.py:134 msgid "Retype password" msgstr "Rishkruaj fjalëkalimin" #: ../ubuntu_sso/utils/ui.py:135 #, python-format msgid "To reset your %(app_name)s password, enter your email address below:" msgstr "" "Për të ndryshuar fjalëkalimin e %(app_name)s, shkruani adresën tuaj të email-" "it më poshtë." #: ../ubuntu_sso/utils/ui.py:137 msgid "" "We are very Sorry! The service that signs you on is not responding right " "now\n" "Please try again or come back in a few minutes." msgstr "" "Na vjen shumë keq! Shërbimi që ju regjistron nuk po përgjgjet për momentin\n" "Ju lutemi ta provoni përsëri ose të ktheheni pas disa minutash." #: ../ubuntu_sso/utils/ui.py:140 msgid "Sorry we did not recognize the email address." msgstr "Na vjen keq, nuk e njohëm adresën email" #: ../ubuntu_sso/utils/ui.py:142 msgid "Reset code" msgstr "Rivendos kodin" #: ../ubuntu_sso/utils/ui.py:145 #, python-format msgid "" "A password reset code has been sent to %(email)s.\n" "Please enter the code below along with your new password." msgstr "" "Një kod për të ndryshuar fjalëkalimin është dërguar tek %(email)s.\n" "Ju lutem shkruani kodin dhe fjalëkalimin më poshtë." #: ../ubuntu_sso/utils/ui.py:147 msgid "Set Up Account" msgstr "Krijo Llogari" #: ../ubuntu_sso/utils/ui.py:148 msgid "I don't have an account yet - sign me up" msgstr "Nuk kam një llogari - regjistromë" #: ../ubuntu_sso/utils/ui.py:149 msgid "Sign In" msgstr "Hyr" #: ../ubuntu_sso/utils/ui.py:150 msgid "Log-in with my existing account." msgstr "Hyrje me llogarinë time ekzistuese." #: ../ubuntu_sso/utils/ui.py:151 msgid "the appname whose ssl error we are going to show." msgstr "Emri i programit për të cilin do të shfaqim gabimin ssl." #: ../ubuntu_sso/utils/ui.py:152 msgid "Certificate details" msgstr "Detajet e çertifikatës" #: ../ubuntu_sso/utils/ui.py:153 msgid "Connect" msgstr "Lidhu" #: ../ubuntu_sso/utils/ui.py:154 msgid "the details ssl certificate we are going to show." msgstr "Detajet që çertifikata ssl do të shfaqë." #: ../ubuntu_sso/utils/ui.py:161 msgid "Open the SSL certificate UI." msgstr "Hap UI të çertifikatës SSL." #: ../ubuntu_sso/utils/ui.py:162 msgid "SSL Certificate Not Valid" msgstr "Çertifikata SSl nuk Është e Vlefshme" #: ../ubuntu_sso/utils/ui.py:163 msgid "the domain whose ssl certificate we are going to show." msgstr "domeini për të cilin do të shfaqim çertifikatën SSL." #: ../ubuntu_sso/utils/ui.py:164 #, python-format msgid "" "You are trying to connect to a proxy server on %(domain)s. This server uses " "a secure connection, and the SSL certificate is not valid because:" msgstr "" "Ju po përpiqeni të ëidheni me një server proksi tek %(domain)s. Ky server " "përdor një lidhje të sigurtë dhe çertifikata SSL nuk është e vlefshme sepse:" #: ../ubuntu_sso/utils/ui.py:167 msgid "The certificate has not been verified" msgstr "Çertifikata nuk është verifikuar" #: ../ubuntu_sso/utils/ui.py:168 msgid "Do you want to connect to this server?" msgstr "Dëshironi të lidheni me këtë server?" #: ../ubuntu_sso/utils/ui.py:169 msgid "Get Help With SSL" msgstr "Merr Ndihmë me SSL" #: ../ubuntu_sso/utils/ui.py:170 #, python-format msgid "" "If you are not sure about this server, do not use it to connect to " "%(app_name)s." msgstr "" "Nëse nuk jeni i sigurtë për këtë server, mos e përdorni për tu lidhur me " "%(app_name)s." #: ../ubuntu_sso/utils/ui.py:172 msgid "Remember my settings for this certificate." msgstr "Mba mend parametrat e mi për këtë çertifikatë." #: ../ubuntu_sso/utils/ui.py:173 msgid "" "The name on the certificate isn't valid or doesn't match the name of the site" msgstr "" "Emri në çertifikatë nuk është i vlefshëm dhe nuk përputhet me emrin e faqes" #: ../ubuntu_sso/utils/ui.py:175 msgid "The certificate has expired" msgstr "Çertifikata ka skaduar" #: ../ubuntu_sso/utils/ui.py:176 #, python-format msgid "You are now logged into %(app_name)s." msgstr "Jeni futur tek %(app_name)s." #: ../ubuntu_sso/utils/ui.py:177 msgid "Surname" msgstr "Mbiemri" #: ../ubuntu_sso/utils/ui.py:178 msgid "Terms of Service" msgstr "Termat e Shërbimit" #: ../ubuntu_sso/utils/ui.py:179 msgid "Sign Up to {app_name}" msgstr "Regjistrohu Tek {app_name}" #: ../ubuntu_sso/utils/ui.py:180 msgid "Show Terms & Conditions" msgstr "Shfaq Temat Dhe Kushtet" #: ../ubuntu_sso/utils/ui.py:181 #, python-format msgid "" "Agreeing to the %(app_name)s Terms & Conditions is required to subscribe." msgstr "" "Pranimi i Termave dhe Kushteve të %(app_name)s kërkohet për tu regjistruar." #: ../ubuntu_sso/utils/ui.py:183 #, python-format msgid "You can also find these terms at %(url)s" msgstr "Ju mund ti gjeni këto terma tek %(url)s" #: ../ubuntu_sso/utils/ui.py:184 msgid "Try again" msgstr "Provo përsëri" #: ../ubuntu_sso/utils/ui.py:185 msgid "" "There was an error when trying to complete the process. Please check the " "information and try again." msgstr "" "U has një gabim kur po mbyllej proçesi. Ju lutem kontrollo informacionet dhe " "provo përsëri." #: ../ubuntu_sso/utils/ui.py:187 msgid "Verification code" msgstr "Kodi i verifikimit" #: ../ubuntu_sso/utils/ui.py:188 #, python-format msgid "" "Check %(email)s for an email from Ubuntu Single Sign On. This message " "contains a verification code. Enter the code in the field below and click OK " "to complete creating your %(app_name)s account." msgstr "" "Kontrolloni %(email)s për një email nga Ubuntu Single Sign On. Ky mesazh " "përmban një kod verifikimi. Vendosni kodin në fushën e mëposhtme dhe klikoni " "OK për të kompletuar krijimin e llogarisë së %(app_name)s tuaj." #: ../ubuntu_sso/utils/ui.py:192 msgid "Enter verification code" msgstr "Vendosni kodin e verifikimit" #: ../ubuntu_sso/utils/ui.py:195 #, python-format msgid "I agree with the %(app_name)s terms and conditions" msgstr "Jam dakord me %(app_name)s temat dhe kushtet" #: ../ubuntu_sso/utils/ui.py:196 #, python-format msgid "Yes! Email me %(app_name)s tips and updates." msgstr "Po! Më dërgoni me Email %(app_name)s këshilla dhe përditësime." ubuntu-sso-client-13.10/po/my.po0000664000202700020270000003440112151461656016756 0ustar dobeydobey00000000000000# Burmese translation for ubuntu-sso-client # Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 # This file is distributed under the same license as the ubuntu-sso-client package. # FIRST AUTHOR , 2011. # msgid "" msgstr "" "Project-Id-Version: ubuntu-sso-client\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-09-11 18:25+0000\n" "PO-Revision-Date: 2011-12-22 00:56+0000\n" "Last-Translator: g00gle \n" "Language-Team: Burmese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-09-17 18:24+0000\n" "X-Generator: Launchpad (build 15944)\n" #. Undefined variable '_', pylint: disable=E0602 #. all the text that is used in the gui #: ../ubuntu_sso/utils/ui.py:49 msgid "By signing up to {app_name} you agree to our {privacy_policy}" msgstr "" #: ../ubuntu_sso/utils/ui.py:51 msgid "By signing up to {app_name} you agree to our {terms_and_conditions}" msgstr "" #: ../ubuntu_sso/utils/ui.py:53 msgid " and {privacy_policy}" msgstr "" #: ../ubuntu_sso/utils/ui.py:54 msgid "Cancel" msgstr "" #: ../ubuntu_sso/utils/ui.py:55 msgid "Type the characters above" msgstr "အထက်မှ စာလုံးများကို ရိုက်ထည့်ပါá‹" #: ../ubuntu_sso/utils/ui.py:56 msgid "There was a problem getting the captcha, reloading..." msgstr "Captcha စာလုံးများ ရယူရာá€á€½á€„် ပြဿနာရှိနေပါသည်ዠပြည်လည်ရယူနေပါသည်á‹" #: ../ubuntu_sso/utils/ui.py:58 #, python-format msgid "If you can't read this then %(reload_link)s this page" msgstr "" #: ../ubuntu_sso/utils/ui.py:60 msgid "refresh" msgstr "" #: ../ubuntu_sso/utils/ui.py:61 msgid "Reload" msgstr "" #: ../ubuntu_sso/utils/ui.py:62 msgid "The captcha is a required field" msgstr "" #: ../ubuntu_sso/utils/ui.py:63 msgid "Close window and set up later" msgstr "" #: ../ubuntu_sso/utils/ui.py:64 msgid "Congratulations, {app_name} is installed!" msgstr "" #: ../ubuntu_sso/utils/ui.py:65 #, python-format msgid "To connect this computer to %(app_name)s enter your details below." msgstr "" "ဤကွန်ပျူá€á€¬á€€á€­á€¯ %(app_name)s နှင့်á€á€»á€­á€á€ºá€†á€€á€ºá€›á€”် လိုအပ်သော အá€á€»á€€á€ºá€¡á€œá€€á€ºá€™á€»á€¬á€¸á€€á€­á€¯ " "အောက်á€á€½á€„်ဖြည့်စွက်ပါá‹" #: ../ubuntu_sso/utils/ui.py:67 msgid "Register with {app_name}." msgstr "" #: ../ubuntu_sso/utils/ui.py:68 ../ubuntu_sso/utils/ui.py:93 #: ../ubuntu_sso/utils/ui.py:143 msgid "Email address" msgstr "အီးမေးလိပ်စာ" #: ../ubuntu_sso/utils/ui.py:69 msgid "Re-type Email address" msgstr "အီးမေးလိပ်စာကို ပြန်ရိုက်ပါ" #: ../ubuntu_sso/utils/ui.py:70 msgid "The email must be a valid email address." msgstr "အီးမေးလိပ်စာသည် လက်ရှိအသုံးပြုနေသော အီးမေးဖြစ်ရပါမည်á‹" #: ../ubuntu_sso/utils/ui.py:71 msgid "" "The email addresses don't match, please double check and try entering them " "again." msgstr "အီးမေးလိပ်စာ နှစ်á€á€¯ မá€á€°á€Šá€®á€•ါዠပြန်လည်စစ်ဆေးပြီး á€á€°á€¡á€±á€¬á€„်ပြန်ရိုက်ပါá‹" #: ../ubuntu_sso/utils/ui.py:73 msgid "Email" msgstr "" #: ../ubuntu_sso/utils/ui.py:74 msgid "The email addresses do not match" msgstr "" #: ../ubuntu_sso/utils/ui.py:75 msgid "Enter code verification here" msgstr "Verification ကုဒ်ကို ဤနေရာá€á€½á€„်ရိုက်ပါá‹" #: ../ubuntu_sso/utils/ui.py:76 msgid "Please enter your name" msgstr "" #: ../ubuntu_sso/utils/ui.py:77 msgid "The process did not finish successfully." msgstr "ဤလုပ်ငန်းစဉ် မအောင်မြင်ပါá‹" #: ../ubuntu_sso/utils/ui.py:79 msgid "Sign me in with my existing account" msgstr "" #: ../ubuntu_sso/utils/ui.py:80 msgid "This field is required." msgstr "ဤနေရာá€á€½á€„် ဖြည့်စွက်ရန် လိုအပ်ပါသည်á‹" #: ../ubuntu_sso/utils/ui.py:81 msgid "I've forgotten my password" msgstr "စကားá€á€¾á€€á€ºá€™á€±á€·á€”ေရင်" #: ../ubuntu_sso/utils/ui.py:82 ../ubuntu_sso/utils/ui.py:130 msgid "Reset password" msgstr "စကားá€á€¾á€€á€ºá€€á€­á€¯ ပြန်ပြင်ပါá‹" #: ../ubuntu_sso/utils/ui.py:83 msgid "" "To reset your {app_name} password, enter your registered email address " "below. We will send instructions to reset your password." msgstr "" #: ../ubuntu_sso/utils/ui.py:86 msgid "Please enter a valid email address" msgstr "" #: ../ubuntu_sso/utils/ui.py:87 msgid "There was a problem accessing the Ubuntu Single Sign On backend." msgstr "" #: ../ubuntu_sso/utils/ui.py:89 #, python-format msgid "Create %(app_name)s account" msgstr "%(app_name)s အကောင့် ပြုလုပ်ပါ" #: ../ubuntu_sso/utils/ui.py:90 msgid "Loading..." msgstr "á€á€±á€á€¹á€á€…ောင့်ပါ..." #: ../ubuntu_sso/utils/ui.py:91 msgid "Getting information, please wait..." msgstr "" #: ../ubuntu_sso/utils/ui.py:92 msgid "Already have an account? Click here to sign in" msgstr "အကောင့်ရှိပြီးသားဆိုပါက ဤနေရာကို နှိပ်ပြီးá€á€„်ပါ" #: ../ubuntu_sso/utils/ui.py:94 #, python-format msgid "Connect to %(app_name)s" msgstr "%(app_name)s နှင့်ဆက်သွယ်နေပါသည်" #: ../ubuntu_sso/utils/ui.py:95 ../ubuntu_sso/utils/ui.py:109 msgid "Password" msgstr "စကားá€á€¾á€€á€º" #: ../ubuntu_sso/utils/ui.py:97 msgid "Sign In to {app_name}" msgstr "" #: ../ubuntu_sso/utils/ui.py:99 msgid "Name" msgstr "အမည်" #: ../ubuntu_sso/utils/ui.py:100 msgid "The name must not be empty." msgstr "" #: ../ubuntu_sso/utils/ui.py:101 msgid "Next" msgstr "ရှေ့သို့" #: ../ubuntu_sso/utils/ui.py:102 msgid "Network detection" msgstr "" #: ../ubuntu_sso/utils/ui.py:103 #, python-format msgid "" "Are you online? We can't detect an internet connection - you will need to be " "connected to set up %(app_name)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:105 msgid "One moment please..." msgstr "á€á€±á€á€¹á€á€…ောင့်ပါ..." #: ../ubuntu_sso/utils/ui.py:106 msgid "Create a password" msgstr "" #: ../ubuntu_sso/utils/ui.py:107 msgid "Your password was successfully changed." msgstr "သင့်စကားá€á€¾á€€á€ºá€€á€­á€¯ ပြောင်းလိုက်ပါပြီá‹" #: ../ubuntu_sso/utils/ui.py:108 msgid "At least one number" msgstr "" #: ../ubuntu_sso/utils/ui.py:110 msgid "Re-type Password" msgstr "စကားá€á€¾á€€á€ºá€€á€­á€¯ ပြန်ရိုက်ပါ" #: ../ubuntu_sso/utils/ui.py:111 msgid "" "The password must have a minimum of 8 characters and include one uppercase " "character and one number." msgstr "" "စကားá€á€¾á€€á€ºá€á€½á€„် အင်္ဂလိပ်စာလုံးအကြီး á€á€…်လုံးአနံပါá€á€º á€á€…်á€á€¯ ပါရမည်ဖြစ်ပြီးአ" "အနည်းဆုံး စာလုံးရေ ሠလုံး ရှိရပါမည်á‹" #: ../ubuntu_sso/utils/ui.py:113 msgid "At least 8 characters" msgstr "" #: ../ubuntu_sso/utils/ui.py:114 msgid "Passwords don't match" msgstr "" #: ../ubuntu_sso/utils/ui.py:115 msgid "" "The passwords don't match, please double check and try entering them again." msgstr "စကားá€á€¾á€€á€º မမှန်ပါዠပြန်လည်စစ်ဆေးပြီး စကားá€á€¾á€€á€ºá€€á€­á€¯ ပြန်ရိုက်ပါá‹" #: ../ubuntu_sso/utils/ui.py:117 msgid "Your password must contain" msgstr "" #: ../ubuntu_sso/utils/ui.py:118 msgid "The password is too weak." msgstr "ဤစကားá€á€¾á€€á€ºá€žá€Šá€º လုံá€á€¼á€¯á€¶á€›á€±á€¸á€¡á€¬á€¸á€”ည်းသည့်အá€á€½á€€á€º မသုံးသင့်ပါá‹" #: ../ubuntu_sso/utils/ui.py:119 msgid "At least one uppercase letter" msgstr "" #: ../ubuntu_sso/utils/ui.py:120 msgid "Privacy Policy" msgstr "" #: ../ubuntu_sso/utils/ui.py:121 msgid "Connecting to:" msgstr "" #: ../ubuntu_sso/utils/ui.py:122 msgid "Proxy Settings" msgstr "" #: ../ubuntu_sso/utils/ui.py:123 msgid "Incorrect login details. Please try again." msgstr "" #: ../ubuntu_sso/utils/ui.py:124 msgid "Please provide login details." msgstr "" #: ../ubuntu_sso/utils/ui.py:125 msgid "You are connecting through a proxy." msgstr "" #: ../ubuntu_sso/utils/ui.py:126 msgid "Get Help With Proxies" msgstr "" #: ../ubuntu_sso/utils/ui.py:127 msgid "Proxy password:" msgstr "" #: ../ubuntu_sso/utils/ui.py:128 msgid "Save and Connect" msgstr "" #: ../ubuntu_sso/utils/ui.py:129 msgid "Proxy username:" msgstr "" #: ../ubuntu_sso/utils/ui.py:131 msgid "" "A password reset code has been sent to your e-mail. Please enter the code " "below along with your new password." msgstr "" #: ../ubuntu_sso/utils/ui.py:133 msgid "Retype email" msgstr "" #: ../ubuntu_sso/utils/ui.py:134 msgid "Retype password" msgstr "" #: ../ubuntu_sso/utils/ui.py:135 #, python-format msgid "To reset your %(app_name)s password, enter your email address below:" msgstr "" "%(app_name)s စကားá€á€¾á€€á€ºá€€á€­á€¯ ပြန်ပြင်ရန် အောက်á€á€½á€„် အီးမေးလိပ်စာ ရိုက်ထည့်ပါá‹" #: ../ubuntu_sso/utils/ui.py:137 msgid "" "We are very Sorry! The service that signs you on is not responding right " "now\n" "Please try again or come back in a few minutes." msgstr "" #: ../ubuntu_sso/utils/ui.py:140 msgid "Sorry we did not recognize the email address." msgstr "" #: ../ubuntu_sso/utils/ui.py:142 msgid "Reset code" msgstr "စကားá€á€¾á€€á€ºá€•ြောင်းရန်ကုဒ်" #: ../ubuntu_sso/utils/ui.py:145 #, python-format msgid "" "A password reset code has been sent to %(email)s.\n" "Please enter the code below along with your new password." msgstr "" "စကားá€á€¾á€€á€ºá€•ြောင်းရန်ကုဒ်ကို %(email)s သို့ ပို့လိုက်ပါသည်á‹\n" "စကားá€á€¾á€€á€ºá€¡á€žá€…်နှင့် ထိုကုဒ်ကို အောက်á€á€½á€„် ရိုက်ပါá‹" #: ../ubuntu_sso/utils/ui.py:147 msgid "Set Up Account" msgstr "" #: ../ubuntu_sso/utils/ui.py:148 msgid "I don't have an account yet - sign me up" msgstr "" #: ../ubuntu_sso/utils/ui.py:149 msgid "Sign In" msgstr "" #: ../ubuntu_sso/utils/ui.py:150 msgid "Log-in with my existing account." msgstr "" #: ../ubuntu_sso/utils/ui.py:151 msgid "the appname whose ssl error we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:152 msgid "Certificate details" msgstr "" #: ../ubuntu_sso/utils/ui.py:153 msgid "Connect" msgstr "" #: ../ubuntu_sso/utils/ui.py:154 msgid "the details ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:161 msgid "Open the SSL certificate UI." msgstr "" #: ../ubuntu_sso/utils/ui.py:162 msgid "SSL Certificate Not Valid" msgstr "" #: ../ubuntu_sso/utils/ui.py:163 msgid "the domain whose ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:164 #, python-format msgid "" "You are trying to connect to a proxy server on %(domain)s. This server uses " "a secure connection, and the SSL certificate is not valid because:" msgstr "" #: ../ubuntu_sso/utils/ui.py:167 msgid "The certificate has not been verified" msgstr "" #: ../ubuntu_sso/utils/ui.py:168 msgid "Do you want to connect to this server?" msgstr "" #: ../ubuntu_sso/utils/ui.py:169 msgid "Get Help With SSL" msgstr "" #: ../ubuntu_sso/utils/ui.py:170 #, python-format msgid "" "If you are not sure about this server, do not use it to connect to " "%(app_name)s." msgstr "" #: ../ubuntu_sso/utils/ui.py:172 msgid "Remember my settings for this certificate." msgstr "" #: ../ubuntu_sso/utils/ui.py:173 msgid "" "The name on the certificate isn't valid or doesn't match the name of the site" msgstr "" #: ../ubuntu_sso/utils/ui.py:175 msgid "The certificate has expired" msgstr "" #: ../ubuntu_sso/utils/ui.py:176 #, python-format msgid "You are now logged into %(app_name)s." msgstr "" #: ../ubuntu_sso/utils/ui.py:177 msgid "Surname" msgstr "" #: ../ubuntu_sso/utils/ui.py:178 msgid "Terms of Service" msgstr "" #: ../ubuntu_sso/utils/ui.py:179 msgid "Sign Up to {app_name}" msgstr "" #: ../ubuntu_sso/utils/ui.py:180 msgid "Show Terms & Conditions" msgstr "လိုင်စင်သá€á€ºá€™á€¾á€á€ºá€á€»á€€á€ºá€™á€»á€¬á€¸ ပြပါá‹" #: ../ubuntu_sso/utils/ui.py:181 #, python-format msgid "" "Agreeing to the %(app_name)s Terms & Conditions is required to subscribe." msgstr "" #: ../ubuntu_sso/utils/ui.py:183 #, python-format msgid "You can also find these terms at %(url)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:184 msgid "Try again" msgstr "" #: ../ubuntu_sso/utils/ui.py:185 msgid "" "There was an error when trying to complete the process. Please check the " "information and try again." msgstr "" "လုပ်ငန်းစဉ်á€á€½á€„် ပြဿနာရှိပါသည်ዠအá€á€»á€€á€ºá€¡á€œá€€á€ºá€™á€»á€¬á€¸á€€á€­á€¯ ပြန်လည်စစ်ဆေးပြီး " "ထပ်မံလုပ်ဆောင်ပါá‹" #: ../ubuntu_sso/utils/ui.py:187 msgid "Verification code" msgstr "" #: ../ubuntu_sso/utils/ui.py:188 #, python-format msgid "" "Check %(email)s for an email from Ubuntu Single Sign On. This message " "contains a verification code. Enter the code in the field below and click OK " "to complete creating your %(app_name)s account." msgstr "" #: ../ubuntu_sso/utils/ui.py:192 msgid "Enter verification code" msgstr "Verification code ကို ရိုက်ထည့်ပါá‹" #: ../ubuntu_sso/utils/ui.py:195 #, python-format msgid "I agree with the %(app_name)s terms and conditions" msgstr "%(app_name)s á လိုင်စင်သá€á€ºá€™á€¾á€á€ºá€á€»á€€á€ºá€™á€»á€¬á€¸á€€á€­á€¯ သဘောá€á€°á€•ါသည်á‹" #: ../ubuntu_sso/utils/ui.py:196 #, python-format msgid "Yes! Email me %(app_name)s tips and updates." msgstr "" "%(app_name)s အသုံးပြုပုံአနောက်ဆုံးသá€á€„်းများကို အီးမေးဖြင့် ပို့ပေးပါá‹" ubuntu-sso-client-13.10/po/fo.po0000664000202700020270000002622112151461656016736 0ustar dobeydobey00000000000000# Faroese translation for ubuntu-sso-client # Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 # This file is distributed under the same license as the ubuntu-sso-client package. # FIRST AUTHOR , 2012. # msgid "" msgstr "" "Project-Id-Version: ubuntu-sso-client\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-09-11 18:25+0000\n" "PO-Revision-Date: 2012-01-12 20:23+0000\n" "Last-Translator: Ragnar Johannesen \n" "Language-Team: Faroese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-09-17 18:24+0000\n" "X-Generator: Launchpad (build 15944)\n" #. Undefined variable '_', pylint: disable=E0602 #. all the text that is used in the gui #: ../ubuntu_sso/utils/ui.py:49 msgid "By signing up to {app_name} you agree to our {privacy_policy}" msgstr "" #: ../ubuntu_sso/utils/ui.py:51 msgid "By signing up to {app_name} you agree to our {terms_and_conditions}" msgstr "" #: ../ubuntu_sso/utils/ui.py:53 msgid " and {privacy_policy}" msgstr "" #: ../ubuntu_sso/utils/ui.py:54 msgid "Cancel" msgstr "" #: ../ubuntu_sso/utils/ui.py:55 msgid "Type the characters above" msgstr "Tasta stavirnir omanfyri" #: ../ubuntu_sso/utils/ui.py:56 msgid "There was a problem getting the captcha, reloading..." msgstr "Tað var ein trupulleiki við CAPTCHA koduni, lesur inn aftur..." #: ../ubuntu_sso/utils/ui.py:58 #, python-format msgid "If you can't read this then %(reload_link)s this page" msgstr "" #: ../ubuntu_sso/utils/ui.py:60 msgid "refresh" msgstr "" #: ../ubuntu_sso/utils/ui.py:61 msgid "Reload" msgstr "" #: ../ubuntu_sso/utils/ui.py:62 msgid "The captcha is a required field" msgstr "" #: ../ubuntu_sso/utils/ui.py:63 msgid "Close window and set up later" msgstr "" #: ../ubuntu_sso/utils/ui.py:64 msgid "Congratulations, {app_name} is installed!" msgstr "" #: ../ubuntu_sso/utils/ui.py:65 #, python-format msgid "To connect this computer to %(app_name)s enter your details below." msgstr "" "Til at knýta hesa telduna til %(app_name)s, tasta inn detaljur niðanfyri." #: ../ubuntu_sso/utils/ui.py:67 msgid "Register with {app_name}." msgstr "" #: ../ubuntu_sso/utils/ui.py:68 ../ubuntu_sso/utils/ui.py:93 #: ../ubuntu_sso/utils/ui.py:143 msgid "Email address" msgstr "Teldupost adressa" #: ../ubuntu_sso/utils/ui.py:69 msgid "Re-type Email address" msgstr "Tasta inn teldupost adressu umaftur" #: ../ubuntu_sso/utils/ui.py:70 msgid "The email must be a valid email address." msgstr "Teldupost adressan skal verða galdandi." #: ../ubuntu_sso/utils/ui.py:71 msgid "" "The email addresses don't match, please double check and try entering them " "again." msgstr "" "Teldupost adressurnar passa ikki saman, kanna eftir við at tøppa tær " "innaftur." #: ../ubuntu_sso/utils/ui.py:73 msgid "Email" msgstr "" #: ../ubuntu_sso/utils/ui.py:74 msgid "The email addresses do not match" msgstr "" #: ../ubuntu_sso/utils/ui.py:75 msgid "Enter code verification here" msgstr "Tasta inn váttanar koduna her" #: ../ubuntu_sso/utils/ui.py:76 msgid "Please enter your name" msgstr "" #: ../ubuntu_sso/utils/ui.py:77 msgid "The process did not finish successfully." msgstr "Hendan prosessin steðgaði ikki rætt" #: ../ubuntu_sso/utils/ui.py:79 msgid "Sign me in with my existing account" msgstr "" #: ../ubuntu_sso/utils/ui.py:80 msgid "This field is required." msgstr "Hesin teigur er kravdur" #: ../ubuntu_sso/utils/ui.py:81 msgid "I've forgotten my password" msgstr "Eg havi gloymt mítt loyniorð" #: ../ubuntu_sso/utils/ui.py:82 ../ubuntu_sso/utils/ui.py:130 msgid "Reset password" msgstr "" #: ../ubuntu_sso/utils/ui.py:83 msgid "" "To reset your {app_name} password, enter your registered email address " "below. We will send instructions to reset your password." msgstr "" #: ../ubuntu_sso/utils/ui.py:86 msgid "Please enter a valid email address" msgstr "" #: ../ubuntu_sso/utils/ui.py:87 msgid "There was a problem accessing the Ubuntu Single Sign On backend." msgstr "" #: ../ubuntu_sso/utils/ui.py:89 #, python-format msgid "Create %(app_name)s account" msgstr "Stovna %(app_name)s konto" #: ../ubuntu_sso/utils/ui.py:90 msgid "Loading..." msgstr "Lesur inn..." #: ../ubuntu_sso/utils/ui.py:91 msgid "Getting information, please wait..." msgstr "" #: ../ubuntu_sso/utils/ui.py:92 msgid "Already have an account? Click here to sign in" msgstr "Longu konto? Trýst her til at rita inn" #: ../ubuntu_sso/utils/ui.py:94 #, python-format msgid "Connect to %(app_name)s" msgstr "Knýt til %(app_name)s" #: ../ubuntu_sso/utils/ui.py:95 ../ubuntu_sso/utils/ui.py:109 msgid "Password" msgstr "Loyniorð" #: ../ubuntu_sso/utils/ui.py:97 msgid "Sign In to {app_name}" msgstr "" #: ../ubuntu_sso/utils/ui.py:99 msgid "Name" msgstr "Navn" #: ../ubuntu_sso/utils/ui.py:100 msgid "The name must not be empty." msgstr "" #: ../ubuntu_sso/utils/ui.py:101 msgid "Next" msgstr "Næsta" #: ../ubuntu_sso/utils/ui.py:102 msgid "Network detection" msgstr "" #: ../ubuntu_sso/utils/ui.py:103 #, python-format msgid "" "Are you online? We can't detect an internet connection - you will need to be " "connected to set up %(app_name)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:105 msgid "One moment please..." msgstr "Ein løta..." #: ../ubuntu_sso/utils/ui.py:106 msgid "Create a password" msgstr "" #: ../ubuntu_sso/utils/ui.py:107 msgid "Your password was successfully changed." msgstr "Loyniorði var broytt." #: ../ubuntu_sso/utils/ui.py:108 msgid "At least one number" msgstr "" #: ../ubuntu_sso/utils/ui.py:110 msgid "Re-type Password" msgstr "" #: ../ubuntu_sso/utils/ui.py:111 msgid "" "The password must have a minimum of 8 characters and include one uppercase " "character and one number." msgstr "" #: ../ubuntu_sso/utils/ui.py:113 msgid "At least 8 characters" msgstr "" #: ../ubuntu_sso/utils/ui.py:114 msgid "Passwords don't match" msgstr "" #: ../ubuntu_sso/utils/ui.py:115 msgid "" "The passwords don't match, please double check and try entering them again." msgstr "" #: ../ubuntu_sso/utils/ui.py:117 msgid "Your password must contain" msgstr "" #: ../ubuntu_sso/utils/ui.py:118 msgid "The password is too weak." msgstr "" #: ../ubuntu_sso/utils/ui.py:119 msgid "At least one uppercase letter" msgstr "" #: ../ubuntu_sso/utils/ui.py:120 msgid "Privacy Policy" msgstr "" #: ../ubuntu_sso/utils/ui.py:121 msgid "Connecting to:" msgstr "" #: ../ubuntu_sso/utils/ui.py:122 msgid "Proxy Settings" msgstr "" #: ../ubuntu_sso/utils/ui.py:123 msgid "Incorrect login details. Please try again." msgstr "" #: ../ubuntu_sso/utils/ui.py:124 msgid "Please provide login details." msgstr "" #: ../ubuntu_sso/utils/ui.py:125 msgid "You are connecting through a proxy." msgstr "" #: ../ubuntu_sso/utils/ui.py:126 msgid "Get Help With Proxies" msgstr "" #: ../ubuntu_sso/utils/ui.py:127 msgid "Proxy password:" msgstr "" #: ../ubuntu_sso/utils/ui.py:128 msgid "Save and Connect" msgstr "" #: ../ubuntu_sso/utils/ui.py:129 msgid "Proxy username:" msgstr "" #: ../ubuntu_sso/utils/ui.py:131 msgid "" "A password reset code has been sent to your e-mail. Please enter the code " "below along with your new password." msgstr "" #: ../ubuntu_sso/utils/ui.py:133 msgid "Retype email" msgstr "" #: ../ubuntu_sso/utils/ui.py:134 msgid "Retype password" msgstr "" #: ../ubuntu_sso/utils/ui.py:135 #, python-format msgid "To reset your %(app_name)s password, enter your email address below:" msgstr "" #: ../ubuntu_sso/utils/ui.py:137 msgid "" "We are very Sorry! The service that signs you on is not responding right " "now\n" "Please try again or come back in a few minutes." msgstr "" #: ../ubuntu_sso/utils/ui.py:140 msgid "Sorry we did not recognize the email address." msgstr "" #: ../ubuntu_sso/utils/ui.py:142 msgid "Reset code" msgstr "" #: ../ubuntu_sso/utils/ui.py:145 #, python-format msgid "" "A password reset code has been sent to %(email)s.\n" "Please enter the code below along with your new password." msgstr "" #: ../ubuntu_sso/utils/ui.py:147 msgid "Set Up Account" msgstr "" #: ../ubuntu_sso/utils/ui.py:148 msgid "I don't have an account yet - sign me up" msgstr "" #: ../ubuntu_sso/utils/ui.py:149 msgid "Sign In" msgstr "" #: ../ubuntu_sso/utils/ui.py:150 msgid "Log-in with my existing account." msgstr "" #: ../ubuntu_sso/utils/ui.py:151 msgid "the appname whose ssl error we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:152 msgid "Certificate details" msgstr "" #: ../ubuntu_sso/utils/ui.py:153 msgid "Connect" msgstr "" #: ../ubuntu_sso/utils/ui.py:154 msgid "the details ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:161 msgid "Open the SSL certificate UI." msgstr "" #: ../ubuntu_sso/utils/ui.py:162 msgid "SSL Certificate Not Valid" msgstr "" #: ../ubuntu_sso/utils/ui.py:163 msgid "the domain whose ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:164 #, python-format msgid "" "You are trying to connect to a proxy server on %(domain)s. This server uses " "a secure connection, and the SSL certificate is not valid because:" msgstr "" #: ../ubuntu_sso/utils/ui.py:167 msgid "The certificate has not been verified" msgstr "" #: ../ubuntu_sso/utils/ui.py:168 msgid "Do you want to connect to this server?" msgstr "" #: ../ubuntu_sso/utils/ui.py:169 msgid "Get Help With SSL" msgstr "" #: ../ubuntu_sso/utils/ui.py:170 #, python-format msgid "" "If you are not sure about this server, do not use it to connect to " "%(app_name)s." msgstr "" #: ../ubuntu_sso/utils/ui.py:172 msgid "Remember my settings for this certificate." msgstr "" #: ../ubuntu_sso/utils/ui.py:173 msgid "" "The name on the certificate isn't valid or doesn't match the name of the site" msgstr "" #: ../ubuntu_sso/utils/ui.py:175 msgid "The certificate has expired" msgstr "" #: ../ubuntu_sso/utils/ui.py:176 #, python-format msgid "You are now logged into %(app_name)s." msgstr "" #: ../ubuntu_sso/utils/ui.py:177 msgid "Surname" msgstr "" #: ../ubuntu_sso/utils/ui.py:178 msgid "Terms of Service" msgstr "" #: ../ubuntu_sso/utils/ui.py:179 msgid "Sign Up to {app_name}" msgstr "" #: ../ubuntu_sso/utils/ui.py:180 msgid "Show Terms & Conditions" msgstr "" #: ../ubuntu_sso/utils/ui.py:181 #, python-format msgid "" "Agreeing to the %(app_name)s Terms & Conditions is required to subscribe." msgstr "" #: ../ubuntu_sso/utils/ui.py:183 #, python-format msgid "You can also find these terms at %(url)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:184 msgid "Try again" msgstr "" #: ../ubuntu_sso/utils/ui.py:185 msgid "" "There was an error when trying to complete the process. Please check the " "information and try again." msgstr "" #: ../ubuntu_sso/utils/ui.py:187 msgid "Verification code" msgstr "" #: ../ubuntu_sso/utils/ui.py:188 #, python-format msgid "" "Check %(email)s for an email from Ubuntu Single Sign On. This message " "contains a verification code. Enter the code in the field below and click OK " "to complete creating your %(app_name)s account." msgstr "" #: ../ubuntu_sso/utils/ui.py:192 msgid "Enter verification code" msgstr "" #: ../ubuntu_sso/utils/ui.py:195 #, python-format msgid "I agree with the %(app_name)s terms and conditions" msgstr "" #: ../ubuntu_sso/utils/ui.py:196 #, python-format msgid "Yes! Email me %(app_name)s tips and updates." msgstr "" ubuntu-sso-client-13.10/po/fy.po0000664000202700020270000002531312151461656016751 0ustar dobeydobey00000000000000# Frisian translation for ubuntu-sso-client # Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 # This file is distributed under the same license as the ubuntu-sso-client package. # FIRST AUTHOR , 2011. # msgid "" msgstr "" "Project-Id-Version: ubuntu-sso-client\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-09-11 18:25+0000\n" "PO-Revision-Date: 2011-03-19 10:23+0000\n" "Last-Translator: Sense Egbert Hofstede \n" "Language-Team: Frisian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-09-17 18:24+0000\n" "X-Generator: Launchpad (build 15944)\n" #. Undefined variable '_', pylint: disable=E0602 #. all the text that is used in the gui #: ../ubuntu_sso/utils/ui.py:49 msgid "By signing up to {app_name} you agree to our {privacy_policy}" msgstr "" #: ../ubuntu_sso/utils/ui.py:51 msgid "By signing up to {app_name} you agree to our {terms_and_conditions}" msgstr "" #: ../ubuntu_sso/utils/ui.py:53 msgid " and {privacy_policy}" msgstr "" #: ../ubuntu_sso/utils/ui.py:54 msgid "Cancel" msgstr "" #: ../ubuntu_sso/utils/ui.py:55 msgid "Type the characters above" msgstr "" #: ../ubuntu_sso/utils/ui.py:56 msgid "There was a problem getting the captcha, reloading..." msgstr "" #: ../ubuntu_sso/utils/ui.py:58 #, python-format msgid "If you can't read this then %(reload_link)s this page" msgstr "" #: ../ubuntu_sso/utils/ui.py:60 msgid "refresh" msgstr "" #: ../ubuntu_sso/utils/ui.py:61 msgid "Reload" msgstr "Opnij lade" #: ../ubuntu_sso/utils/ui.py:62 msgid "The captcha is a required field" msgstr "" #: ../ubuntu_sso/utils/ui.py:63 msgid "Close window and set up later" msgstr "" #: ../ubuntu_sso/utils/ui.py:64 msgid "Congratulations, {app_name} is installed!" msgstr "" #: ../ubuntu_sso/utils/ui.py:65 #, python-format msgid "To connect this computer to %(app_name)s enter your details below." msgstr "" #: ../ubuntu_sso/utils/ui.py:67 msgid "Register with {app_name}." msgstr "" #: ../ubuntu_sso/utils/ui.py:68 ../ubuntu_sso/utils/ui.py:93 #: ../ubuntu_sso/utils/ui.py:143 msgid "Email address" msgstr "E-mailadres" #: ../ubuntu_sso/utils/ui.py:69 msgid "Re-type Email address" msgstr "" #: ../ubuntu_sso/utils/ui.py:70 msgid "The email must be a valid email address." msgstr "" #: ../ubuntu_sso/utils/ui.py:71 msgid "" "The email addresses don't match, please double check and try entering them " "again." msgstr "" #: ../ubuntu_sso/utils/ui.py:73 msgid "Email" msgstr "" #: ../ubuntu_sso/utils/ui.py:74 msgid "The email addresses do not match" msgstr "" #: ../ubuntu_sso/utils/ui.py:75 msgid "Enter code verification here" msgstr "" #: ../ubuntu_sso/utils/ui.py:76 msgid "Please enter your name" msgstr "" #: ../ubuntu_sso/utils/ui.py:77 msgid "The process did not finish successfully." msgstr "" #: ../ubuntu_sso/utils/ui.py:79 msgid "Sign me in with my existing account" msgstr "" #: ../ubuntu_sso/utils/ui.py:80 msgid "This field is required." msgstr "" #: ../ubuntu_sso/utils/ui.py:81 msgid "I've forgotten my password" msgstr "Ik haw myn wachtwurd fergetten" #: ../ubuntu_sso/utils/ui.py:82 ../ubuntu_sso/utils/ui.py:130 msgid "Reset password" msgstr "" #: ../ubuntu_sso/utils/ui.py:83 msgid "" "To reset your {app_name} password, enter your registered email address " "below. We will send instructions to reset your password." msgstr "" #: ../ubuntu_sso/utils/ui.py:86 msgid "Please enter a valid email address" msgstr "" #: ../ubuntu_sso/utils/ui.py:87 msgid "There was a problem accessing the Ubuntu Single Sign On backend." msgstr "" #: ../ubuntu_sso/utils/ui.py:89 #, python-format msgid "Create %(app_name)s account" msgstr "%(app_name)s-akkount oanmeitsje" #: ../ubuntu_sso/utils/ui.py:90 msgid "Loading..." msgstr "Dwaande mei lade..." #: ../ubuntu_sso/utils/ui.py:91 msgid "Getting information, please wait..." msgstr "" #: ../ubuntu_sso/utils/ui.py:92 msgid "Already have an account? Click here to sign in" msgstr "" #: ../ubuntu_sso/utils/ui.py:94 #, python-format msgid "Connect to %(app_name)s" msgstr "Ferbine mei %(app_name)s" #: ../ubuntu_sso/utils/ui.py:95 ../ubuntu_sso/utils/ui.py:109 msgid "Password" msgstr "Wachtwurd" #: ../ubuntu_sso/utils/ui.py:97 msgid "Sign In to {app_name}" msgstr "" #: ../ubuntu_sso/utils/ui.py:99 msgid "Name" msgstr "Namme" #: ../ubuntu_sso/utils/ui.py:100 msgid "The name must not be empty." msgstr "" #: ../ubuntu_sso/utils/ui.py:101 msgid "Next" msgstr "Folgjende" #: ../ubuntu_sso/utils/ui.py:102 msgid "Network detection" msgstr "" #: ../ubuntu_sso/utils/ui.py:103 #, python-format msgid "" "Are you online? We can't detect an internet connection - you will need to be " "connected to set up %(app_name)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:105 msgid "One moment please..." msgstr "" #: ../ubuntu_sso/utils/ui.py:106 msgid "Create a password" msgstr "" #: ../ubuntu_sso/utils/ui.py:107 msgid "Your password was successfully changed." msgstr "" #: ../ubuntu_sso/utils/ui.py:108 msgid "At least one number" msgstr "" #: ../ubuntu_sso/utils/ui.py:110 msgid "Re-type Password" msgstr "" #: ../ubuntu_sso/utils/ui.py:111 msgid "" "The password must have a minimum of 8 characters and include one uppercase " "character and one number." msgstr "" #: ../ubuntu_sso/utils/ui.py:113 msgid "At least 8 characters" msgstr "" #: ../ubuntu_sso/utils/ui.py:114 msgid "Passwords don't match" msgstr "" #: ../ubuntu_sso/utils/ui.py:115 msgid "" "The passwords don't match, please double check and try entering them again." msgstr "" #: ../ubuntu_sso/utils/ui.py:117 msgid "Your password must contain" msgstr "" #: ../ubuntu_sso/utils/ui.py:118 msgid "The password is too weak." msgstr "" #: ../ubuntu_sso/utils/ui.py:119 msgid "At least one uppercase letter" msgstr "" #: ../ubuntu_sso/utils/ui.py:120 msgid "Privacy Policy" msgstr "" #: ../ubuntu_sso/utils/ui.py:121 msgid "Connecting to:" msgstr "" #: ../ubuntu_sso/utils/ui.py:122 msgid "Proxy Settings" msgstr "" #: ../ubuntu_sso/utils/ui.py:123 msgid "Incorrect login details. Please try again." msgstr "" #: ../ubuntu_sso/utils/ui.py:124 msgid "Please provide login details." msgstr "" #: ../ubuntu_sso/utils/ui.py:125 msgid "You are connecting through a proxy." msgstr "" #: ../ubuntu_sso/utils/ui.py:126 msgid "Get Help With Proxies" msgstr "" #: ../ubuntu_sso/utils/ui.py:127 msgid "Proxy password:" msgstr "" #: ../ubuntu_sso/utils/ui.py:128 msgid "Save and Connect" msgstr "" #: ../ubuntu_sso/utils/ui.py:129 msgid "Proxy username:" msgstr "" #: ../ubuntu_sso/utils/ui.py:131 msgid "" "A password reset code has been sent to your e-mail. Please enter the code " "below along with your new password." msgstr "" #: ../ubuntu_sso/utils/ui.py:133 msgid "Retype email" msgstr "" #: ../ubuntu_sso/utils/ui.py:134 msgid "Retype password" msgstr "" #: ../ubuntu_sso/utils/ui.py:135 #, python-format msgid "To reset your %(app_name)s password, enter your email address below:" msgstr "" #: ../ubuntu_sso/utils/ui.py:137 msgid "" "We are very Sorry! The service that signs you on is not responding right " "now\n" "Please try again or come back in a few minutes." msgstr "" #: ../ubuntu_sso/utils/ui.py:140 msgid "Sorry we did not recognize the email address." msgstr "" #: ../ubuntu_sso/utils/ui.py:142 msgid "Reset code" msgstr "" #: ../ubuntu_sso/utils/ui.py:145 #, python-format msgid "" "A password reset code has been sent to %(email)s.\n" "Please enter the code below along with your new password." msgstr "" #: ../ubuntu_sso/utils/ui.py:147 msgid "Set Up Account" msgstr "" #: ../ubuntu_sso/utils/ui.py:148 msgid "I don't have an account yet - sign me up" msgstr "" #: ../ubuntu_sso/utils/ui.py:149 msgid "Sign In" msgstr "" #: ../ubuntu_sso/utils/ui.py:150 msgid "Log-in with my existing account." msgstr "" #: ../ubuntu_sso/utils/ui.py:151 msgid "the appname whose ssl error we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:152 msgid "Certificate details" msgstr "" #: ../ubuntu_sso/utils/ui.py:153 msgid "Connect" msgstr "" #: ../ubuntu_sso/utils/ui.py:154 msgid "the details ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:161 msgid "Open the SSL certificate UI." msgstr "" #: ../ubuntu_sso/utils/ui.py:162 msgid "SSL Certificate Not Valid" msgstr "" #: ../ubuntu_sso/utils/ui.py:163 msgid "the domain whose ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:164 #, python-format msgid "" "You are trying to connect to a proxy server on %(domain)s. This server uses " "a secure connection, and the SSL certificate is not valid because:" msgstr "" #: ../ubuntu_sso/utils/ui.py:167 msgid "The certificate has not been verified" msgstr "" #: ../ubuntu_sso/utils/ui.py:168 msgid "Do you want to connect to this server?" msgstr "" #: ../ubuntu_sso/utils/ui.py:169 msgid "Get Help With SSL" msgstr "" #: ../ubuntu_sso/utils/ui.py:170 #, python-format msgid "" "If you are not sure about this server, do not use it to connect to " "%(app_name)s." msgstr "" #: ../ubuntu_sso/utils/ui.py:172 msgid "Remember my settings for this certificate." msgstr "" #: ../ubuntu_sso/utils/ui.py:173 msgid "" "The name on the certificate isn't valid or doesn't match the name of the site" msgstr "" #: ../ubuntu_sso/utils/ui.py:175 msgid "The certificate has expired" msgstr "" #: ../ubuntu_sso/utils/ui.py:176 #, python-format msgid "You are now logged into %(app_name)s." msgstr "" #: ../ubuntu_sso/utils/ui.py:177 msgid "Surname" msgstr "" #: ../ubuntu_sso/utils/ui.py:178 msgid "Terms of Service" msgstr "" #: ../ubuntu_sso/utils/ui.py:179 msgid "Sign Up to {app_name}" msgstr "" #: ../ubuntu_sso/utils/ui.py:180 msgid "Show Terms & Conditions" msgstr "" #: ../ubuntu_sso/utils/ui.py:181 #, python-format msgid "" "Agreeing to the %(app_name)s Terms & Conditions is required to subscribe." msgstr "" #: ../ubuntu_sso/utils/ui.py:183 #, python-format msgid "You can also find these terms at %(url)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:184 msgid "Try again" msgstr "" #: ../ubuntu_sso/utils/ui.py:185 msgid "" "There was an error when trying to complete the process. Please check the " "information and try again." msgstr "" #: ../ubuntu_sso/utils/ui.py:187 msgid "Verification code" msgstr "" #: ../ubuntu_sso/utils/ui.py:188 #, python-format msgid "" "Check %(email)s for an email from Ubuntu Single Sign On. This message " "contains a verification code. Enter the code in the field below and click OK " "to complete creating your %(app_name)s account." msgstr "" #: ../ubuntu_sso/utils/ui.py:192 msgid "Enter verification code" msgstr "" #: ../ubuntu_sso/utils/ui.py:195 #, python-format msgid "I agree with the %(app_name)s terms and conditions" msgstr "" #: ../ubuntu_sso/utils/ui.py:196 #, python-format msgid "Yes! Email me %(app_name)s tips and updates." msgstr "" ubuntu-sso-client-13.10/po/ja.po0000664000202700020270000004055412151461656016731 0ustar dobeydobey00000000000000# Japanese translation for ubuntu-sso-client # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the ubuntu-sso-client package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: ubuntu-sso-client\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-09-11 18:25+0000\n" "PO-Revision-Date: 2012-04-18 13:01+0000\n" "Last-Translator: Shushi Kurose \n" "Language-Team: Japanese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-09-17 18:24+0000\n" "X-Generator: Launchpad (build 15944)\n" #. Undefined variable '_', pylint: disable=E0602 #. all the text that is used in the gui #: ../ubuntu_sso/utils/ui.py:49 msgid "By signing up to {app_name} you agree to our {privacy_policy}" msgstr "{app_name}ã«ã‚µã‚¤ãƒ³ã‚¢ãƒƒãƒ—ã™ã‚‹ã“ã¨ã§ã€ç§ãŸã¡ã®{privacy_policy}ã«åŒæ„ã™ã‚‹" #: ../ubuntu_sso/utils/ui.py:51 msgid "By signing up to {app_name} you agree to our {terms_and_conditions}" msgstr "{app_name}ã«ã‚µã‚¤ãƒ³ã‚¢ãƒƒãƒ—ã™ã‚‹ã“ã¨ã§ã€ç§ãŸã¡ã® {terms_and_conditions}" #: ../ubuntu_sso/utils/ui.py:53 msgid " and {privacy_policy}" msgstr " 㨠{privacy_policy} ã«åŒæ„ã™ã‚‹" #: ../ubuntu_sso/utils/ui.py:54 msgid "Cancel" msgstr "キャンセル" #: ../ubuntu_sso/utils/ui.py:55 msgid "Type the characters above" msgstr "ä¸Šã®æ–‡å­—を入力ã—ã¦ãã ã•ã„" #: ../ubuntu_sso/utils/ui.py:56 msgid "There was a problem getting the captcha, reloading..." msgstr "CAPTCHAã®å–å¾—ã«å•題ãŒã‚ã‚‹ãŸã‚ã€å†èª­è¾¼ã—ã¦ã„ã¾ã™..." #: ../ubuntu_sso/utils/ui.py:58 #, python-format msgid "If you can't read this then %(reload_link)s this page" msgstr "ã“れãŒèª­ã‚ãªã„å ´åˆã¯ã“ã®ãƒšãƒ¼ã‚¸ã‚’ %(reload_link)s ã—ã¾ã™" #: ../ubuntu_sso/utils/ui.py:60 msgid "refresh" msgstr "æ›´æ–°" #: ../ubuntu_sso/utils/ui.py:61 msgid "Reload" msgstr "å†èª­ã¿è¾¼ã¿" #: ../ubuntu_sso/utils/ui.py:62 msgid "The captcha is a required field" msgstr "captchaã¯å¿…須フィールドã§ã™" #: ../ubuntu_sso/utils/ui.py:63 msgid "Close window and set up later" msgstr "ウィンドウを閉ã˜ã¦å¾Œã§ã‚»ãƒƒãƒˆã‚¢ãƒƒãƒ—ã™ã‚‹" #: ../ubuntu_sso/utils/ui.py:64 msgid "Congratulations, {app_name} is installed!" msgstr "ãŠã‚ã§ã¨ã†ã”ã–ã„ã¾ã™ã€‚{app_name} をインストールã—ã¾ã—ãŸï¼" #: ../ubuntu_sso/utils/ui.py:65 #, python-format msgid "To connect this computer to %(app_name)s enter your details below." msgstr "ã“ã®ã‚³ãƒ³ãƒ”ュータã‹ã‚‰ %(app_name)s ã«æŽ¥ç¶šã™ã‚‹ã«ã¯ä»¥ä¸‹ã®é …目を入力ã—ã¦ãã ã•ã„。" #: ../ubuntu_sso/utils/ui.py:67 msgid "Register with {app_name}." msgstr "" #: ../ubuntu_sso/utils/ui.py:68 ../ubuntu_sso/utils/ui.py:93 #: ../ubuntu_sso/utils/ui.py:143 msgid "Email address" msgstr "メールアドレス" #: ../ubuntu_sso/utils/ui.py:69 msgid "Re-type Email address" msgstr "メールアドレスã®å†å…¥åŠ›" #: ../ubuntu_sso/utils/ui.py:70 msgid "The email must be a valid email address." msgstr "ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã¯æœ‰åйãªã‚‚ã®ã‚’使用ã—ã¦ãã ã•ã„。" #: ../ubuntu_sso/utils/ui.py:71 msgid "" "The email addresses don't match, please double check and try entering them " "again." msgstr "メールアドレスãŒä¸€è‡´ã—ã¾ã›ã‚“。2ã¤ã®é …目を確èªã—ã¦å†åº¦å…¥åŠ›ã—ã¦ãã ã•ã„。" #: ../ubuntu_sso/utils/ui.py:73 msgid "Email" msgstr "メール" #: ../ubuntu_sso/utils/ui.py:74 msgid "The email addresses do not match" msgstr "メールアドレスãŒä¸€è‡´ã—ã¾ã›ã‚“" #: ../ubuntu_sso/utils/ui.py:75 msgid "Enter code verification here" msgstr "èªè¨¼ã‚³ãƒ¼ãƒ‰ã‚’ã“ã“ã«å…¥åŠ›ã—ã¦ãã ã•ã„" #: ../ubuntu_sso/utils/ui.py:76 msgid "Please enter your name" msgstr "ã‚ãªãŸã®åå‰ã‚’入力ã—ã¦ãã ã•ã„" #: ../ubuntu_sso/utils/ui.py:77 msgid "The process did not finish successfully." msgstr "ã“ã®å‡¦ç†ã¯å®Œäº†ã—ã¾ã›ã‚“ã§ã—ãŸã€‚" #: ../ubuntu_sso/utils/ui.py:79 msgid "Sign me in with my existing account" msgstr "既存ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã§ã‚µã‚¤ãƒ³ã‚¤ãƒ³" #: ../ubuntu_sso/utils/ui.py:80 msgid "This field is required." msgstr "ã“ã®æ¬„ã¯å…¥åŠ›å¿…é ˆã§ã™ã€‚" #: ../ubuntu_sso/utils/ui.py:81 msgid "I've forgotten my password" msgstr "パスワードを忘れã¾ã—ãŸ" #: ../ubuntu_sso/utils/ui.py:82 ../ubuntu_sso/utils/ui.py:130 msgid "Reset password" msgstr "パスワードã®ãƒªã‚»ãƒƒãƒˆ" #: ../ubuntu_sso/utils/ui.py:83 msgid "" "To reset your {app_name} password, enter your registered email address " "below. We will send instructions to reset your password." msgstr "" "{app_name}ã®ãƒ‘スワードをリセットã™ã‚‹ãŸã‚ã«ã¯ã€ç™»éŒ²ã‚’行ã£ãŸE-メールアドレスを入力ã—ã¦ãã ã•ã„。パスワードをリセットã§ãるよã†ã«ã”案内ã—ã¾ã™ã€‚" #: ../ubuntu_sso/utils/ui.py:86 msgid "Please enter a valid email address" msgstr "有効ãªãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’入力ã—ã¦ãã ã•ã„" #: ../ubuntu_sso/utils/ui.py:87 msgid "There was a problem accessing the Ubuntu Single Sign On backend." msgstr "Ubuntuシングルサインオンã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã«ã¤ã„ã¦ã€ãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰ã§å•題ãŒã‚りã¾ã—ãŸã€‚" #: ../ubuntu_sso/utils/ui.py:89 #, python-format msgid "Create %(app_name)s account" msgstr "%(app_name)s ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’作æˆ" #: ../ubuntu_sso/utils/ui.py:90 msgid "Loading..." msgstr "読ã¿è¾¼ã¿ä¸­..." #: ../ubuntu_sso/utils/ui.py:91 msgid "Getting information, please wait..." msgstr "情報をå–得中ã§ã™ã€‚ã—ã°ã‚‰ããŠå¾…ã¡ãã ã•ã„..." #: ../ubuntu_sso/utils/ui.py:92 msgid "Already have an account? Click here to sign in" msgstr "ã™ã§ã«ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’ãŠæŒã¡ã§ã™ã‹? ã“ã“をクリックã—ã¦ã‚µã‚¤ãƒ³ã‚¤ãƒ³ã—ã¦ãã ã•ã„" #: ../ubuntu_sso/utils/ui.py:94 #, python-format msgid "Connect to %(app_name)s" msgstr "%(app_name)s ã«æŽ¥ç¶š" #: ../ubuntu_sso/utils/ui.py:95 ../ubuntu_sso/utils/ui.py:109 msgid "Password" msgstr "パスワード" #: ../ubuntu_sso/utils/ui.py:97 msgid "Sign In to {app_name}" msgstr "{app_name}ã¸ã‚µã‚¤ãƒ³ã‚¤ãƒ³" #: ../ubuntu_sso/utils/ui.py:99 msgid "Name" msgstr "åå‰" #: ../ubuntu_sso/utils/ui.py:100 msgid "The name must not be empty." msgstr "åå‰ã®å…¥åŠ›ãŒå¿…è¦ã§ã™ã€‚" #: ../ubuntu_sso/utils/ui.py:101 msgid "Next" msgstr "次ã¸" #: ../ubuntu_sso/utils/ui.py:102 msgid "Network detection" msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã®æ¤œå‡º" #: ../ubuntu_sso/utils/ui.py:103 #, python-format msgid "" "Are you online? We can't detect an internet connection - you will need to be " "connected to set up %(app_name)s" msgstr "ã‚ªãƒ³ãƒ©ã‚¤ãƒ³ã§æŽ¥ç¶šã—ã¦ã„ã¾ã™ã‹?インターãƒãƒƒãƒˆæŽ¥ç¶šãŒæ¤œå‡ºã§ãã¾ã›ã‚“。%(app_name)sを設定ã™ã‚‹ã«ã¯æŽ¥ç¶šã•れã¦ã„ã‚‹å¿…è¦ãŒã‚りã¾ã™" #: ../ubuntu_sso/utils/ui.py:105 msgid "One moment please..." msgstr "少々ãŠå¾…ã¡ãã ã•ã„..." #: ../ubuntu_sso/utils/ui.py:106 msgid "Create a password" msgstr "パスワードã®ç”Ÿæˆ" #: ../ubuntu_sso/utils/ui.py:107 msgid "Your password was successfully changed." msgstr "パスワードを変更ã—ã¾ã—ãŸã€‚" #: ../ubuntu_sso/utils/ui.py:108 msgid "At least one number" msgstr "å°‘ãªãã¨ã‚‚1ã¤ã¯æ•°å­—ãŒå¿…è¦" #: ../ubuntu_sso/utils/ui.py:110 msgid "Re-type Password" msgstr "パスワードã®å†å…¥åŠ›" #: ../ubuntu_sso/utils/ui.py:111 msgid "" "The password must have a minimum of 8 characters and include one uppercase " "character and one number." msgstr "パスワードã¯8文字以上ã«ã—ã€ã‚¢ãƒ«ãƒ•ァベットã®å¤§æ–‡å­—ãƒ»å°æ–‡å­—・数字をãれãžã‚Œå«ã‚ã¦ãã ã•ã„。" #: ../ubuntu_sso/utils/ui.py:113 msgid "At least 8 characters" msgstr "å°‘ãªãã¨ã‚‚8文字以上ãŒå¿…è¦" #: ../ubuntu_sso/utils/ui.py:114 msgid "Passwords don't match" msgstr "パスワードãŒä¸€è‡´ã—ã¾ã›ã‚“" #: ../ubuntu_sso/utils/ui.py:115 msgid "" "The passwords don't match, please double check and try entering them again." msgstr "パスワードãŒä¸€è‡´ã—ã¾ã›ã‚“。ダブルãƒã‚§ãƒƒã‚¯ã‚’行ã£ã¦ã€ãれãžã‚Œå†å…¥åŠ›ã—ã¦ãã ã•ã„。" #: ../ubuntu_sso/utils/ui.py:117 msgid "Your password must contain" msgstr "以下ã®ãƒ‘スワードæ¡ä»¶ã‚’満ãŸã™ã“ã¨" #: ../ubuntu_sso/utils/ui.py:118 msgid "The password is too weak." msgstr "パスワードãŒå¼±ã™ãŽã¾ã™ã€‚" #: ../ubuntu_sso/utils/ui.py:119 msgid "At least one uppercase letter" msgstr "å°‘ãªãã¨ã‚‚1ã¤ã¯å¤§æ–‡å­—ãŒå¿…è¦" #: ../ubuntu_sso/utils/ui.py:120 msgid "Privacy Policy" msgstr "プライãƒã‚·ãƒ¼ãƒãƒªã‚·ãƒ¼" #: ../ubuntu_sso/utils/ui.py:121 msgid "Connecting to:" msgstr "接続先:" #: ../ubuntu_sso/utils/ui.py:122 msgid "Proxy Settings" msgstr "プロキシã®è¨­å®š" #: ../ubuntu_sso/utils/ui.py:123 msgid "Incorrect login details. Please try again." msgstr "ログイン情報ã®è©³ç´°ãŒæ­£ã—ãã‚りã¾ã›ã‚“。å†åº¦è©¦ã—ã¦ãã ã•ã„。" #: ../ubuntu_sso/utils/ui.py:124 msgid "Please provide login details." msgstr "ログイン情報ã®è©³ç´°ã‚’入力ã—ã¦ãã ã•ã„。" #: ../ubuntu_sso/utils/ui.py:125 msgid "You are connecting through a proxy." msgstr "ãƒ—ãƒ­ã‚­ã‚·çµŒç”±ã§æŽ¥ç¶šã—ã¦ã„ã¾ã™ã€‚" #: ../ubuntu_sso/utils/ui.py:126 msgid "Get Help With Proxies" msgstr "プロキシã«ã¤ã„ã¦ã®ãƒ˜ãƒ«ãƒ—" #: ../ubuntu_sso/utils/ui.py:127 msgid "Proxy password:" msgstr "プロキシã®ãƒ‘スワード:" #: ../ubuntu_sso/utils/ui.py:128 msgid "Save and Connect" msgstr "ä¿å­˜ã—ã¦æŽ¥ç¶šã™ã‚‹" #: ../ubuntu_sso/utils/ui.py:129 msgid "Proxy username:" msgstr "プロキシã®ãƒ¦ãƒ¼ã‚¶ãƒ¼å:" #: ../ubuntu_sso/utils/ui.py:131 msgid "" "A password reset code has been sent to your e-mail. Please enter the code " "below along with your new password." msgstr "パスワードã®ãƒªã‚»ãƒƒãƒˆã‚³ãƒ¼ãƒ‰ã‚’ã‚ãªãŸã®ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã«é€ã‚Šã¾ã—ãŸã€‚æ–°ã—ã„パスワードã¨ã¨ã‚‚ã«ä»¥ä¸‹ã®ã‚³ãƒ¼ãƒ‰ã‚’入力ã—ã¦ãã ã•ã„。" #: ../ubuntu_sso/utils/ui.py:133 msgid "Retype email" msgstr "メールアドレスã®å†å…¥åŠ›" #: ../ubuntu_sso/utils/ui.py:134 msgid "Retype password" msgstr "パスワードã®å†å…¥åŠ›" #: ../ubuntu_sso/utils/ui.py:135 #, python-format msgid "To reset your %(app_name)s password, enter your email address below:" msgstr "%(app_name)s ã®ãƒ‘スワードをリセットã™ã‚‹ã«ã¯ã€ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’入力ã—ã¦ãã ã•ã„:" #: ../ubuntu_sso/utils/ui.py:137 msgid "" "We are very Sorry! The service that signs you on is not responding right " "now\n" "Please try again or come back in a few minutes." msgstr "" "申ã—訳ã‚りã¾ã›ã‚“ï¼ã‚ãªãŸãŒã‚µã‚¤ãƒ³ã‚¢ãƒƒãƒ—ã—ãŸã“ã®ã‚µãƒ¼ãƒ“スã¯ç¾åœ¨å¿œç­”ã—ã¦ã„ã¾ã›ã‚“。\n" "å†åº¦è©¦ã™ã‹ã€å°‘ã—å¾…ã£ã¦ã‹ã‚‰ã‚µã‚¤ãƒ³ã‚¢ãƒƒãƒ—ã—ã¦ã¿ã¦ãã ã•ã„。" #: ../ubuntu_sso/utils/ui.py:140 msgid "Sorry we did not recognize the email address." msgstr "ã™ã¿ã¾ã›ã‚“ãŒã€ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’èªè­˜ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚" #: ../ubuntu_sso/utils/ui.py:142 msgid "Reset code" msgstr "リセットコード" #: ../ubuntu_sso/utils/ui.py:145 #, python-format msgid "" "A password reset code has been sent to %(email)s.\n" "Please enter the code below along with your new password." msgstr "" "パスワードリセットコード㌠%(email)s ã«é€ä¿¡ã•れã¾ã—ãŸã€‚\n" "以下ã§ã€æ–°ã—ã„パスワードã¨ä¸€ç·’ã«ã‚³ãƒ¼ãƒ‰ã‚’入力ã—ã¦ãã ã•ã„。" #: ../ubuntu_sso/utils/ui.py:147 msgid "Set Up Account" msgstr "アカウントã®ã‚»ãƒƒãƒˆã‚¢ãƒƒãƒ—" #: ../ubuntu_sso/utils/ui.py:148 msgid "I don't have an account yet - sign me up" msgstr "ã¾ã ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’æŒã£ã¦ã¾ã›ã‚“ - サインアップã™ã‚‹" #: ../ubuntu_sso/utils/ui.py:149 msgid "Sign In" msgstr "サインイン" #: ../ubuntu_sso/utils/ui.py:150 msgid "Log-in with my existing account." msgstr "" #: ../ubuntu_sso/utils/ui.py:151 msgid "the appname whose ssl error we are going to show." msgstr "表示ã—よã†ã¨ã—ã¦ã„ã‚‹SSLエラーã®ã‚¢ãƒ—リケーションåã§ã™ã€‚" #: ../ubuntu_sso/utils/ui.py:152 msgid "Certificate details" msgstr "証明書ã®è©³ç´°" #: ../ubuntu_sso/utils/ui.py:153 msgid "Connect" msgstr "接続" #: ../ubuntu_sso/utils/ui.py:154 msgid "the details ssl certificate we are going to show." msgstr "表示ã—よã†ã¨ã—ã¦ã„ã‚‹SSL証明書ã®è©³ç´°ã§ã™ã€‚" #: ../ubuntu_sso/utils/ui.py:161 msgid "Open the SSL certificate UI." msgstr "SSL証明書ã®UIã‚’é–‹ãã¾ã™ã€‚" #: ../ubuntu_sso/utils/ui.py:162 msgid "SSL Certificate Not Valid" msgstr "SSL証明書ãŒç„¡åйã§ã™" #: ../ubuntu_sso/utils/ui.py:163 msgid "the domain whose ssl certificate we are going to show." msgstr "表示ã—よã†ã¨ã—ã¦ã„ã‚‹SSL証明書ã®ãƒ‰ãƒ¡ã‚¤ãƒ³ã§ã™ã€‚" #: ../ubuntu_sso/utils/ui.py:164 #, python-format msgid "" "You are trying to connect to a proxy server on %(domain)s. This server uses " "a secure connection, and the SSL certificate is not valid because:" msgstr "" "%(domain)s ã®ãƒ—ロキシサーãƒãƒ¼çµŒç”±ã§æŽ¥ç¶šã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚ã“ã®ã‚µãƒ¼ãƒãƒ¼ã¯ã‚»ã‚­ãƒ¥ã‚¢æŽ¥ç¶šã‚’使用ã—ã¦ãŠã‚Šã€ä»¥ä¸‹ã®ç†ç”±ã§SSL証明書ãŒç„¡åйã§ã™:" #: ../ubuntu_sso/utils/ui.py:167 msgid "The certificate has not been verified" msgstr "è¨¼æ˜Žæ›¸ã¯æ¤œè¨¼ã•れã¦ã„ã¾ã›ã‚“" #: ../ubuntu_sso/utils/ui.py:168 msgid "Do you want to connect to this server?" msgstr "ã“ã®ã‚µãƒ¼ãƒãƒ¼ã«æŽ¥ç¶šã—ã¾ã™ã‹?" #: ../ubuntu_sso/utils/ui.py:169 msgid "Get Help With SSL" msgstr "SSLã«ã¤ã„ã¦ã®ãƒ˜ãƒ«ãƒ—" #: ../ubuntu_sso/utils/ui.py:170 #, python-format msgid "" "If you are not sure about this server, do not use it to connect to " "%(app_name)s." msgstr "ã“ã®ã‚µãƒ¼ãƒãƒ¼ã«ã¤ã„ã¦ç¢ºèªã§ããªã„ãªã‚‰ã€%(app_name)sを接続ã™ã‚‹ãŸã‚ã«åˆ©ç”¨ã—ãªã„ã§ãã ã•ã„。" #: ../ubuntu_sso/utils/ui.py:172 msgid "Remember my settings for this certificate." msgstr "ã“ã®è¨¼æ˜Žæ›¸ã®è¨­å®šã‚’記憶ã™ã‚‹ã€‚" #: ../ubuntu_sso/utils/ui.py:173 msgid "" "The name on the certificate isn't valid or doesn't match the name of the site" msgstr "証明書ã«ã‚ã‚‹åå‰ãŒç„¡åйã¾ãŸã¯ã‚µã‚¤ãƒˆåã¨åˆè‡´ã—ã¦ã„ã¾ã›ã‚“。" #: ../ubuntu_sso/utils/ui.py:175 msgid "The certificate has expired" msgstr "è¨¼æ˜Žæ›¸ã®æœŸé™ãŒåˆ‡ã‚Œã¦ã„ã¾ã™" #: ../ubuntu_sso/utils/ui.py:176 #, python-format msgid "You are now logged into %(app_name)s." msgstr "%(app_name)s ã«ãƒ­ã‚°ã‚¤ãƒ³ã—ã¾ã—ãŸã€‚" #: ../ubuntu_sso/utils/ui.py:177 msgid "Surname" msgstr "å§“" #: ../ubuntu_sso/utils/ui.py:178 msgid "Terms of Service" msgstr "利用è¦ç´„" #: ../ubuntu_sso/utils/ui.py:179 msgid "Sign Up to {app_name}" msgstr "{app_name} ã«ã‚µã‚¤ãƒ³ã‚¢ãƒƒãƒ—ã™ã‚‹" #: ../ubuntu_sso/utils/ui.py:180 msgid "Show Terms & Conditions" msgstr "利用è¦ç´„を表示" #: ../ubuntu_sso/utils/ui.py:181 #, python-format msgid "" "Agreeing to the %(app_name)s Terms & Conditions is required to subscribe." msgstr "%(app_name)s ã®åˆ©ç”¨ç™»éŒ²ã‚’行ã†ã«ã¯ã€è¦ç´„ã«åŒæ„ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" #: ../ubuntu_sso/utils/ui.py:183 #, python-format msgid "You can also find these terms at %(url)s" msgstr "ã“れらã®è¦ç´„ã¯%(url)sã§ã‚‚見るã“ã¨ãŒã§ãã¾ã™" #: ../ubuntu_sso/utils/ui.py:184 msgid "Try again" msgstr "å†è©¦è¡Œ" #: ../ubuntu_sso/utils/ui.py:185 msgid "" "There was an error when trying to complete the process. Please check the " "information and try again." msgstr "処ç†ã‚’完了ã•ã›ã‚‹éš›ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚情報を確èªã—ãŸä¸Šã§ã€ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。" #: ../ubuntu_sso/utils/ui.py:187 msgid "Verification code" msgstr "èªè¨¼ã‚³ãƒ¼ãƒ‰" #: ../ubuntu_sso/utils/ui.py:188 #, python-format msgid "" "Check %(email)s for an email from Ubuntu Single Sign On. This message " "contains a verification code. Enter the code in the field below and click OK " "to complete creating your %(app_name)s account." msgstr "" "Ubuntuシングルサインオンã‹ã‚‰ã®ãƒ¡ãƒ¼ãƒ« %(email)s " "を確èªã—ã¦ãã ã•ã„。ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«ã¯èªè¨¼ã‚³ãƒ¼ãƒ‰ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚%(app_name)sã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã®ä½œæˆã‚’完了ã™ã‚‹ã«ã¯ã€ä»¥ä¸‹ã®ãƒ•ィールドã«èªè¨¼ã‚³ãƒ¼ãƒ‰ã‚’" "入力ã—ã¦OKをクリックã—ã¾ã™ã€‚" #: ../ubuntu_sso/utils/ui.py:192 msgid "Enter verification code" msgstr "èªè¨¼ã‚³ãƒ¼ãƒ‰ã‚’入力" #: ../ubuntu_sso/utils/ui.py:195 #, python-format msgid "I agree with the %(app_name)s terms and conditions" msgstr "ç§ã¯ %(app_name)s ã®åˆ©ç”¨è¦ç´„ã«åŒæ„ã—ã¾ã™" #: ../ubuntu_sso/utils/ui.py:196 #, python-format msgid "Yes! Email me %(app_name)s tips and updates." msgstr "ã¯ã„! %(app_name)s ã®å½¹ã«ç«‹ã¤æƒ…å ±ã¨ã‚¢ãƒƒãƒ—デートをメールã§çŸ¥ã‚‰ã›ã¦ãã ã•ã„。" ubuntu-sso-client-13.10/po/kn.po0000664000202700020270000002560712151461656016751 0ustar dobeydobey00000000000000# Kannada translation for ubuntu-sso-client # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the ubuntu-sso-client package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: ubuntu-sso-client\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-09-11 18:25+0000\n" "PO-Revision-Date: 2010-09-13 11:56+0000\n" "Last-Translator: Neelavar \n" "Language-Team: Kannada \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-09-17 18:24+0000\n" "X-Generator: Launchpad (build 15944)\n" #. Undefined variable '_', pylint: disable=E0602 #. all the text that is used in the gui #: ../ubuntu_sso/utils/ui.py:49 msgid "By signing up to {app_name} you agree to our {privacy_policy}" msgstr "" #: ../ubuntu_sso/utils/ui.py:51 msgid "By signing up to {app_name} you agree to our {terms_and_conditions}" msgstr "" #: ../ubuntu_sso/utils/ui.py:53 msgid " and {privacy_policy}" msgstr "" #: ../ubuntu_sso/utils/ui.py:54 msgid "Cancel" msgstr "" #: ../ubuntu_sso/utils/ui.py:55 msgid "Type the characters above" msgstr "ಈ ಮೇಲೆ ಅಕà³à²·à²°à²—ಳನà³à²¨à³ ಟೈಪಿಸಿ" #: ../ubuntu_sso/utils/ui.py:56 msgid "There was a problem getting the captcha, reloading..." msgstr "" #: ../ubuntu_sso/utils/ui.py:58 #, python-format msgid "If you can't read this then %(reload_link)s this page" msgstr "" #: ../ubuntu_sso/utils/ui.py:60 msgid "refresh" msgstr "" #: ../ubuntu_sso/utils/ui.py:61 msgid "Reload" msgstr "" #: ../ubuntu_sso/utils/ui.py:62 msgid "The captcha is a required field" msgstr "" #: ../ubuntu_sso/utils/ui.py:63 msgid "Close window and set up later" msgstr "" #: ../ubuntu_sso/utils/ui.py:64 msgid "Congratulations, {app_name} is installed!" msgstr "" #: ../ubuntu_sso/utils/ui.py:65 #, python-format msgid "To connect this computer to %(app_name)s enter your details below." msgstr "" #: ../ubuntu_sso/utils/ui.py:67 msgid "Register with {app_name}." msgstr "" #: ../ubuntu_sso/utils/ui.py:68 ../ubuntu_sso/utils/ui.py:93 #: ../ubuntu_sso/utils/ui.py:143 msgid "Email address" msgstr "ಇಮೇಲೠವಿಳಾಸ" #: ../ubuntu_sso/utils/ui.py:69 msgid "Re-type Email address" msgstr "ಈಮೇಲೠವಿಳಾಸವನà³à²¨à³ ಪà³à²¨à²ƒ ತà³à²‚ಬಿಸಿ" #: ../ubuntu_sso/utils/ui.py:70 msgid "The email must be a valid email address." msgstr "ಈಮೇಲೠವಿಳಾಸವೠಅಧಿಕೃತವಾಗಿರಬೇಕà³" #: ../ubuntu_sso/utils/ui.py:71 msgid "" "The email addresses don't match, please double check and try entering them " "again." msgstr "" #: ../ubuntu_sso/utils/ui.py:73 msgid "Email" msgstr "" #: ../ubuntu_sso/utils/ui.py:74 msgid "The email addresses do not match" msgstr "" #: ../ubuntu_sso/utils/ui.py:75 msgid "Enter code verification here" msgstr "" #: ../ubuntu_sso/utils/ui.py:76 msgid "Please enter your name" msgstr "" #: ../ubuntu_sso/utils/ui.py:77 msgid "The process did not finish successfully." msgstr "" #: ../ubuntu_sso/utils/ui.py:79 msgid "Sign me in with my existing account" msgstr "" #: ../ubuntu_sso/utils/ui.py:80 msgid "This field is required." msgstr "" #: ../ubuntu_sso/utils/ui.py:81 msgid "I've forgotten my password" msgstr "ನಾನೠನನà³à²¨ ಗà³à²ªà³à²¤à²ªà²¦à²µà²¨à³à²¨à³ ಮರೆತಿರà³à²µà³†à²¨à³" #: ../ubuntu_sso/utils/ui.py:82 ../ubuntu_sso/utils/ui.py:130 msgid "Reset password" msgstr "" #: ../ubuntu_sso/utils/ui.py:83 msgid "" "To reset your {app_name} password, enter your registered email address " "below. We will send instructions to reset your password." msgstr "" #: ../ubuntu_sso/utils/ui.py:86 msgid "Please enter a valid email address" msgstr "" #: ../ubuntu_sso/utils/ui.py:87 msgid "There was a problem accessing the Ubuntu Single Sign On backend." msgstr "" #: ../ubuntu_sso/utils/ui.py:89 #, python-format msgid "Create %(app_name)s account" msgstr "" #: ../ubuntu_sso/utils/ui.py:90 msgid "Loading..." msgstr "" #: ../ubuntu_sso/utils/ui.py:91 msgid "Getting information, please wait..." msgstr "" #: ../ubuntu_sso/utils/ui.py:92 msgid "Already have an account? Click here to sign in" msgstr "" #: ../ubuntu_sso/utils/ui.py:94 #, python-format msgid "Connect to %(app_name)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:95 ../ubuntu_sso/utils/ui.py:109 msgid "Password" msgstr "" #: ../ubuntu_sso/utils/ui.py:97 msgid "Sign In to {app_name}" msgstr "" #: ../ubuntu_sso/utils/ui.py:99 msgid "Name" msgstr "" #: ../ubuntu_sso/utils/ui.py:100 msgid "The name must not be empty." msgstr "" #: ../ubuntu_sso/utils/ui.py:101 msgid "Next" msgstr "" #: ../ubuntu_sso/utils/ui.py:102 msgid "Network detection" msgstr "" #: ../ubuntu_sso/utils/ui.py:103 #, python-format msgid "" "Are you online? We can't detect an internet connection - you will need to be " "connected to set up %(app_name)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:105 msgid "One moment please..." msgstr "" #: ../ubuntu_sso/utils/ui.py:106 msgid "Create a password" msgstr "" #: ../ubuntu_sso/utils/ui.py:107 msgid "Your password was successfully changed." msgstr "" #: ../ubuntu_sso/utils/ui.py:108 msgid "At least one number" msgstr "" #: ../ubuntu_sso/utils/ui.py:110 msgid "Re-type Password" msgstr "" #: ../ubuntu_sso/utils/ui.py:111 msgid "" "The password must have a minimum of 8 characters and include one uppercase " "character and one number." msgstr "" #: ../ubuntu_sso/utils/ui.py:113 msgid "At least 8 characters" msgstr "" #: ../ubuntu_sso/utils/ui.py:114 msgid "Passwords don't match" msgstr "" #: ../ubuntu_sso/utils/ui.py:115 msgid "" "The passwords don't match, please double check and try entering them again." msgstr "" #: ../ubuntu_sso/utils/ui.py:117 msgid "Your password must contain" msgstr "" #: ../ubuntu_sso/utils/ui.py:118 msgid "The password is too weak." msgstr "" #: ../ubuntu_sso/utils/ui.py:119 msgid "At least one uppercase letter" msgstr "" #: ../ubuntu_sso/utils/ui.py:120 msgid "Privacy Policy" msgstr "" #: ../ubuntu_sso/utils/ui.py:121 msgid "Connecting to:" msgstr "" #: ../ubuntu_sso/utils/ui.py:122 msgid "Proxy Settings" msgstr "" #: ../ubuntu_sso/utils/ui.py:123 msgid "Incorrect login details. Please try again." msgstr "" #: ../ubuntu_sso/utils/ui.py:124 msgid "Please provide login details." msgstr "" #: ../ubuntu_sso/utils/ui.py:125 msgid "You are connecting through a proxy." msgstr "" #: ../ubuntu_sso/utils/ui.py:126 msgid "Get Help With Proxies" msgstr "" #: ../ubuntu_sso/utils/ui.py:127 msgid "Proxy password:" msgstr "" #: ../ubuntu_sso/utils/ui.py:128 msgid "Save and Connect" msgstr "" #: ../ubuntu_sso/utils/ui.py:129 msgid "Proxy username:" msgstr "" #: ../ubuntu_sso/utils/ui.py:131 msgid "" "A password reset code has been sent to your e-mail. Please enter the code " "below along with your new password." msgstr "" #: ../ubuntu_sso/utils/ui.py:133 msgid "Retype email" msgstr "" #: ../ubuntu_sso/utils/ui.py:134 msgid "Retype password" msgstr "" #: ../ubuntu_sso/utils/ui.py:135 #, python-format msgid "To reset your %(app_name)s password, enter your email address below:" msgstr "" #: ../ubuntu_sso/utils/ui.py:137 msgid "" "We are very Sorry! The service that signs you on is not responding right " "now\n" "Please try again or come back in a few minutes." msgstr "" #: ../ubuntu_sso/utils/ui.py:140 msgid "Sorry we did not recognize the email address." msgstr "" #: ../ubuntu_sso/utils/ui.py:142 msgid "Reset code" msgstr "" #: ../ubuntu_sso/utils/ui.py:145 #, python-format msgid "" "A password reset code has been sent to %(email)s.\n" "Please enter the code below along with your new password." msgstr "" #: ../ubuntu_sso/utils/ui.py:147 msgid "Set Up Account" msgstr "" #: ../ubuntu_sso/utils/ui.py:148 msgid "I don't have an account yet - sign me up" msgstr "" #: ../ubuntu_sso/utils/ui.py:149 msgid "Sign In" msgstr "" #: ../ubuntu_sso/utils/ui.py:150 msgid "Log-in with my existing account." msgstr "" #: ../ubuntu_sso/utils/ui.py:151 msgid "the appname whose ssl error we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:152 msgid "Certificate details" msgstr "" #: ../ubuntu_sso/utils/ui.py:153 msgid "Connect" msgstr "" #: ../ubuntu_sso/utils/ui.py:154 msgid "the details ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:161 msgid "Open the SSL certificate UI." msgstr "" #: ../ubuntu_sso/utils/ui.py:162 msgid "SSL Certificate Not Valid" msgstr "" #: ../ubuntu_sso/utils/ui.py:163 msgid "the domain whose ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:164 #, python-format msgid "" "You are trying to connect to a proxy server on %(domain)s. This server uses " "a secure connection, and the SSL certificate is not valid because:" msgstr "" #: ../ubuntu_sso/utils/ui.py:167 msgid "The certificate has not been verified" msgstr "" #: ../ubuntu_sso/utils/ui.py:168 msgid "Do you want to connect to this server?" msgstr "" #: ../ubuntu_sso/utils/ui.py:169 msgid "Get Help With SSL" msgstr "" #: ../ubuntu_sso/utils/ui.py:170 #, python-format msgid "" "If you are not sure about this server, do not use it to connect to " "%(app_name)s." msgstr "" #: ../ubuntu_sso/utils/ui.py:172 msgid "Remember my settings for this certificate." msgstr "" #: ../ubuntu_sso/utils/ui.py:173 msgid "" "The name on the certificate isn't valid or doesn't match the name of the site" msgstr "" #: ../ubuntu_sso/utils/ui.py:175 msgid "The certificate has expired" msgstr "" #: ../ubuntu_sso/utils/ui.py:176 #, python-format msgid "You are now logged into %(app_name)s." msgstr "" #: ../ubuntu_sso/utils/ui.py:177 msgid "Surname" msgstr "" #: ../ubuntu_sso/utils/ui.py:178 msgid "Terms of Service" msgstr "" #: ../ubuntu_sso/utils/ui.py:179 msgid "Sign Up to {app_name}" msgstr "" #: ../ubuntu_sso/utils/ui.py:180 msgid "Show Terms & Conditions" msgstr "" #: ../ubuntu_sso/utils/ui.py:181 #, python-format msgid "" "Agreeing to the %(app_name)s Terms & Conditions is required to subscribe." msgstr "" #: ../ubuntu_sso/utils/ui.py:183 #, python-format msgid "You can also find these terms at %(url)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:184 msgid "Try again" msgstr "" #: ../ubuntu_sso/utils/ui.py:185 msgid "" "There was an error when trying to complete the process. Please check the " "information and try again." msgstr "" #: ../ubuntu_sso/utils/ui.py:187 msgid "Verification code" msgstr "" #: ../ubuntu_sso/utils/ui.py:188 #, python-format msgid "" "Check %(email)s for an email from Ubuntu Single Sign On. This message " "contains a verification code. Enter the code in the field below and click OK " "to complete creating your %(app_name)s account." msgstr "" #: ../ubuntu_sso/utils/ui.py:192 msgid "Enter verification code" msgstr "" #: ../ubuntu_sso/utils/ui.py:195 #, python-format msgid "I agree with the %(app_name)s terms and conditions" msgstr "" #: ../ubuntu_sso/utils/ui.py:196 #, python-format msgid "Yes! Email me %(app_name)s tips and updates." msgstr "" ubuntu-sso-client-13.10/po/ky.po0000664000202700020270000002504612151461656016761 0ustar dobeydobey00000000000000# Kirghiz translation for ubuntu-sso-client # Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 # This file is distributed under the same license as the ubuntu-sso-client package. # FIRST AUTHOR , 2011. # msgid "" msgstr "" "Project-Id-Version: ubuntu-sso-client\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-09-11 18:25+0000\n" "PO-Revision-Date: 2011-06-03 08:52+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Kirghiz \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-09-17 18:24+0000\n" "X-Generator: Launchpad (build 15944)\n" #. Undefined variable '_', pylint: disable=E0602 #. all the text that is used in the gui #: ../ubuntu_sso/utils/ui.py:49 msgid "By signing up to {app_name} you agree to our {privacy_policy}" msgstr "" #: ../ubuntu_sso/utils/ui.py:51 msgid "By signing up to {app_name} you agree to our {terms_and_conditions}" msgstr "" #: ../ubuntu_sso/utils/ui.py:53 msgid " and {privacy_policy}" msgstr "" #: ../ubuntu_sso/utils/ui.py:54 msgid "Cancel" msgstr "" #: ../ubuntu_sso/utils/ui.py:55 msgid "Type the characters above" msgstr "" #: ../ubuntu_sso/utils/ui.py:56 msgid "There was a problem getting the captcha, reloading..." msgstr "" #: ../ubuntu_sso/utils/ui.py:58 #, python-format msgid "If you can't read this then %(reload_link)s this page" msgstr "" #: ../ubuntu_sso/utils/ui.py:60 msgid "refresh" msgstr "" #: ../ubuntu_sso/utils/ui.py:61 msgid "Reload" msgstr "" #: ../ubuntu_sso/utils/ui.py:62 msgid "The captcha is a required field" msgstr "" #: ../ubuntu_sso/utils/ui.py:63 msgid "Close window and set up later" msgstr "" #: ../ubuntu_sso/utils/ui.py:64 msgid "Congratulations, {app_name} is installed!" msgstr "" #: ../ubuntu_sso/utils/ui.py:65 #, python-format msgid "To connect this computer to %(app_name)s enter your details below." msgstr "" #: ../ubuntu_sso/utils/ui.py:67 msgid "Register with {app_name}." msgstr "" #: ../ubuntu_sso/utils/ui.py:68 ../ubuntu_sso/utils/ui.py:93 #: ../ubuntu_sso/utils/ui.py:143 msgid "Email address" msgstr "" #: ../ubuntu_sso/utils/ui.py:69 msgid "Re-type Email address" msgstr "" #: ../ubuntu_sso/utils/ui.py:70 msgid "The email must be a valid email address." msgstr "" #: ../ubuntu_sso/utils/ui.py:71 msgid "" "The email addresses don't match, please double check and try entering them " "again." msgstr "" #: ../ubuntu_sso/utils/ui.py:73 msgid "Email" msgstr "" #: ../ubuntu_sso/utils/ui.py:74 msgid "The email addresses do not match" msgstr "" #: ../ubuntu_sso/utils/ui.py:75 msgid "Enter code verification here" msgstr "" #: ../ubuntu_sso/utils/ui.py:76 msgid "Please enter your name" msgstr "" #: ../ubuntu_sso/utils/ui.py:77 msgid "The process did not finish successfully." msgstr "" #: ../ubuntu_sso/utils/ui.py:79 msgid "Sign me in with my existing account" msgstr "" #: ../ubuntu_sso/utils/ui.py:80 msgid "This field is required." msgstr "" #: ../ubuntu_sso/utils/ui.py:81 msgid "I've forgotten my password" msgstr "" #: ../ubuntu_sso/utils/ui.py:82 ../ubuntu_sso/utils/ui.py:130 msgid "Reset password" msgstr "" #: ../ubuntu_sso/utils/ui.py:83 msgid "" "To reset your {app_name} password, enter your registered email address " "below. We will send instructions to reset your password." msgstr "" #: ../ubuntu_sso/utils/ui.py:86 msgid "Please enter a valid email address" msgstr "" #: ../ubuntu_sso/utils/ui.py:87 msgid "There was a problem accessing the Ubuntu Single Sign On backend." msgstr "" #: ../ubuntu_sso/utils/ui.py:89 #, python-format msgid "Create %(app_name)s account" msgstr "" #: ../ubuntu_sso/utils/ui.py:90 msgid "Loading..." msgstr "" #: ../ubuntu_sso/utils/ui.py:91 msgid "Getting information, please wait..." msgstr "" #: ../ubuntu_sso/utils/ui.py:92 msgid "Already have an account? Click here to sign in" msgstr "" #: ../ubuntu_sso/utils/ui.py:94 #, python-format msgid "Connect to %(app_name)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:95 ../ubuntu_sso/utils/ui.py:109 msgid "Password" msgstr "" #: ../ubuntu_sso/utils/ui.py:97 msgid "Sign In to {app_name}" msgstr "" #: ../ubuntu_sso/utils/ui.py:99 msgid "Name" msgstr "" #: ../ubuntu_sso/utils/ui.py:100 msgid "The name must not be empty." msgstr "" #: ../ubuntu_sso/utils/ui.py:101 msgid "Next" msgstr "" #: ../ubuntu_sso/utils/ui.py:102 msgid "Network detection" msgstr "" #: ../ubuntu_sso/utils/ui.py:103 #, python-format msgid "" "Are you online? We can't detect an internet connection - you will need to be " "connected to set up %(app_name)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:105 msgid "One moment please..." msgstr "" #: ../ubuntu_sso/utils/ui.py:106 msgid "Create a password" msgstr "" #: ../ubuntu_sso/utils/ui.py:107 msgid "Your password was successfully changed." msgstr "" #: ../ubuntu_sso/utils/ui.py:108 msgid "At least one number" msgstr "" #: ../ubuntu_sso/utils/ui.py:110 msgid "Re-type Password" msgstr "" #: ../ubuntu_sso/utils/ui.py:111 msgid "" "The password must have a minimum of 8 characters and include one uppercase " "character and one number." msgstr "" #: ../ubuntu_sso/utils/ui.py:113 msgid "At least 8 characters" msgstr "" #: ../ubuntu_sso/utils/ui.py:114 msgid "Passwords don't match" msgstr "" #: ../ubuntu_sso/utils/ui.py:115 msgid "" "The passwords don't match, please double check and try entering them again." msgstr "" #: ../ubuntu_sso/utils/ui.py:117 msgid "Your password must contain" msgstr "" #: ../ubuntu_sso/utils/ui.py:118 msgid "The password is too weak." msgstr "" #: ../ubuntu_sso/utils/ui.py:119 msgid "At least one uppercase letter" msgstr "" #: ../ubuntu_sso/utils/ui.py:120 msgid "Privacy Policy" msgstr "" #: ../ubuntu_sso/utils/ui.py:121 msgid "Connecting to:" msgstr "" #: ../ubuntu_sso/utils/ui.py:122 msgid "Proxy Settings" msgstr "" #: ../ubuntu_sso/utils/ui.py:123 msgid "Incorrect login details. Please try again." msgstr "" #: ../ubuntu_sso/utils/ui.py:124 msgid "Please provide login details." msgstr "" #: ../ubuntu_sso/utils/ui.py:125 msgid "You are connecting through a proxy." msgstr "" #: ../ubuntu_sso/utils/ui.py:126 msgid "Get Help With Proxies" msgstr "" #: ../ubuntu_sso/utils/ui.py:127 msgid "Proxy password:" msgstr "" #: ../ubuntu_sso/utils/ui.py:128 msgid "Save and Connect" msgstr "" #: ../ubuntu_sso/utils/ui.py:129 msgid "Proxy username:" msgstr "" #: ../ubuntu_sso/utils/ui.py:131 msgid "" "A password reset code has been sent to your e-mail. Please enter the code " "below along with your new password." msgstr "" #: ../ubuntu_sso/utils/ui.py:133 msgid "Retype email" msgstr "" #: ../ubuntu_sso/utils/ui.py:134 msgid "Retype password" msgstr "" #: ../ubuntu_sso/utils/ui.py:135 #, python-format msgid "To reset your %(app_name)s password, enter your email address below:" msgstr "" #: ../ubuntu_sso/utils/ui.py:137 msgid "" "We are very Sorry! The service that signs you on is not responding right " "now\n" "Please try again or come back in a few minutes." msgstr "" #: ../ubuntu_sso/utils/ui.py:140 msgid "Sorry we did not recognize the email address." msgstr "" #: ../ubuntu_sso/utils/ui.py:142 msgid "Reset code" msgstr "" #: ../ubuntu_sso/utils/ui.py:145 #, python-format msgid "" "A password reset code has been sent to %(email)s.\n" "Please enter the code below along with your new password." msgstr "" #: ../ubuntu_sso/utils/ui.py:147 msgid "Set Up Account" msgstr "" #: ../ubuntu_sso/utils/ui.py:148 msgid "I don't have an account yet - sign me up" msgstr "" #: ../ubuntu_sso/utils/ui.py:149 msgid "Sign In" msgstr "" #: ../ubuntu_sso/utils/ui.py:150 msgid "Log-in with my existing account." msgstr "" #: ../ubuntu_sso/utils/ui.py:151 msgid "the appname whose ssl error we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:152 msgid "Certificate details" msgstr "" #: ../ubuntu_sso/utils/ui.py:153 msgid "Connect" msgstr "" #: ../ubuntu_sso/utils/ui.py:154 msgid "the details ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:161 msgid "Open the SSL certificate UI." msgstr "" #: ../ubuntu_sso/utils/ui.py:162 msgid "SSL Certificate Not Valid" msgstr "" #: ../ubuntu_sso/utils/ui.py:163 msgid "the domain whose ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:164 #, python-format msgid "" "You are trying to connect to a proxy server on %(domain)s. This server uses " "a secure connection, and the SSL certificate is not valid because:" msgstr "" #: ../ubuntu_sso/utils/ui.py:167 msgid "The certificate has not been verified" msgstr "" #: ../ubuntu_sso/utils/ui.py:168 msgid "Do you want to connect to this server?" msgstr "" #: ../ubuntu_sso/utils/ui.py:169 msgid "Get Help With SSL" msgstr "" #: ../ubuntu_sso/utils/ui.py:170 #, python-format msgid "" "If you are not sure about this server, do not use it to connect to " "%(app_name)s." msgstr "" #: ../ubuntu_sso/utils/ui.py:172 msgid "Remember my settings for this certificate." msgstr "" #: ../ubuntu_sso/utils/ui.py:173 msgid "" "The name on the certificate isn't valid or doesn't match the name of the site" msgstr "" #: ../ubuntu_sso/utils/ui.py:175 msgid "The certificate has expired" msgstr "" #: ../ubuntu_sso/utils/ui.py:176 #, python-format msgid "You are now logged into %(app_name)s." msgstr "" #: ../ubuntu_sso/utils/ui.py:177 msgid "Surname" msgstr "" #: ../ubuntu_sso/utils/ui.py:178 msgid "Terms of Service" msgstr "" #: ../ubuntu_sso/utils/ui.py:179 msgid "Sign Up to {app_name}" msgstr "" #: ../ubuntu_sso/utils/ui.py:180 msgid "Show Terms & Conditions" msgstr "" #: ../ubuntu_sso/utils/ui.py:181 #, python-format msgid "" "Agreeing to the %(app_name)s Terms & Conditions is required to subscribe." msgstr "" #: ../ubuntu_sso/utils/ui.py:183 #, python-format msgid "You can also find these terms at %(url)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:184 msgid "Try again" msgstr "" #: ../ubuntu_sso/utils/ui.py:185 msgid "" "There was an error when trying to complete the process. Please check the " "information and try again." msgstr "" #: ../ubuntu_sso/utils/ui.py:187 msgid "Verification code" msgstr "" #: ../ubuntu_sso/utils/ui.py:188 #, python-format msgid "" "Check %(email)s for an email from Ubuntu Single Sign On. This message " "contains a verification code. Enter the code in the field below and click OK " "to complete creating your %(app_name)s account." msgstr "" #: ../ubuntu_sso/utils/ui.py:192 msgid "Enter verification code" msgstr "" #: ../ubuntu_sso/utils/ui.py:195 #, python-format msgid "I agree with the %(app_name)s terms and conditions" msgstr "" #: ../ubuntu_sso/utils/ui.py:196 #, python-format msgid "Yes! Email me %(app_name)s tips and updates." msgstr "" ubuntu-sso-client-13.10/po/pt_BR.po0000664000202700020270000003624312151461656017345 0ustar dobeydobey00000000000000# Brazilian Portuguese translation for ubuntu-sso-client # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the ubuntu-sso-client package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: ubuntu-sso-client\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-09-11 18:25+0000\n" "PO-Revision-Date: 2012-09-09 15:05+0000\n" "Last-Translator: Fábio Nogueira \n" "Language-Team: Brazilian Portuguese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-09-17 18:24+0000\n" "X-Generator: Launchpad (build 15944)\n" #. Undefined variable '_', pylint: disable=E0602 #. all the text that is used in the gui #: ../ubuntu_sso/utils/ui.py:49 msgid "By signing up to {app_name} you agree to our {privacy_policy}" msgstr "Ao assinar {app_name} você concorda com nossa {privacy_policy}" #: ../ubuntu_sso/utils/ui.py:51 msgid "By signing up to {app_name} you agree to our {terms_and_conditions}" msgstr "" "Ao assinar o {app_name} você concorda com nossos {terms_and_conditions}" #: ../ubuntu_sso/utils/ui.py:53 msgid " and {privacy_policy}" msgstr " e {privacy_policy}" #: ../ubuntu_sso/utils/ui.py:54 msgid "Cancel" msgstr "Cancelar" #: ../ubuntu_sso/utils/ui.py:55 msgid "Type the characters above" msgstr "Entre com os caracteres acima" #: ../ubuntu_sso/utils/ui.py:56 msgid "There was a problem getting the captcha, reloading..." msgstr "Houve um problema na obtenção do captcha, recarregando..." #: ../ubuntu_sso/utils/ui.py:58 #, python-format msgid "If you can't read this then %(reload_link)s this page" msgstr "Se você não consegue ler isso então %(reload_link)s esta página" #: ../ubuntu_sso/utils/ui.py:60 msgid "refresh" msgstr "atualizar" #: ../ubuntu_sso/utils/ui.py:61 msgid "Reload" msgstr "Recarregar" #: ../ubuntu_sso/utils/ui.py:62 msgid "The captcha is a required field" msgstr "O captcha é um campo obrigatório" #: ../ubuntu_sso/utils/ui.py:63 msgid "Close window and set up later" msgstr "Fechar janela e configurar mais tarde" #: ../ubuntu_sso/utils/ui.py:64 msgid "Congratulations, {app_name} is installed!" msgstr "Parabéns, o {app_name} está instalado!" #: ../ubuntu_sso/utils/ui.py:65 #, python-format msgid "To connect this computer to %(app_name)s enter your details below." msgstr "" "Para conectar este computador com %(app_name)s, entre com seus detalhes " "abaixo." #: ../ubuntu_sso/utils/ui.py:67 msgid "Register with {app_name}." msgstr "Registrar com {app_name}." #: ../ubuntu_sso/utils/ui.py:68 ../ubuntu_sso/utils/ui.py:93 #: ../ubuntu_sso/utils/ui.py:143 msgid "Email address" msgstr "Endereço de e-mail" #: ../ubuntu_sso/utils/ui.py:69 msgid "Re-type Email address" msgstr "Redigite seu endereço de e-mail" #: ../ubuntu_sso/utils/ui.py:70 msgid "The email must be a valid email address." msgstr "O e-mail tem que ser um endereço de e-mail válido." #: ../ubuntu_sso/utils/ui.py:71 msgid "" "The email addresses don't match, please double check and try entering them " "again." msgstr "" "Os endereços de e-amail não correspondem, por favor verifique e tente digitá-" "los novamente." #: ../ubuntu_sso/utils/ui.py:73 msgid "Email" msgstr "E-mail" #: ../ubuntu_sso/utils/ui.py:74 msgid "The email addresses do not match" msgstr "Os endereços de e-mail não correspondem" #: ../ubuntu_sso/utils/ui.py:75 msgid "Enter code verification here" msgstr "Digite o seu código de verificação aqui" #: ../ubuntu_sso/utils/ui.py:76 msgid "Please enter your name" msgstr "Informe seu nome" #: ../ubuntu_sso/utils/ui.py:77 msgid "The process did not finish successfully." msgstr "O processo não foi finalizado com sucesso." #: ../ubuntu_sso/utils/ui.py:79 msgid "Sign me in with my existing account" msgstr "Entrar com minha conta existente" #: ../ubuntu_sso/utils/ui.py:80 msgid "This field is required." msgstr "Este campo é necessário." #: ../ubuntu_sso/utils/ui.py:81 msgid "I've forgotten my password" msgstr "Eu esqueci minha senha" #: ../ubuntu_sso/utils/ui.py:82 ../ubuntu_sso/utils/ui.py:130 msgid "Reset password" msgstr "Recuperar senha" #: ../ubuntu_sso/utils/ui.py:83 msgid "" "To reset your {app_name} password, enter your registered email address " "below. We will send instructions to reset your password." msgstr "" "Para redefinir a senha do seu {app_name}, informe seu endereço de e-mail " "abaixo. Nós enviaremos instruções para redefinir sua senha." #: ../ubuntu_sso/utils/ui.py:86 msgid "Please enter a valid email address" msgstr "Informe um endereço de e-mail válido" #: ../ubuntu_sso/utils/ui.py:87 msgid "There was a problem accessing the Ubuntu Single Sign On backend." msgstr "" "Houve um problema ao acessar a infraestrutura do Ubuntu Single Sign On." #: ../ubuntu_sso/utils/ui.py:89 #, python-format msgid "Create %(app_name)s account" msgstr "Criar conta %(app_name)s" #: ../ubuntu_sso/utils/ui.py:90 msgid "Loading..." msgstr "Carregando..." #: ../ubuntu_sso/utils/ui.py:91 msgid "Getting information, please wait..." msgstr "Obtendo informações, por favor aguarde..." #: ../ubuntu_sso/utils/ui.py:92 msgid "Already have an account? Click here to sign in" msgstr "Conta já existe? Clique aqui para entrar" #: ../ubuntu_sso/utils/ui.py:94 #, python-format msgid "Connect to %(app_name)s" msgstr "Conectar com %(app_name)s" #: ../ubuntu_sso/utils/ui.py:95 ../ubuntu_sso/utils/ui.py:109 msgid "Password" msgstr "Senha" #: ../ubuntu_sso/utils/ui.py:97 msgid "Sign In to {app_name}" msgstr "Autentique-se no {app_name}" #: ../ubuntu_sso/utils/ui.py:99 msgid "Name" msgstr "Nome" #: ../ubuntu_sso/utils/ui.py:100 msgid "The name must not be empty." msgstr "O campo nome não pode estar vazio." #: ../ubuntu_sso/utils/ui.py:101 msgid "Next" msgstr "Próximo" #: ../ubuntu_sso/utils/ui.py:102 msgid "Network detection" msgstr "Detecção de rede" #: ../ubuntu_sso/utils/ui.py:103 #, python-format msgid "" "Are you online? We can't detect an internet connection - you will need to be " "connected to set up %(app_name)s" msgstr "" "Você está conectado? Nós não conseguimos detectar uma conexão de internet - " "você precisará estar conectado para configurar o %(app_name)s" #: ../ubuntu_sso/utils/ui.py:105 msgid "One moment please..." msgstr "Um momento, por favor..." #: ../ubuntu_sso/utils/ui.py:106 msgid "Create a password" msgstr "Crie uma senha" #: ../ubuntu_sso/utils/ui.py:107 msgid "Your password was successfully changed." msgstr "Sua senha foi alterada com sucesso." #: ../ubuntu_sso/utils/ui.py:108 msgid "At least one number" msgstr "Pelo menos um número" #: ../ubuntu_sso/utils/ui.py:110 msgid "Re-type Password" msgstr "Redigite a senha" #: ../ubuntu_sso/utils/ui.py:111 msgid "" "The password must have a minimum of 8 characters and include one uppercase " "character and one number." msgstr "" "A senha precisa ter no mínimo 8 caracteres e incluir um caractere maiúsculo " "e um número." #: ../ubuntu_sso/utils/ui.py:113 msgid "At least 8 characters" msgstr "Pelo menos 8 caracteres" #: ../ubuntu_sso/utils/ui.py:114 msgid "Passwords don't match" msgstr "As senhas não correspondem" #: ../ubuntu_sso/utils/ui.py:115 msgid "" "The passwords don't match, please double check and try entering them again." msgstr "" "As senhas não correspondem, por favor verifique-as e tente digitá-las " "novamente." #: ../ubuntu_sso/utils/ui.py:117 msgid "Your password must contain" msgstr "Sua senha deve conter" #: ../ubuntu_sso/utils/ui.py:118 msgid "The password is too weak." msgstr "A senha é muito fraca." #: ../ubuntu_sso/utils/ui.py:119 msgid "At least one uppercase letter" msgstr "Pelo menos uma letra maiúscula" #: ../ubuntu_sso/utils/ui.py:120 msgid "Privacy Policy" msgstr "Política de privacidade" #: ../ubuntu_sso/utils/ui.py:121 msgid "Connecting to:" msgstr "Conectando a:" #: ../ubuntu_sso/utils/ui.py:122 msgid "Proxy Settings" msgstr "Configurações de proxy" #: ../ubuntu_sso/utils/ui.py:123 msgid "Incorrect login details. Please try again." msgstr "Detalhes de autenticação incorretos. Por favor, tente novamente." #: ../ubuntu_sso/utils/ui.py:124 msgid "Please provide login details." msgstr "Informe os detalhes da autenticação." #: ../ubuntu_sso/utils/ui.py:125 msgid "You are connecting through a proxy." msgstr "Você está conectando através de um proxy." #: ../ubuntu_sso/utils/ui.py:126 msgid "Get Help With Proxies" msgstr "Obter ajuda com proxies" #: ../ubuntu_sso/utils/ui.py:127 msgid "Proxy password:" msgstr "Senha do proxy:" #: ../ubuntu_sso/utils/ui.py:128 msgid "Save and Connect" msgstr "Salvar e conectar" #: ../ubuntu_sso/utils/ui.py:129 msgid "Proxy username:" msgstr "Nome de usuário do proxy:" #: ../ubuntu_sso/utils/ui.py:131 msgid "" "A password reset code has been sent to your e-mail. Please enter the code " "below along with your new password." msgstr "" "Um código para redefinir a senha foi enviado para seu e-mail. Por favor, " "digite o código abaixo juntamente com sua nova senha." #: ../ubuntu_sso/utils/ui.py:133 msgid "Retype email" msgstr "Redigite o e-mail" #: ../ubuntu_sso/utils/ui.py:134 msgid "Retype password" msgstr "Redigite a senha" #: ../ubuntu_sso/utils/ui.py:135 #, python-format msgid "To reset your %(app_name)s password, enter your email address below:" msgstr "" "Para recuperar a senha do seu %(app_name)s. digite o seu endereço de e-mail " "abaixo:" #: ../ubuntu_sso/utils/ui.py:137 msgid "" "We are very Sorry! The service that signs you on is not responding right " "now\n" "Please try again or come back in a few minutes." msgstr "" "Nós sentimos muito! O serviço para efetuar sua inscrição não está " "funcionando no momento\n" "Por favor, tente novamente em alguns minutos." #: ../ubuntu_sso/utils/ui.py:140 msgid "Sorry we did not recognize the email address." msgstr "Desculpe, não reconhecemos o seu endereço de e-mail." #: ../ubuntu_sso/utils/ui.py:142 msgid "Reset code" msgstr "Recuperar código" #: ../ubuntu_sso/utils/ui.py:145 #, python-format msgid "" "A password reset code has been sent to %(email)s.\n" "Please enter the code below along with your new password." msgstr "" "O código de recuperação de senha voi enviado para %(email)s.\n" "Por favor insira o código abaixo, juntamente com sua nova senha." #: ../ubuntu_sso/utils/ui.py:147 msgid "Set Up Account" msgstr "Configurar conta" #: ../ubuntu_sso/utils/ui.py:148 msgid "I don't have an account yet - sign me up" msgstr "Eu ainda não tenho uma conta - quero me inscrever" #: ../ubuntu_sso/utils/ui.py:149 msgid "Sign In" msgstr "Entrar" #: ../ubuntu_sso/utils/ui.py:150 msgid "Log-in with my existing account." msgstr "Logar com minha conta existente." #: ../ubuntu_sso/utils/ui.py:151 msgid "the appname whose ssl error we are going to show." msgstr "o nome do aplicativo cujo erro de SSL vamos mostrar." #: ../ubuntu_sso/utils/ui.py:152 msgid "Certificate details" msgstr "Detalhes do certificado" #: ../ubuntu_sso/utils/ui.py:153 msgid "Connect" msgstr "Conectar" #: ../ubuntu_sso/utils/ui.py:154 msgid "the details ssl certificate we are going to show." msgstr "os detalhes do certificado SSL que vamos mostrar." #: ../ubuntu_sso/utils/ui.py:161 msgid "Open the SSL certificate UI." msgstr "Abra a interface de usuário do certificado SSL." #: ../ubuntu_sso/utils/ui.py:162 msgid "SSL Certificate Not Valid" msgstr "Certificado SSL não é válido" #: ../ubuntu_sso/utils/ui.py:163 msgid "the domain whose ssl certificate we are going to show." msgstr "o domínio cujo certificado SSL vamos mostrar." #: ../ubuntu_sso/utils/ui.py:164 #, python-format msgid "" "You are trying to connect to a proxy server on %(domain)s. This server uses " "a secure connection, and the SSL certificate is not valid because:" msgstr "" "Você está tentando se conectar a um servidor proxy em %(domain)s. Esse " "servidor usa uma conexão segura, e o certificado SSL não é válido porque:" #: ../ubuntu_sso/utils/ui.py:167 msgid "The certificate has not been verified" msgstr "O certificado não foi verificado" #: ../ubuntu_sso/utils/ui.py:168 msgid "Do you want to connect to this server?" msgstr "Você tem certeza de que deseja conectar-se a este servidor?" #: ../ubuntu_sso/utils/ui.py:169 msgid "Get Help With SSL" msgstr "Obter ajuda com SSL" #: ../ubuntu_sso/utils/ui.py:170 #, python-format msgid "" "If you are not sure about this server, do not use it to connect to " "%(app_name)s." msgstr "" "Se você não está seguro sobre este servidor, não o utilize para conectar-se " "a %(app_name)s." #: ../ubuntu_sso/utils/ui.py:172 msgid "Remember my settings for this certificate." msgstr "Lembrar minhas configurações para este certificado." #: ../ubuntu_sso/utils/ui.py:173 msgid "" "The name on the certificate isn't valid or doesn't match the name of the site" msgstr "" "O nome do certificado não é válido ou não confere com o nome da página" #: ../ubuntu_sso/utils/ui.py:175 msgid "The certificate has expired" msgstr "O certificado expirou" #: ../ubuntu_sso/utils/ui.py:176 #, python-format msgid "You are now logged into %(app_name)s." msgstr "Você está autenticado em %(app_name)s." #: ../ubuntu_sso/utils/ui.py:177 msgid "Surname" msgstr "Sobrenome" #: ../ubuntu_sso/utils/ui.py:178 msgid "Terms of Service" msgstr "Termos do serviço" #: ../ubuntu_sso/utils/ui.py:179 msgid "Sign Up to {app_name}" msgstr "Inscrever-se no {app_name}" #: ../ubuntu_sso/utils/ui.py:180 msgid "Show Terms & Conditions" msgstr "Mostrar termos e condições" #: ../ubuntu_sso/utils/ui.py:181 #, python-format msgid "" "Agreeing to the %(app_name)s Terms & Conditions is required to subscribe." msgstr "" "A aceitação dos termos & condições do %(app_name)s é necessário para " "inscrever-se." #: ../ubuntu_sso/utils/ui.py:183 #, python-format msgid "You can also find these terms at %(url)s" msgstr "" "Você também pode encontrar estes termos em %(url)s" #: ../ubuntu_sso/utils/ui.py:184 msgid "Try again" msgstr "Tentar novamente" #: ../ubuntu_sso/utils/ui.py:185 msgid "" "There was an error when trying to complete the process. Please check the " "information and try again." msgstr "" "Houve um erro ao completar o processo. Por favor, verifique as informações e " "tente novamente." #: ../ubuntu_sso/utils/ui.py:187 msgid "Verification code" msgstr "Código de verificação" #: ../ubuntu_sso/utils/ui.py:188 #, python-format msgid "" "Check %(email)s for an email from Ubuntu Single Sign On. This message " "contains a verification code. Enter the code in the field below and click OK " "to complete creating your %(app_name)s account." msgstr "" "Procure na conta %(email)s por uma mensagem de e-mail de Ubuntu Single Sign " "On. Esta mensagem contém um código de verificação. Digite o código no campo " "abaixo e clique em OK para completar a criação de sua conta do %(app_name)s." #: ../ubuntu_sso/utils/ui.py:192 msgid "Enter verification code" msgstr "Digite o código de verificação" #: ../ubuntu_sso/utils/ui.py:195 #, python-format msgid "I agree with the %(app_name)s terms and conditions" msgstr "Estou de acordo com os termos e condições de %(app_name)s" #: ../ubuntu_sso/utils/ui.py:196 #, python-format msgid "Yes! Email me %(app_name)s tips and updates." msgstr "Sim! Envie e-mail com dicas e atualizações do %(app_name)s." ubuntu-sso-client-13.10/po/nl.po0000664000202700020270000003611512151461656016746 0ustar dobeydobey00000000000000# Dutch translation for ubuntu-sso-client # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the ubuntu-sso-client package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: ubuntu-sso-client\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-09-11 18:25+0000\n" "PO-Revision-Date: 2012-09-16 07:18+0000\n" "Last-Translator: Hannie Dumoleyn \n" "Language-Team: Dutch \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-09-17 18:24+0000\n" "X-Generator: Launchpad (build 15944)\n" #. Undefined variable '_', pylint: disable=E0602 #. all the text that is used in the gui #: ../ubuntu_sso/utils/ui.py:49 msgid "By signing up to {app_name} you agree to our {privacy_policy}" msgstr "" "Door in te schrijven bij {app_name} gaat u akkoord met ons {privacy_policy}" #: ../ubuntu_sso/utils/ui.py:51 msgid "By signing up to {app_name} you agree to our {terms_and_conditions}" msgstr "" "Door in te schrijven bij {app_name} gaat u akkoord met onze " "{terms_and_conditions}" #: ../ubuntu_sso/utils/ui.py:53 msgid " and {privacy_policy}" msgstr " en {privacy_policy}" #: ../ubuntu_sso/utils/ui.py:54 msgid "Cancel" msgstr "Annuleren" #: ../ubuntu_sso/utils/ui.py:55 msgid "Type the characters above" msgstr "Typ de bovenstaande tekens over" #: ../ubuntu_sso/utils/ui.py:56 msgid "There was a problem getting the captcha, reloading..." msgstr "" "Er heeft zich een probleem voorgedaan bij het ontvangen van de ‘captcha’, " "herladen…" #: ../ubuntu_sso/utils/ui.py:58 #, python-format msgid "If you can't read this then %(reload_link)s this page" msgstr "Als u dit niet kunt lezen kunt u deze pagina %(reload_link)s" #: ../ubuntu_sso/utils/ui.py:60 msgid "refresh" msgstr "vernieuwen" #: ../ubuntu_sso/utils/ui.py:61 msgid "Reload" msgstr "Opnieuw laden" #: ../ubuntu_sso/utils/ui.py:62 msgid "The captcha is a required field" msgstr "De captcha is een verplicht veld" #: ../ubuntu_sso/utils/ui.py:63 msgid "Close window and set up later" msgstr "Sluit het venster en stel het in op een later moment" #: ../ubuntu_sso/utils/ui.py:64 msgid "Congratulations, {app_name} is installed!" msgstr "Gefeliciteerd, {app_name} is geïnstalleerd!" #: ../ubuntu_sso/utils/ui.py:65 #, python-format msgid "To connect this computer to %(app_name)s enter your details below." msgstr "" "Om uw computer met %(app_name)s te verbinden, dient u uw gegevens hieronder " "in te vullen." #: ../ubuntu_sso/utils/ui.py:67 msgid "Register with {app_name}." msgstr "Registreren bij {app_name}." #: ../ubuntu_sso/utils/ui.py:68 ../ubuntu_sso/utils/ui.py:93 #: ../ubuntu_sso/utils/ui.py:143 msgid "Email address" msgstr "E-mailadres" #: ../ubuntu_sso/utils/ui.py:69 msgid "Re-type Email address" msgstr "E-mailadres opnieuw invoeren" #: ../ubuntu_sso/utils/ui.py:70 msgid "The email must be a valid email address." msgstr "Het e-mailadres moet een bestaand adres zijn." #: ../ubuntu_sso/utils/ui.py:71 msgid "" "The email addresses don't match, please double check and try entering them " "again." msgstr "" "De e-mailadressen komen niet overeen. Controleer deze en probeer het opnieuw." #: ../ubuntu_sso/utils/ui.py:73 msgid "Email" msgstr "E-mail" #: ../ubuntu_sso/utils/ui.py:74 msgid "The email addresses do not match" msgstr "De e-mailadressen komen niet overeen" #: ../ubuntu_sso/utils/ui.py:75 msgid "Enter code verification here" msgstr "Verificatiecode hier invoeren" #: ../ubuntu_sso/utils/ui.py:76 msgid "Please enter your name" msgstr "Vul uw naam in" #: ../ubuntu_sso/utils/ui.py:77 msgid "The process did not finish successfully." msgstr "Dit proces is niet succesvol afgerond." #: ../ubuntu_sso/utils/ui.py:79 msgid "Sign me in with my existing account" msgstr "Aanmelden met mijn bestaande account" #: ../ubuntu_sso/utils/ui.py:80 msgid "This field is required." msgstr "Dit veld is verplicht." #: ../ubuntu_sso/utils/ui.py:81 msgid "I've forgotten my password" msgstr "Ik ben mijn wachtwoord vergeten" #: ../ubuntu_sso/utils/ui.py:82 ../ubuntu_sso/utils/ui.py:130 msgid "Reset password" msgstr "Wachtwoord opnieuw instellen" #: ../ubuntu_sso/utils/ui.py:83 msgid "" "To reset your {app_name} password, enter your registered email address " "below. We will send instructions to reset your password." msgstr "" "Om uw {app_name}-wachtwoord opnieuw in te stellen, voer hieronder uw e-" "mailadres in waarmee u zich heeft geregistreerd. We sturen instructies " "waarmee u het wachtwoord opnieuw kunt instellen." #: ../ubuntu_sso/utils/ui.py:86 msgid "Please enter a valid email address" msgstr "Vul een geldig e-mailadres in" #: ../ubuntu_sso/utils/ui.py:87 msgid "There was a problem accessing the Ubuntu Single Sign On backend." msgstr "" "Er was een probleem tijdens het verbinding maken met de backend van Ubuntu " "Single Sign On." #: ../ubuntu_sso/utils/ui.py:89 #, python-format msgid "Create %(app_name)s account" msgstr "Account voor %(app_name)s aanmaken" #: ../ubuntu_sso/utils/ui.py:90 msgid "Loading..." msgstr "Laden…" #: ../ubuntu_sso/utils/ui.py:91 msgid "Getting information, please wait..." msgstr "Bezig met ophalen van informatie, even geduld…" #: ../ubuntu_sso/utils/ui.py:92 msgid "Already have an account? Click here to sign in" msgstr "Heeft u al een account? Klik hier om aan te melden" #: ../ubuntu_sso/utils/ui.py:94 #, python-format msgid "Connect to %(app_name)s" msgstr "Verbinden met %(app_name)s" #: ../ubuntu_sso/utils/ui.py:95 ../ubuntu_sso/utils/ui.py:109 msgid "Password" msgstr "Wachtwoord" #: ../ubuntu_sso/utils/ui.py:97 msgid "Sign In to {app_name}" msgstr "Aanmelden bij {app_name}" #: ../ubuntu_sso/utils/ui.py:99 msgid "Name" msgstr "Naam" #: ../ubuntu_sso/utils/ui.py:100 msgid "The name must not be empty." msgstr "De naam mag niet leeg zijn." #: ../ubuntu_sso/utils/ui.py:101 msgid "Next" msgstr "Volgende" #: ../ubuntu_sso/utils/ui.py:102 msgid "Network detection" msgstr "Netwerkdetectie" #: ../ubuntu_sso/utils/ui.py:103 #, python-format msgid "" "Are you online? We can't detect an internet connection - you will need to be " "connected to set up %(app_name)s" msgstr "" "Bent u online? Er kan geen internetverbinding gedetecteerd worden - u moet " "verbonden zijn om %(app_name)s in te stellen" #: ../ubuntu_sso/utils/ui.py:105 msgid "One moment please..." msgstr "Een moment alstublieft…" #: ../ubuntu_sso/utils/ui.py:106 msgid "Create a password" msgstr "Wachtwoord aanmaken" #: ../ubuntu_sso/utils/ui.py:107 msgid "Your password was successfully changed." msgstr "Uw wachtwoord is succesvol gewijzigd." #: ../ubuntu_sso/utils/ui.py:108 msgid "At least one number" msgstr "Ten minste één cijfer" #: ../ubuntu_sso/utils/ui.py:110 msgid "Re-type Password" msgstr "Wachtwoord herhalen" #: ../ubuntu_sso/utils/ui.py:111 msgid "" "The password must have a minimum of 8 characters and include one uppercase " "character and one number." msgstr "" "Het wachtwoord moet uit minimaal acht tekens bestaan en dient tenminste één " "hoofdletter en één cijfer te bevatten." #: ../ubuntu_sso/utils/ui.py:113 msgid "At least 8 characters" msgstr "Ten minste 8 letters" #: ../ubuntu_sso/utils/ui.py:114 msgid "Passwords don't match" msgstr "Wachtwoorden komen niet overeen" #: ../ubuntu_sso/utils/ui.py:115 msgid "" "The passwords don't match, please double check and try entering them again." msgstr "" "De wachtwoorden komen niet overeen. Controleer ze en probeer het opnieuw." #: ../ubuntu_sso/utils/ui.py:117 msgid "Your password must contain" msgstr "Uw wachtwoord moet bevatten" #: ../ubuntu_sso/utils/ui.py:118 msgid "The password is too weak." msgstr "Het wachtwoord is te zwak." #: ../ubuntu_sso/utils/ui.py:119 msgid "At least one uppercase letter" msgstr "Ten minste één hoofdletter" #: ../ubuntu_sso/utils/ui.py:120 msgid "Privacy Policy" msgstr "Privacybeleid" #: ../ubuntu_sso/utils/ui.py:121 msgid "Connecting to:" msgstr "Verbinden met:" #: ../ubuntu_sso/utils/ui.py:122 msgid "Proxy Settings" msgstr "Proxy-instellingen" #: ../ubuntu_sso/utils/ui.py:123 msgid "Incorrect login details. Please try again." msgstr "Onjuiste aanmeldgegevens. Probeer het opnieuw." #: ../ubuntu_sso/utils/ui.py:124 msgid "Please provide login details." msgstr "Voer uw aanmeldgegevens in." #: ../ubuntu_sso/utils/ui.py:125 msgid "You are connecting through a proxy." msgstr "U wordt verbonden via een proxy." #: ../ubuntu_sso/utils/ui.py:126 msgid "Get Help With Proxies" msgstr "Hulp verkrijgen voor proxies" #: ../ubuntu_sso/utils/ui.py:127 msgid "Proxy password:" msgstr "Proxy-wachtwoord:" #: ../ubuntu_sso/utils/ui.py:128 msgid "Save and Connect" msgstr "Opslaan en verbinden" #: ../ubuntu_sso/utils/ui.py:129 msgid "Proxy username:" msgstr "Proxy-gebruikersnaam:" #: ../ubuntu_sso/utils/ui.py:131 msgid "" "A password reset code has been sent to your e-mail. Please enter the code " "below along with your new password." msgstr "" "Een code om uw wachtwoord opnieuw in te stellen is verzonden naar uw e-" "mailadres. Geef hieronder deze code en het nieuwe wachtwoord op." #: ../ubuntu_sso/utils/ui.py:133 msgid "Retype email" msgstr "E-mail herhalen" #: ../ubuntu_sso/utils/ui.py:134 msgid "Retype password" msgstr "Wachtwoord herhalen" #: ../ubuntu_sso/utils/ui.py:135 #, python-format msgid "To reset your %(app_name)s password, enter your email address below:" msgstr "" "Voer uw e-mailadres hieronder in om uw %(app_name)s-wachtwoord opnieuw in te " "stellen:" #: ../ubuntu_sso/utils/ui.py:137 msgid "" "We are very Sorry! The service that signs you on is not responding right " "now\n" "Please try again or come back in a few minutes." msgstr "" "Het spijt ons heel erg! De dienst die u aanmeldt reageert op het moment " "niet\n" "Probeer het later nog eens of kom terug over een paar minuten." #: ../ubuntu_sso/utils/ui.py:140 msgid "Sorry we did not recognize the email address." msgstr "Dit e-mailadres wordt helaas niet herkend." #: ../ubuntu_sso/utils/ui.py:142 msgid "Reset code" msgstr "Resetcode" #: ../ubuntu_sso/utils/ui.py:145 #, python-format msgid "" "A password reset code has been sent to %(email)s.\n" "Please enter the code below along with your new password." msgstr "" "Er is een wachtwoord-resetcode naar %(email)s gestuurd.\n" "Voer hieronder deze code en uw nieuwe wachtwoord in." #: ../ubuntu_sso/utils/ui.py:147 msgid "Set Up Account" msgstr "Account instellen" #: ../ubuntu_sso/utils/ui.py:148 msgid "I don't have an account yet - sign me up" msgstr "Ik heb nog geen account - maak een nieuwe aan" #: ../ubuntu_sso/utils/ui.py:149 msgid "Sign In" msgstr "Aanmelden" #: ../ubuntu_sso/utils/ui.py:150 msgid "Log-in with my existing account." msgstr "Aanmelden met mijn bestaande account." #: ../ubuntu_sso/utils/ui.py:151 msgid "the appname whose ssl error we are going to show." msgstr "de appname waarvan we de SSL-fout gaan tonen." #: ../ubuntu_sso/utils/ui.py:152 msgid "Certificate details" msgstr "Certificaatdetails" #: ../ubuntu_sso/utils/ui.py:153 msgid "Connect" msgstr "Verbinden" #: ../ubuntu_sso/utils/ui.py:154 msgid "the details ssl certificate we are going to show." msgstr "De details van het SSL-certificaat dat we gaan tonen." #: ../ubuntu_sso/utils/ui.py:161 msgid "Open the SSL certificate UI." msgstr "De interface voor SSL-certificaten openen." #: ../ubuntu_sso/utils/ui.py:162 msgid "SSL Certificate Not Valid" msgstr "SSL-certificaat ongeldig" #: ../ubuntu_sso/utils/ui.py:163 msgid "the domain whose ssl certificate we are going to show." msgstr "het domein waarvan we het SSL-certificaat gaan tonen." #: ../ubuntu_sso/utils/ui.py:164 #, python-format msgid "" "You are trying to connect to a proxy server on %(domain)s. This server uses " "a secure connection, and the SSL certificate is not valid because:" msgstr "" "U probeert te verbinden met een proxyserver op %(domain)s. Deze server " "vereist een beveiligde verbinding, en het SSL-certificaat is ongeldig omdat:" #: ../ubuntu_sso/utils/ui.py:167 msgid "The certificate has not been verified" msgstr "Het certificaat is niet geverifieerd" #: ../ubuntu_sso/utils/ui.py:168 msgid "Do you want to connect to this server?" msgstr "Wilt u verbinding maken met deze server?" #: ../ubuntu_sso/utils/ui.py:169 msgid "Get Help With SSL" msgstr "Hulp met SSL" #: ../ubuntu_sso/utils/ui.py:170 #, python-format msgid "" "If you are not sure about this server, do not use it to connect to " "%(app_name)s." msgstr "" "Als u niet zeker bent over deze server, gebruik het dan niet om verbinding " "te maken met %(app_name)s." #: ../ubuntu_sso/utils/ui.py:172 msgid "Remember my settings for this certificate." msgstr "Mijn instellingen onthouden voor dit certificaat." #: ../ubuntu_sso/utils/ui.py:173 msgid "" "The name on the certificate isn't valid or doesn't match the name of the site" msgstr "" "De naam op dit certificaat is niet geldig of komt niet overeen met de naam " "op de site" #: ../ubuntu_sso/utils/ui.py:175 msgid "The certificate has expired" msgstr "Het certificaat is verlopen" #: ../ubuntu_sso/utils/ui.py:176 #, python-format msgid "You are now logged into %(app_name)s." msgstr "U bent nu aangemeld bij %(app_name)s." #: ../ubuntu_sso/utils/ui.py:177 msgid "Surname" msgstr "Achternaam" #: ../ubuntu_sso/utils/ui.py:178 msgid "Terms of Service" msgstr "Voorwaarden" #: ../ubuntu_sso/utils/ui.py:179 msgid "Sign Up to {app_name}" msgstr "Aanmelden bij {app_name}" #: ../ubuntu_sso/utils/ui.py:180 msgid "Show Terms & Conditions" msgstr "Voorwaarden tonen" #: ../ubuntu_sso/utils/ui.py:181 #, python-format msgid "" "Agreeing to the %(app_name)s Terms & Conditions is required to subscribe." msgstr "" "Om u te kunnen inschrijven bij %(app_name)s dient u akkoord te gaan met de " "voorwaarden ervan." #: ../ubuntu_sso/utils/ui.py:183 #, python-format msgid "You can also find these terms at %(url)s" msgstr "Deze voorwaarden kunt u ook vinden op %(url)s" #: ../ubuntu_sso/utils/ui.py:184 msgid "Try again" msgstr "Opnieuw proberen" #: ../ubuntu_sso/utils/ui.py:185 msgid "" "There was an error when trying to complete the process. Please check the " "information and try again." msgstr "" "Er is een fout opgetreden bij het voltooien van het proces. Controleer de " "informatie en probeer het opnieuw." #: ../ubuntu_sso/utils/ui.py:187 msgid "Verification code" msgstr "Verificatiecode" #: ../ubuntu_sso/utils/ui.py:188 #, python-format msgid "" "Check %(email)s for an email from Ubuntu Single Sign On. This message " "contains a verification code. Enter the code in the field below and click OK " "to complete creating your %(app_name)s account." msgstr "" "Controleer %(email)s op e-mails van Ubuntu Single Sign On. Dit bericht bevat " "een verificatiecode. Voer deze code hieronder in en klik op OK om het " "aanmaken van uw account bij %(app_name)s af te ronden." #: ../ubuntu_sso/utils/ui.py:192 msgid "Enter verification code" msgstr "Verificatiecode invoeren" #: ../ubuntu_sso/utils/ui.py:195 #, python-format msgid "I agree with the %(app_name)s terms and conditions" msgstr "Ik ga akkoord met de voorwaarden van %(app_name)s" #: ../ubuntu_sso/utils/ui.py:196 #, python-format msgid "Yes! Email me %(app_name)s tips and updates." msgstr "Ja! Stuur mij e-mail met tips en nieuws over %(app_name)s." ubuntu-sso-client-13.10/po/pl.po0000664000202700020270000003400712151461656016746 0ustar dobeydobey00000000000000# Polish translation for ubuntu-sso-client # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the ubuntu-sso-client package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: ubuntu-sso-client\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-09-11 18:25+0000\n" "PO-Revision-Date: 2012-09-11 17:27+0000\n" "Last-Translator: Piotr Sokół \n" "Language-Team: Polish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-09-17 18:24+0000\n" "X-Generator: Launchpad (build 15944)\n" #. Undefined variable '_', pylint: disable=E0602 #. all the text that is used in the gui #: ../ubuntu_sso/utils/ui.py:49 msgid "By signing up to {app_name} you agree to our {privacy_policy}" msgstr "" "Utworzenie konta w usÅ‚udze {app_name) i zaakceptowanie {privacy_policy}" #: ../ubuntu_sso/utils/ui.py:51 msgid "By signing up to {app_name} you agree to our {terms_and_conditions}" msgstr "" "Utworzenie konta w usÅ‚udze {app_name) i zaakceptowanie {terms_and_conditions}" #: ../ubuntu_sso/utils/ui.py:53 msgid " and {privacy_policy}" msgstr " i {privacy_policy}" #: ../ubuntu_sso/utils/ui.py:54 msgid "Cancel" msgstr "Anuluj" #: ../ubuntu_sso/utils/ui.py:55 msgid "Type the characters above" msgstr "ProszÄ™ wprowadzić znaki znajdujÄ…ce siÄ™ powyżej" #: ../ubuntu_sso/utils/ui.py:56 msgid "There was a problem getting the captcha, reloading..." msgstr "" "WystÄ…piÅ‚ problem przy pobieraniu obrazu weryfikujÄ…cego. Trwa ponowne " "wczytywanie..." #: ../ubuntu_sso/utils/ui.py:58 #, python-format msgid "If you can't read this then %(reload_link)s this page" msgstr "JeÅ›li obraz jest nieczytelny, proszÄ™ %(reload_link)s go ponownie" #: ../ubuntu_sso/utils/ui.py:60 msgid "refresh" msgstr "wczytać" #: ../ubuntu_sso/utils/ui.py:61 msgid "Reload" msgstr "Wczytuje ponownie obraz weryfikujÄ…cy" #: ../ubuntu_sso/utils/ui.py:62 msgid "The captcha is a required field" msgstr "Kod weryfikujÄ…cy jest wymagany" #: ../ubuntu_sso/utils/ui.py:63 msgid "Close window and set up later" msgstr "Zamknij okno i skonfiguruj później" #: ../ubuntu_sso/utils/ui.py:64 msgid "Congratulations, {app_name} is installed!" msgstr "Zainstalowano program {app_name}" #: ../ubuntu_sso/utils/ui.py:65 #, python-format msgid "To connect this computer to %(app_name)s enter your details below." msgstr "" "Aby zalogować użytkownika do konta usÅ‚ugi %(app_name)s, proszÄ™ wprowadzić " "poniższe dane:" #: ../ubuntu_sso/utils/ui.py:67 msgid "Register with {app_name}." msgstr "Zarejestruj za pomocÄ… {app_name}" #: ../ubuntu_sso/utils/ui.py:68 ../ubuntu_sso/utils/ui.py:93 #: ../ubuntu_sso/utils/ui.py:143 msgid "Email address" msgstr "Adres e-mail" #: ../ubuntu_sso/utils/ui.py:69 msgid "Re-type Email address" msgstr "Powtórzenie adresu e-mail" #: ../ubuntu_sso/utils/ui.py:70 msgid "The email must be a valid email address." msgstr "Należy wprowadzić prawidÅ‚owy adres e-mail." #: ../ubuntu_sso/utils/ui.py:71 msgid "" "The email addresses don't match, please double check and try entering them " "again." msgstr "" "Adresy e-mail nie sÄ… takie same. ProszÄ™ sprawdzić poprawność danych i " "spróbować wprowadzić je ponownie." #: ../ubuntu_sso/utils/ui.py:73 msgid "Email" msgstr "Adres e-mail" #: ../ubuntu_sso/utils/ui.py:74 msgid "The email addresses do not match" msgstr "Adresy e-mail nie sÄ… takie same" #: ../ubuntu_sso/utils/ui.py:75 msgid "Enter code verification here" msgstr "Tutaj proszÄ™ wprowadzić kod weryfikacji" #: ../ubuntu_sso/utils/ui.py:76 msgid "Please enter your name" msgstr "ProszÄ™ wprowadzić imiÄ™ i nazwisko" #: ../ubuntu_sso/utils/ui.py:77 msgid "The process did not finish successfully." msgstr "Nie udaÅ‚o siÄ™ zakoÅ„czyć procesu." #: ../ubuntu_sso/utils/ui.py:79 msgid "Sign me in with my existing account" msgstr "Zaloguj do istniejÄ…cego konta" #: ../ubuntu_sso/utils/ui.py:80 msgid "This field is required." msgstr "To pole jest wymagane." #: ../ubuntu_sso/utils/ui.py:81 msgid "I've forgotten my password" msgstr "ZapomniaÅ‚em hasÅ‚a" #: ../ubuntu_sso/utils/ui.py:82 ../ubuntu_sso/utils/ui.py:130 msgid "Reset password" msgstr "Wyczyść hasÅ‚o" #: ../ubuntu_sso/utils/ui.py:83 msgid "" "To reset your {app_name} password, enter your registered email address " "below. We will send instructions to reset your password." msgstr "" "Aby wyczyÅ›cić hasÅ‚o usÅ‚ugi {app_name}, proszÄ™ wprowadzić adres e-mail " "zarejestrowanego konta. Na podany adres zostanÄ… przesÅ‚ane odpowiednie " "instrukcje." #: ../ubuntu_sso/utils/ui.py:86 msgid "Please enter a valid email address" msgstr "ProszÄ™ wprowadzić poprawny adres e-mail" #: ../ubuntu_sso/utils/ui.py:87 msgid "There was a problem accessing the Ubuntu Single Sign On backend." msgstr "WystÄ…piÅ‚ problem dostÄ™pu do moduÅ‚u obsÅ‚ugi Ubuntu Single Sing On." #: ../ubuntu_sso/utils/ui.py:89 #, python-format msgid "Create %(app_name)s account" msgstr "Tworzenie konta %(app_name)s" #: ../ubuntu_sso/utils/ui.py:90 msgid "Loading..." msgstr "Wczytywanie..." #: ../ubuntu_sso/utils/ui.py:91 msgid "Getting information, please wait..." msgstr "Gromadzenie informacji, proszÄ™ czekać..." #: ../ubuntu_sso/utils/ui.py:92 msgid "Already have an account? Click here to sign in" msgstr "Konto już istnieje? ProszÄ™ kliknąć tutaj, aby zalogować użytkownika." #: ../ubuntu_sso/utils/ui.py:94 #, python-format msgid "Connect to %(app_name)s" msgstr "ÅÄ…czenie z %(app_name)s" #: ../ubuntu_sso/utils/ui.py:95 ../ubuntu_sso/utils/ui.py:109 msgid "Password" msgstr "HasÅ‚o" #: ../ubuntu_sso/utils/ui.py:97 msgid "Sign In to {app_name}" msgstr "Logowanie do konta usÅ‚ugi {app_name}" #: ../ubuntu_sso/utils/ui.py:99 msgid "Name" msgstr "ImiÄ™ i nazwisko" #: ../ubuntu_sso/utils/ui.py:100 msgid "The name must not be empty." msgstr "Nazwa nie może być pusta" #: ../ubuntu_sso/utils/ui.py:101 msgid "Next" msgstr "Naprzód" #: ../ubuntu_sso/utils/ui.py:102 msgid "Network detection" msgstr "Wykrywanie sieci" #: ../ubuntu_sso/utils/ui.py:103 #, python-format msgid "" "Are you online? We can't detect an internet connection - you will need to be " "connected to set up %(app_name)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:105 msgid "One moment please..." msgstr "ProszÄ™ czekać..." #: ../ubuntu_sso/utils/ui.py:106 msgid "Create a password" msgstr "HasÅ‚o" #: ../ubuntu_sso/utils/ui.py:107 msgid "Your password was successfully changed." msgstr "Zmieniono hasÅ‚o." #: ../ubuntu_sso/utils/ui.py:108 msgid "At least one number" msgstr "co najmniej jednÄ… cyfrÄ™" #: ../ubuntu_sso/utils/ui.py:110 msgid "Re-type Password" msgstr "Powtórzenie hasÅ‚a" #: ../ubuntu_sso/utils/ui.py:111 msgid "" "The password must have a minimum of 8 characters and include one uppercase " "character and one number." msgstr "" "HasÅ‚o musi zawierać co najmniej 8 znaków i zawierać jednÄ… wielkÄ… literÄ™ oraz " "jednÄ… cyfrÄ™." #: ../ubuntu_sso/utils/ui.py:113 msgid "At least 8 characters" msgstr "co najmniej 8 znaków" #: ../ubuntu_sso/utils/ui.py:114 msgid "Passwords don't match" msgstr "HasÅ‚a nie sÄ… takie same" #: ../ubuntu_sso/utils/ui.py:115 msgid "" "The passwords don't match, please double check and try entering them again." msgstr "" "HasÅ‚a siÄ™ nie zgadzajÄ…. ProszÄ™ sprawdzić poprawność danych i spróbować " "wprowadzić je ponownie." #: ../ubuntu_sso/utils/ui.py:117 msgid "Your password must contain" msgstr "HasÅ‚o musi zawierać:" #: ../ubuntu_sso/utils/ui.py:118 msgid "The password is too weak." msgstr "HasÅ‚o jest za sÅ‚abe." #: ../ubuntu_sso/utils/ui.py:119 msgid "At least one uppercase letter" msgstr "co najmniej jednÄ… wielkÄ… literÄ™" #: ../ubuntu_sso/utils/ui.py:120 msgid "Privacy Policy" msgstr "Polityka prywatnoÅ›ci" #: ../ubuntu_sso/utils/ui.py:121 msgid "Connecting to:" msgstr "NawiÄ…zywanie połączenia:" #: ../ubuntu_sso/utils/ui.py:122 msgid "Proxy Settings" msgstr "Ustawienia poÅ›rednika" #: ../ubuntu_sso/utils/ui.py:123 msgid "Incorrect login details. Please try again." msgstr "NieprawidÅ‚owe dane uwierzytelniajÄ…ce. ProszÄ™ spróbować ponownie." #: ../ubuntu_sso/utils/ui.py:124 msgid "Please provide login details." msgstr "ProszÄ™ wprowadzić dane uwierzytelniajÄ…ce." #: ../ubuntu_sso/utils/ui.py:125 msgid "You are connecting through a proxy." msgstr "" #: ../ubuntu_sso/utils/ui.py:126 msgid "Get Help With Proxies" msgstr "" #: ../ubuntu_sso/utils/ui.py:127 msgid "Proxy password:" msgstr "" #: ../ubuntu_sso/utils/ui.py:128 msgid "Save and Connect" msgstr "" #: ../ubuntu_sso/utils/ui.py:129 msgid "Proxy username:" msgstr "" #: ../ubuntu_sso/utils/ui.py:131 msgid "" "A password reset code has been sent to your e-mail. Please enter the code " "below along with your new password." msgstr "" "Kod czyszczenia hasÅ‚a zostaÅ‚ wysÅ‚any na adres e-mail użytkownika. ProszÄ™ " "wprowadzić kod poniżej wraz z nowym hasÅ‚em." #: ../ubuntu_sso/utils/ui.py:133 msgid "Retype email" msgstr "Powtrórzenie hasÅ‚a" #: ../ubuntu_sso/utils/ui.py:134 msgid "Retype password" msgstr "Powtórzenie hasÅ‚a" #: ../ubuntu_sso/utils/ui.py:135 #, python-format msgid "To reset your %(app_name)s password, enter your email address below:" msgstr "" "Aby wyczyÅ›cić hasÅ‚o %(app_name)s, należy wprowadzić poniżej adres e-mail:" #: ../ubuntu_sso/utils/ui.py:137 msgid "" "We are very Sorry! The service that signs you on is not responding right " "now\n" "Please try again or come back in a few minutes." msgstr "" "Niestety usÅ‚uga logowania nie odpowiada w tej chwili.\n" "ProszÄ™ spróbować ponownie teraz lub za kilka minut." #: ../ubuntu_sso/utils/ui.py:140 msgid "Sorry we did not recognize the email address." msgstr "Nie można rozpoznać adresu e-mail." #: ../ubuntu_sso/utils/ui.py:142 msgid "Reset code" msgstr "Kod czyszczenia hasÅ‚a" #: ../ubuntu_sso/utils/ui.py:145 #, python-format msgid "" "A password reset code has been sent to %(email)s.\n" "Please enter the code below along with your new password." msgstr "" "Kod do wyczyszczenia hasÅ‚a zostaÅ‚ wysÅ‚any na adres %(email)s.\n" "ProszÄ™ wprowadzić ten kod poniżej razem z nowym hasÅ‚em." #: ../ubuntu_sso/utils/ui.py:147 msgid "Set Up Account" msgstr "Utwórz konto" #: ../ubuntu_sso/utils/ui.py:148 msgid "I don't have an account yet - sign me up" msgstr "Utwórz nowe konto" #: ../ubuntu_sso/utils/ui.py:149 msgid "Sign In" msgstr "Zaloguj" #: ../ubuntu_sso/utils/ui.py:150 msgid "Log-in with my existing account." msgstr "" #: ../ubuntu_sso/utils/ui.py:151 msgid "the appname whose ssl error we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:152 msgid "Certificate details" msgstr "Szczegóły certyfikatu" #: ../ubuntu_sso/utils/ui.py:153 msgid "Connect" msgstr "Połącz" #: ../ubuntu_sso/utils/ui.py:154 msgid "the details ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:161 msgid "Open the SSL certificate UI." msgstr "" #: ../ubuntu_sso/utils/ui.py:162 msgid "SSL Certificate Not Valid" msgstr "NieprawidÅ‚owy certyfikat SSL" #: ../ubuntu_sso/utils/ui.py:163 msgid "the domain whose ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:164 #, python-format msgid "" "You are trying to connect to a proxy server on %(domain)s. This server uses " "a secure connection, and the SSL certificate is not valid because:" msgstr "" #: ../ubuntu_sso/utils/ui.py:167 msgid "The certificate has not been verified" msgstr "Certyfikat nie zostaÅ‚ zatwierdzony" #: ../ubuntu_sso/utils/ui.py:168 msgid "Do you want to connect to this server?" msgstr "Połączyć z tym serwerem?" #: ../ubuntu_sso/utils/ui.py:169 msgid "Get Help With SSL" msgstr "Uzyskaj pomoc na temat SSL" #: ../ubuntu_sso/utils/ui.py:170 #, python-format msgid "" "If you are not sure about this server, do not use it to connect to " "%(app_name)s." msgstr "" #: ../ubuntu_sso/utils/ui.py:172 msgid "Remember my settings for this certificate." msgstr "" #: ../ubuntu_sso/utils/ui.py:173 msgid "" "The name on the certificate isn't valid or doesn't match the name of the site" msgstr "" #: ../ubuntu_sso/utils/ui.py:175 msgid "The certificate has expired" msgstr "Certyfikat wygasÅ‚" #: ../ubuntu_sso/utils/ui.py:176 #, python-format msgid "You are now logged into %(app_name)s." msgstr "Zalogowano do konta %(app_name)s." #: ../ubuntu_sso/utils/ui.py:177 msgid "Surname" msgstr "" #: ../ubuntu_sso/utils/ui.py:178 msgid "Terms of Service" msgstr "Regulamin usÅ‚ugi" #: ../ubuntu_sso/utils/ui.py:179 msgid "Sign Up to {app_name}" msgstr "Tworzenie konta usÅ‚ugi {app_name}" #: ../ubuntu_sso/utils/ui.py:180 msgid "Show Terms & Conditions" msgstr "WyÅ›wietl warunki i postanowienia" #: ../ubuntu_sso/utils/ui.py:181 #, python-format msgid "" "Agreeing to the %(app_name)s Terms & Conditions is required to subscribe." msgstr "" "Zaakceptowanie regulaminu usÅ‚ugi %(app_name)s jest niezbÄ™dne do subskrypcji." #: ../ubuntu_sso/utils/ui.py:183 #, python-format msgid "You can also find these terms at %(url)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:184 msgid "Try again" msgstr "Spróbuj ponownie" #: ../ubuntu_sso/utils/ui.py:185 msgid "" "There was an error when trying to complete the process. Please check the " "information and try again." msgstr "" "WystÄ…piÅ‚ błąd podczas próby ukoÅ„czenia procesu. ProszÄ™ sprawdzić informacje " "i spróbować ponownie." #: ../ubuntu_sso/utils/ui.py:187 msgid "Verification code" msgstr "Kod weryfikacyjny" #: ../ubuntu_sso/utils/ui.py:188 #, python-format msgid "" "Check %(email)s for an email from Ubuntu Single Sign On. This message " "contains a verification code. Enter the code in the field below and click OK " "to complete creating your %(app_name)s account." msgstr "" #: ../ubuntu_sso/utils/ui.py:192 msgid "Enter verification code" msgstr "ProszÄ™ wprowadzić kod weryfikacji" #: ../ubuntu_sso/utils/ui.py:195 #, python-format msgid "I agree with the %(app_name)s terms and conditions" msgstr "Zgadzam siÄ™ z warunkami i postanowieniami programu %(app_name)s" #: ../ubuntu_sso/utils/ui.py:196 #, python-format msgid "Yes! Email me %(app_name)s tips and updates." msgstr "Tak, proszÄ™ o wysyÅ‚anie porad i nowoÅ›ci na temat %(app_name)s." ubuntu-sso-client-13.10/po/ml.po0000664000202700020270000002505212151461656016743 0ustar dobeydobey00000000000000# Malayalam translation for ubuntu-sso-client # Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 # This file is distributed under the same license as the ubuntu-sso-client package. # FIRST AUTHOR , 2012. # msgid "" msgstr "" "Project-Id-Version: ubuntu-sso-client\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-09-11 18:25+0000\n" "PO-Revision-Date: 2012-01-10 11:47+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Malayalam \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-09-17 18:24+0000\n" "X-Generator: Launchpad (build 15944)\n" #. Undefined variable '_', pylint: disable=E0602 #. all the text that is used in the gui #: ../ubuntu_sso/utils/ui.py:49 msgid "By signing up to {app_name} you agree to our {privacy_policy}" msgstr "" #: ../ubuntu_sso/utils/ui.py:51 msgid "By signing up to {app_name} you agree to our {terms_and_conditions}" msgstr "" #: ../ubuntu_sso/utils/ui.py:53 msgid " and {privacy_policy}" msgstr "" #: ../ubuntu_sso/utils/ui.py:54 msgid "Cancel" msgstr "" #: ../ubuntu_sso/utils/ui.py:55 msgid "Type the characters above" msgstr "" #: ../ubuntu_sso/utils/ui.py:56 msgid "There was a problem getting the captcha, reloading..." msgstr "" #: ../ubuntu_sso/utils/ui.py:58 #, python-format msgid "If you can't read this then %(reload_link)s this page" msgstr "" #: ../ubuntu_sso/utils/ui.py:60 msgid "refresh" msgstr "" #: ../ubuntu_sso/utils/ui.py:61 msgid "Reload" msgstr "" #: ../ubuntu_sso/utils/ui.py:62 msgid "The captcha is a required field" msgstr "" #: ../ubuntu_sso/utils/ui.py:63 msgid "Close window and set up later" msgstr "" #: ../ubuntu_sso/utils/ui.py:64 msgid "Congratulations, {app_name} is installed!" msgstr "" #: ../ubuntu_sso/utils/ui.py:65 #, python-format msgid "To connect this computer to %(app_name)s enter your details below." msgstr "" #: ../ubuntu_sso/utils/ui.py:67 msgid "Register with {app_name}." msgstr "" #: ../ubuntu_sso/utils/ui.py:68 ../ubuntu_sso/utils/ui.py:93 #: ../ubuntu_sso/utils/ui.py:143 msgid "Email address" msgstr "" #: ../ubuntu_sso/utils/ui.py:69 msgid "Re-type Email address" msgstr "" #: ../ubuntu_sso/utils/ui.py:70 msgid "The email must be a valid email address." msgstr "" #: ../ubuntu_sso/utils/ui.py:71 msgid "" "The email addresses don't match, please double check and try entering them " "again." msgstr "" #: ../ubuntu_sso/utils/ui.py:73 msgid "Email" msgstr "" #: ../ubuntu_sso/utils/ui.py:74 msgid "The email addresses do not match" msgstr "" #: ../ubuntu_sso/utils/ui.py:75 msgid "Enter code verification here" msgstr "" #: ../ubuntu_sso/utils/ui.py:76 msgid "Please enter your name" msgstr "" #: ../ubuntu_sso/utils/ui.py:77 msgid "The process did not finish successfully." msgstr "" #: ../ubuntu_sso/utils/ui.py:79 msgid "Sign me in with my existing account" msgstr "" #: ../ubuntu_sso/utils/ui.py:80 msgid "This field is required." msgstr "" #: ../ubuntu_sso/utils/ui.py:81 msgid "I've forgotten my password" msgstr "" #: ../ubuntu_sso/utils/ui.py:82 ../ubuntu_sso/utils/ui.py:130 msgid "Reset password" msgstr "" #: ../ubuntu_sso/utils/ui.py:83 msgid "" "To reset your {app_name} password, enter your registered email address " "below. We will send instructions to reset your password." msgstr "" #: ../ubuntu_sso/utils/ui.py:86 msgid "Please enter a valid email address" msgstr "" #: ../ubuntu_sso/utils/ui.py:87 msgid "There was a problem accessing the Ubuntu Single Sign On backend." msgstr "" #: ../ubuntu_sso/utils/ui.py:89 #, python-format msgid "Create %(app_name)s account" msgstr "" #: ../ubuntu_sso/utils/ui.py:90 msgid "Loading..." msgstr "" #: ../ubuntu_sso/utils/ui.py:91 msgid "Getting information, please wait..." msgstr "" #: ../ubuntu_sso/utils/ui.py:92 msgid "Already have an account? Click here to sign in" msgstr "" #: ../ubuntu_sso/utils/ui.py:94 #, python-format msgid "Connect to %(app_name)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:95 ../ubuntu_sso/utils/ui.py:109 msgid "Password" msgstr "" #: ../ubuntu_sso/utils/ui.py:97 msgid "Sign In to {app_name}" msgstr "" #: ../ubuntu_sso/utils/ui.py:99 msgid "Name" msgstr "" #: ../ubuntu_sso/utils/ui.py:100 msgid "The name must not be empty." msgstr "" #: ../ubuntu_sso/utils/ui.py:101 msgid "Next" msgstr "" #: ../ubuntu_sso/utils/ui.py:102 msgid "Network detection" msgstr "" #: ../ubuntu_sso/utils/ui.py:103 #, python-format msgid "" "Are you online? We can't detect an internet connection - you will need to be " "connected to set up %(app_name)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:105 msgid "One moment please..." msgstr "" #: ../ubuntu_sso/utils/ui.py:106 msgid "Create a password" msgstr "" #: ../ubuntu_sso/utils/ui.py:107 msgid "Your password was successfully changed." msgstr "" #: ../ubuntu_sso/utils/ui.py:108 msgid "At least one number" msgstr "" #: ../ubuntu_sso/utils/ui.py:110 msgid "Re-type Password" msgstr "" #: ../ubuntu_sso/utils/ui.py:111 msgid "" "The password must have a minimum of 8 characters and include one uppercase " "character and one number." msgstr "" #: ../ubuntu_sso/utils/ui.py:113 msgid "At least 8 characters" msgstr "" #: ../ubuntu_sso/utils/ui.py:114 msgid "Passwords don't match" msgstr "" #: ../ubuntu_sso/utils/ui.py:115 msgid "" "The passwords don't match, please double check and try entering them again." msgstr "" #: ../ubuntu_sso/utils/ui.py:117 msgid "Your password must contain" msgstr "" #: ../ubuntu_sso/utils/ui.py:118 msgid "The password is too weak." msgstr "" #: ../ubuntu_sso/utils/ui.py:119 msgid "At least one uppercase letter" msgstr "" #: ../ubuntu_sso/utils/ui.py:120 msgid "Privacy Policy" msgstr "" #: ../ubuntu_sso/utils/ui.py:121 msgid "Connecting to:" msgstr "" #: ../ubuntu_sso/utils/ui.py:122 msgid "Proxy Settings" msgstr "" #: ../ubuntu_sso/utils/ui.py:123 msgid "Incorrect login details. Please try again." msgstr "" #: ../ubuntu_sso/utils/ui.py:124 msgid "Please provide login details." msgstr "" #: ../ubuntu_sso/utils/ui.py:125 msgid "You are connecting through a proxy." msgstr "" #: ../ubuntu_sso/utils/ui.py:126 msgid "Get Help With Proxies" msgstr "" #: ../ubuntu_sso/utils/ui.py:127 msgid "Proxy password:" msgstr "" #: ../ubuntu_sso/utils/ui.py:128 msgid "Save and Connect" msgstr "" #: ../ubuntu_sso/utils/ui.py:129 msgid "Proxy username:" msgstr "" #: ../ubuntu_sso/utils/ui.py:131 msgid "" "A password reset code has been sent to your e-mail. Please enter the code " "below along with your new password." msgstr "" #: ../ubuntu_sso/utils/ui.py:133 msgid "Retype email" msgstr "" #: ../ubuntu_sso/utils/ui.py:134 msgid "Retype password" msgstr "" #: ../ubuntu_sso/utils/ui.py:135 #, python-format msgid "To reset your %(app_name)s password, enter your email address below:" msgstr "" #: ../ubuntu_sso/utils/ui.py:137 msgid "" "We are very Sorry! The service that signs you on is not responding right " "now\n" "Please try again or come back in a few minutes." msgstr "" #: ../ubuntu_sso/utils/ui.py:140 msgid "Sorry we did not recognize the email address." msgstr "" #: ../ubuntu_sso/utils/ui.py:142 msgid "Reset code" msgstr "" #: ../ubuntu_sso/utils/ui.py:145 #, python-format msgid "" "A password reset code has been sent to %(email)s.\n" "Please enter the code below along with your new password." msgstr "" #: ../ubuntu_sso/utils/ui.py:147 msgid "Set Up Account" msgstr "" #: ../ubuntu_sso/utils/ui.py:148 msgid "I don't have an account yet - sign me up" msgstr "" #: ../ubuntu_sso/utils/ui.py:149 msgid "Sign In" msgstr "" #: ../ubuntu_sso/utils/ui.py:150 msgid "Log-in with my existing account." msgstr "" #: ../ubuntu_sso/utils/ui.py:151 msgid "the appname whose ssl error we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:152 msgid "Certificate details" msgstr "" #: ../ubuntu_sso/utils/ui.py:153 msgid "Connect" msgstr "" #: ../ubuntu_sso/utils/ui.py:154 msgid "the details ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:161 msgid "Open the SSL certificate UI." msgstr "" #: ../ubuntu_sso/utils/ui.py:162 msgid "SSL Certificate Not Valid" msgstr "" #: ../ubuntu_sso/utils/ui.py:163 msgid "the domain whose ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:164 #, python-format msgid "" "You are trying to connect to a proxy server on %(domain)s. This server uses " "a secure connection, and the SSL certificate is not valid because:" msgstr "" #: ../ubuntu_sso/utils/ui.py:167 msgid "The certificate has not been verified" msgstr "" #: ../ubuntu_sso/utils/ui.py:168 msgid "Do you want to connect to this server?" msgstr "" #: ../ubuntu_sso/utils/ui.py:169 msgid "Get Help With SSL" msgstr "" #: ../ubuntu_sso/utils/ui.py:170 #, python-format msgid "" "If you are not sure about this server, do not use it to connect to " "%(app_name)s." msgstr "" #: ../ubuntu_sso/utils/ui.py:172 msgid "Remember my settings for this certificate." msgstr "" #: ../ubuntu_sso/utils/ui.py:173 msgid "" "The name on the certificate isn't valid or doesn't match the name of the site" msgstr "" #: ../ubuntu_sso/utils/ui.py:175 msgid "The certificate has expired" msgstr "" #: ../ubuntu_sso/utils/ui.py:176 #, python-format msgid "You are now logged into %(app_name)s." msgstr "" #: ../ubuntu_sso/utils/ui.py:177 msgid "Surname" msgstr "" #: ../ubuntu_sso/utils/ui.py:178 msgid "Terms of Service" msgstr "" #: ../ubuntu_sso/utils/ui.py:179 msgid "Sign Up to {app_name}" msgstr "" #: ../ubuntu_sso/utils/ui.py:180 msgid "Show Terms & Conditions" msgstr "" #: ../ubuntu_sso/utils/ui.py:181 #, python-format msgid "" "Agreeing to the %(app_name)s Terms & Conditions is required to subscribe." msgstr "" #: ../ubuntu_sso/utils/ui.py:183 #, python-format msgid "You can also find these terms at %(url)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:184 msgid "Try again" msgstr "" #: ../ubuntu_sso/utils/ui.py:185 msgid "" "There was an error when trying to complete the process. Please check the " "information and try again." msgstr "" #: ../ubuntu_sso/utils/ui.py:187 msgid "Verification code" msgstr "" #: ../ubuntu_sso/utils/ui.py:188 #, python-format msgid "" "Check %(email)s for an email from Ubuntu Single Sign On. This message " "contains a verification code. Enter the code in the field below and click OK " "to complete creating your %(app_name)s account." msgstr "" #: ../ubuntu_sso/utils/ui.py:192 msgid "Enter verification code" msgstr "" #: ../ubuntu_sso/utils/ui.py:195 #, python-format msgid "I agree with the %(app_name)s terms and conditions" msgstr "" #: ../ubuntu_sso/utils/ui.py:196 #, python-format msgid "Yes! Email me %(app_name)s tips and updates." msgstr "" ubuntu-sso-client-13.10/po/da.po0000664000202700020270000003561112151461656016721 0ustar dobeydobey00000000000000# Danish translation for ubuntu-sso-client # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the ubuntu-sso-client package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: ubuntu-sso-client\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-09-11 18:25+0000\n" "PO-Revision-Date: 2012-04-05 21:05+0000\n" "Last-Translator: Aputsiaq Niels Janussen \n" "Language-Team: Danish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-09-17 18:24+0000\n" "X-Generator: Launchpad (build 15944)\n" #. Undefined variable '_', pylint: disable=E0602 #. all the text that is used in the gui #: ../ubuntu_sso/utils/ui.py:49 msgid "By signing up to {app_name} you agree to our {privacy_policy}" msgstr "" "Med tilmelding til {app_name} giver du din accept af vores {privacy_policy}" #: ../ubuntu_sso/utils/ui.py:51 msgid "By signing up to {app_name} you agree to our {terms_and_conditions}" msgstr "" "Med tilmelding til {app_name} giver du din accept af vores " "{terms_and_conditions}" #: ../ubuntu_sso/utils/ui.py:53 msgid " and {privacy_policy}" msgstr " samt {privacy_policy}" #: ../ubuntu_sso/utils/ui.py:54 msgid "Cancel" msgstr "Annullér" #: ../ubuntu_sso/utils/ui.py:55 msgid "Type the characters above" msgstr "Skriv tegnene ovenfor" #: ../ubuntu_sso/utils/ui.py:56 msgid "There was a problem getting the captcha, reloading..." msgstr "" "Der opstod en fejl ved hentningen af captcha-billedet, genindlæser..." #: ../ubuntu_sso/utils/ui.py:58 #, python-format msgid "If you can't read this then %(reload_link)s this page" msgstr "Hvis du ikke kan læse dette, sÃ¥ %(reload_link)s denne side" #: ../ubuntu_sso/utils/ui.py:60 msgid "refresh" msgstr "opdatér" #: ../ubuntu_sso/utils/ui.py:61 msgid "Reload" msgstr "Genindlæs" #: ../ubuntu_sso/utils/ui.py:62 msgid "The captcha is a required field" msgstr "Captcha'en er et obligatorisk felt" #: ../ubuntu_sso/utils/ui.py:63 msgid "Close window and set up later" msgstr "Luk vinduet og konfigurér senere" #: ../ubuntu_sso/utils/ui.py:64 msgid "Congratulations, {app_name} is installed!" msgstr "Tillykke, {app_name} er blevet installeret!" #: ../ubuntu_sso/utils/ui.py:65 #, python-format msgid "To connect this computer to %(app_name)s enter your details below." msgstr "" "Indtast dine oplysninger for at tilslutte denne computer til %(app_name)s." #: ../ubuntu_sso/utils/ui.py:67 msgid "Register with {app_name}." msgstr "" #: ../ubuntu_sso/utils/ui.py:68 ../ubuntu_sso/utils/ui.py:93 #: ../ubuntu_sso/utils/ui.py:143 msgid "Email address" msgstr "E-postadresse" #: ../ubuntu_sso/utils/ui.py:69 msgid "Re-type Email address" msgstr "Skriv e-postadresse igen" #: ../ubuntu_sso/utils/ui.py:70 msgid "The email must be a valid email address." msgstr "E-postadressen skal være en gyldig e-postadresse." #: ../ubuntu_sso/utils/ui.py:71 msgid "" "The email addresses don't match, please double check and try entering them " "again." msgstr "" "E-postadresserne stemmer ikke overens. Se dem venligst efter, og prøv at " "indtaste dem igen." #: ../ubuntu_sso/utils/ui.py:73 msgid "Email" msgstr "E-post" #: ../ubuntu_sso/utils/ui.py:74 msgid "The email addresses do not match" msgstr "E-post-adresserne stemmer ikke overens" #: ../ubuntu_sso/utils/ui.py:75 msgid "Enter code verification here" msgstr "Indtast kodegodkendelse her" #: ../ubuntu_sso/utils/ui.py:76 msgid "Please enter your name" msgstr "Indtast venligst dit navn" #: ../ubuntu_sso/utils/ui.py:77 msgid "The process did not finish successfully." msgstr "Handlingen afsluttede ikke korrekt." #: ../ubuntu_sso/utils/ui.py:79 msgid "Sign me in with my existing account" msgstr "Log ind med min eksisterende konto" #: ../ubuntu_sso/utils/ui.py:80 msgid "This field is required." msgstr "Dette felt er pÃ¥krævet." #: ../ubuntu_sso/utils/ui.py:81 msgid "I've forgotten my password" msgstr "Jeg har glemt min adgangskode" #: ../ubuntu_sso/utils/ui.py:82 ../ubuntu_sso/utils/ui.py:130 msgid "Reset password" msgstr "Nulstil adgangskode" #: ../ubuntu_sso/utils/ui.py:83 msgid "" "To reset your {app_name} password, enter your registered email address " "below. We will send instructions to reset your password." msgstr "" "Indtast din registrerede e-post-adresse nedenfor for at nulstille din " "adgangskode til {app_name}. Vi sender sÃ¥ instruktioner til at nulstille " "adgangskoden." #: ../ubuntu_sso/utils/ui.py:86 msgid "Please enter a valid email address" msgstr "Indtast venligst en gyldig e-post-adresse" #: ../ubuntu_sso/utils/ui.py:87 msgid "There was a problem accessing the Ubuntu Single Sign On backend." msgstr "Der opstod et problem med at tilgÃ¥ Ubuntu Single Sign On-motoren." #: ../ubuntu_sso/utils/ui.py:89 #, python-format msgid "Create %(app_name)s account" msgstr "Opret %(app_name)s-konto" #: ../ubuntu_sso/utils/ui.py:90 msgid "Loading..." msgstr "Indlæser..." #: ../ubuntu_sso/utils/ui.py:91 msgid "Getting information, please wait..." msgstr "Henter oplysninger. Vent venligst..." #: ../ubuntu_sso/utils/ui.py:92 msgid "Already have an account? Click here to sign in" msgstr "Har du allerede en konto? Klik her for at logge ind" #: ../ubuntu_sso/utils/ui.py:94 #, python-format msgid "Connect to %(app_name)s" msgstr "Forbind til %(app_name)s" #: ../ubuntu_sso/utils/ui.py:95 ../ubuntu_sso/utils/ui.py:109 msgid "Password" msgstr "Adgangskode" #: ../ubuntu_sso/utils/ui.py:97 msgid "Sign In to {app_name}" msgstr "Log ind pÃ¥ {app_name}" #: ../ubuntu_sso/utils/ui.py:99 msgid "Name" msgstr "Navn" #: ../ubuntu_sso/utils/ui.py:100 msgid "The name must not be empty." msgstr "Navnet mÃ¥ ikke være udeladt." #: ../ubuntu_sso/utils/ui.py:101 msgid "Next" msgstr "Næste" #: ../ubuntu_sso/utils/ui.py:102 msgid "Network detection" msgstr "Netværksdetektering" #: ../ubuntu_sso/utils/ui.py:103 #, python-format msgid "" "Are you online? We can't detect an internet connection - you will need to be " "connected to set up %(app_name)s" msgstr "" "Er du pÃ¥ nettet? Vi kan ikke finde en internetforbindelse - det er " "nødvendigt at være pÃ¥ nettet for at kunne konfigurere %(app_name)s" #: ../ubuntu_sso/utils/ui.py:105 msgid "One moment please..." msgstr "Øjeblik..." #: ../ubuntu_sso/utils/ui.py:106 msgid "Create a password" msgstr "Opret en adgangskode" #: ../ubuntu_sso/utils/ui.py:107 msgid "Your password was successfully changed." msgstr "Din adgangskode er blevet ændret." #: ../ubuntu_sso/utils/ui.py:108 msgid "At least one number" msgstr "Mindst ét tal" #: ../ubuntu_sso/utils/ui.py:110 msgid "Re-type Password" msgstr "Indtast din adgangskode igen" #: ../ubuntu_sso/utils/ui.py:111 msgid "" "The password must have a minimum of 8 characters and include one uppercase " "character and one number." msgstr "" "Adgangskoden skal være pÃ¥ minimum 8 tegn og inkludere et stort bogstav og et " "tal." #: ../ubuntu_sso/utils/ui.py:113 msgid "At least 8 characters" msgstr "Mindst otte tegn" #: ../ubuntu_sso/utils/ui.py:114 msgid "Passwords don't match" msgstr "Adgangskoder stemmer ikke" #: ../ubuntu_sso/utils/ui.py:115 msgid "" "The passwords don't match, please double check and try entering them again." msgstr "" "Adgangskoderne stemmer ikke overens, kontroller en ekstra gang og prøv at " "indtaste dem igen." #: ../ubuntu_sso/utils/ui.py:117 msgid "Your password must contain" msgstr "Din adgangskode skal indeholde" #: ../ubuntu_sso/utils/ui.py:118 msgid "The password is too weak." msgstr "Adgangskoden er for svag." #: ../ubuntu_sso/utils/ui.py:119 msgid "At least one uppercase letter" msgstr "Mindst ét stort bogstav" #: ../ubuntu_sso/utils/ui.py:120 msgid "Privacy Policy" msgstr "Privatlivspolitik" #: ../ubuntu_sso/utils/ui.py:121 msgid "Connecting to:" msgstr "Forbinder til:" #: ../ubuntu_sso/utils/ui.py:122 msgid "Proxy Settings" msgstr "Proxyindstillinger" #: ../ubuntu_sso/utils/ui.py:123 msgid "Incorrect login details. Please try again." msgstr "Forkerte logind-detaljer. Prøv venligst igen." #: ../ubuntu_sso/utils/ui.py:124 msgid "Please provide login details." msgstr "Angiv venligst logind-detaljerne." #: ../ubuntu_sso/utils/ui.py:125 msgid "You are connecting through a proxy." msgstr "Du er ved at forbinde gennem en proxy." #: ../ubuntu_sso/utils/ui.py:126 msgid "Get Help With Proxies" msgstr "FÃ¥ hjælp til proxy'er" #: ../ubuntu_sso/utils/ui.py:127 msgid "Proxy password:" msgstr "Proxyadgangskode:" #: ../ubuntu_sso/utils/ui.py:128 msgid "Save and Connect" msgstr "Gem og forbind" #: ../ubuntu_sso/utils/ui.py:129 msgid "Proxy username:" msgstr "Proxybrugernavn:" #: ../ubuntu_sso/utils/ui.py:131 msgid "" "A password reset code has been sent to your e-mail. Please enter the code " "below along with your new password." msgstr "" "Der er afsendt en kode til din e-post-adresse, der lader dig nulstille " "adgangskoden. Indtast venligst koden nedenfor sammen med din nye adgangskode." #: ../ubuntu_sso/utils/ui.py:133 msgid "Retype email" msgstr "Gentag e-post-adresse" #: ../ubuntu_sso/utils/ui.py:134 msgid "Retype password" msgstr "Gentag adgangskode" #: ../ubuntu_sso/utils/ui.py:135 #, python-format msgid "To reset your %(app_name)s password, enter your email address below:" msgstr "" "Indtast din e-postadresse her under, for at nulstille din %(app_name)s " "adgangskode:" #: ../ubuntu_sso/utils/ui.py:137 msgid "" "We are very Sorry! The service that signs you on is not responding right " "now\n" "Please try again or come back in a few minutes." msgstr "" "Vi beklager meget! Tjenesten, der logger dig pÃ¥, svarer i øjeblikket ikke\n" "Prøv venligst igen eller kom tilbage om nogle minutter." #: ../ubuntu_sso/utils/ui.py:140 msgid "Sorry we did not recognize the email address." msgstr "Beklager, men vi kunne ikke genkende din e-post-adresse." #: ../ubuntu_sso/utils/ui.py:142 msgid "Reset code" msgstr "Nulstillingskode" #: ../ubuntu_sso/utils/ui.py:145 #, python-format msgid "" "A password reset code has been sent to %(email)s.\n" "Please enter the code below along with your new password." msgstr "" "En nulstillingskode til adgangskoden er blevet sendt til %(email)s.\n" "Indtast venligst koden nedenfor sammen med din nye adgangskode." #: ../ubuntu_sso/utils/ui.py:147 msgid "Set Up Account" msgstr "Konfigurér konto" #: ../ubuntu_sso/utils/ui.py:148 msgid "I don't have an account yet - sign me up" msgstr "Jeg har ikke en konto endnu - opret en" #: ../ubuntu_sso/utils/ui.py:149 msgid "Sign In" msgstr "Log ind" #: ../ubuntu_sso/utils/ui.py:150 msgid "Log-in with my existing account." msgstr "" #: ../ubuntu_sso/utils/ui.py:151 msgid "the appname whose ssl error we are going to show." msgstr "navnet pÃ¥ programmet hvis ssl-fejl vi skal til at vise." #: ../ubuntu_sso/utils/ui.py:152 msgid "Certificate details" msgstr "Certifikat-detaljer" #: ../ubuntu_sso/utils/ui.py:153 msgid "Connect" msgstr "Forbind" #: ../ubuntu_sso/utils/ui.py:154 msgid "the details ssl certificate we are going to show." msgstr "detaljer for ssl-certifikatet, vi skal til at vise." #: ../ubuntu_sso/utils/ui.py:161 msgid "Open the SSL certificate UI." msgstr "Ã…bn SSL-certifikatgrænsefladen." #: ../ubuntu_sso/utils/ui.py:162 msgid "SSL Certificate Not Valid" msgstr "SSL-certifikat er ugyldigt" #: ../ubuntu_sso/utils/ui.py:163 msgid "the domain whose ssl certificate we are going to show." msgstr "domænet hvis ssl-certifikat vi skal til at vise." #: ../ubuntu_sso/utils/ui.py:164 #, python-format msgid "" "You are trying to connect to a proxy server on %(domain)s. This server uses " "a secure connection, and the SSL certificate is not valid because:" msgstr "" "Du forsøger at forbinde til en proxyserver pÃ¥ %(domain)s. Denne server " "bruger en sikker forbindelse, og SSL-certifikatet er ikke gyldigt fordi:" #: ../ubuntu_sso/utils/ui.py:167 msgid "The certificate has not been verified" msgstr "Certifikatet er ikke blevet verificeret" #: ../ubuntu_sso/utils/ui.py:168 msgid "Do you want to connect to this server?" msgstr "Vil du forbinde til denne server?" #: ../ubuntu_sso/utils/ui.py:169 msgid "Get Help With SSL" msgstr "FÃ¥ hjælp til SSL" #: ../ubuntu_sso/utils/ui.py:170 #, python-format msgid "" "If you are not sure about this server, do not use it to connect to " "%(app_name)s." msgstr "" "Hvis du ikke stoler pÃ¥ denne server, skal du ikke bruge den til at forbinde " "til %(app_name)s." #: ../ubuntu_sso/utils/ui.py:172 msgid "Remember my settings for this certificate." msgstr "Husk mine indstillinger for dette certifikat." #: ../ubuntu_sso/utils/ui.py:173 msgid "" "The name on the certificate isn't valid or doesn't match the name of the site" msgstr "" "Navnet pÃ¥ certifikatet er ugyldigt, eller svarer ikke til webstedets navn" #: ../ubuntu_sso/utils/ui.py:175 msgid "The certificate has expired" msgstr "Certifikatet er udløbet" #: ../ubuntu_sso/utils/ui.py:176 #, python-format msgid "You are now logged into %(app_name)s." msgstr "Du er nu logget pÃ¥ %(app_name)s." #: ../ubuntu_sso/utils/ui.py:177 msgid "Surname" msgstr "Efternavn" #: ../ubuntu_sso/utils/ui.py:178 msgid "Terms of Service" msgstr "ServicevilkÃ¥r" #: ../ubuntu_sso/utils/ui.py:179 msgid "Sign Up to {app_name}" msgstr "Log ind pÃ¥ {app_name}" #: ../ubuntu_sso/utils/ui.py:180 msgid "Show Terms & Conditions" msgstr "Vis betingelser og vilkÃ¥r" #: ../ubuntu_sso/utils/ui.py:181 #, python-format msgid "" "Agreeing to the %(app_name)s Terms & Conditions is required to subscribe." msgstr "" "For at kunne abonnere, skal du acceptere brugsvilkÃ¥rene for %(app_name)s." #: ../ubuntu_sso/utils/ui.py:183 #, python-format msgid "You can also find these terms at %(url)s" msgstr "Du kan ogsÃ¥ finde disse vilkÃ¥r pÃ¥ %(url)s" #: ../ubuntu_sso/utils/ui.py:184 msgid "Try again" msgstr "Forsøg igen" #: ../ubuntu_sso/utils/ui.py:185 msgid "" "There was an error when trying to complete the process. Please check the " "information and try again." msgstr "" "Der opstod en fejl ved forsøg pÃ¥ at fuldføre processen. Kontroller venligst " "din information og prøv igen." #: ../ubuntu_sso/utils/ui.py:187 msgid "Verification code" msgstr "Verifikationskode" #: ../ubuntu_sso/utils/ui.py:188 #, python-format msgid "" "Check %(email)s for an email from Ubuntu Single Sign On. This message " "contains a verification code. Enter the code in the field below and click OK " "to complete creating your %(app_name)s account." msgstr "" "Kontrollér %(email)s for e-post fra Ubuntu Single Sign On. Denne besked " "indeholder en verifikationskode. Indtast koden i feltet herunder, og klik " "O.k. for at fuldføre oprettelsen af din %(app_name)s-konto." #: ../ubuntu_sso/utils/ui.py:192 msgid "Enter verification code" msgstr "Indtast godkendelseskode" #: ../ubuntu_sso/utils/ui.py:195 #, python-format msgid "I agree with the %(app_name)s terms and conditions" msgstr "Jeg er enig med betingelser og vilkÃ¥r for %(app_name)s" #: ../ubuntu_sso/utils/ui.py:196 #, python-format msgid "Yes! Email me %(app_name)s tips and updates." msgstr "Ja! Send mig tips og opdateringer for %(app_name)s." ubuntu-sso-client-13.10/po/ace.po0000664000202700020270000002647112151461656017071 0ustar dobeydobey00000000000000# Acehnese translation for ubuntu-sso-client # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the ubuntu-sso-client package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: ubuntu-sso-client\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-09-11 18:25+0000\n" "PO-Revision-Date: 2010-10-26 13:29+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Acehnese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-09-17 18:24+0000\n" "X-Generator: Launchpad (build 15944)\n" #. Undefined variable '_', pylint: disable=E0602 #. all the text that is used in the gui #: ../ubuntu_sso/utils/ui.py:49 msgid "By signing up to {app_name} you agree to our {privacy_policy}" msgstr "" #: ../ubuntu_sso/utils/ui.py:51 msgid "By signing up to {app_name} you agree to our {terms_and_conditions}" msgstr "" #: ../ubuntu_sso/utils/ui.py:53 msgid " and {privacy_policy}" msgstr "" #: ../ubuntu_sso/utils/ui.py:54 msgid "Cancel" msgstr "" #: ../ubuntu_sso/utils/ui.py:55 msgid "Type the characters above" msgstr "Ketik karakter yang na di ateuh" #: ../ubuntu_sso/utils/ui.py:56 msgid "There was a problem getting the captcha, reloading..." msgstr "" #: ../ubuntu_sso/utils/ui.py:58 #, python-format msgid "If you can't read this then %(reload_link)s this page" msgstr "" #: ../ubuntu_sso/utils/ui.py:60 msgid "refresh" msgstr "" #: ../ubuntu_sso/utils/ui.py:61 msgid "Reload" msgstr "Peumuat lom" #: ../ubuntu_sso/utils/ui.py:62 msgid "The captcha is a required field" msgstr "" #: ../ubuntu_sso/utils/ui.py:63 msgid "Close window and set up later" msgstr "" #: ../ubuntu_sso/utils/ui.py:64 msgid "Congratulations, {app_name} is installed!" msgstr "" #: ../ubuntu_sso/utils/ui.py:65 #, python-format msgid "To connect this computer to %(app_name)s enter your details below." msgstr "To connect this computer to %(app_name)s enter your details below." #: ../ubuntu_sso/utils/ui.py:67 msgid "Register with {app_name}." msgstr "" #: ../ubuntu_sso/utils/ui.py:68 ../ubuntu_sso/utils/ui.py:93 #: ../ubuntu_sso/utils/ui.py:143 msgid "Email address" msgstr "Alamat Email" #: ../ubuntu_sso/utils/ui.py:69 msgid "Re-type Email address" msgstr "Neu ketik lom alamat Email" #: ../ubuntu_sso/utils/ui.py:70 msgid "The email must be a valid email address." msgstr "Email musti betui." #: ../ubuntu_sso/utils/ui.py:71 msgid "" "The email addresses don't match, please double check and try entering them " "again." msgstr "" "Alamat email hana cocok, neu cek sigoe tek dan neu cuba peutamong lom." #: ../ubuntu_sso/utils/ui.py:73 msgid "Email" msgstr "" #: ../ubuntu_sso/utils/ui.py:74 msgid "The email addresses do not match" msgstr "" #: ../ubuntu_sso/utils/ui.py:75 msgid "Enter code verification here" msgstr "Peutamong kode verifikasi sinoe" #: ../ubuntu_sso/utils/ui.py:76 msgid "Please enter your name" msgstr "" #: ../ubuntu_sso/utils/ui.py:77 msgid "The process did not finish successfully." msgstr "" #: ../ubuntu_sso/utils/ui.py:79 msgid "Sign me in with my existing account" msgstr "" #: ../ubuntu_sso/utils/ui.py:80 msgid "This field is required." msgstr "Kotak nyoe peurlee di paso." #: ../ubuntu_sso/utils/ui.py:81 msgid "I've forgotten my password" msgstr "Lon tuwoe kata gunci" #: ../ubuntu_sso/utils/ui.py:82 ../ubuntu_sso/utils/ui.py:130 msgid "Reset password" msgstr "Pasang ulang kata gunci" #: ../ubuntu_sso/utils/ui.py:83 msgid "" "To reset your {app_name} password, enter your registered email address " "below. We will send instructions to reset your password." msgstr "" #: ../ubuntu_sso/utils/ui.py:86 msgid "Please enter a valid email address" msgstr "" #: ../ubuntu_sso/utils/ui.py:87 msgid "There was a problem accessing the Ubuntu Single Sign On backend." msgstr "" #: ../ubuntu_sso/utils/ui.py:89 #, python-format msgid "Create %(app_name)s account" msgstr "" #: ../ubuntu_sso/utils/ui.py:90 msgid "Loading..." msgstr "Teungoh neu muat..." #: ../ubuntu_sso/utils/ui.py:91 msgid "Getting information, please wait..." msgstr "" #: ../ubuntu_sso/utils/ui.py:92 msgid "Already have an account? Click here to sign in" msgstr "Kaleuh na akun? Klik sinoe ke tamong" #: ../ubuntu_sso/utils/ui.py:94 #, python-format msgid "Connect to %(app_name)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:95 ../ubuntu_sso/utils/ui.py:109 msgid "Password" msgstr "Kata Gunci" #: ../ubuntu_sso/utils/ui.py:97 msgid "Sign In to {app_name}" msgstr "" #: ../ubuntu_sso/utils/ui.py:99 msgid "Name" msgstr "Nan" #: ../ubuntu_sso/utils/ui.py:100 msgid "The name must not be empty." msgstr "" #: ../ubuntu_sso/utils/ui.py:101 msgid "Next" msgstr "Lanjut" #: ../ubuntu_sso/utils/ui.py:102 msgid "Network detection" msgstr "" #: ../ubuntu_sso/utils/ui.py:103 #, python-format msgid "" "Are you online? We can't detect an internet connection - you will need to be " "connected to set up %(app_name)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:105 msgid "One moment please..." msgstr "Neu preh siat..." #: ../ubuntu_sso/utils/ui.py:106 msgid "Create a password" msgstr "" #: ../ubuntu_sso/utils/ui.py:107 msgid "Your password was successfully changed." msgstr "Kata gunci droe neuh berhasil di ganto." #: ../ubuntu_sso/utils/ui.py:108 msgid "At least one number" msgstr "" #: ../ubuntu_sso/utils/ui.py:110 msgid "Re-type Password" msgstr "Neu ketik lom Kata Gunci" #: ../ubuntu_sso/utils/ui.py:111 msgid "" "The password must have a minimum of 8 characters and include one uppercase " "character and one number." msgstr "" "Kata gunci minimum na 8 karakter dan na termasuk saboh huruf rayeuk dan " "saboh angka." #: ../ubuntu_sso/utils/ui.py:113 msgid "At least 8 characters" msgstr "" #: ../ubuntu_sso/utils/ui.py:114 msgid "Passwords don't match" msgstr "" #: ../ubuntu_sso/utils/ui.py:115 msgid "" "The passwords don't match, please double check and try entering them again." msgstr "Kata gunci hana cocok, neu cek lom dan neu cuba peutamong lom." #: ../ubuntu_sso/utils/ui.py:117 msgid "Your password must contain" msgstr "" #: ../ubuntu_sso/utils/ui.py:118 msgid "The password is too weak." msgstr "Kata gunci leumoh that." #: ../ubuntu_sso/utils/ui.py:119 msgid "At least one uppercase letter" msgstr "" #: ../ubuntu_sso/utils/ui.py:120 msgid "Privacy Policy" msgstr "" #: ../ubuntu_sso/utils/ui.py:121 msgid "Connecting to:" msgstr "" #: ../ubuntu_sso/utils/ui.py:122 msgid "Proxy Settings" msgstr "" #: ../ubuntu_sso/utils/ui.py:123 msgid "Incorrect login details. Please try again." msgstr "" #: ../ubuntu_sso/utils/ui.py:124 msgid "Please provide login details." msgstr "" #: ../ubuntu_sso/utils/ui.py:125 msgid "You are connecting through a proxy." msgstr "" #: ../ubuntu_sso/utils/ui.py:126 msgid "Get Help With Proxies" msgstr "" #: ../ubuntu_sso/utils/ui.py:127 msgid "Proxy password:" msgstr "" #: ../ubuntu_sso/utils/ui.py:128 msgid "Save and Connect" msgstr "" #: ../ubuntu_sso/utils/ui.py:129 msgid "Proxy username:" msgstr "" #: ../ubuntu_sso/utils/ui.py:131 msgid "" "A password reset code has been sent to your e-mail. Please enter the code " "below along with your new password." msgstr "" #: ../ubuntu_sso/utils/ui.py:133 msgid "Retype email" msgstr "" #: ../ubuntu_sso/utils/ui.py:134 msgid "Retype password" msgstr "" #: ../ubuntu_sso/utils/ui.py:135 #, python-format msgid "To reset your %(app_name)s password, enter your email address below:" msgstr "" #: ../ubuntu_sso/utils/ui.py:137 msgid "" "We are very Sorry! The service that signs you on is not responding right " "now\n" "Please try again or come back in a few minutes." msgstr "" #: ../ubuntu_sso/utils/ui.py:140 msgid "Sorry we did not recognize the email address." msgstr "" #: ../ubuntu_sso/utils/ui.py:142 msgid "Reset code" msgstr "Pasang ulang kode" #: ../ubuntu_sso/utils/ui.py:145 #, python-format msgid "" "A password reset code has been sent to %(email)s.\n" "Please enter the code below along with your new password." msgstr "" #: ../ubuntu_sso/utils/ui.py:147 msgid "Set Up Account" msgstr "" #: ../ubuntu_sso/utils/ui.py:148 msgid "I don't have an account yet - sign me up" msgstr "" #: ../ubuntu_sso/utils/ui.py:149 msgid "Sign In" msgstr "" #: ../ubuntu_sso/utils/ui.py:150 msgid "Log-in with my existing account." msgstr "" #: ../ubuntu_sso/utils/ui.py:151 msgid "the appname whose ssl error we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:152 msgid "Certificate details" msgstr "" #: ../ubuntu_sso/utils/ui.py:153 msgid "Connect" msgstr "" #: ../ubuntu_sso/utils/ui.py:154 msgid "the details ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:161 msgid "Open the SSL certificate UI." msgstr "" #: ../ubuntu_sso/utils/ui.py:162 msgid "SSL Certificate Not Valid" msgstr "" #: ../ubuntu_sso/utils/ui.py:163 msgid "the domain whose ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:164 #, python-format msgid "" "You are trying to connect to a proxy server on %(domain)s. This server uses " "a secure connection, and the SSL certificate is not valid because:" msgstr "" #: ../ubuntu_sso/utils/ui.py:167 msgid "The certificate has not been verified" msgstr "" #: ../ubuntu_sso/utils/ui.py:168 msgid "Do you want to connect to this server?" msgstr "" #: ../ubuntu_sso/utils/ui.py:169 msgid "Get Help With SSL" msgstr "" #: ../ubuntu_sso/utils/ui.py:170 #, python-format msgid "" "If you are not sure about this server, do not use it to connect to " "%(app_name)s." msgstr "" #: ../ubuntu_sso/utils/ui.py:172 msgid "Remember my settings for this certificate." msgstr "" #: ../ubuntu_sso/utils/ui.py:173 msgid "" "The name on the certificate isn't valid or doesn't match the name of the site" msgstr "" #: ../ubuntu_sso/utils/ui.py:175 msgid "The certificate has expired" msgstr "" #: ../ubuntu_sso/utils/ui.py:176 #, python-format msgid "You are now logged into %(app_name)s." msgstr "" #: ../ubuntu_sso/utils/ui.py:177 msgid "Surname" msgstr "" #: ../ubuntu_sso/utils/ui.py:178 msgid "Terms of Service" msgstr "" #: ../ubuntu_sso/utils/ui.py:179 msgid "Sign Up to {app_name}" msgstr "" #: ../ubuntu_sso/utils/ui.py:180 msgid "Show Terms & Conditions" msgstr "" #: ../ubuntu_sso/utils/ui.py:181 #, python-format msgid "" "Agreeing to the %(app_name)s Terms & Conditions is required to subscribe." msgstr "" #: ../ubuntu_sso/utils/ui.py:183 #, python-format msgid "You can also find these terms at %(url)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:184 msgid "Try again" msgstr "" #: ../ubuntu_sso/utils/ui.py:185 msgid "" "There was an error when trying to complete the process. Please check the " "information and try again." msgstr "" "Na kesalahan watee peulengkap proses. Neu cek informasi jih dan cuba lom." #: ../ubuntu_sso/utils/ui.py:187 msgid "Verification code" msgstr "" #: ../ubuntu_sso/utils/ui.py:188 #, python-format msgid "" "Check %(email)s for an email from Ubuntu Single Sign On. This message " "contains a verification code. Enter the code in the field below and click OK " "to complete creating your %(app_name)s account." msgstr "" #: ../ubuntu_sso/utils/ui.py:192 msgid "Enter verification code" msgstr "Peutamong kode verifikasi" #: ../ubuntu_sso/utils/ui.py:195 #, python-format msgid "I agree with the %(app_name)s terms and conditions" msgstr "" #: ../ubuntu_sso/utils/ui.py:196 #, python-format msgid "Yes! Email me %(app_name)s tips and updates." msgstr "" ubuntu-sso-client-13.10/po/zh_CN.po0000664000202700020270000003405312151461656017335 0ustar dobeydobey00000000000000# Chinese (Simplified) translation for ubuntu-sso-client # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the ubuntu-sso-client package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: ubuntu-sso-client\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-09-11 18:25+0000\n" "PO-Revision-Date: 2012-04-13 17:22+0000\n" "Last-Translator: Aron Xu \n" "Language-Team: Chinese (Simplified) \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-09-17 18:24+0000\n" "X-Generator: Launchpad (build 15944)\n" #. Undefined variable '_', pylint: disable=E0602 #. all the text that is used in the gui #: ../ubuntu_sso/utils/ui.py:49 msgid "By signing up to {app_name} you agree to our {privacy_policy}" msgstr "è¦æ³¨å†Œ {app_name} æ‚¨å¿…é¡»åŒæ„我们的 {privacy_policy}" #: ../ubuntu_sso/utils/ui.py:51 msgid "By signing up to {app_name} you agree to our {terms_and_conditions}" msgstr "è¦æ³¨å†Œ {app_name} æ‚¨å¿…é¡»åŒæ„我们的 {terms_and_conditions}" #: ../ubuntu_sso/utils/ui.py:53 msgid " and {privacy_policy}" msgstr " ä»¥åŠ {privacy_policy}" #: ../ubuntu_sso/utils/ui.py:54 msgid "Cancel" msgstr "å–æ¶ˆ" #: ../ubuntu_sso/utils/ui.py:55 msgid "Type the characters above" msgstr "键入上é¢çš„字符" #: ../ubuntu_sso/utils/ui.py:56 msgid "There was a problem getting the captcha, reloading..." msgstr "获å–验è¯ç é‡åˆ°é—®é¢˜ï¼Œæ­£åœ¨é‡æ–°è½½å…¥..." #: ../ubuntu_sso/utils/ui.py:58 #, python-format msgid "If you can't read this then %(reload_link)s this page" msgstr "如果您ä¸èƒ½é˜…读这些内容,请 %(reload_link)s 此页é¢" #: ../ubuntu_sso/utils/ui.py:60 msgid "refresh" msgstr "刷新" #: ../ubuntu_sso/utils/ui.py:61 msgid "Reload" msgstr "刷新" #: ../ubuntu_sso/utils/ui.py:62 msgid "The captcha is a required field" msgstr "captcha 是必填项" #: ../ubuntu_sso/utils/ui.py:63 msgid "Close window and set up later" msgstr "关闭窗å£ï¼Œä»¥åŽå†è¿›è¡Œè®¾ç½®" #: ../ubuntu_sso/utils/ui.py:64 msgid "Congratulations, {app_name} is installed!" msgstr "æ­å–œï¼Œ{app_name} 已安装ï¼" #: ../ubuntu_sso/utils/ui.py:65 #, python-format msgid "To connect this computer to %(app_name)s enter your details below." msgstr "è¦å°†æ­¤è®¡ç®—机连接到 %(app_name)s,在下é¢è¾“入您的详细信æ¯ã€‚" #: ../ubuntu_sso/utils/ui.py:67 msgid "Register with {app_name}." msgstr "" #: ../ubuntu_sso/utils/ui.py:68 ../ubuntu_sso/utils/ui.py:93 #: ../ubuntu_sso/utils/ui.py:143 msgid "Email address" msgstr "E-mail 地å€" #: ../ubuntu_sso/utils/ui.py:69 msgid "Re-type Email address" msgstr "è¯·é‡æ–°è¾“入电å­é‚®ä»¶åœ°å€" #: ../ubuntu_sso/utils/ui.py:70 msgid "The email must be a valid email address." msgstr "必须是有效的电å­é‚®ä»¶åœ°å€ã€‚" #: ../ubuntu_sso/utils/ui.py:71 msgid "" "The email addresses don't match, please double check and try entering them " "again." msgstr "电å­é‚®ä»¶åœ°å€ä¸æ­£ç¡®ï¼Œè¯·å†æ¬¡æ£€æŸ¥å¹¶é‡æ–°è¾“入。" #: ../ubuntu_sso/utils/ui.py:73 msgid "Email" msgstr "电å­é‚®ä»¶" #: ../ubuntu_sso/utils/ui.py:74 msgid "The email addresses do not match" msgstr "电å­é‚®ä»¶åœ°å€ä¸åŒ¹é…" #: ../ubuntu_sso/utils/ui.py:75 msgid "Enter code verification here" msgstr "在这里输入验è¯ç " #: ../ubuntu_sso/utils/ui.py:76 msgid "Please enter your name" msgstr "请输入您的åå­—" #: ../ubuntu_sso/utils/ui.py:77 msgid "The process did not finish successfully." msgstr "过程没有æˆåŠŸå®Œæˆã€‚" #: ../ubuntu_sso/utils/ui.py:79 msgid "Sign me in with my existing account" msgstr "用已有å¸å·ç™»å½•" #: ../ubuntu_sso/utils/ui.py:80 msgid "This field is required." msgstr "此字段必须填写。" #: ../ubuntu_sso/utils/ui.py:81 msgid "I've forgotten my password" msgstr "我忘记了密ç " #: ../ubuntu_sso/utils/ui.py:82 ../ubuntu_sso/utils/ui.py:130 msgid "Reset password" msgstr "é‡è®¾å¯†ç " #: ../ubuntu_sso/utils/ui.py:83 msgid "" "To reset your {app_name} password, enter your registered email address " "below. We will send instructions to reset your password." msgstr "è¦é‡è®¾æ‚¨çš„ {app_name} 密ç ï¼Œè¯·åœ¨ä¸‹æ–¹è¾“入您注册时所填写的电å­é‚®ä»¶åœ°å€ã€‚我们将给您å‘é€é‡è®¾å¯†ç çš„详细说明。" #: ../ubuntu_sso/utils/ui.py:86 msgid "Please enter a valid email address" msgstr "请输入一个有效的电å­é‚®ä»¶åœ°å€" #: ../ubuntu_sso/utils/ui.py:87 msgid "There was a problem accessing the Ubuntu Single Sign On backend." msgstr "访问 Ubuntu å•点登录åŽç«¯æ—¶é‡åˆ°é—®é¢˜ã€‚" #: ../ubuntu_sso/utils/ui.py:89 #, python-format msgid "Create %(app_name)s account" msgstr "创建 %(app_name)s 叿ˆ·" #: ../ubuntu_sso/utils/ui.py:90 msgid "Loading..." msgstr "装载中..." #: ../ubuntu_sso/utils/ui.py:91 msgid "Getting information, please wait..." msgstr "正在获å–ä¿¡æ¯ï¼Œè¯·ç¨å€™..." #: ../ubuntu_sso/utils/ui.py:92 msgid "Already have an account? Click here to sign in" msgstr "å·²ç»æ‹¥æœ‰å¸æˆ·ï¼Ÿç‚¹å‡»ç™»å½•" #: ../ubuntu_sso/utils/ui.py:94 #, python-format msgid "Connect to %(app_name)s" msgstr "连接至 %(app_name)s" #: ../ubuntu_sso/utils/ui.py:95 ../ubuntu_sso/utils/ui.py:109 msgid "Password" msgstr "密ç " #: ../ubuntu_sso/utils/ui.py:97 msgid "Sign In to {app_name}" msgstr "登录到 {app_name}" #: ../ubuntu_sso/utils/ui.py:99 msgid "Name" msgstr "å§“å" #: ../ubuntu_sso/utils/ui.py:100 msgid "The name must not be empty." msgstr "åç§°ä¸èƒ½ä¸ºç©ºã€‚" #: ../ubuntu_sso/utils/ui.py:101 msgid "Next" msgstr "下一步" #: ../ubuntu_sso/utils/ui.py:102 msgid "Network detection" msgstr "网络检测" #: ../ubuntu_sso/utils/ui.py:103 #, python-format msgid "" "Are you online? We can't detect an internet connection - you will need to be " "connected to set up %(app_name)s" msgstr "您在线å—?我们ä¸èƒ½æ£€æµ‹åˆ°ç½‘络连接 - 您需è¦è”网以便注册 %(app_name)s" #: ../ubuntu_sso/utils/ui.py:105 msgid "One moment please..." msgstr "请ç¨å€™..." #: ../ubuntu_sso/utils/ui.py:106 msgid "Create a password" msgstr "创建密ç " #: ../ubuntu_sso/utils/ui.py:107 msgid "Your password was successfully changed." msgstr "您的密ç ä¿®æ”¹æˆåŠŸã€‚" #: ../ubuntu_sso/utils/ui.py:108 msgid "At least one number" msgstr "è‡³å°‘åŒ…å« 1 个数字" #: ../ubuntu_sso/utils/ui.py:110 msgid "Re-type Password" msgstr "冿¬¡è¾“入密ç " #: ../ubuntu_sso/utils/ui.py:111 msgid "" "The password must have a minimum of 8 characters and include one uppercase " "character and one number." msgstr "密ç å¿…须多于 8 字符并且包å«ä¸€ä¸ªå¤§å†™å­—æ¯å’Œä¸€ä¸ªæ•°å­—。" #: ../ubuntu_sso/utils/ui.py:113 msgid "At least 8 characters" msgstr "è‡³å°‘åŒ…å« 8 个字符" #: ../ubuntu_sso/utils/ui.py:114 msgid "Passwords don't match" msgstr "密ç ä¸åŒ¹é…" #: ../ubuntu_sso/utils/ui.py:115 msgid "" "The passwords don't match, please double check and try entering them again." msgstr "密ç ä¸åŒ¹é…ï¼Œè¯·é‡æ–°è¾“入。" #: ../ubuntu_sso/utils/ui.py:117 msgid "Your password must contain" msgstr "密ç å¿…须包å«" #: ../ubuntu_sso/utils/ui.py:118 msgid "The password is too weak." msgstr "密ç å¼ºåº¦å¤ªå¼±ã€‚" #: ../ubuntu_sso/utils/ui.py:119 msgid "At least one uppercase letter" msgstr "è‡³å°‘åŒ…å« 1 个大写字æ¯" #: ../ubuntu_sso/utils/ui.py:120 msgid "Privacy Policy" msgstr "éšç§æ”¿ç­–" #: ../ubuntu_sso/utils/ui.py:121 msgid "Connecting to:" msgstr "连接到:" #: ../ubuntu_sso/utils/ui.py:122 msgid "Proxy Settings" msgstr "代ç†è®¾ç½®" #: ../ubuntu_sso/utils/ui.py:123 msgid "Incorrect login details. Please try again." msgstr "登录信æ¯ä¸æ­£ç¡®ï¼Œè¯·é‡è¯•。" #: ../ubuntu_sso/utils/ui.py:124 msgid "Please provide login details." msgstr "请æä¾›ç™»å½•ä¿¡æ¯ã€‚" #: ../ubuntu_sso/utils/ui.py:125 msgid "You are connecting through a proxy." msgstr "您正在使用代ç†è¿›è¡Œè¿žæŽ¥ã€‚" #: ../ubuntu_sso/utils/ui.py:126 msgid "Get Help With Proxies" msgstr "èŽ·å–æœ‰å…³ä»£ç†çš„帮助信æ¯" #: ../ubuntu_sso/utils/ui.py:127 msgid "Proxy password:" msgstr "代ç†å¯†ç ï¼š" #: ../ubuntu_sso/utils/ui.py:128 msgid "Save and Connect" msgstr "ä¿å­˜å¹¶è¿žæŽ¥" #: ../ubuntu_sso/utils/ui.py:129 msgid "Proxy username:" msgstr "代ç†ç”¨æˆ·å:" #: ../ubuntu_sso/utils/ui.py:131 msgid "" "A password reset code has been sent to your e-mail. Please enter the code " "below along with your new password." msgstr "已呿‚¨çš„电å­é‚®ç®±å‘é€å¯†ç é‡ç½®ä»£ç ã€‚请在下方输入该代ç ä»¥ä¾¿è®¾ç½®æ–°å¯†ç ã€‚" #: ../ubuntu_sso/utils/ui.py:133 msgid "Retype email" msgstr "釿–°è¾“入电å­é‚®ä»¶åœ°å€" #: ../ubuntu_sso/utils/ui.py:134 msgid "Retype password" msgstr "é‡å¤å¯†ç " #: ../ubuntu_sso/utils/ui.py:135 #, python-format msgid "To reset your %(app_name)s password, enter your email address below:" msgstr "é‡è®¾ %(app_name)s 的密ç ï¼Œè¯·åœ¨ä¸‹æ–¹è¾“入您的电å­é‚®ä»¶åœ°å€ï¼š" #: ../ubuntu_sso/utils/ui.py:137 msgid "" "We are very Sorry! The service that signs you on is not responding right " "now\n" "Please try again or come back in a few minutes." msgstr "éžå¸¸æŠ±æ­‰ï¼æ‚¨çš„æ³¨å†Œçš„æœåŠ¡æ²¡æœ‰å“应,请å†è¯•一次,或在几分钟åŽé‡è¯•。" #: ../ubuntu_sso/utils/ui.py:140 msgid "Sorry we did not recognize the email address." msgstr "很抱歉,该电å­é‚®ä»¶åœ°å€æ— æ³•识别。" #: ../ubuntu_sso/utils/ui.py:142 msgid "Reset code" msgstr "é‡ç½®ç " #: ../ubuntu_sso/utils/ui.py:145 #, python-format msgid "" "A password reset code has been sent to %(email)s.\n" "Please enter the code below along with your new password." msgstr "一个密ç é‡ç½®ç å·²ç»å‘é€è‡³ %(email)s。" #: ../ubuntu_sso/utils/ui.py:147 msgid "Set Up Account" msgstr "设置å¸å·" #: ../ubuntu_sso/utils/ui.py:148 msgid "I don't have an account yet - sign me up" msgstr "还没有å¸å· - æˆ‘è¦æ³¨å†Œ" #: ../ubuntu_sso/utils/ui.py:149 msgid "Sign In" msgstr "登录" #: ../ubuntu_sso/utils/ui.py:150 msgid "Log-in with my existing account." msgstr "" #: ../ubuntu_sso/utils/ui.py:151 msgid "the appname whose ssl error we are going to show." msgstr "å°†è¦æ˜¾ç¤ºçš„存在 ssl 错误的应用å称。" #: ../ubuntu_sso/utils/ui.py:152 msgid "Certificate details" msgstr "è¯ä¹¦ç»†èŠ‚" #: ../ubuntu_sso/utils/ui.py:153 msgid "Connect" msgstr "连接" #: ../ubuntu_sso/utils/ui.py:154 msgid "the details ssl certificate we are going to show." msgstr "å°†è¦æ˜¾ç¤ºçš„ ssl è¯ä¹¦è¯¦ç»†ä¿¡æ¯ã€‚" #: ../ubuntu_sso/utils/ui.py:161 msgid "Open the SSL certificate UI." msgstr "打开 SSL è¯ä¹¦ç•Œé¢ã€‚" #: ../ubuntu_sso/utils/ui.py:162 msgid "SSL Certificate Not Valid" msgstr "SSL è¯ä¹¦æ— æ•ˆ" #: ../ubuntu_sso/utils/ui.py:163 msgid "the domain whose ssl certificate we are going to show." msgstr "å°†è¦æ˜¾ç¤º ssl è¯ä¹¦æ‰€è®¤è¯çš„域。" #: ../ubuntu_sso/utils/ui.py:164 #, python-format msgid "" "You are trying to connect to a proxy server on %(domain)s. This server uses " "a secure connection, and the SSL certificate is not valid because:" msgstr "您正在连接到 %(domain)s ä¸Šçš„ä»£ç†æœåŠ¡å™¨ã€‚è¯¥æœåŠ¡å™¨ä½¿ç”¨å®‰å…¨é“¾æŽ¥ï¼Œä½† SSL è¯ä¹¦æ— æ•ˆï¼š" #: ../ubuntu_sso/utils/ui.py:167 msgid "The certificate has not been verified" msgstr "该è¯ä¹¦æ²¡æœ‰è¢«éªŒè¯ã€‚" #: ../ubuntu_sso/utils/ui.py:168 msgid "Do you want to connect to this server?" msgstr "您想è¦è¿žæŽ¥åˆ°è¯¥æœåС噍å—?" #: ../ubuntu_sso/utils/ui.py:169 msgid "Get Help With SSL" msgstr "èŽ·å– SSL 的帮助" #: ../ubuntu_sso/utils/ui.py:170 #, python-format msgid "" "If you are not sure about this server, do not use it to connect to " "%(app_name)s." msgstr "如果您ä¸èƒ½ç¡®å®šæ­¤æœåС噍å¯é ï¼Œè¯·ä¸è¦ä½¿ç”¨å®ƒè¿žæŽ¥åˆ°%(app_name)s。" #: ../ubuntu_sso/utils/ui.py:172 msgid "Remember my settings for this certificate." msgstr "è®°ä½æˆ‘关于该è¯ä¹¦çš„设置。" #: ../ubuntu_sso/utils/ui.py:173 msgid "" "The name on the certificate isn't valid or doesn't match the name of the site" msgstr "è¯ä¹¦ä¸Šçš„å称无效,或与网站的åç§°ä¸åŒ¹é…" #: ../ubuntu_sso/utils/ui.py:175 msgid "The certificate has expired" msgstr "è¯ä¹¦å·²è¿‡æœŸ" #: ../ubuntu_sso/utils/ui.py:176 #, python-format msgid "You are now logged into %(app_name)s." msgstr "您现在已登录进 %(app_name)s。" #: ../ubuntu_sso/utils/ui.py:177 msgid "Surname" msgstr "å§“" #: ../ubuntu_sso/utils/ui.py:178 msgid "Terms of Service" msgstr "æœåŠ¡æ¡æ¬¾" #: ../ubuntu_sso/utils/ui.py:179 msgid "Sign Up to {app_name}" msgstr "注册 {app_name}" #: ../ubuntu_sso/utils/ui.py:180 msgid "Show Terms & Conditions" msgstr "æ˜¾ç¤ºä½¿ç”¨æ¡æ¬¾" #: ../ubuntu_sso/utils/ui.py:181 #, python-format msgid "" "Agreeing to the %(app_name)s Terms & Conditions is required to subscribe." msgstr "订购需è¦åŒæ„ %(app_name)s çš„æœåŠ¡æ¡æ¬¾ã€‚" #: ../ubuntu_sso/utils/ui.py:183 #, python-format msgid "You can also find these terms at %(url)s" msgstr "您也å¯ä»¥åœ¨ %(url)s æ‰¾åˆ°è¿™äº›æ¡æ¬¾ã€‚" #: ../ubuntu_sso/utils/ui.py:184 msgid "Try again" msgstr "é‡è¯•" #: ../ubuntu_sso/utils/ui.py:185 msgid "" "There was an error when trying to complete the process. Please check the " "information and try again." msgstr "当试图完æˆè¿™ä¸€è¿›ç¨‹å‘生了一个错误。请检查错误信æ¯å¹¶é‡è¯•。" #: ../ubuntu_sso/utils/ui.py:187 msgid "Verification code" msgstr "验è¯ç " #: ../ubuntu_sso/utils/ui.py:188 #, python-format msgid "" "Check %(email)s for an email from Ubuntu Single Sign On. This message " "contains a verification code. Enter the code in the field below and click OK " "to complete creating your %(app_name)s account." msgstr "" "请检查邮箱 %(email)s ä¸­æ˜¯å¦æœ‰æ¥è‡ª Ubuntu " "å•点登录æœåŠ¡çš„é‚®ä»¶ï¼Œè¯¥æ¶ˆæ¯ä¸­åŒ…å«ä¸€ä¸ªéªŒè¯ç ã€‚请在下é¢è¾“入该验è¯ç ï¼Œå¹¶å•å‡»â€œç¡®å®šâ€æ¥å®Œæˆåˆ›å»ºæ‚¨çš„ %(app_name)s å¸å·ã€‚" #: ../ubuntu_sso/utils/ui.py:192 msgid "Enter verification code" msgstr "输入验è¯ç " #: ../ubuntu_sso/utils/ui.py:195 #, python-format msgid "I agree with the %(app_name)s terms and conditions" msgstr "æˆ‘åŒæ„ %(app_name)s çš„ä½¿ç”¨æ¡æ¬¾" #: ../ubuntu_sso/utils/ui.py:196 #, python-format msgid "Yes! Email me %(app_name)s tips and updates." msgstr "是的ï¼ç»™æˆ‘å‘é€ %(app_name)s çš„å°æŠ€å·§å’Œæ›´æ–°ã€‚" ubuntu-sso-client-13.10/po/bg.po0000664000202700020270000003130512151461656016721 0ustar dobeydobey00000000000000# Bulgarian translation for ubuntu-sso-client # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the ubuntu-sso-client package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: ubuntu-sso-client\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-09-11 18:25+0000\n" "PO-Revision-Date: 2011-08-04 12:34+0000\n" "Last-Translator: Gangov \n" "Language-Team: Bulgarian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-09-17 18:24+0000\n" "X-Generator: Launchpad (build 15944)\n" #. Undefined variable '_', pylint: disable=E0602 #. all the text that is used in the gui #: ../ubuntu_sso/utils/ui.py:49 msgid "By signing up to {app_name} you agree to our {privacy_policy}" msgstr "" #: ../ubuntu_sso/utils/ui.py:51 msgid "By signing up to {app_name} you agree to our {terms_and_conditions}" msgstr "" #: ../ubuntu_sso/utils/ui.py:53 msgid " and {privacy_policy}" msgstr "" #: ../ubuntu_sso/utils/ui.py:54 msgid "Cancel" msgstr "" #: ../ubuntu_sso/utils/ui.py:55 msgid "Type the characters above" msgstr "Препишете знаците отгоре" #: ../ubuntu_sso/utils/ui.py:56 msgid "There was a problem getting the captcha, reloading..." msgstr "Имаше проблем, Ð¼Ð¾Ð»Ñ Ð½Ð°Ð¿Ð¸ÑˆÐµÑ‚Ðµ знаците отново..." #: ../ubuntu_sso/utils/ui.py:58 #, python-format msgid "If you can't read this then %(reload_link)s this page" msgstr "" #: ../ubuntu_sso/utils/ui.py:60 msgid "refresh" msgstr "" #: ../ubuntu_sso/utils/ui.py:61 msgid "Reload" msgstr "Презареждане" #: ../ubuntu_sso/utils/ui.py:62 msgid "The captcha is a required field" msgstr "" #: ../ubuntu_sso/utils/ui.py:63 msgid "Close window and set up later" msgstr "" #: ../ubuntu_sso/utils/ui.py:64 msgid "Congratulations, {app_name} is installed!" msgstr "" #: ../ubuntu_sso/utils/ui.py:65 #, python-format msgid "To connect this computer to %(app_name)s enter your details below." msgstr "" "За да Ñвържете този компютър към %(app_name)s въведете подробноÑтите по-долу" #: ../ubuntu_sso/utils/ui.py:67 msgid "Register with {app_name}." msgstr "" #: ../ubuntu_sso/utils/ui.py:68 ../ubuntu_sso/utils/ui.py:93 #: ../ubuntu_sso/utils/ui.py:143 msgid "Email address" msgstr "Имейл адреÑ" #: ../ubuntu_sso/utils/ui.py:69 msgid "Re-type Email address" msgstr "Отново Имейл адреÑ" #: ../ubuntu_sso/utils/ui.py:70 msgid "The email must be a valid email address." msgstr "Имейлът адреÑÑŠÑ‚ трÑбва да бъде валиден" #: ../ubuntu_sso/utils/ui.py:71 msgid "" "The email addresses don't match, please double check and try entering them " "again." msgstr "" "Имейл адреÑите не Ñъвпадат. МолÑ, проверете отново и ги въведете правилно." #: ../ubuntu_sso/utils/ui.py:73 msgid "Email" msgstr "" #: ../ubuntu_sso/utils/ui.py:74 msgid "The email addresses do not match" msgstr "" #: ../ubuntu_sso/utils/ui.py:75 msgid "Enter code verification here" msgstr "Въведете кода за потвърждение тук" #: ../ubuntu_sso/utils/ui.py:76 msgid "Please enter your name" msgstr "" #: ../ubuntu_sso/utils/ui.py:77 msgid "The process did not finish successfully." msgstr "ПроцеÑÑŠÑ‚ не завърши уÑпешно." #: ../ubuntu_sso/utils/ui.py:79 msgid "Sign me in with my existing account" msgstr "" #: ../ubuntu_sso/utils/ui.py:80 msgid "This field is required." msgstr "Това поле е задължително." #: ../ubuntu_sso/utils/ui.py:81 msgid "I've forgotten my password" msgstr "Забравих Ñи паролата" #: ../ubuntu_sso/utils/ui.py:82 ../ubuntu_sso/utils/ui.py:130 msgid "Reset password" msgstr "ИзчиÑтване на паролата" #: ../ubuntu_sso/utils/ui.py:83 msgid "" "To reset your {app_name} password, enter your registered email address " "below. We will send instructions to reset your password." msgstr "" #: ../ubuntu_sso/utils/ui.py:86 msgid "Please enter a valid email address" msgstr "" #: ../ubuntu_sso/utils/ui.py:87 msgid "There was a problem accessing the Ubuntu Single Sign On backend." msgstr "" #: ../ubuntu_sso/utils/ui.py:89 #, python-format msgid "Create %(app_name)s account" msgstr "Създайте %(app_name)s акаунт" #: ../ubuntu_sso/utils/ui.py:90 msgid "Loading..." msgstr "Зареждане…" #: ../ubuntu_sso/utils/ui.py:91 msgid "Getting information, please wait..." msgstr "" #: ../ubuntu_sso/utils/ui.py:92 msgid "Already have an account? Click here to sign in" msgstr "Вече имате акаунт? ÐатиÑнете тук, за да Ñе впишете" #: ../ubuntu_sso/utils/ui.py:94 #, python-format msgid "Connect to %(app_name)s" msgstr "Свържете Ñе към %(app_name)s" #: ../ubuntu_sso/utils/ui.py:95 ../ubuntu_sso/utils/ui.py:109 msgid "Password" msgstr "Парола" #: ../ubuntu_sso/utils/ui.py:97 msgid "Sign In to {app_name}" msgstr "" #: ../ubuntu_sso/utils/ui.py:99 msgid "Name" msgstr "Име" #: ../ubuntu_sso/utils/ui.py:100 msgid "The name must not be empty." msgstr "" #: ../ubuntu_sso/utils/ui.py:101 msgid "Next" msgstr "Ðапред" #: ../ubuntu_sso/utils/ui.py:102 msgid "Network detection" msgstr "" #: ../ubuntu_sso/utils/ui.py:103 #, python-format msgid "" "Are you online? We can't detect an internet connection - you will need to be " "connected to set up %(app_name)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:105 msgid "One moment please..." msgstr "МолÑ, изчакайте..." #: ../ubuntu_sso/utils/ui.py:106 msgid "Create a password" msgstr "" #: ../ubuntu_sso/utils/ui.py:107 msgid "Your password was successfully changed." msgstr "Паролата бе уÑпешно Ñменена" #: ../ubuntu_sso/utils/ui.py:108 msgid "At least one number" msgstr "" #: ../ubuntu_sso/utils/ui.py:110 msgid "Re-type Password" msgstr "Въведете паролата отново" #: ../ubuntu_sso/utils/ui.py:111 msgid "" "The password must have a minimum of 8 characters and include one uppercase " "character and one number." msgstr "" "Паролата трÑбва да поне 8 Ñимвола и да включва поне една главна буква и едно " "чиÑло." #: ../ubuntu_sso/utils/ui.py:113 msgid "At least 8 characters" msgstr "" #: ../ubuntu_sso/utils/ui.py:114 msgid "Passwords don't match" msgstr "" #: ../ubuntu_sso/utils/ui.py:115 msgid "" "The passwords don't match, please double check and try entering them again." msgstr "Паролите не Ñъвпадат. МолÑ, проверете и ги въведете повторно." #: ../ubuntu_sso/utils/ui.py:117 msgid "Your password must contain" msgstr "" #: ../ubuntu_sso/utils/ui.py:118 msgid "The password is too weak." msgstr "Паролата е прекалено Ñлаба" #: ../ubuntu_sso/utils/ui.py:119 msgid "At least one uppercase letter" msgstr "" #: ../ubuntu_sso/utils/ui.py:120 msgid "Privacy Policy" msgstr "" #: ../ubuntu_sso/utils/ui.py:121 msgid "Connecting to:" msgstr "" #: ../ubuntu_sso/utils/ui.py:122 msgid "Proxy Settings" msgstr "" #: ../ubuntu_sso/utils/ui.py:123 msgid "Incorrect login details. Please try again." msgstr "" #: ../ubuntu_sso/utils/ui.py:124 msgid "Please provide login details." msgstr "" #: ../ubuntu_sso/utils/ui.py:125 msgid "You are connecting through a proxy." msgstr "" #: ../ubuntu_sso/utils/ui.py:126 msgid "Get Help With Proxies" msgstr "" #: ../ubuntu_sso/utils/ui.py:127 msgid "Proxy password:" msgstr "" #: ../ubuntu_sso/utils/ui.py:128 msgid "Save and Connect" msgstr "" #: ../ubuntu_sso/utils/ui.py:129 msgid "Proxy username:" msgstr "" #: ../ubuntu_sso/utils/ui.py:131 msgid "" "A password reset code has been sent to your e-mail. Please enter the code " "below along with your new password." msgstr "" #: ../ubuntu_sso/utils/ui.py:133 msgid "Retype email" msgstr "" #: ../ubuntu_sso/utils/ui.py:134 msgid "Retype password" msgstr "" #: ../ubuntu_sso/utils/ui.py:135 #, python-format msgid "To reset your %(app_name)s password, enter your email address below:" msgstr "" "За да изчиÑтите паролата на %(app_name)s, въведете ÑÐ²Ð¾Ñ Ð°Ð´Ñ€ÐµÑ Ð½Ð° е-поща по-" "долу:" #: ../ubuntu_sso/utils/ui.py:137 msgid "" "We are very Sorry! The service that signs you on is not responding right " "now\n" "Please try again or come back in a few minutes." msgstr "" #: ../ubuntu_sso/utils/ui.py:140 msgid "Sorry we did not recognize the email address." msgstr "" #: ../ubuntu_sso/utils/ui.py:142 msgid "Reset code" msgstr "ИзчиÑтване на кода" #: ../ubuntu_sso/utils/ui.py:145 #, python-format msgid "" "A password reset code has been sent to %(email)s.\n" "Please enter the code below along with your new password." msgstr "" "Код за изчиÑтване на паролата е изпратен на %(email)s.\n" "МолÑ, въведете го по-долу, заедно Ñ Ð½Ð¾Ð²Ð°Ñ‚Ð° парола." #: ../ubuntu_sso/utils/ui.py:147 msgid "Set Up Account" msgstr "" #: ../ubuntu_sso/utils/ui.py:148 msgid "I don't have an account yet - sign me up" msgstr "" #: ../ubuntu_sso/utils/ui.py:149 msgid "Sign In" msgstr "" #: ../ubuntu_sso/utils/ui.py:150 msgid "Log-in with my existing account." msgstr "" #: ../ubuntu_sso/utils/ui.py:151 msgid "the appname whose ssl error we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:152 msgid "Certificate details" msgstr "" #: ../ubuntu_sso/utils/ui.py:153 msgid "Connect" msgstr "" #: ../ubuntu_sso/utils/ui.py:154 msgid "the details ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:161 msgid "Open the SSL certificate UI." msgstr "" #: ../ubuntu_sso/utils/ui.py:162 msgid "SSL Certificate Not Valid" msgstr "" #: ../ubuntu_sso/utils/ui.py:163 msgid "the domain whose ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:164 #, python-format msgid "" "You are trying to connect to a proxy server on %(domain)s. This server uses " "a secure connection, and the SSL certificate is not valid because:" msgstr "" #: ../ubuntu_sso/utils/ui.py:167 msgid "The certificate has not been verified" msgstr "" #: ../ubuntu_sso/utils/ui.py:168 msgid "Do you want to connect to this server?" msgstr "" #: ../ubuntu_sso/utils/ui.py:169 msgid "Get Help With SSL" msgstr "" #: ../ubuntu_sso/utils/ui.py:170 #, python-format msgid "" "If you are not sure about this server, do not use it to connect to " "%(app_name)s." msgstr "" #: ../ubuntu_sso/utils/ui.py:172 msgid "Remember my settings for this certificate." msgstr "" #: ../ubuntu_sso/utils/ui.py:173 msgid "" "The name on the certificate isn't valid or doesn't match the name of the site" msgstr "" #: ../ubuntu_sso/utils/ui.py:175 msgid "The certificate has expired" msgstr "" #: ../ubuntu_sso/utils/ui.py:176 #, python-format msgid "You are now logged into %(app_name)s." msgstr "" #: ../ubuntu_sso/utils/ui.py:177 msgid "Surname" msgstr "" #: ../ubuntu_sso/utils/ui.py:178 msgid "Terms of Service" msgstr "" #: ../ubuntu_sso/utils/ui.py:179 msgid "Sign Up to {app_name}" msgstr "" #: ../ubuntu_sso/utils/ui.py:180 msgid "Show Terms & Conditions" msgstr "Покажи уÑловиÑта" #: ../ubuntu_sso/utils/ui.py:181 #, python-format msgid "" "Agreeing to the %(app_name)s Terms & Conditions is required to subscribe." msgstr "" #: ../ubuntu_sso/utils/ui.py:183 #, python-format msgid "You can also find these terms at %(url)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:184 msgid "Try again" msgstr "" #: ../ubuntu_sso/utils/ui.py:185 msgid "" "There was an error when trying to complete the process. Please check the " "information and try again." msgstr "" "Възникна грешка при завършване на процеÑа. МолÑ, проверете информациÑта и " "опитайте отново." #: ../ubuntu_sso/utils/ui.py:187 msgid "Verification code" msgstr "" #: ../ubuntu_sso/utils/ui.py:188 #, python-format msgid "" "Check %(email)s for an email from Ubuntu Single Sign On. This message " "contains a verification code. Enter the code in the field below and click OK " "to complete creating your %(app_name)s account." msgstr "" #: ../ubuntu_sso/utils/ui.py:192 msgid "Enter verification code" msgstr "Въведете код за проверка" #: ../ubuntu_sso/utils/ui.py:195 #, python-format msgid "I agree with the %(app_name)s terms and conditions" msgstr "СъглаÑÑвам Ñе Ñ ÑƒÑловиÑта на %(app_name)s" #: ../ubuntu_sso/utils/ui.py:196 #, python-format msgid "Yes! Email me %(app_name)s tips and updates." msgstr "Да! Изпращайте ми %(app_name)s Ñъвети и обновлениÑ." ubuntu-sso-client-13.10/po/he.po0000664000202700020270000003050612151461656016727 0ustar dobeydobey00000000000000# Hebrew translation for ubuntu-sso-client # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the ubuntu-sso-client package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: ubuntu-sso-client\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-09-11 18:25+0000\n" "PO-Revision-Date: 2010-12-09 14:14+0000\n" "Last-Translator: Yaron \n" "Language-Team: Hebrew \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-09-17 18:24+0000\n" "X-Generator: Launchpad (build 15944)\n" #. Undefined variable '_', pylint: disable=E0602 #. all the text that is used in the gui #: ../ubuntu_sso/utils/ui.py:49 msgid "By signing up to {app_name} you agree to our {privacy_policy}" msgstr "" #: ../ubuntu_sso/utils/ui.py:51 msgid "By signing up to {app_name} you agree to our {terms_and_conditions}" msgstr "" #: ../ubuntu_sso/utils/ui.py:53 msgid " and {privacy_policy}" msgstr "" #: ../ubuntu_sso/utils/ui.py:54 msgid "Cancel" msgstr "" #: ../ubuntu_sso/utils/ui.py:55 msgid "Type the characters above" msgstr "הזנת ×”×ª×•×•×™× ×œ×”×œ×Ÿ" #: ../ubuntu_sso/utils/ui.py:56 msgid "There was a problem getting the captcha, reloading..." msgstr "×ירעה שגי××” בקבלת התשובה ממבחן הטיורינג, טעינה מחדש..." #: ../ubuntu_sso/utils/ui.py:58 #, python-format msgid "If you can't read this then %(reload_link)s this page" msgstr "" #: ../ubuntu_sso/utils/ui.py:60 msgid "refresh" msgstr "" #: ../ubuntu_sso/utils/ui.py:61 msgid "Reload" msgstr "רענון" #: ../ubuntu_sso/utils/ui.py:62 msgid "The captcha is a required field" msgstr "" #: ../ubuntu_sso/utils/ui.py:63 msgid "Close window and set up later" msgstr "" #: ../ubuntu_sso/utils/ui.py:64 msgid "Congratulations, {app_name} is installed!" msgstr "" #: ../ubuntu_sso/utils/ui.py:65 #, python-format msgid "To connect this computer to %(app_name)s enter your details below." msgstr "כדי לחבר ×ת מחשב ×–×” ×ל %(app_name)s יש להזין ×ת ×”×¤×¨×˜×™× ×©×œ×š להלן." #: ../ubuntu_sso/utils/ui.py:67 msgid "Register with {app_name}." msgstr "" #: ../ubuntu_sso/utils/ui.py:68 ../ubuntu_sso/utils/ui.py:93 #: ../ubuntu_sso/utils/ui.py:143 msgid "Email address" msgstr "כתובת דו×״ל" #: ../ubuntu_sso/utils/ui.py:69 msgid "Re-type Email address" msgstr "הקלדת כתובת הדו×״ל ×¤×¢× × ×•×¡×¤×ª" #: ../ubuntu_sso/utils/ui.py:70 msgid "The email must be a valid email address." msgstr "כל כתובת הדו×״ל להיות תקפה" #: ../ubuntu_sso/utils/ui.py:71 msgid "" "The email addresses don't match, please double check and try entering them " "again." msgstr "" "כתובות הדו×״ל ×ינן תו×מות, × × ×œ×‘×“×•×§ ×ותן ביתר קפידה ולנסות להזין ×ותן שוב." #: ../ubuntu_sso/utils/ui.py:73 msgid "Email" msgstr "" #: ../ubuntu_sso/utils/ui.py:74 msgid "The email addresses do not match" msgstr "" #: ../ubuntu_sso/utils/ui.py:75 msgid "Enter code verification here" msgstr "יש להזין קוד ×ימות ×›×ן" #: ../ubuntu_sso/utils/ui.py:76 msgid "Please enter your name" msgstr "" #: ../ubuntu_sso/utils/ui.py:77 msgid "The process did not finish successfully." msgstr "התהליך ×œ× ×¡×™×™× ×›×¨×וי." #: ../ubuntu_sso/utils/ui.py:79 msgid "Sign me in with my existing account" msgstr "" #: ../ubuntu_sso/utils/ui.py:80 msgid "This field is required." msgstr "שדה ×–×” נדרש." #: ../ubuntu_sso/utils/ui.py:81 msgid "I've forgotten my password" msgstr "שכחתי ×ת ססמתי" #: ../ubuntu_sso/utils/ui.py:82 ../ubuntu_sso/utils/ui.py:130 msgid "Reset password" msgstr "×יפוס הססמה" #: ../ubuntu_sso/utils/ui.py:83 msgid "" "To reset your {app_name} password, enter your registered email address " "below. We will send instructions to reset your password." msgstr "" #: ../ubuntu_sso/utils/ui.py:86 msgid "Please enter a valid email address" msgstr "" #: ../ubuntu_sso/utils/ui.py:87 msgid "There was a problem accessing the Ubuntu Single Sign On backend." msgstr "" #: ../ubuntu_sso/utils/ui.py:89 #, python-format msgid "Create %(app_name)s account" msgstr "יצירת חשבון %(app_name)s" #: ../ubuntu_sso/utils/ui.py:90 msgid "Loading..." msgstr "בטעינה..." #: ../ubuntu_sso/utils/ui.py:91 msgid "Getting information, please wait..." msgstr "" #: ../ubuntu_sso/utils/ui.py:92 msgid "Already have an account? Click here to sign in" msgstr "כבר יש לך חשבון? יש ללחוץ ×›×ן כדי להיכנס" #: ../ubuntu_sso/utils/ui.py:94 #, python-format msgid "Connect to %(app_name)s" msgstr "התחברות ×ל %(app_name)s" #: ../ubuntu_sso/utils/ui.py:95 ../ubuntu_sso/utils/ui.py:109 msgid "Password" msgstr "ססמה" #: ../ubuntu_sso/utils/ui.py:97 msgid "Sign In to {app_name}" msgstr "" #: ../ubuntu_sso/utils/ui.py:99 msgid "Name" msgstr "ש×" #: ../ubuntu_sso/utils/ui.py:100 msgid "The name must not be empty." msgstr "" #: ../ubuntu_sso/utils/ui.py:101 msgid "Next" msgstr "הב×" #: ../ubuntu_sso/utils/ui.py:102 msgid "Network detection" msgstr "" #: ../ubuntu_sso/utils/ui.py:103 #, python-format msgid "" "Are you online? We can't detect an internet connection - you will need to be " "connected to set up %(app_name)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:105 msgid "One moment please..." msgstr "רק רגע בבקשה..." #: ../ubuntu_sso/utils/ui.py:106 msgid "Create a password" msgstr "" #: ../ubuntu_sso/utils/ui.py:107 msgid "Your password was successfully changed." msgstr "הססמה שלך שונתה בהצלחה." #: ../ubuntu_sso/utils/ui.py:108 msgid "At least one number" msgstr "" #: ../ubuntu_sso/utils/ui.py:110 msgid "Re-type Password" msgstr "× × ×œ×”×–×™×Ÿ ×ת הססמה שוב" #: ../ubuntu_sso/utils/ui.py:111 msgid "" "The password must have a minimum of 8 characters and include one uppercase " "character and one number." msgstr "" "הססמה מוגבלת כך שעליה להכיל 8 ×ª×•×•×™× ×œ×›×•×œ הפחות ועליה לכלול ×ות גדולה ×חת " "ב×נגלית ומספר ×חד." #: ../ubuntu_sso/utils/ui.py:113 msgid "At least 8 characters" msgstr "" #: ../ubuntu_sso/utils/ui.py:114 msgid "Passwords don't match" msgstr "" #: ../ubuntu_sso/utils/ui.py:115 msgid "" "The passwords don't match, please double check and try entering them again." msgstr "הססמ×ות ×ינן תו×מות, × × ×œ×‘×“×•×§ ביתר קפידה ולנסות להזין ×ותן שוב." #: ../ubuntu_sso/utils/ui.py:117 msgid "Your password must contain" msgstr "" #: ../ubuntu_sso/utils/ui.py:118 msgid "The password is too weak." msgstr "הססמה חלשה מדי." #: ../ubuntu_sso/utils/ui.py:119 msgid "At least one uppercase letter" msgstr "" #: ../ubuntu_sso/utils/ui.py:120 msgid "Privacy Policy" msgstr "" #: ../ubuntu_sso/utils/ui.py:121 msgid "Connecting to:" msgstr "" #: ../ubuntu_sso/utils/ui.py:122 msgid "Proxy Settings" msgstr "" #: ../ubuntu_sso/utils/ui.py:123 msgid "Incorrect login details. Please try again." msgstr "" #: ../ubuntu_sso/utils/ui.py:124 msgid "Please provide login details." msgstr "" #: ../ubuntu_sso/utils/ui.py:125 msgid "You are connecting through a proxy." msgstr "" #: ../ubuntu_sso/utils/ui.py:126 msgid "Get Help With Proxies" msgstr "" #: ../ubuntu_sso/utils/ui.py:127 msgid "Proxy password:" msgstr "" #: ../ubuntu_sso/utils/ui.py:128 msgid "Save and Connect" msgstr "" #: ../ubuntu_sso/utils/ui.py:129 msgid "Proxy username:" msgstr "" #: ../ubuntu_sso/utils/ui.py:131 msgid "" "A password reset code has been sent to your e-mail. Please enter the code " "below along with your new password." msgstr "" #: ../ubuntu_sso/utils/ui.py:133 msgid "Retype email" msgstr "" #: ../ubuntu_sso/utils/ui.py:134 msgid "Retype password" msgstr "" #: ../ubuntu_sso/utils/ui.py:135 #, python-format msgid "To reset your %(app_name)s password, enter your email address below:" msgstr "כדי ל×פס ×ת ססמתך ב־%(app_name)s, × × ×œ×”×–×™×Ÿ ×ת כתובת הדו×״ל שלך להלן:" #: ../ubuntu_sso/utils/ui.py:137 msgid "" "We are very Sorry! The service that signs you on is not responding right " "now\n" "Please try again or come back in a few minutes." msgstr "" #: ../ubuntu_sso/utils/ui.py:140 msgid "Sorry we did not recognize the email address." msgstr "" #: ../ubuntu_sso/utils/ui.py:142 msgid "Reset code" msgstr "קוד ×”×יפוס" #: ../ubuntu_sso/utils/ui.py:145 #, python-format msgid "" "A password reset code has been sent to %(email)s.\n" "Please enter the code below along with your new password." msgstr "" "קוד ×יפוס ססמה נשלח ×ל %(email)s.\n" "× × ×œ×”×–×™×Ÿ ×ת הקוד להלן יחד ×¢× ×”×¡×¡×ž×” החדשה שלך." #: ../ubuntu_sso/utils/ui.py:147 msgid "Set Up Account" msgstr "" #: ../ubuntu_sso/utils/ui.py:148 msgid "I don't have an account yet - sign me up" msgstr "" #: ../ubuntu_sso/utils/ui.py:149 msgid "Sign In" msgstr "" #: ../ubuntu_sso/utils/ui.py:150 msgid "Log-in with my existing account." msgstr "" #: ../ubuntu_sso/utils/ui.py:151 msgid "the appname whose ssl error we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:152 msgid "Certificate details" msgstr "" #: ../ubuntu_sso/utils/ui.py:153 msgid "Connect" msgstr "" #: ../ubuntu_sso/utils/ui.py:154 msgid "the details ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:161 msgid "Open the SSL certificate UI." msgstr "" #: ../ubuntu_sso/utils/ui.py:162 msgid "SSL Certificate Not Valid" msgstr "" #: ../ubuntu_sso/utils/ui.py:163 msgid "the domain whose ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:164 #, python-format msgid "" "You are trying to connect to a proxy server on %(domain)s. This server uses " "a secure connection, and the SSL certificate is not valid because:" msgstr "" #: ../ubuntu_sso/utils/ui.py:167 msgid "The certificate has not been verified" msgstr "" #: ../ubuntu_sso/utils/ui.py:168 msgid "Do you want to connect to this server?" msgstr "" #: ../ubuntu_sso/utils/ui.py:169 msgid "Get Help With SSL" msgstr "" #: ../ubuntu_sso/utils/ui.py:170 #, python-format msgid "" "If you are not sure about this server, do not use it to connect to " "%(app_name)s." msgstr "" #: ../ubuntu_sso/utils/ui.py:172 msgid "Remember my settings for this certificate." msgstr "" #: ../ubuntu_sso/utils/ui.py:173 msgid "" "The name on the certificate isn't valid or doesn't match the name of the site" msgstr "" #: ../ubuntu_sso/utils/ui.py:175 msgid "The certificate has expired" msgstr "" #: ../ubuntu_sso/utils/ui.py:176 #, python-format msgid "You are now logged into %(app_name)s." msgstr "" #: ../ubuntu_sso/utils/ui.py:177 msgid "Surname" msgstr "" #: ../ubuntu_sso/utils/ui.py:178 msgid "Terms of Service" msgstr "" #: ../ubuntu_sso/utils/ui.py:179 msgid "Sign Up to {app_name}" msgstr "" #: ../ubuntu_sso/utils/ui.py:180 msgid "Show Terms & Conditions" msgstr "הצגת התנ××™×" #: ../ubuntu_sso/utils/ui.py:181 #, python-format msgid "" "Agreeing to the %(app_name)s Terms & Conditions is required to subscribe." msgstr "" #: ../ubuntu_sso/utils/ui.py:183 #, python-format msgid "You can also find these terms at %(url)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:184 msgid "Try again" msgstr "" #: ../ubuntu_sso/utils/ui.py:185 msgid "" "There was an error when trying to complete the process. Please check the " "information and try again." msgstr "" "×ירעה שגי××” בעת הניסיון להשלמת התהליך. × × ×œ×‘×“×•×§ ×ת ×”×¤×¨×˜×™× ×•×œ× ×¡×•×ª שוב." #: ../ubuntu_sso/utils/ui.py:187 msgid "Verification code" msgstr "" #: ../ubuntu_sso/utils/ui.py:188 #, python-format msgid "" "Check %(email)s for an email from Ubuntu Single Sign On. This message " "contains a verification code. Enter the code in the field below and click OK " "to complete creating your %(app_name)s account." msgstr "" #: ../ubuntu_sso/utils/ui.py:192 msgid "Enter verification code" msgstr "יש להזין ×ת קוד ×”×ימות" #: ../ubuntu_sso/utils/ui.py:195 #, python-format msgid "I agree with the %(app_name)s terms and conditions" msgstr "התנ××™× ×©×œ %(app_name)s ×ž×•×¡×›×ž×™× ×‘×¢×™× ×™" #: ../ubuntu_sso/utils/ui.py:196 #, python-format msgid "Yes! Email me %(app_name)s tips and updates." msgstr "כן! × × ×œ×©×œ×•×— לי ×¢×“×›×•× ×™× ×•×¢×¦×•×ª בנוגע ל־%(app_name)s." ubuntu-sso-client-13.10/po/es.po0000664000202700020270000003633412151461656016747 0ustar dobeydobey00000000000000# Spanish translation for ubuntu-sso-client # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the ubuntu-sso-client package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: ubuntu-sso-client\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-09-11 18:25+0000\n" "PO-Revision-Date: 2012-09-08 04:33+0000\n" "Last-Translator: Paco Molinero \n" "Language-Team: Spanish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-09-17 18:24+0000\n" "X-Generator: Launchpad (build 15944)\n" #. Undefined variable '_', pylint: disable=E0602 #. all the text that is used in the gui #: ../ubuntu_sso/utils/ui.py:49 msgid "By signing up to {app_name} you agree to our {privacy_policy}" msgstr "" "Al registrarse en {app_name}, acepta estar de acuerdo con nuestra " "{privacy_policy}" #: ../ubuntu_sso/utils/ui.py:51 msgid "By signing up to {app_name} you agree to our {terms_and_conditions}" msgstr "" "Al registrarse en {app_name}, acepta estar de acuerdo con nuestros " "{terms_and_conditions}" #: ../ubuntu_sso/utils/ui.py:53 msgid " and {privacy_policy}" msgstr " y {privacy_policy}" #: ../ubuntu_sso/utils/ui.py:54 msgid "Cancel" msgstr "Cancelar" #: ../ubuntu_sso/utils/ui.py:55 msgid "Type the characters above" msgstr "Teclee los caracteres anteriores" #: ../ubuntu_sso/utils/ui.py:56 msgid "There was a problem getting the captcha, reloading..." msgstr "Hubo un problema al obtener el captcha; recargando…" #: ../ubuntu_sso/utils/ui.py:58 #, python-format msgid "If you can't read this then %(reload_link)s this page" msgstr "Si no puede leer esto, %(reload_link)s esta página" #: ../ubuntu_sso/utils/ui.py:60 msgid "refresh" msgstr "actualice" #: ../ubuntu_sso/utils/ui.py:61 msgid "Reload" msgstr "Recargar" #: ../ubuntu_sso/utils/ui.py:62 msgid "The captcha is a required field" msgstr "El captcha es un campo obligatorio" #: ../ubuntu_sso/utils/ui.py:63 msgid "Close window and set up later" msgstr "Cerrar la ventana y configurar después" #: ../ubuntu_sso/utils/ui.py:64 msgid "Congratulations, {app_name} is installed!" msgstr "Felicidades, {app_name} está instalado." #: ../ubuntu_sso/utils/ui.py:65 #, python-format msgid "To connect this computer to %(app_name)s enter your details below." msgstr "" "Para conectar este equipo a %(app_name)s, introduzca sus datos a " "continuación." #: ../ubuntu_sso/utils/ui.py:67 msgid "Register with {app_name}." msgstr "Registrar con {app_name}." #: ../ubuntu_sso/utils/ui.py:68 ../ubuntu_sso/utils/ui.py:93 #: ../ubuntu_sso/utils/ui.py:143 msgid "Email address" msgstr "Dirección de correo electrónico" #: ../ubuntu_sso/utils/ui.py:69 msgid "Re-type Email address" msgstr "Vuelva a escribir la dirección de correo" #: ../ubuntu_sso/utils/ui.py:70 msgid "The email must be a valid email address." msgstr "La dirección de correo debe ser válida." #: ../ubuntu_sso/utils/ui.py:71 msgid "" "The email addresses don't match, please double check and try entering them " "again." msgstr "" "Las direcciones de correo no coinciden, revíselas y vuelva a intentarlo." #: ../ubuntu_sso/utils/ui.py:73 msgid "Email" msgstr "Correo electrónico" #: ../ubuntu_sso/utils/ui.py:74 msgid "The email addresses do not match" msgstr "Las direcciones de correo electrónico no coinciden" #: ../ubuntu_sso/utils/ui.py:75 msgid "Enter code verification here" msgstr "Introduzca el código de verificación aquí" #: ../ubuntu_sso/utils/ui.py:76 msgid "Please enter your name" msgstr "Introduzca su nombre" #: ../ubuntu_sso/utils/ui.py:77 msgid "The process did not finish successfully." msgstr "El proceso no terminó correctamente." #: ../ubuntu_sso/utils/ui.py:79 msgid "Sign me in with my existing account" msgstr "Acceder con una cuenta ya existente" #: ../ubuntu_sso/utils/ui.py:80 msgid "This field is required." msgstr "Este campo es obligatorio." #: ../ubuntu_sso/utils/ui.py:81 msgid "I've forgotten my password" msgstr "Olvidé mi contraseña" #: ../ubuntu_sso/utils/ui.py:82 ../ubuntu_sso/utils/ui.py:130 msgid "Reset password" msgstr "Restablecer contraseña" #: ../ubuntu_sso/utils/ui.py:83 msgid "" "To reset your {app_name} password, enter your registered email address " "below. We will send instructions to reset your password." msgstr "" "Para restablecer su contraseña de {app_name}, introduzca a continuación su " "dirección de correo electrónico. Le enviaremos instrucciones para " "restablecer su contraseña." #: ../ubuntu_sso/utils/ui.py:86 msgid "Please enter a valid email address" msgstr "Introduzca una dirección de correo electrónico válida" #: ../ubuntu_sso/utils/ui.py:87 msgid "There was a problem accessing the Ubuntu Single Sign On backend." msgstr "Hubo un problema al acceder al motor de cuenta única de Ubuntu." #: ../ubuntu_sso/utils/ui.py:89 #, python-format msgid "Create %(app_name)s account" msgstr "Crear una cuenta para %(app_name)s" #: ../ubuntu_sso/utils/ui.py:90 msgid "Loading..." msgstr "Cargando…" #: ../ubuntu_sso/utils/ui.py:91 msgid "Getting information, please wait..." msgstr "Obteniendo información, espere…" #: ../ubuntu_sso/utils/ui.py:92 msgid "Already have an account? Click here to sign in" msgstr "¿Ya tiene una cuenta? Pulse aquí para acceder" #: ../ubuntu_sso/utils/ui.py:94 #, python-format msgid "Connect to %(app_name)s" msgstr "Conectarse a %(app_name)s" #: ../ubuntu_sso/utils/ui.py:95 ../ubuntu_sso/utils/ui.py:109 msgid "Password" msgstr "Contraseña" #: ../ubuntu_sso/utils/ui.py:97 msgid "Sign In to {app_name}" msgstr "Iniciar sesión en {app_name}" #: ../ubuntu_sso/utils/ui.py:99 msgid "Name" msgstr "Nombre" #: ../ubuntu_sso/utils/ui.py:100 msgid "The name must not be empty." msgstr "El nombre no debe estar vacío." #: ../ubuntu_sso/utils/ui.py:101 msgid "Next" msgstr "Siguiente" #: ../ubuntu_sso/utils/ui.py:102 msgid "Network detection" msgstr "Detección de red" #: ../ubuntu_sso/utils/ui.py:103 #, python-format msgid "" "Are you online? We can't detect an internet connection - you will need to be " "connected to set up %(app_name)s" msgstr "" "¿Está conectado? No podemos detectar una conexión a Internet, necesaria para " "configurar %(app_name)s" #: ../ubuntu_sso/utils/ui.py:105 msgid "One moment please..." msgstr "Espere un momento…" #: ../ubuntu_sso/utils/ui.py:106 msgid "Create a password" msgstr "Crear una contraseña" #: ../ubuntu_sso/utils/ui.py:107 msgid "Your password was successfully changed." msgstr "Su contraseña se cambió correctamente." #: ../ubuntu_sso/utils/ui.py:108 msgid "At least one number" msgstr "Al menos un número" #: ../ubuntu_sso/utils/ui.py:110 msgid "Re-type Password" msgstr "Vuelva a escribir la contraseña" #: ../ubuntu_sso/utils/ui.py:111 msgid "" "The password must have a minimum of 8 characters and include one uppercase " "character and one number." msgstr "" "La contraseña debe tener un mínimo de ocho caracteres e incluir una letra " "mayúscula y un número." #: ../ubuntu_sso/utils/ui.py:113 msgid "At least 8 characters" msgstr "Al menos 8 caracteres" #: ../ubuntu_sso/utils/ui.py:114 msgid "Passwords don't match" msgstr "Las contraseñas no coinciden" #: ../ubuntu_sso/utils/ui.py:115 msgid "" "The passwords don't match, please double check and try entering them again." msgstr "Las contraseñas no coinciden, revíselas y vuelva a intentarlo." #: ../ubuntu_sso/utils/ui.py:117 msgid "Your password must contain" msgstr "Su contraseña debe contener" #: ../ubuntu_sso/utils/ui.py:118 msgid "The password is too weak." msgstr "La contraseña es muy débil." #: ../ubuntu_sso/utils/ui.py:119 msgid "At least one uppercase letter" msgstr "Al menos una letra mayúscula" #: ../ubuntu_sso/utils/ui.py:120 msgid "Privacy Policy" msgstr "Política de privacidad" #: ../ubuntu_sso/utils/ui.py:121 msgid "Connecting to:" msgstr "Conectando a:" #: ../ubuntu_sso/utils/ui.py:122 msgid "Proxy Settings" msgstr "Configuración de proxy" #: ../ubuntu_sso/utils/ui.py:123 msgid "Incorrect login details. Please try again." msgstr "Detalles de acceso incorrectos. Inténtelo de nuevo." #: ../ubuntu_sso/utils/ui.py:124 msgid "Please provide login details." msgstr "Proporcione los detalles de acceso." #: ../ubuntu_sso/utils/ui.py:125 msgid "You are connecting through a proxy." msgstr "Se está conectando a través de un proxy." #: ../ubuntu_sso/utils/ui.py:126 msgid "Get Help With Proxies" msgstr "Obtener ayuda con el uso de proxys" #: ../ubuntu_sso/utils/ui.py:127 msgid "Proxy password:" msgstr "Contraseña del proxy:" #: ../ubuntu_sso/utils/ui.py:128 msgid "Save and Connect" msgstr "Guardar y conectar" #: ../ubuntu_sso/utils/ui.py:129 msgid "Proxy username:" msgstr "Nombre de usuario del proxy:" #: ../ubuntu_sso/utils/ui.py:131 msgid "" "A password reset code has been sent to your e-mail. Please enter the code " "below along with your new password." msgstr "" "Se ha enviado a su correo un código para restablecer la contraseña. " "Introduzca el código y su nueva contraseña a continuación." #: ../ubuntu_sso/utils/ui.py:133 msgid "Retype email" msgstr "Escriba el correo electrónico de nuevo" #: ../ubuntu_sso/utils/ui.py:134 msgid "Retype password" msgstr "Escriba la contraseña de nuevo" #: ../ubuntu_sso/utils/ui.py:135 #, python-format msgid "To reset your %(app_name)s password, enter your email address below:" msgstr "" "Para restablecer su contraseña de %(app_name)s, introduzca su dirección de " "correo a continuación:" #: ../ubuntu_sso/utils/ui.py:137 msgid "" "We are very Sorry! The service that signs you on is not responding right " "now\n" "Please try again or come back in a few minutes." msgstr "" "Lo sentimos, el servicio para iniciar sesión no está respondiendo en este " "momento\n" "Inténtelo de nuevo o regrese en unos minutos." #: ../ubuntu_sso/utils/ui.py:140 msgid "Sorry we did not recognize the email address." msgstr "Lo sentimos, no reconocemos esa dirección de correo electrónico." #: ../ubuntu_sso/utils/ui.py:142 msgid "Reset code" msgstr "Restablecer código" #: ../ubuntu_sso/utils/ui.py:145 #, python-format msgid "" "A password reset code has been sent to %(email)s.\n" "Please enter the code below along with your new password." msgstr "" "Se ha enviado a %(email)s un código para restablecer su contraseña.\n" "Introduzca el código a continuación junto con su contraseña nueva." #: ../ubuntu_sso/utils/ui.py:147 msgid "Set Up Account" msgstr "Configurar cuenta" #: ../ubuntu_sso/utils/ui.py:148 msgid "I don't have an account yet - sign me up" msgstr "No tengo una cuenta aún: registrarme" #: ../ubuntu_sso/utils/ui.py:149 msgid "Sign In" msgstr "Iniciar sesión" #: ../ubuntu_sso/utils/ui.py:150 msgid "Log-in with my existing account." msgstr "Acceder con mi cuenta existente." #: ../ubuntu_sso/utils/ui.py:151 msgid "the appname whose ssl error we are going to show." msgstr "el nombre de la aplicación cuyo error ssl vamos a mostrar." #: ../ubuntu_sso/utils/ui.py:152 msgid "Certificate details" msgstr "Detalles del certificado" #: ../ubuntu_sso/utils/ui.py:153 msgid "Connect" msgstr "Conectar" #: ../ubuntu_sso/utils/ui.py:154 msgid "the details ssl certificate we are going to show." msgstr "los detalles del certificado ssl que vamos a mostrar." #: ../ubuntu_sso/utils/ui.py:161 msgid "Open the SSL certificate UI." msgstr "Abrir la interfaz del certificado SSL." #: ../ubuntu_sso/utils/ui.py:162 msgid "SSL Certificate Not Valid" msgstr "El certificado SSL no es válido" #: ../ubuntu_sso/utils/ui.py:163 msgid "the domain whose ssl certificate we are going to show." msgstr "el dominio cuyo certificado ssl vamos a mostrar." #: ../ubuntu_sso/utils/ui.py:164 #, python-format msgid "" "You are trying to connect to a proxy server on %(domain)s. This server uses " "a secure connection, and the SSL certificate is not valid because:" msgstr "" "Está intentando conectarse a un servidor proxy en %(domain)s. Este servidor " "usa una conexión segura, y el certificado SSL no es válido porque:" #: ../ubuntu_sso/utils/ui.py:167 msgid "The certificate has not been verified" msgstr "El certificado no se ha verificado" #: ../ubuntu_sso/utils/ui.py:168 msgid "Do you want to connect to this server?" msgstr "¿Quiere conectarse a este servidor?" #: ../ubuntu_sso/utils/ui.py:169 msgid "Get Help With SSL" msgstr "Obtener ayuda con SSL" #: ../ubuntu_sso/utils/ui.py:170 #, python-format msgid "" "If you are not sure about this server, do not use it to connect to " "%(app_name)s." msgstr "" "Si este servidor no es de su confianza, no lo use para conectarse a " "%(app_name)s." #: ../ubuntu_sso/utils/ui.py:172 msgid "Remember my settings for this certificate." msgstr "Recordar mi configuración para este certificado." #: ../ubuntu_sso/utils/ui.py:173 msgid "" "The name on the certificate isn't valid or doesn't match the name of the site" msgstr "" "El nombre en el certificado no es válido o no coincide con el nombre del " "sitio" #: ../ubuntu_sso/utils/ui.py:175 msgid "The certificate has expired" msgstr "El certificado ha caducado" #: ../ubuntu_sso/utils/ui.py:176 #, python-format msgid "You are now logged into %(app_name)s." msgstr "Ahora ha iniciado sesión en %(app_name)s." #: ../ubuntu_sso/utils/ui.py:177 msgid "Surname" msgstr "Apellidos" #: ../ubuntu_sso/utils/ui.py:178 msgid "Terms of Service" msgstr "Términos del servicio" #: ../ubuntu_sso/utils/ui.py:179 msgid "Sign Up to {app_name}" msgstr "Registrarse en {app_name}" #: ../ubuntu_sso/utils/ui.py:180 msgid "Show Terms & Conditions" msgstr "Mostrar términos y condiciones" #: ../ubuntu_sso/utils/ui.py:181 #, python-format msgid "" "Agreeing to the %(app_name)s Terms & Conditions is required to subscribe." msgstr "" "Para suscribirse, es necesario aceptar los términos y condiciones de " "%(app_name)s." #: ../ubuntu_sso/utils/ui.py:183 #, python-format msgid "You can also find these terms at %(url)s" msgstr "" "También puede encontrar estos términos en %(url)s" #: ../ubuntu_sso/utils/ui.py:184 msgid "Try again" msgstr "Inténtelo de nuevo" #: ../ubuntu_sso/utils/ui.py:185 msgid "" "There was an error when trying to complete the process. Please check the " "information and try again." msgstr "" "Hubo un error al intentar completar el proceso. Compruebe la información e " "inténtelo de nuevo." #: ../ubuntu_sso/utils/ui.py:187 msgid "Verification code" msgstr "Código de verificación" #: ../ubuntu_sso/utils/ui.py:188 #, python-format msgid "" "Check %(email)s for an email from Ubuntu Single Sign On. This message " "contains a verification code. Enter the code in the field below and click OK " "to complete creating your %(app_name)s account." msgstr "" "Busque en %(email)s un correo de Ubuntu Single Sign On. Ese correo contiene " "un código de verificación. Introdúzcalo más abajo y pulse Aceptar para " "terminar de crear su cuenta de %(app_name)s." #: ../ubuntu_sso/utils/ui.py:192 msgid "Enter verification code" msgstr "Introduzca el código de verificación" #: ../ubuntu_sso/utils/ui.py:195 #, python-format msgid "I agree with the %(app_name)s terms and conditions" msgstr "Estoy de acuerdo con los términos y condiciones de %(app_name)s" #: ../ubuntu_sso/utils/ui.py:196 #, python-format msgid "Yes! Email me %(app_name)s tips and updates." msgstr "Sí, envíenme consejos y actualizaciones de %(app_name)s." ubuntu-sso-client-13.10/po/fr.po0000664000202700020270000003743412151461656016751 0ustar dobeydobey00000000000000# French translation for ubuntu-sso-client # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the ubuntu-sso-client package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: ubuntu-sso-client\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-09-11 18:25+0000\n" "PO-Revision-Date: 2012-09-15 14:50+0000\n" "Last-Translator: Olivier FEBWIN \n" "Language-Team: French \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-09-17 18:24+0000\n" "X-Generator: Launchpad (build 15944)\n" #. Undefined variable '_', pylint: disable=E0602 #. all the text that is used in the gui #: ../ubuntu_sso/utils/ui.py:49 msgid "By signing up to {app_name} you agree to our {privacy_policy}" msgstr "En vous connectant à {app_name} vous acceptez nos {privacy_policy}" #: ../ubuntu_sso/utils/ui.py:51 msgid "By signing up to {app_name} you agree to our {terms_and_conditions}" msgstr "" "En vous connectant à {app_name} vous acceptez nos {terms_and_conditions}" #: ../ubuntu_sso/utils/ui.py:53 msgid " and {privacy_policy}" msgstr " et {privacy_policy}" #: ../ubuntu_sso/utils/ui.py:54 msgid "Cancel" msgstr "Annuler" #: ../ubuntu_sso/utils/ui.py:55 msgid "Type the characters above" msgstr "Saisissez les caractères ci-dessus" #: ../ubuntu_sso/utils/ui.py:56 msgid "There was a problem getting the captcha, reloading..." msgstr "" "Il y a eu un problème d'obtention du captcha. Rechargement en cours..." #: ../ubuntu_sso/utils/ui.py:58 #, python-format msgid "If you can't read this then %(reload_link)s this page" msgstr "Si vous n'arrivez pas à lire, alors %(reload_link)s cette page" #: ../ubuntu_sso/utils/ui.py:60 msgid "refresh" msgstr "actualisez" #: ../ubuntu_sso/utils/ui.py:61 msgid "Reload" msgstr "Recharger" #: ../ubuntu_sso/utils/ui.py:62 msgid "The captcha is a required field" msgstr "Le captcha est un champ nécessaire" #: ../ubuntu_sso/utils/ui.py:63 msgid "Close window and set up later" msgstr "Fermer la fenêtre et configurer plus tard" #: ../ubuntu_sso/utils/ui.py:64 msgid "Congratulations, {app_name} is installed!" msgstr "Félicitations, {app_name} est installé !" #: ../ubuntu_sso/utils/ui.py:65 #, python-format msgid "To connect this computer to %(app_name)s enter your details below." msgstr "" "Pour connecter cet ordinateur à %(app_name)s, saisissez vos informations ci-" "dessous." #: ../ubuntu_sso/utils/ui.py:67 msgid "Register with {app_name}." msgstr "Enregistrez-vous avec {app_name}." #: ../ubuntu_sso/utils/ui.py:68 ../ubuntu_sso/utils/ui.py:93 #: ../ubuntu_sso/utils/ui.py:143 msgid "Email address" msgstr "Adresse de courriel" #: ../ubuntu_sso/utils/ui.py:69 msgid "Re-type Email address" msgstr "Saisissez de nouveau votre adresse de courriel" #: ../ubuntu_sso/utils/ui.py:70 msgid "The email must be a valid email address." msgstr "L'adresse de courriel doit être valide." #: ../ubuntu_sso/utils/ui.py:71 msgid "" "The email addresses don't match, please double check and try entering them " "again." msgstr "" "Les adresses ne correspondent pas. Veuillez les vérifier attentivement et " "essayer de les saisir à nouveau." #: ../ubuntu_sso/utils/ui.py:73 msgid "Email" msgstr "Courriel" #: ../ubuntu_sso/utils/ui.py:74 msgid "The email addresses do not match" msgstr "Les adresses ne correspondent pas" #: ../ubuntu_sso/utils/ui.py:75 msgid "Enter code verification here" msgstr "Saisissez le code de vérification ici" #: ../ubuntu_sso/utils/ui.py:76 msgid "Please enter your name" msgstr "Veuillez saisir votre nom" #: ../ubuntu_sso/utils/ui.py:77 msgid "The process did not finish successfully." msgstr "Le processus ne s'est pas correctement terminé." #: ../ubuntu_sso/utils/ui.py:79 msgid "Sign me in with my existing account" msgstr "Me connecter avec mon compte" #: ../ubuntu_sso/utils/ui.py:80 msgid "This field is required." msgstr "Ce champ est obligatoire." #: ../ubuntu_sso/utils/ui.py:81 msgid "I've forgotten my password" msgstr "J'ai oublié mon mot de passe" #: ../ubuntu_sso/utils/ui.py:82 ../ubuntu_sso/utils/ui.py:130 msgid "Reset password" msgstr "Réinitialiser le mot de passe" #: ../ubuntu_sso/utils/ui.py:83 msgid "" "To reset your {app_name} password, enter your registered email address " "below. We will send instructions to reset your password." msgstr "" "Pour réinitialiser le mot de passe de {app_name}, saisissez ci-dessous " "l'adresse de courriel utilisée lors de votre inscription. Nous vous " "enverrons les instructions nécessaires pour réinitialiser votre mot de passe." #: ../ubuntu_sso/utils/ui.py:86 msgid "Please enter a valid email address" msgstr "Veuillez entrer une adresse de courriel valide" #: ../ubuntu_sso/utils/ui.py:87 msgid "There was a problem accessing the Ubuntu Single Sign On backend." msgstr "Un problème est survenu lors de l'accès à Ubuntu Single Sign On." #: ../ubuntu_sso/utils/ui.py:89 #, python-format msgid "Create %(app_name)s account" msgstr "Créer un compte %(app_name)s" #: ../ubuntu_sso/utils/ui.py:90 msgid "Loading..." msgstr "Chargement…" #: ../ubuntu_sso/utils/ui.py:91 msgid "Getting information, please wait..." msgstr "Récupération des informations, veuillez patienter..." #: ../ubuntu_sso/utils/ui.py:92 msgid "Already have an account? Click here to sign in" msgstr "Vous avez déjà un compte ? Cliquez ici pour vous y connecter." #: ../ubuntu_sso/utils/ui.py:94 #, python-format msgid "Connect to %(app_name)s" msgstr "Se connecter à %(app_name)s" #: ../ubuntu_sso/utils/ui.py:95 ../ubuntu_sso/utils/ui.py:109 msgid "Password" msgstr "Mot de passe" #: ../ubuntu_sso/utils/ui.py:97 msgid "Sign In to {app_name}" msgstr "Se connecter à {app_name}" #: ../ubuntu_sso/utils/ui.py:99 msgid "Name" msgstr "Nom" #: ../ubuntu_sso/utils/ui.py:100 msgid "The name must not be empty." msgstr "Le nom ne doit pas être vide." #: ../ubuntu_sso/utils/ui.py:101 msgid "Next" msgstr "Suivant" #: ../ubuntu_sso/utils/ui.py:102 msgid "Network detection" msgstr "Détection du réseau" #: ../ubuntu_sso/utils/ui.py:103 #, python-format msgid "" "Are you online? We can't detect an internet connection - you will need to be " "connected to set up %(app_name)s" msgstr "" "Êtes-vous en ligne ? Aucune connexion à Internet n'a été détectée - vous " "devez vous connecter pour configurer %(app_name)s" #: ../ubuntu_sso/utils/ui.py:105 msgid "One moment please..." msgstr "Veuillez patienter..." #: ../ubuntu_sso/utils/ui.py:106 msgid "Create a password" msgstr "Saisir un mot de passe" #: ../ubuntu_sso/utils/ui.py:107 msgid "Your password was successfully changed." msgstr "Votre mot de passe a été changé avec succès." #: ../ubuntu_sso/utils/ui.py:108 msgid "At least one number" msgstr "Au moins un chiffre" #: ../ubuntu_sso/utils/ui.py:110 msgid "Re-type Password" msgstr "Saisissez de nouveau le mot de passe" #: ../ubuntu_sso/utils/ui.py:111 msgid "" "The password must have a minimum of 8 characters and include one uppercase " "character and one number." msgstr "" "Le mot de passe doit comporter au minimum 8 caractères et inclure une " "majuscule ainsi qu'un chiffre." #: ../ubuntu_sso/utils/ui.py:113 msgid "At least 8 characters" msgstr "Au moins 8 charactères" #: ../ubuntu_sso/utils/ui.py:114 msgid "Passwords don't match" msgstr "Les mots de passe ne correspondent pas" #: ../ubuntu_sso/utils/ui.py:115 msgid "" "The passwords don't match, please double check and try entering them again." msgstr "" "Les mots de passe ne correspondent pas. Veuillez les vérifier attentivement " "et les saisir à nouveau." #: ../ubuntu_sso/utils/ui.py:117 msgid "Your password must contain" msgstr "Votre mot de passe doit comporter" #: ../ubuntu_sso/utils/ui.py:118 msgid "The password is too weak." msgstr "Le mot de passe est trop faible." #: ../ubuntu_sso/utils/ui.py:119 msgid "At least one uppercase letter" msgstr "Au moins une lettre majuscule" #: ../ubuntu_sso/utils/ui.py:120 msgid "Privacy Policy" msgstr "Politique de confidentialité" #: ../ubuntu_sso/utils/ui.py:121 msgid "Connecting to:" msgstr "Connexion à :" #: ../ubuntu_sso/utils/ui.py:122 msgid "Proxy Settings" msgstr "Paramètres du serveur mandataire" #: ../ubuntu_sso/utils/ui.py:123 msgid "Incorrect login details. Please try again." msgstr "Informations de connexion incorrectes. Veuillez réessayer." #: ../ubuntu_sso/utils/ui.py:124 msgid "Please provide login details." msgstr "Veuillez saisir vos informations de connexion." #: ../ubuntu_sso/utils/ui.py:125 msgid "You are connecting through a proxy." msgstr "Vous vous connectez à travers un serveur mandataire." #: ../ubuntu_sso/utils/ui.py:126 msgid "Get Help With Proxies" msgstr "Obtenir de l'aide à propos des serveurs mandaires" #: ../ubuntu_sso/utils/ui.py:127 msgid "Proxy password:" msgstr "Mot de passe pour le serveur mandataire :" #: ../ubuntu_sso/utils/ui.py:128 msgid "Save and Connect" msgstr "Sauvegarder et se connecter" #: ../ubuntu_sso/utils/ui.py:129 msgid "Proxy username:" msgstr "Nom d'utilisateur pour le serveur mandataire :" #: ../ubuntu_sso/utils/ui.py:131 msgid "" "A password reset code has been sent to your e-mail. Please enter the code " "below along with your new password." msgstr "" "Un code de réinitialisation du mot de passe a été envoyé à votre adresse de " "courriel. Veuillez saisir ce code ci-dessous avec votre nouveau mot de passe." #: ../ubuntu_sso/utils/ui.py:133 msgid "Retype email" msgstr "Ressaisir l'adresse de courriel" #: ../ubuntu_sso/utils/ui.py:134 msgid "Retype password" msgstr "Ressaisir le mot de passe" #: ../ubuntu_sso/utils/ui.py:135 #, python-format msgid "To reset your %(app_name)s password, enter your email address below:" msgstr "" "Pour réinitialiser votre mot de passe pour %(app_name)s, saisissez votre " "adresse de courriel ci-dessous :" #: ../ubuntu_sso/utils/ui.py:137 msgid "" "We are very Sorry! The service that signs you on is not responding right " "now\n" "Please try again or come back in a few minutes." msgstr "" "Nous sommes désolés ! Le service permettant de vous inscrire ne réponde pas " "pour le moment\n" "Veuillez réessayer maintenant ou dans quelques minutes." #: ../ubuntu_sso/utils/ui.py:140 msgid "Sorry we did not recognize the email address." msgstr "Navré, nous n'avons pas reconnu l'adresse de courriel." #: ../ubuntu_sso/utils/ui.py:142 msgid "Reset code" msgstr "Code de réinitialisation" #: ../ubuntu_sso/utils/ui.py:145 #, python-format msgid "" "A password reset code has been sent to %(email)s.\n" "Please enter the code below along with your new password." msgstr "" "Un code de réinitialisation du mot de passe à été envoyé à %(email)s.\n" "Veuillez saisir le code ci-dessous avec votre nouveau mot de passe." #: ../ubuntu_sso/utils/ui.py:147 msgid "Set Up Account" msgstr "Configurer le compte" #: ../ubuntu_sso/utils/ui.py:148 msgid "I don't have an account yet - sign me up" msgstr "Je n'ai pas de compte - M'inscrire" #: ../ubuntu_sso/utils/ui.py:149 msgid "Sign In" msgstr "Me connecter" #: ../ubuntu_sso/utils/ui.py:150 msgid "Log-in with my existing account." msgstr "Se connecter avec mon compte existant." #: ../ubuntu_sso/utils/ui.py:151 msgid "the appname whose ssl error we are going to show." msgstr "le nom de l'application dont on va afficher l'erreur SSL." #: ../ubuntu_sso/utils/ui.py:152 msgid "Certificate details" msgstr "Informations du certificat" #: ../ubuntu_sso/utils/ui.py:153 msgid "Connect" msgstr "Se connecter" #: ../ubuntu_sso/utils/ui.py:154 msgid "the details ssl certificate we are going to show." msgstr "les informations du certificat SSL qu'on va afficher." #: ../ubuntu_sso/utils/ui.py:161 msgid "Open the SSL certificate UI." msgstr "Ouvrir l'interface utilisateur pour le certificat SSL." #: ../ubuntu_sso/utils/ui.py:162 msgid "SSL Certificate Not Valid" msgstr "Certificat SSL non valide" #: ../ubuntu_sso/utils/ui.py:163 msgid "the domain whose ssl certificate we are going to show." msgstr "le domaine dont on va afficher le certificat SSL." #: ../ubuntu_sso/utils/ui.py:164 #, python-format msgid "" "You are trying to connect to a proxy server on %(domain)s. This server uses " "a secure connection, and the SSL certificate is not valid because:" msgstr "" "Vous essayez de vous connecter à un serveur mandataire sur %(domain)s. Ce " "serveur utilise une connexion sécurisée et le certificat SSL n'est pas " "valide parce que :" #: ../ubuntu_sso/utils/ui.py:167 msgid "The certificate has not been verified" msgstr "Le certificat n'a pas été vérifié" #: ../ubuntu_sso/utils/ui.py:168 msgid "Do you want to connect to this server?" msgstr "Voulez-vous vous connecter à ce serveur ?" #: ../ubuntu_sso/utils/ui.py:169 msgid "Get Help With SSL" msgstr "Obtenir de l'aide à propos de SSL" #: ../ubuntu_sso/utils/ui.py:170 #, python-format msgid "" "If you are not sure about this server, do not use it to connect to " "%(app_name)s." msgstr "" "Si vous n'êtes pas sûr de ce serveur, ne vous y connectez pas avec " "%(app_name)s." #: ../ubuntu_sso/utils/ui.py:172 msgid "Remember my settings for this certificate." msgstr "Se souvenir de mes préférences pour ce certificat." #: ../ubuntu_sso/utils/ui.py:173 msgid "" "The name on the certificate isn't valid or doesn't match the name of the site" msgstr "" "Le nom du certificat n'est pas valide ou bien ne correspond pas au nom du " "site" #: ../ubuntu_sso/utils/ui.py:175 msgid "The certificate has expired" msgstr "Le certificat a expiré" #: ../ubuntu_sso/utils/ui.py:176 #, python-format msgid "You are now logged into %(app_name)s." msgstr "Vous êtes maintenant connecté à %(app_name)s." #: ../ubuntu_sso/utils/ui.py:177 msgid "Surname" msgstr "Nom de famille" #: ../ubuntu_sso/utils/ui.py:178 msgid "Terms of Service" msgstr "Conditions d'utilisation" #: ../ubuntu_sso/utils/ui.py:179 msgid "Sign Up to {app_name}" msgstr "S'inscrire sur {app_name}" #: ../ubuntu_sso/utils/ui.py:180 msgid "Show Terms & Conditions" msgstr "Afficher les conditions d'utilisation" #: ../ubuntu_sso/utils/ui.py:181 #, python-format msgid "" "Agreeing to the %(app_name)s Terms & Conditions is required to subscribe." msgstr "" "Il est nécessaire d'accepter les conditions d'utilisation de %(app_name)s " "pour pouvoir s'inscrire." #: ../ubuntu_sso/utils/ui.py:183 #, python-format msgid "You can also find these terms at %(url)s" msgstr "" "Vous pouvez également trouver ces conditions d'utilisation sur %(url)s" #: ../ubuntu_sso/utils/ui.py:184 msgid "Try again" msgstr "Réessayer" #: ../ubuntu_sso/utils/ui.py:185 msgid "" "There was an error when trying to complete the process. Please check the " "information and try again." msgstr "" "Une erreur est survenue lors de la finalisation du processus. Veuillez " "vérifier les informations et réessayer." #: ../ubuntu_sso/utils/ui.py:187 msgid "Verification code" msgstr "Code de vérification" #: ../ubuntu_sso/utils/ui.py:188 #, python-format msgid "" "Check %(email)s for an email from Ubuntu Single Sign On. This message " "contains a verification code. Enter the code in the field below and click OK " "to complete creating your %(app_name)s account." msgstr "" "Vérifiez dans %(email)s si vous avez reçu un courriel provenant d'Ubuntu " "Single Sign On. Ce message contient un code de vérification. Saisissez ce " "code dans le champs ci-dessous et cliquez sur OK pour terminer la création " "de votre compte %(app_name)s." #: ../ubuntu_sso/utils/ui.py:192 msgid "Enter verification code" msgstr "Saisissez le code de vérification" #: ../ubuntu_sso/utils/ui.py:195 #, python-format msgid "I agree with the %(app_name)s terms and conditions" msgstr "" "Je suis d'accord avec les termes des conditions d'utilisation de %(app_name)s" #: ../ubuntu_sso/utils/ui.py:196 #, python-format msgid "Yes! Email me %(app_name)s tips and updates." msgstr "Oui ! Envoyez moi les conseils et les mises à jour de %(app_name)s." ubuntu-sso-client-13.10/po/gd.po0000664000202700020270000003730712151461656016733 0ustar dobeydobey00000000000000# Gaelic; Scottish translation for ubuntu-sso-client # Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 # This file is distributed under the same license as the ubuntu-sso-client package. # FIRST AUTHOR , 2011. # msgid "" msgstr "" "Project-Id-Version: ubuntu-sso-client\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-09-11 18:25+0000\n" "PO-Revision-Date: 2012-09-07 20:07+0000\n" "Last-Translator: alasdair caimbeul \n" "Language-Team: Gaelic; Scottish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-09-17 18:24+0000\n" "X-Generator: Launchpad (build 15944)\n" #. Undefined variable '_', pylint: disable=E0602 #. all the text that is used in the gui #: ../ubuntu_sso/utils/ui.py:49 msgid "By signing up to {app_name} you agree to our {privacy_policy}" msgstr "" "Le soidhnigeadh suas ri {app_name} tha thu ag aontaicheadh le " "{privacy_policy} againn" #: ../ubuntu_sso/utils/ui.py:51 msgid "By signing up to {app_name} you agree to our {terms_and_conditions}" msgstr "" "Le soidhnigeadh suas ri {app_name} tha thu ag aontaicheadh le na " "{terms_and_conditions} againn" #: ../ubuntu_sso/utils/ui.py:53 msgid " and {privacy_policy}" msgstr " agus {privacy_policy}" #: ../ubuntu_sso/utils/ui.py:54 msgid "Cancel" msgstr "Sguir" #: ../ubuntu_sso/utils/ui.py:55 msgid "Type the characters above" msgstr "Clò-sgrìobh na caractaran gu h-àrd" #: ../ubuntu_sso/utils/ui.py:56 msgid "There was a problem getting the captcha, reloading..." msgstr "Bha trioblaid ann faighinn a' captcha, ath-luchdadh..." #: ../ubuntu_sso/utils/ui.py:58 #, python-format msgid "If you can't read this then %(reload_link)s this page" msgstr "" "Mur 's nach leugh thu seo, às dèidh sin %(reload_link)s an duilleag seo" #: ../ubuntu_sso/utils/ui.py:60 msgid "refresh" msgstr "ath-ùraich" #: ../ubuntu_sso/utils/ui.py:61 msgid "Reload" msgstr "Ath-luchdaich" #: ../ubuntu_sso/utils/ui.py:62 msgid "The captcha is a required field" msgstr "Tha an captcha na raon riatanach" #: ../ubuntu_sso/utils/ui.py:63 msgid "Close window and set up later" msgstr "Dùin an uinneag agus stèidhich nas anmoch" #: ../ubuntu_sso/utils/ui.py:64 msgid "Congratulations, {app_name} is installed!" msgstr "Meal do naidheachd, tha {app_name} stàlaichte!" #: ../ubuntu_sso/utils/ui.py:65 #, python-format msgid "To connect this computer to %(app_name)s enter your details below." msgstr "" "Gu cheangal a' coimpiutair seo ri %(app_name)s cuir a-steach ar mion-" "fhiosrach gu h-ìseal." #: ../ubuntu_sso/utils/ui.py:67 msgid "Register with {app_name}." msgstr "Clàraich le {app_name}." #: ../ubuntu_sso/utils/ui.py:68 ../ubuntu_sso/utils/ui.py:93 #: ../ubuntu_sso/utils/ui.py:143 msgid "Email address" msgstr "Seoladh post-dealan" #: ../ubuntu_sso/utils/ui.py:69 msgid "Re-type Email address" msgstr "Ath-clò-sgrìobh Seoladh post-dealan" #: ../ubuntu_sso/utils/ui.py:70 msgid "The email must be a valid email address." msgstr "Feumaidh a phost-dealan bhith na phost-dealan dligheach." #: ../ubuntu_sso/utils/ui.py:71 msgid "" "The email addresses don't match, please double check and try entering them " "again." msgstr "" "Chan eil na seòlaidhean co-ionnan, sgrùd sibh a dara turas agus feuch iad a " "chuir a-steach a-rithist." #: ../ubuntu_sso/utils/ui.py:73 msgid "Email" msgstr "Post-d" #: ../ubuntu_sso/utils/ui.py:74 msgid "The email addresses do not match" msgstr "Chan eil na seòlaidhean post-d co-ionnanach" #: ../ubuntu_sso/utils/ui.py:75 msgid "Enter code verification here" msgstr "Cuir a-steach còd dearbhadh an seo" #: ../ubuntu_sso/utils/ui.py:76 msgid "Please enter your name" msgstr "Cuir an t-ainm agaibh a-steach" #: ../ubuntu_sso/utils/ui.py:77 msgid "The process did not finish successfully." msgstr "Cha robh criothnachadh a' phròiseas soirbheachail." #: ../ubuntu_sso/utils/ui.py:79 msgid "Sign me in with my existing account" msgstr "Soidhnig mi a-steach le mo chunntas mhaireann" #: ../ubuntu_sso/utils/ui.py:80 msgid "This field is required." msgstr "Tha an raon seo na riatanas." #: ../ubuntu_sso/utils/ui.py:81 msgid "I've forgotten my password" msgstr "Dhì-chuimhnich mi m'fhacal-faire" #: ../ubuntu_sso/utils/ui.py:82 ../ubuntu_sso/utils/ui.py:130 msgid "Reset password" msgstr "Ath-shuidhich facal-faire" #: ../ubuntu_sso/utils/ui.py:83 msgid "" "To reset your {app_name} password, enter your registered email address " "below. We will send instructions to reset your password." msgstr "" "Gu ath-shuidhich do fhacal-faire {app_name}, cuir a-steach do sheòladh post-" "d chlàraichte gu ìseal. Cuireadh sinn fios stiùireadh thugad gu ath-" "shuidhich do fhacal-faire." #: ../ubuntu_sso/utils/ui.py:86 msgid "Please enter a valid email address" msgstr "Cuir sibh a-steach seòladh post-d dligheach" #: ../ubuntu_sso/utils/ui.py:87 msgid "There was a problem accessing the Ubuntu Single Sign On backend." msgstr "" "Bha trioblaid ann faighinn cothrom air a' Chùl-dheireadh Soidhnig Air " "Singilte Ubuntu." #: ../ubuntu_sso/utils/ui.py:89 #, python-format msgid "Create %(app_name)s account" msgstr "Cruthaich %(app_name)s cunntas" #: ../ubuntu_sso/utils/ui.py:90 msgid "Loading..." msgstr "Luchdachadh..." #: ../ubuntu_sso/utils/ui.py:91 msgid "Getting information, please wait..." msgstr "Faighinn fiosrachadh, fuirich sibh..." #: ../ubuntu_sso/utils/ui.py:92 msgid "Already have an account? Click here to sign in" msgstr "Cunntas agad mar thà? Briog an seo son soidhnigeadh a-steach" #: ../ubuntu_sso/utils/ui.py:94 #, python-format msgid "Connect to %(app_name)s" msgstr "Ceangal ri %(app_name)s" #: ../ubuntu_sso/utils/ui.py:95 ../ubuntu_sso/utils/ui.py:109 msgid "Password" msgstr "Facal-Faire" #: ../ubuntu_sso/utils/ui.py:97 msgid "Sign In to {app_name}" msgstr "Soidhnig A-steach gu {app_name}" #: ../ubuntu_sso/utils/ui.py:99 msgid "Name" msgstr "Ainm" #: ../ubuntu_sso/utils/ui.py:100 msgid "The name must not be empty." msgstr "Chan fhaod an t-ainm bhith falamh." #: ../ubuntu_sso/utils/ui.py:101 msgid "Next" msgstr "An ath" #: ../ubuntu_sso/utils/ui.py:102 msgid "Network detection" msgstr "A' lorg lìonra" #: ../ubuntu_sso/utils/ui.py:103 #, python-format msgid "" "Are you online? We can't detect an internet connection - you will need to be " "connected to set up %(app_name)s" msgstr "" "Bheil thu air-loidhne? Chan fhaigh sinn lorg air ceangal eadar-lìon – " "feumaidh tu bhith ceangailte son stèidheachadh %(app_name)s" #: ../ubuntu_sso/utils/ui.py:105 msgid "One moment please..." msgstr "Fuirichibh diog..." #: ../ubuntu_sso/utils/ui.py:106 msgid "Create a password" msgstr "Cruthaich facail-faire" #: ../ubuntu_sso/utils/ui.py:107 msgid "Your password was successfully changed." msgstr "Bha atharrachadh dh'fhacal-faire soirbheachail." #: ../ubuntu_sso/utils/ui.py:108 msgid "At least one number" msgstr "Co-dhiù aon àireamh" #: ../ubuntu_sso/utils/ui.py:110 msgid "Re-type Password" msgstr "Ath-clò-sgrìobh Facal-faire" #: ../ubuntu_sso/utils/ui.py:111 msgid "" "The password must have a minimum of 8 characters and include one uppercase " "character and one number." msgstr "" "Feumaidh facal-faire 8 caractaran co-dhiù agus gabhail a-staigh aon caractar " "litir mhór agus aon àireamh." #: ../ubuntu_sso/utils/ui.py:113 msgid "At least 8 characters" msgstr "Co-dhiù 8 caractaran" #: ../ubuntu_sso/utils/ui.py:114 msgid "Passwords don't match" msgstr "Chan eil facail-faire co-ionnan" #: ../ubuntu_sso/utils/ui.py:115 msgid "" "The passwords don't match, please double check and try entering them again." msgstr "" "Chan eil na facail-faire co-ionnan, sgrùd sibh a dara turas agus feuch iad a " "chuir a-steach a-rithist." #: ../ubuntu_sso/utils/ui.py:117 msgid "Your password must contain" msgstr "Feumaidh do fhacal-faire glèidh" #: ../ubuntu_sso/utils/ui.py:118 msgid "The password is too weak." msgstr "Tha facal-faire ro lag" #: ../ubuntu_sso/utils/ui.py:119 msgid "At least one uppercase letter" msgstr "Co-dhiù aon litir cèis-uarach" #: ../ubuntu_sso/utils/ui.py:120 msgid "Privacy Policy" msgstr "Poileasaidh Prìobhaideach" #: ../ubuntu_sso/utils/ui.py:121 msgid "Connecting to:" msgstr "A' ceangal ri:" #: ../ubuntu_sso/utils/ui.py:122 msgid "Proxy Settings" msgstr "Suidheachdaidhean Progsaidh" #: ../ubuntu_sso/utils/ui.py:123 msgid "Incorrect login details. Please try again." msgstr "Mion-chunntasan logadh a-steach ceàrr. Feuch sibh a-rithist." #: ../ubuntu_sso/utils/ui.py:124 msgid "Please provide login details." msgstr "Solaraich sibh mion-chunntasan logadh a-steach." #: ../ubuntu_sso/utils/ui.py:125 msgid "You are connecting through a proxy." msgstr "Tha thu a' ceangal tro progsaidh" #: ../ubuntu_sso/utils/ui.py:126 msgid "Get Help With Proxies" msgstr "Faigh cobhair le progsaidhean" #: ../ubuntu_sso/utils/ui.py:127 msgid "Proxy password:" msgstr "Facal-faire progsaidh:" #: ../ubuntu_sso/utils/ui.py:128 msgid "Save and Connect" msgstr "Sàbhail agus ceangal" #: ../ubuntu_sso/utils/ui.py:129 msgid "Proxy username:" msgstr "Ainm-chleachdaiche progsaidh:" #: ../ubuntu_sso/utils/ui.py:131 msgid "" "A password reset code has been sent to your e-mail. Please enter the code " "below along with your new password." msgstr "" "Chaidh a chur còd ath-shuidhich facal-faire dhan post-d agad. Cuir sibh a-" "steach a' chòd gu ìseal còmhla ris a' fhacal-faire ùr agaibh." #: ../ubuntu_sso/utils/ui.py:133 msgid "Retype email" msgstr "Clò-sgrìobh post-d a-rithist" #: ../ubuntu_sso/utils/ui.py:134 msgid "Retype password" msgstr "Clò-sgrìobh facal-faire a-rithist" #: ../ubuntu_sso/utils/ui.py:135 #, python-format msgid "To reset your %(app_name)s password, enter your email address below:" msgstr "" "Gu ath-shuidhich do %(app_name)s facal-faire, cuir a-steach do seòladh post-" "dealan gu ìseal:" #: ../ubuntu_sso/utils/ui.py:137 msgid "" "We are very Sorry! The service that signs you on is not responding right " "now\n" "Please try again or come back in a few minutes." msgstr "" "Tha sinn glè dhuilich! Chan eil an t-seirbheis tha soidhnigeadh a-steach thu " "gad freagairt an dràsta\n" "Feuch sibh a-rithist no thig air ais ann am beagan mhionaidean." #: ../ubuntu_sso/utils/ui.py:140 msgid "Sorry we did not recognize the email address." msgstr "Duilich cha do dh'aithnich sinn an t-seòladh post-d." #: ../ubuntu_sso/utils/ui.py:142 msgid "Reset code" msgstr "Ath-shuidhich còd" #: ../ubuntu_sso/utils/ui.py:145 #, python-format msgid "" "A password reset code has been sent to %(email)s.\n" "Please enter the code below along with your new password." msgstr "" "Chaidh còd ath-shuidhich facal-faire chur thugaibh %(email)s.\n" "Cuiribh a-steach a' còd gu ìseal ri taobh am facal-faire ùr agaibh." #: ../ubuntu_sso/utils/ui.py:147 msgid "Set Up Account" msgstr "Stèidhich Cunntas" #: ../ubuntu_sso/utils/ui.py:148 msgid "I don't have an account yet - sign me up" msgstr "Chan eil cunntas agam fhathast - soidhnig suas mi" #: ../ubuntu_sso/utils/ui.py:149 msgid "Sign In" msgstr "Soidhnig A-steach" #: ../ubuntu_sso/utils/ui.py:150 msgid "Log-in with my existing account." msgstr "Log a-steach le mo chunntas tha maireann." #: ../ubuntu_sso/utils/ui.py:151 msgid "the appname whose ssl error we are going to show." msgstr "an t-ainm appname le mearachd ssl tha sinn a' dol a shealladh." #: ../ubuntu_sso/utils/ui.py:152 msgid "Certificate details" msgstr "Mion-chunntasan teisteanas" #: ../ubuntu_sso/utils/ui.py:153 msgid "Connect" msgstr "Ceangal" #: ../ubuntu_sso/utils/ui.py:154 msgid "the details ssl certificate we are going to show." msgstr "na mion-chunntasan teisteanas ssl tha sinn dol a shealladh." #: ../ubuntu_sso/utils/ui.py:161 msgid "Open the SSL certificate UI." msgstr "Fosgail an EC (UI) teisteanas SSL." #: ../ubuntu_sso/utils/ui.py:162 msgid "SSL Certificate Not Valid" msgstr "Teisteanas SSL Neo-Dhligheach" #: ../ubuntu_sso/utils/ui.py:163 msgid "the domain whose ssl certificate we are going to show." msgstr "an t-àrainn-lìn leis an teisteanas ssl tha sinn dol a shealladh." #: ../ubuntu_sso/utils/ui.py:164 #, python-format msgid "" "You are trying to connect to a proxy server on %(domain)s. This server uses " "a secure connection, and the SSL certificate is not valid because:" msgstr "" "Tha thu feuchainn ceangal ri frithealaiche progsaidh air %(domain)s. Tha am " "frithealaiche a cleachdadh ceangal tèarainte, agus chan eil an teisteanas " "SSL dligheach sgàth:" #: ../ubuntu_sso/utils/ui.py:167 msgid "The certificate has not been verified" msgstr "Cha robh an teisteanas dearbhaichte" #: ../ubuntu_sso/utils/ui.py:168 msgid "Do you want to connect to this server?" msgstr "Bheil thu ag iarraidh ceangal ris am frithealaiche seo?" #: ../ubuntu_sso/utils/ui.py:169 msgid "Get Help With SSL" msgstr "Faigh cobhair le SSL" #: ../ubuntu_sso/utils/ui.py:170 #, python-format msgid "" "If you are not sure about this server, do not use it to connect to " "%(app_name)s." msgstr "" "Mur 'eil thu cinnteach mun frithealaiche seo, na cleachd e son ceangal ri " "%(app_name)s." #: ../ubuntu_sso/utils/ui.py:172 msgid "Remember my settings for this certificate." msgstr "Cuimhnich mo shuidheachaidhean airson an teisteanas seo." #: ../ubuntu_sso/utils/ui.py:173 msgid "" "The name on the certificate isn't valid or doesn't match the name of the site" msgstr "" "Chan eil an t-ainm air an teisteanas dligheach no chan eil e co-ionnan ri " "ainm an làrach" #: ../ubuntu_sso/utils/ui.py:175 msgid "The certificate has expired" msgstr "Tha an teisteanas air crìochnachadh" #: ../ubuntu_sso/utils/ui.py:176 #, python-format msgid "You are now logged into %(app_name)s." msgstr "Tha thu a-nis air logadh a-steach %(app_name)s." #: ../ubuntu_sso/utils/ui.py:177 msgid "Surname" msgstr "Sloinneadh" #: ../ubuntu_sso/utils/ui.py:178 msgid "Terms of Service" msgstr "Teirmichean Seirbheis" #: ../ubuntu_sso/utils/ui.py:179 msgid "Sign Up to {app_name}" msgstr "Soidhnig Suas gu {app_name}" #: ../ubuntu_sso/utils/ui.py:180 msgid "Show Terms & Conditions" msgstr "Seall Teirmichean & Cumhachan" #: ../ubuntu_sso/utils/ui.py:181 #, python-format msgid "" "Agreeing to the %(app_name)s Terms & Conditions is required to subscribe." msgstr "" "Ag aontaich ris na %(app_name)s Teirmichean & Cumhachan dha iarraidh son fo-" "sgrìobhadh." #: ../ubuntu_sso/utils/ui.py:183 #, python-format msgid "You can also find these terms at %(url)s" msgstr "" "Gheibh thu lorg air na teirmichean seo cuideachd aig %(url)s" #: ../ubuntu_sso/utils/ui.py:184 msgid "Try again" msgstr "Feuch a-rithist" #: ../ubuntu_sso/utils/ui.py:185 msgid "" "There was an error when trying to complete the process. Please check the " "information and try again." msgstr "" "Bha mearachd ann nuair feuchainn criothnachadh a' phròiseas. Sgrùd sibh a " "mion-fhiosrach agus feuch a-rithist." #: ../ubuntu_sso/utils/ui.py:187 msgid "Verification code" msgstr "Còd dearbhaich" #: ../ubuntu_sso/utils/ui.py:188 #, python-format msgid "" "Check %(email)s for an email from Ubuntu Single Sign On. This message " "contains a verification code. Enter the code in the field below and click OK " "to complete creating your %(app_name)s account." msgstr "" "Sgrùd %(email)s airson post-d bho Soidhnig Air Singilte Ubuntu. Tha an " "teachdaireachd seo a glèidheadh còd dearbhachadh.\r\n" "Cur a-steach a' chòd anns an raon gu ìseal agus briog CEART gus crìochnaich " "cruthachadh do chunntas %(app_name)s." #: ../ubuntu_sso/utils/ui.py:192 msgid "Enter verification code" msgstr "Cuir a-steach còd dearbhadh" #: ../ubuntu_sso/utils/ui.py:195 #, python-format msgid "I agree with the %(app_name)s terms and conditions" msgstr "Tha mi a' còrdadh ri na %(app_name)s teirmichean agus cumhaichean" #: ../ubuntu_sso/utils/ui.py:196 #, python-format msgid "Yes! Email me %(app_name)s tips and updates." msgstr "Tha! cuir Post-dealan thugam %(app_name)s gliocasan agus ùrachadhan." ubuntu-sso-client-13.10/po/ast.po0000664000202700020270000003601112151461656017117 0ustar dobeydobey00000000000000# Asturian translation for ubuntu-sso-client # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the ubuntu-sso-client package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: ubuntu-sso-client\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-09-11 18:25+0000\n" "PO-Revision-Date: 2012-04-03 00:57+0000\n" "Last-Translator: Xuacu Saturio \n" "Language-Team: Asturian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-09-17 18:24+0000\n" "X-Generator: Launchpad (build 15944)\n" #. Undefined variable '_', pylint: disable=E0602 #. all the text that is used in the gui #: ../ubuntu_sso/utils/ui.py:49 msgid "By signing up to {app_name} you agree to our {privacy_policy}" msgstr "" "Al rexistrate en {app_name} tas d'alcuerdu cola nuesa {privacy_policy}" #: ../ubuntu_sso/utils/ui.py:51 msgid "By signing up to {app_name} you agree to our {terms_and_conditions}" msgstr "" "Al rexistrate en {app_name} tas d'alcuerdu colos nuesos " "{terms_and_conditions}" #: ../ubuntu_sso/utils/ui.py:53 msgid " and {privacy_policy}" msgstr " y {privacy_policy}" #: ../ubuntu_sso/utils/ui.py:54 msgid "Cancel" msgstr "Encaboxar" #: ../ubuntu_sso/utils/ui.py:55 msgid "Type the characters above" msgstr "Escribi los carauteres d'arriba" #: ../ubuntu_sso/utils/ui.py:56 msgid "There was a problem getting the captcha, reloading..." msgstr "Hebo un problema obteniendo'l captcha, recargando..." #: ../ubuntu_sso/utils/ui.py:58 #, python-format msgid "If you can't read this then %(reload_link)s this page" msgstr "Si nun pues lleer esto, %(reload_link)s esta páxina" #: ../ubuntu_sso/utils/ui.py:60 msgid "refresh" msgstr "anova" #: ../ubuntu_sso/utils/ui.py:61 msgid "Reload" msgstr "Recargar" #: ../ubuntu_sso/utils/ui.py:62 msgid "The captcha is a required field" msgstr "El captcha ye un campu obligatoriu" #: ../ubuntu_sso/utils/ui.py:63 msgid "Close window and set up later" msgstr "Zarrar la ventana y configurar dempués" #: ../ubuntu_sso/utils/ui.py:64 msgid "Congratulations, {app_name} is installed!" msgstr "Felicidaes, {app_name} ta instaláu." #: ../ubuntu_sso/utils/ui.py:65 #, python-format msgid "To connect this computer to %(app_name)s enter your details below." msgstr "Pa coneutar esti equipu a %(app_name)s introduz los detalles abaxo." #: ../ubuntu_sso/utils/ui.py:67 msgid "Register with {app_name}." msgstr "" #: ../ubuntu_sso/utils/ui.py:68 ../ubuntu_sso/utils/ui.py:93 #: ../ubuntu_sso/utils/ui.py:143 msgid "Email address" msgstr "Direición de corréu-e" #: ../ubuntu_sso/utils/ui.py:69 msgid "Re-type Email address" msgstr "Vuelvi a escribir la direición de corréu" #: ../ubuntu_sso/utils/ui.py:70 msgid "The email must be a valid email address." msgstr "La direición de corréu tien de ser válida" #: ../ubuntu_sso/utils/ui.py:71 msgid "" "The email addresses don't match, please double check and try entering them " "again." msgstr "" "Les direiciones de corréu-e nun concasen, por favor verifícales ya intenta " "inxertales nuevamente." #: ../ubuntu_sso/utils/ui.py:73 msgid "Email" msgstr "Corréu-e" #: ../ubuntu_sso/utils/ui.py:74 msgid "The email addresses do not match" msgstr "Les direiciones de corréu electrónicu nun concasen" #: ../ubuntu_sso/utils/ui.py:75 msgid "Enter code verification here" msgstr "Introduz el códigu de verificación equí" #: ../ubuntu_sso/utils/ui.py:76 msgid "Please enter your name" msgstr "Introduz el to nome" #: ../ubuntu_sso/utils/ui.py:77 msgid "The process did not finish successfully." msgstr "El procesu nun finó correutamente." #: ../ubuntu_sso/utils/ui.py:79 msgid "Sign me in with my existing account" msgstr "Accedi con una cuenta yá esistente" #: ../ubuntu_sso/utils/ui.py:80 msgid "This field is required." msgstr "Esti campu requierse." #: ../ubuntu_sso/utils/ui.py:81 msgid "I've forgotten my password" msgstr "Escaecí la mio contraseña" #: ../ubuntu_sso/utils/ui.py:82 ../ubuntu_sso/utils/ui.py:130 msgid "Reset password" msgstr "Restablecer la contraseña" #: ../ubuntu_sso/utils/ui.py:83 msgid "" "To reset your {app_name} password, enter your registered email address " "below. We will send instructions to reset your password." msgstr "" "Para reaniciar la to conseña de {app_name}, escribi abaxo la to direición de " "corréu electrónicu rexistrada. T'unviaremos instrucciones pa reaniciar la " "conseña." #: ../ubuntu_sso/utils/ui.py:86 msgid "Please enter a valid email address" msgstr "Introduz una direición de corréu-e válida" #: ../ubuntu_sso/utils/ui.py:87 msgid "There was a problem accessing the Ubuntu Single Sign On backend." msgstr "Hebo un fallu al acceder al motor de la cuenta única d'Ubuntu." #: ../ubuntu_sso/utils/ui.py:89 #, python-format msgid "Create %(app_name)s account" msgstr "Crear una cuenta %(app_name)s" #: ../ubuntu_sso/utils/ui.py:90 msgid "Loading..." msgstr "Cargando..." #: ../ubuntu_sso/utils/ui.py:91 msgid "Getting information, please wait..." msgstr "Consiguiendo información, espera..." #: ../ubuntu_sso/utils/ui.py:92 msgid "Already have an account? Click here to sign in" msgstr "¿Yá tienes una cuenta? Calca equí p'acceder" #: ../ubuntu_sso/utils/ui.py:94 #, python-format msgid "Connect to %(app_name)s" msgstr "Coneutar a %(app_name)s" #: ../ubuntu_sso/utils/ui.py:95 ../ubuntu_sso/utils/ui.py:109 msgid "Password" msgstr "Contraseña" #: ../ubuntu_sso/utils/ui.py:97 msgid "Sign In to {app_name}" msgstr "Aniciar sesión en {app_name}" #: ../ubuntu_sso/utils/ui.py:99 msgid "Name" msgstr "Nome" #: ../ubuntu_sso/utils/ui.py:100 msgid "The name must not be empty." msgstr "El nome nun pue quedar baleru" #: ../ubuntu_sso/utils/ui.py:101 msgid "Next" msgstr "Siguiente" #: ../ubuntu_sso/utils/ui.py:102 msgid "Network detection" msgstr "Deteición de rede" #: ../ubuntu_sso/utils/ui.py:103 #, python-format msgid "" "Are you online? We can't detect an internet connection - you will need to be " "connected to set up %(app_name)s" msgstr "" "¿Tas en llinia? Nun podemos deteutar una conexón a Internet, necesaria pa " "configurar %(app_name)s" #: ../ubuntu_sso/utils/ui.py:105 msgid "One moment please..." msgstr "Un momentu, por favor ..." #: ../ubuntu_sso/utils/ui.py:106 msgid "Create a password" msgstr "Crear una contraseña" #: ../ubuntu_sso/utils/ui.py:107 msgid "Your password was successfully changed." msgstr "La contraseña camudóse correcho." #: ../ubuntu_sso/utils/ui.py:108 msgid "At least one number" msgstr "Al menos un númberu" #: ../ubuntu_sso/utils/ui.py:110 msgid "Re-type Password" msgstr "Vuelvi a escribir la contraseña" #: ../ubuntu_sso/utils/ui.py:111 msgid "" "The password must have a minimum of 8 characters and include one uppercase " "character and one number." msgstr "" "La contraseña tien de ser d'un mínimu de 8 carauteres ya incluyir una lletra " "mayúscula y un númberu." #: ../ubuntu_sso/utils/ui.py:113 msgid "At least 8 characters" msgstr "Al menos 8 caráuteres" #: ../ubuntu_sso/utils/ui.py:114 msgid "Passwords don't match" msgstr "Les contraseñes nun concasen" #: ../ubuntu_sso/utils/ui.py:115 msgid "" "The passwords don't match, please double check and try entering them again." msgstr "" "Les contraseñes nun concasen, por favor verifícales ya intenta inxertales " "nuevamente." #: ../ubuntu_sso/utils/ui.py:117 msgid "Your password must contain" msgstr "La contraseña tien de contener" #: ../ubuntu_sso/utils/ui.py:118 msgid "The password is too weak." msgstr "La contraseña ye enforma feble." #: ../ubuntu_sso/utils/ui.py:119 msgid "At least one uppercase letter" msgstr "Al menos una lletra mayúscula" #: ../ubuntu_sso/utils/ui.py:120 msgid "Privacy Policy" msgstr "Política de privacidá" #: ../ubuntu_sso/utils/ui.py:121 msgid "Connecting to:" msgstr "Coneutando a:" #: ../ubuntu_sso/utils/ui.py:122 msgid "Proxy Settings" msgstr "Axustes de proxy" #: ../ubuntu_sso/utils/ui.py:123 msgid "Incorrect login details. Please try again." msgstr "Detalles d'accesu incorreutos. Inténtalo de nueves." #: ../ubuntu_sso/utils/ui.py:124 msgid "Please provide login details." msgstr "Proporciona los detalles d'accesu." #: ../ubuntu_sso/utils/ui.py:125 msgid "You are connecting through a proxy." msgstr "Tas coneutando a traviés d'un proxy." #: ../ubuntu_sso/utils/ui.py:126 msgid "Get Help With Proxies" msgstr "Obtener ayuda con proxy" #: ../ubuntu_sso/utils/ui.py:127 msgid "Proxy password:" msgstr "Contraseña nel proxy:" #: ../ubuntu_sso/utils/ui.py:128 msgid "Save and Connect" msgstr "Guardar y coneutar" #: ../ubuntu_sso/utils/ui.py:129 msgid "Proxy username:" msgstr "Nome d'usuariu nel Proxy:" #: ../ubuntu_sso/utils/ui.py:131 msgid "" "A password reset code has been sent to your e-mail. Please enter the code " "below along with your new password." msgstr "" "Unvióse un códigu al to corréu-e pa poder restablecer la contraseña. " "Introduz esi códigu y la nueva contraseña abaxo." #: ../ubuntu_sso/utils/ui.py:133 msgid "Retype email" msgstr "Escribi'l corréu-e de nueves" #: ../ubuntu_sso/utils/ui.py:134 msgid "Retype password" msgstr "Reescribi la contraseña" #: ../ubuntu_sso/utils/ui.py:135 #, python-format msgid "To reset your %(app_name)s password, enter your email address below:" msgstr "" "Pa restablecer la contraseña de %(app_name)s , introduz el corréu-e más " "abaxo:" #: ../ubuntu_sso/utils/ui.py:137 msgid "" "We are very Sorry! The service that signs you on is not responding right " "now\n" "Please try again or come back in a few minutes." msgstr "" "Sentímoslo, el serviciu p'aniciar sesión nun respuende nesti intre.\n" "Inténtalo de nueves o regresa nunos minutos." #: ../ubuntu_sso/utils/ui.py:140 msgid "Sorry we did not recognize the email address." msgstr "Sentímoslo, nun se reconoz esta direición de corréu-e" #: ../ubuntu_sso/utils/ui.py:142 msgid "Reset code" msgstr "Restablecer el códigu" #: ../ubuntu_sso/utils/ui.py:145 #, python-format msgid "" "A password reset code has been sent to %(email)s.\n" "Please enter the code below along with your new password." msgstr "" "Unvióse a %(email)s un códigu pa restablecer la contraseña.\n" "Introduz el códigu abaxo xunto cola nueva contraseña." #: ../ubuntu_sso/utils/ui.py:147 msgid "Set Up Account" msgstr "Configurar cuenta" #: ../ubuntu_sso/utils/ui.py:148 msgid "I don't have an account yet - sign me up" msgstr "Entá nun tengo una cuenta - rexistrame" #: ../ubuntu_sso/utils/ui.py:149 msgid "Sign In" msgstr "Aniciar sesión" #: ../ubuntu_sso/utils/ui.py:150 msgid "Log-in with my existing account." msgstr "" #: ../ubuntu_sso/utils/ui.py:151 msgid "the appname whose ssl error we are going to show." msgstr "el nome de l'aplicación de la que vamos a amosar el fallu ssl." #: ../ubuntu_sso/utils/ui.py:152 msgid "Certificate details" msgstr "Detalles del certificáu" #: ../ubuntu_sso/utils/ui.py:153 msgid "Connect" msgstr "Coneutar" #: ../ubuntu_sso/utils/ui.py:154 msgid "the details ssl certificate we are going to show." msgstr "los detalles del certificáu ssl que vamos a amosar." #: ../ubuntu_sso/utils/ui.py:161 msgid "Open the SSL certificate UI." msgstr "Abrir la IU del certificáu SSL." #: ../ubuntu_sso/utils/ui.py:162 msgid "SSL Certificate Not Valid" msgstr "El certificáu SSL nun ye válidu." #: ../ubuntu_sso/utils/ui.py:163 msgid "the domain whose ssl certificate we are going to show." msgstr "el dominiu del que vamos a amosar el certificáu." #: ../ubuntu_sso/utils/ui.py:164 #, python-format msgid "" "You are trying to connect to a proxy server on %(domain)s. This server uses " "a secure connection, and the SSL certificate is not valid because:" msgstr "" "Tas intentando coneutate a un sirvidor proxy en %(domain)s. Esti sirvidor " "usa una conexón segura, y el certificáu SSL nun ye válidu porque:" #: ../ubuntu_sso/utils/ui.py:167 msgid "The certificate has not been verified" msgstr "El certificáu nun se verificó" #: ../ubuntu_sso/utils/ui.py:168 msgid "Do you want to connect to this server?" msgstr "¿Quies coneutate a esti sirvidor?" #: ../ubuntu_sso/utils/ui.py:169 msgid "Get Help With SSL" msgstr "Obtener ayuda con SSL" #: ../ubuntu_sso/utils/ui.py:170 #, python-format msgid "" "If you are not sure about this server, do not use it to connect to " "%(app_name)s." msgstr "" "Si nun te fies d'esti sirvidor, nun lu uses pa coneutate con %(app_name)s." #: ../ubuntu_sso/utils/ui.py:172 msgid "Remember my settings for this certificate." msgstr "Recordar la mio configuración pa esti certificáu." #: ../ubuntu_sso/utils/ui.py:173 msgid "" "The name on the certificate isn't valid or doesn't match the name of the site" msgstr "" "El nome del certificáu nun ye válidu o nun concasa col nome del sitiu" #: ../ubuntu_sso/utils/ui.py:175 msgid "The certificate has expired" msgstr "El certificáu caducó" #: ../ubuntu_sso/utils/ui.py:176 #, python-format msgid "You are now logged into %(app_name)s." msgstr "Agora aniciaste sesión en %(app_name)s." #: ../ubuntu_sso/utils/ui.py:177 msgid "Surname" msgstr "Apellíu" #: ../ubuntu_sso/utils/ui.py:178 msgid "Terms of Service" msgstr "Términos del serviciu" #: ../ubuntu_sso/utils/ui.py:179 msgid "Sign Up to {app_name}" msgstr "Rexistrase en {app_name}" #: ../ubuntu_sso/utils/ui.py:180 msgid "Show Terms & Conditions" msgstr "Amosar términos y condiciones" #: ../ubuntu_sso/utils/ui.py:181 #, python-format msgid "" "Agreeing to the %(app_name)s Terms & Conditions is required to subscribe." msgstr "" "Pa suscribise, ye obligatorio aceutar los términos y condiciones de " "%(app_name)s." #: ../ubuntu_sso/utils/ui.py:183 #, python-format msgid "You can also find these terms at %(url)s" msgstr "" "También pues alcontrar estos términos en %(url)s" #: ../ubuntu_sso/utils/ui.py:184 msgid "Try again" msgstr "Inténtalo otra vegada" #: ../ubuntu_sso/utils/ui.py:185 msgid "" "There was an error when trying to complete the process. Please check the " "information and try again." msgstr "" "Hebo un fallu al intentar completar el procesu. Comprueba la información ya " "inténtalo de nueves." #: ../ubuntu_sso/utils/ui.py:187 msgid "Verification code" msgstr "Códigu de verificación" #: ../ubuntu_sso/utils/ui.py:188 #, python-format msgid "" "Check %(email)s for an email from Ubuntu Single Sign On. This message " "contains a verification code. Enter the code in the field below and click OK " "to complete creating your %(app_name)s account." msgstr "" "Comprueba %(email)s por un mensaxe d'Ubuntu Single Sign On. Esti mensaxe " "contién un códigu de verificación. Escribi'l códigu nel campu d'abaxo y " "calca Aceutar pa terminar de crear la to cuenta de %(app_name)s." #: ../ubuntu_sso/utils/ui.py:192 msgid "Enter verification code" msgstr "Introduz el códigu de verificación" #: ../ubuntu_sso/utils/ui.py:195 #, python-format msgid "I agree with the %(app_name)s terms and conditions" msgstr "Toi d'acuerdu colos términos y condiciones de %(app_name)s." #: ../ubuntu_sso/utils/ui.py:196 #, python-format msgid "Yes! Email me %(app_name)s tips and updates." msgstr "Sí, unviáime al corréu conseyos y anovamientos de %(app_name)s." ubuntu-sso-client-13.10/po/fa.po0000664000202700020270000002504612151461656016724 0ustar dobeydobey00000000000000# Persian translation for ubuntu-sso-client # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the ubuntu-sso-client package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: ubuntu-sso-client\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-09-11 18:25+0000\n" "PO-Revision-Date: 2010-10-08 10:49+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Persian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-09-17 18:24+0000\n" "X-Generator: Launchpad (build 15944)\n" #. Undefined variable '_', pylint: disable=E0602 #. all the text that is used in the gui #: ../ubuntu_sso/utils/ui.py:49 msgid "By signing up to {app_name} you agree to our {privacy_policy}" msgstr "" #: ../ubuntu_sso/utils/ui.py:51 msgid "By signing up to {app_name} you agree to our {terms_and_conditions}" msgstr "" #: ../ubuntu_sso/utils/ui.py:53 msgid " and {privacy_policy}" msgstr "" #: ../ubuntu_sso/utils/ui.py:54 msgid "Cancel" msgstr "" #: ../ubuntu_sso/utils/ui.py:55 msgid "Type the characters above" msgstr "" #: ../ubuntu_sso/utils/ui.py:56 msgid "There was a problem getting the captcha, reloading..." msgstr "" #: ../ubuntu_sso/utils/ui.py:58 #, python-format msgid "If you can't read this then %(reload_link)s this page" msgstr "" #: ../ubuntu_sso/utils/ui.py:60 msgid "refresh" msgstr "" #: ../ubuntu_sso/utils/ui.py:61 msgid "Reload" msgstr "" #: ../ubuntu_sso/utils/ui.py:62 msgid "The captcha is a required field" msgstr "" #: ../ubuntu_sso/utils/ui.py:63 msgid "Close window and set up later" msgstr "" #: ../ubuntu_sso/utils/ui.py:64 msgid "Congratulations, {app_name} is installed!" msgstr "" #: ../ubuntu_sso/utils/ui.py:65 #, python-format msgid "To connect this computer to %(app_name)s enter your details below." msgstr "" #: ../ubuntu_sso/utils/ui.py:67 msgid "Register with {app_name}." msgstr "" #: ../ubuntu_sso/utils/ui.py:68 ../ubuntu_sso/utils/ui.py:93 #: ../ubuntu_sso/utils/ui.py:143 msgid "Email address" msgstr "" #: ../ubuntu_sso/utils/ui.py:69 msgid "Re-type Email address" msgstr "" #: ../ubuntu_sso/utils/ui.py:70 msgid "The email must be a valid email address." msgstr "" #: ../ubuntu_sso/utils/ui.py:71 msgid "" "The email addresses don't match, please double check and try entering them " "again." msgstr "" #: ../ubuntu_sso/utils/ui.py:73 msgid "Email" msgstr "" #: ../ubuntu_sso/utils/ui.py:74 msgid "The email addresses do not match" msgstr "" #: ../ubuntu_sso/utils/ui.py:75 msgid "Enter code verification here" msgstr "" #: ../ubuntu_sso/utils/ui.py:76 msgid "Please enter your name" msgstr "" #: ../ubuntu_sso/utils/ui.py:77 msgid "The process did not finish successfully." msgstr "" #: ../ubuntu_sso/utils/ui.py:79 msgid "Sign me in with my existing account" msgstr "" #: ../ubuntu_sso/utils/ui.py:80 msgid "This field is required." msgstr "" #: ../ubuntu_sso/utils/ui.py:81 msgid "I've forgotten my password" msgstr "" #: ../ubuntu_sso/utils/ui.py:82 ../ubuntu_sso/utils/ui.py:130 msgid "Reset password" msgstr "" #: ../ubuntu_sso/utils/ui.py:83 msgid "" "To reset your {app_name} password, enter your registered email address " "below. We will send instructions to reset your password." msgstr "" #: ../ubuntu_sso/utils/ui.py:86 msgid "Please enter a valid email address" msgstr "" #: ../ubuntu_sso/utils/ui.py:87 msgid "There was a problem accessing the Ubuntu Single Sign On backend." msgstr "" #: ../ubuntu_sso/utils/ui.py:89 #, python-format msgid "Create %(app_name)s account" msgstr "" #: ../ubuntu_sso/utils/ui.py:90 msgid "Loading..." msgstr "" #: ../ubuntu_sso/utils/ui.py:91 msgid "Getting information, please wait..." msgstr "" #: ../ubuntu_sso/utils/ui.py:92 msgid "Already have an account? Click here to sign in" msgstr "" #: ../ubuntu_sso/utils/ui.py:94 #, python-format msgid "Connect to %(app_name)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:95 ../ubuntu_sso/utils/ui.py:109 msgid "Password" msgstr "" #: ../ubuntu_sso/utils/ui.py:97 msgid "Sign In to {app_name}" msgstr "" #: ../ubuntu_sso/utils/ui.py:99 msgid "Name" msgstr "" #: ../ubuntu_sso/utils/ui.py:100 msgid "The name must not be empty." msgstr "" #: ../ubuntu_sso/utils/ui.py:101 msgid "Next" msgstr "" #: ../ubuntu_sso/utils/ui.py:102 msgid "Network detection" msgstr "" #: ../ubuntu_sso/utils/ui.py:103 #, python-format msgid "" "Are you online? We can't detect an internet connection - you will need to be " "connected to set up %(app_name)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:105 msgid "One moment please..." msgstr "" #: ../ubuntu_sso/utils/ui.py:106 msgid "Create a password" msgstr "" #: ../ubuntu_sso/utils/ui.py:107 msgid "Your password was successfully changed." msgstr "" #: ../ubuntu_sso/utils/ui.py:108 msgid "At least one number" msgstr "" #: ../ubuntu_sso/utils/ui.py:110 msgid "Re-type Password" msgstr "" #: ../ubuntu_sso/utils/ui.py:111 msgid "" "The password must have a minimum of 8 characters and include one uppercase " "character and one number." msgstr "" #: ../ubuntu_sso/utils/ui.py:113 msgid "At least 8 characters" msgstr "" #: ../ubuntu_sso/utils/ui.py:114 msgid "Passwords don't match" msgstr "" #: ../ubuntu_sso/utils/ui.py:115 msgid "" "The passwords don't match, please double check and try entering them again." msgstr "" #: ../ubuntu_sso/utils/ui.py:117 msgid "Your password must contain" msgstr "" #: ../ubuntu_sso/utils/ui.py:118 msgid "The password is too weak." msgstr "" #: ../ubuntu_sso/utils/ui.py:119 msgid "At least one uppercase letter" msgstr "" #: ../ubuntu_sso/utils/ui.py:120 msgid "Privacy Policy" msgstr "" #: ../ubuntu_sso/utils/ui.py:121 msgid "Connecting to:" msgstr "" #: ../ubuntu_sso/utils/ui.py:122 msgid "Proxy Settings" msgstr "" #: ../ubuntu_sso/utils/ui.py:123 msgid "Incorrect login details. Please try again." msgstr "" #: ../ubuntu_sso/utils/ui.py:124 msgid "Please provide login details." msgstr "" #: ../ubuntu_sso/utils/ui.py:125 msgid "You are connecting through a proxy." msgstr "" #: ../ubuntu_sso/utils/ui.py:126 msgid "Get Help With Proxies" msgstr "" #: ../ubuntu_sso/utils/ui.py:127 msgid "Proxy password:" msgstr "" #: ../ubuntu_sso/utils/ui.py:128 msgid "Save and Connect" msgstr "" #: ../ubuntu_sso/utils/ui.py:129 msgid "Proxy username:" msgstr "" #: ../ubuntu_sso/utils/ui.py:131 msgid "" "A password reset code has been sent to your e-mail. Please enter the code " "below along with your new password." msgstr "" #: ../ubuntu_sso/utils/ui.py:133 msgid "Retype email" msgstr "" #: ../ubuntu_sso/utils/ui.py:134 msgid "Retype password" msgstr "" #: ../ubuntu_sso/utils/ui.py:135 #, python-format msgid "To reset your %(app_name)s password, enter your email address below:" msgstr "" #: ../ubuntu_sso/utils/ui.py:137 msgid "" "We are very Sorry! The service that signs you on is not responding right " "now\n" "Please try again or come back in a few minutes." msgstr "" #: ../ubuntu_sso/utils/ui.py:140 msgid "Sorry we did not recognize the email address." msgstr "" #: ../ubuntu_sso/utils/ui.py:142 msgid "Reset code" msgstr "" #: ../ubuntu_sso/utils/ui.py:145 #, python-format msgid "" "A password reset code has been sent to %(email)s.\n" "Please enter the code below along with your new password." msgstr "" #: ../ubuntu_sso/utils/ui.py:147 msgid "Set Up Account" msgstr "" #: ../ubuntu_sso/utils/ui.py:148 msgid "I don't have an account yet - sign me up" msgstr "" #: ../ubuntu_sso/utils/ui.py:149 msgid "Sign In" msgstr "" #: ../ubuntu_sso/utils/ui.py:150 msgid "Log-in with my existing account." msgstr "" #: ../ubuntu_sso/utils/ui.py:151 msgid "the appname whose ssl error we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:152 msgid "Certificate details" msgstr "" #: ../ubuntu_sso/utils/ui.py:153 msgid "Connect" msgstr "" #: ../ubuntu_sso/utils/ui.py:154 msgid "the details ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:161 msgid "Open the SSL certificate UI." msgstr "" #: ../ubuntu_sso/utils/ui.py:162 msgid "SSL Certificate Not Valid" msgstr "" #: ../ubuntu_sso/utils/ui.py:163 msgid "the domain whose ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:164 #, python-format msgid "" "You are trying to connect to a proxy server on %(domain)s. This server uses " "a secure connection, and the SSL certificate is not valid because:" msgstr "" #: ../ubuntu_sso/utils/ui.py:167 msgid "The certificate has not been verified" msgstr "" #: ../ubuntu_sso/utils/ui.py:168 msgid "Do you want to connect to this server?" msgstr "" #: ../ubuntu_sso/utils/ui.py:169 msgid "Get Help With SSL" msgstr "" #: ../ubuntu_sso/utils/ui.py:170 #, python-format msgid "" "If you are not sure about this server, do not use it to connect to " "%(app_name)s." msgstr "" #: ../ubuntu_sso/utils/ui.py:172 msgid "Remember my settings for this certificate." msgstr "" #: ../ubuntu_sso/utils/ui.py:173 msgid "" "The name on the certificate isn't valid or doesn't match the name of the site" msgstr "" #: ../ubuntu_sso/utils/ui.py:175 msgid "The certificate has expired" msgstr "" #: ../ubuntu_sso/utils/ui.py:176 #, python-format msgid "You are now logged into %(app_name)s." msgstr "" #: ../ubuntu_sso/utils/ui.py:177 msgid "Surname" msgstr "" #: ../ubuntu_sso/utils/ui.py:178 msgid "Terms of Service" msgstr "" #: ../ubuntu_sso/utils/ui.py:179 msgid "Sign Up to {app_name}" msgstr "" #: ../ubuntu_sso/utils/ui.py:180 msgid "Show Terms & Conditions" msgstr "" #: ../ubuntu_sso/utils/ui.py:181 #, python-format msgid "" "Agreeing to the %(app_name)s Terms & Conditions is required to subscribe." msgstr "" #: ../ubuntu_sso/utils/ui.py:183 #, python-format msgid "You can also find these terms at %(url)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:184 msgid "Try again" msgstr "" #: ../ubuntu_sso/utils/ui.py:185 msgid "" "There was an error when trying to complete the process. Please check the " "information and try again." msgstr "" #: ../ubuntu_sso/utils/ui.py:187 msgid "Verification code" msgstr "" #: ../ubuntu_sso/utils/ui.py:188 #, python-format msgid "" "Check %(email)s for an email from Ubuntu Single Sign On. This message " "contains a verification code. Enter the code in the field below and click OK " "to complete creating your %(app_name)s account." msgstr "" #: ../ubuntu_sso/utils/ui.py:192 msgid "Enter verification code" msgstr "" #: ../ubuntu_sso/utils/ui.py:195 #, python-format msgid "I agree with the %(app_name)s terms and conditions" msgstr "" #: ../ubuntu_sso/utils/ui.py:196 #, python-format msgid "Yes! Email me %(app_name)s tips and updates." msgstr "" ubuntu-sso-client-13.10/po/fi.po0000664000202700020270000003576312151461656016743 0ustar dobeydobey00000000000000# Finnish translation for ubuntu-sso-client # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the ubuntu-sso-client package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: ubuntu-sso-client\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-09-11 18:25+0000\n" "PO-Revision-Date: 2012-03-23 15:52+0000\n" "Last-Translator: Timo Jyrinki \n" "Language-Team: Finnish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-09-17 18:24+0000\n" "X-Generator: Launchpad (build 15944)\n" #. Undefined variable '_', pylint: disable=E0602 #. all the text that is used in the gui #: ../ubuntu_sso/utils/ui.py:49 msgid "By signing up to {app_name} you agree to our {privacy_policy}" msgstr "" "Rekisteröitymällä sovellukseen {app_name} hyväksyt yksityisyyssuojamme " "säännöt: {privacy_policy}" #: ../ubuntu_sso/utils/ui.py:51 msgid "By signing up to {app_name} you agree to our {terms_and_conditions}" msgstr "" "Rekisteröitymällä sovellukseen {app_name} hyväksyt ehtomme: " "{terms_and_conditions}" #: ../ubuntu_sso/utils/ui.py:53 msgid " and {privacy_policy}" msgstr " ja {privacy_policy}" #: ../ubuntu_sso/utils/ui.py:54 msgid "Cancel" msgstr "Peru" #: ../ubuntu_sso/utils/ui.py:55 msgid "Type the characters above" msgstr "Kirjoita yllä olevat merkit" #: ../ubuntu_sso/utils/ui.py:56 msgid "There was a problem getting the captcha, reloading..." msgstr "" "Captcha-tarkistesanoja haettessa ilmeni ongelma, ladataan uudelleen..." #: ../ubuntu_sso/utils/ui.py:58 #, python-format msgid "If you can't read this then %(reload_link)s this page" msgstr "Jos et voit lukea tätä, %(reload_link)s tämä sivu" #: ../ubuntu_sso/utils/ui.py:60 msgid "refresh" msgstr "päivitä" #: ../ubuntu_sso/utils/ui.py:61 msgid "Reload" msgstr "Päivitä" #: ../ubuntu_sso/utils/ui.py:62 msgid "The captcha is a required field" msgstr "Captcha-tunnus on pakollinen kenttä" #: ../ubuntu_sso/utils/ui.py:63 msgid "Close window and set up later" msgstr "Sulje ikkuna ja asenna myöhemmin" #: ../ubuntu_sso/utils/ui.py:64 msgid "Congratulations, {app_name} is installed!" msgstr "Onnittelut, {app_name} on asennettu!" #: ../ubuntu_sso/utils/ui.py:65 #, python-format msgid "To connect this computer to %(app_name)s enter your details below." msgstr "" "Yhdistä tämä tietokone %(app_name)s -palveluun täyttämällä seuraavat kentät." #: ../ubuntu_sso/utils/ui.py:67 msgid "Register with {app_name}." msgstr "" #: ../ubuntu_sso/utils/ui.py:68 ../ubuntu_sso/utils/ui.py:93 #: ../ubuntu_sso/utils/ui.py:143 msgid "Email address" msgstr "Sähköpostiosoite" #: ../ubuntu_sso/utils/ui.py:69 msgid "Re-type Email address" msgstr "Kirjoita sähköpostiosoite uudelleen" #: ../ubuntu_sso/utils/ui.py:70 msgid "The email must be a valid email address." msgstr "Sähköpostin tulee olla kelvollinen sähköpostiosoite." #: ../ubuntu_sso/utils/ui.py:71 msgid "" "The email addresses don't match, please double check and try entering them " "again." msgstr "" "Sähköpostiosoitteet eivät täsmää, tarkista osoitteet ja koeta uudelleen." #: ../ubuntu_sso/utils/ui.py:73 msgid "Email" msgstr "Sähköposti" #: ../ubuntu_sso/utils/ui.py:74 msgid "The email addresses do not match" msgstr "Sähköpostiosoitteet eivät täsmää" #: ../ubuntu_sso/utils/ui.py:75 msgid "Enter code verification here" msgstr "Syötä tarkistuskoodi tähän" #: ../ubuntu_sso/utils/ui.py:76 msgid "Please enter your name" msgstr "Kirjoita nimesi" #: ../ubuntu_sso/utils/ui.py:77 msgid "The process did not finish successfully." msgstr "Tapahtumaa ei saatettu loppuun onnistuneesti." #: ../ubuntu_sso/utils/ui.py:79 msgid "Sign me in with my existing account" msgstr "Kirjaudu olemassa olevalla tilillä" #: ../ubuntu_sso/utils/ui.py:80 msgid "This field is required." msgstr "Tämä kenttä on pakollinen." #: ../ubuntu_sso/utils/ui.py:81 msgid "I've forgotten my password" msgstr "Unohdin salasanani" #: ../ubuntu_sso/utils/ui.py:82 ../ubuntu_sso/utils/ui.py:130 msgid "Reset password" msgstr "Palauta salasana" #: ../ubuntu_sso/utils/ui.py:83 msgid "" "To reset your {app_name} password, enter your registered email address " "below. We will send instructions to reset your password." msgstr "" "Palauta sovelluksen {app_name} salasana kirjoittamalla alapuolelle " "käyttäjätiliin liitetty sähköpostiosoite. Osoitteeseen lähetetään salasanan " "palautusohjeet." #: ../ubuntu_sso/utils/ui.py:86 msgid "Please enter a valid email address" msgstr "Anna kelvollinen sähköpostiosoite" #: ../ubuntu_sso/utils/ui.py:87 msgid "There was a problem accessing the Ubuntu Single Sign On backend." msgstr "Ongelma otettaessa yhteyttä Ubuntu Single Sign On -taustaosaan." #: ../ubuntu_sso/utils/ui.py:89 #, python-format msgid "Create %(app_name)s account" msgstr "Luo %(app_name)s -käyttäjätili" #: ../ubuntu_sso/utils/ui.py:90 msgid "Loading..." msgstr "Ladataan..." #: ../ubuntu_sso/utils/ui.py:91 msgid "Getting information, please wait..." msgstr "Päivitetään tietoja, odota hetki..." #: ../ubuntu_sso/utils/ui.py:92 msgid "Already have an account? Click here to sign in" msgstr "Onko sinulla jo tili? Napsauta tästä kirjautuaksesi sisään" #: ../ubuntu_sso/utils/ui.py:94 #, python-format msgid "Connect to %(app_name)s" msgstr "Yhdistä kohteeseen %(app_name)s" #: ../ubuntu_sso/utils/ui.py:95 ../ubuntu_sso/utils/ui.py:109 msgid "Password" msgstr "Salasana" #: ../ubuntu_sso/utils/ui.py:97 msgid "Sign In to {app_name}" msgstr "Kirjautuminen sovellukseen {app_name}" #: ../ubuntu_sso/utils/ui.py:99 msgid "Name" msgstr "Nimi" #: ../ubuntu_sso/utils/ui.py:100 msgid "The name must not be empty." msgstr "Nimi ei voi olla tyhjä." #: ../ubuntu_sso/utils/ui.py:101 msgid "Next" msgstr "Seuraava" #: ../ubuntu_sso/utils/ui.py:102 msgid "Network detection" msgstr "Verkon havaitseminen" #: ../ubuntu_sso/utils/ui.py:103 #, python-format msgid "" "Are you online? We can't detect an internet connection - you will need to be " "connected to set up %(app_name)s" msgstr "" "Oletko verkossa? Internet-yhteyttä ei ole havaittu - sinun tulee olla " "yhdistettynä tehdäksesi sovelluksen %(app_name)s asennuksen" #: ../ubuntu_sso/utils/ui.py:105 msgid "One moment please..." msgstr "Pieni hetki..." #: ../ubuntu_sso/utils/ui.py:106 msgid "Create a password" msgstr "Luo salasana" #: ../ubuntu_sso/utils/ui.py:107 msgid "Your password was successfully changed." msgstr "Salasanasi vaihdettiin onnistuneesti." #: ../ubuntu_sso/utils/ui.py:108 msgid "At least one number" msgstr "Vähintään yksi numero" #: ../ubuntu_sso/utils/ui.py:110 msgid "Re-type Password" msgstr "Kirjoita salasana uudelleen" #: ../ubuntu_sso/utils/ui.py:111 msgid "" "The password must have a minimum of 8 characters and include one uppercase " "character and one number." msgstr "" "Salasanan tulee sisältää vähintään kahdeksan merkkiä ja siinä tulee olla " "vähintään yksi iso kirjain sekä numero." #: ../ubuntu_sso/utils/ui.py:113 msgid "At least 8 characters" msgstr "Vähintään 8 kirjainta" #: ../ubuntu_sso/utils/ui.py:114 msgid "Passwords don't match" msgstr "Salasanat eivät täsmää" #: ../ubuntu_sso/utils/ui.py:115 msgid "" "The passwords don't match, please double check and try entering them again." msgstr "" "Salasanat eivät täsmää. Varmista salasanojen vastaavuus ja yritä uudelleen." #: ../ubuntu_sso/utils/ui.py:117 msgid "Your password must contain" msgstr "Salasanan täytyy sisältää" #: ../ubuntu_sso/utils/ui.py:118 msgid "The password is too weak." msgstr "Salasana on liian yksinkertainen." #: ../ubuntu_sso/utils/ui.py:119 msgid "At least one uppercase letter" msgstr "Vähintään yksi iso kirjain" #: ../ubuntu_sso/utils/ui.py:120 msgid "Privacy Policy" msgstr "Tietosuojakäytäntö" #: ../ubuntu_sso/utils/ui.py:121 msgid "Connecting to:" msgstr "Yhdistetään:" #: ../ubuntu_sso/utils/ui.py:122 msgid "Proxy Settings" msgstr "Välityspalvelimen asetukset" #: ../ubuntu_sso/utils/ui.py:123 msgid "Incorrect login details. Please try again." msgstr "Kirjautumistiedot ovat väärät. Yritä uudelleen." #: ../ubuntu_sso/utils/ui.py:124 msgid "Please provide login details." msgstr "Anna kirjautumistiedot." #: ../ubuntu_sso/utils/ui.py:125 msgid "You are connecting through a proxy." msgstr "Olet yhdistämässä välipalvelimen kautta." #: ../ubuntu_sso/utils/ui.py:126 msgid "Get Help With Proxies" msgstr "Lue ohjeita välipalvelimien käytöstä" #: ../ubuntu_sso/utils/ui.py:127 msgid "Proxy password:" msgstr "Välityspalvelimen salasana:" #: ../ubuntu_sso/utils/ui.py:128 msgid "Save and Connect" msgstr "Tallenna ja yhdistä" #: ../ubuntu_sso/utils/ui.py:129 msgid "Proxy username:" msgstr "Välityspalvelimen käyttäjätunnus:" #: ../ubuntu_sso/utils/ui.py:131 msgid "" "A password reset code has been sent to your e-mail. Please enter the code " "below along with your new password." msgstr "" "Salasanan nollauskoodi on lähetetty sähköpostiisi. Syötä koodi alle uuden " "salasanasi kera." #: ../ubuntu_sso/utils/ui.py:133 msgid "Retype email" msgstr "Kirjoita sähköpostiosoite uudelleen" #: ../ubuntu_sso/utils/ui.py:134 msgid "Retype password" msgstr "Kirjoita salasana uudelleen" #: ../ubuntu_sso/utils/ui.py:135 #, python-format msgid "To reset your %(app_name)s password, enter your email address below:" msgstr "" "Syötä alle sähköpostiosoitteesi palauttaaksesi %(app_name)s -salasanan:" #: ../ubuntu_sso/utils/ui.py:137 msgid "" "We are very Sorry! The service that signs you on is not responding right " "now\n" "Please try again or come back in a few minutes." msgstr "" "Olemme pahoillamme. Kirjautumispalvelu ei vastaa tällä hetkellä\n" "Yritä uudelleen joko nyt tai muutaman minuutin päästä." #: ../ubuntu_sso/utils/ui.py:140 msgid "Sorry we did not recognize the email address." msgstr "Sähköpostiosoitetta ei tunnistettu." #: ../ubuntu_sso/utils/ui.py:142 msgid "Reset code" msgstr "Palautuskoodi" #: ../ubuntu_sso/utils/ui.py:145 #, python-format msgid "" "A password reset code has been sent to %(email)s.\n" "Please enter the code below along with your new password." msgstr "" "Salasanan palautuskoodi on lähetetty osoitteeseen %(email)s.\n" "Syötä palautuskoodi ja haluamasi uusi salasana alle." #: ../ubuntu_sso/utils/ui.py:147 msgid "Set Up Account" msgstr "Luo käyttäjätili" #: ../ubuntu_sso/utils/ui.py:148 msgid "I don't have an account yet - sign me up" msgstr "Ei vielä tiliä - rekisteröidy" #: ../ubuntu_sso/utils/ui.py:149 msgid "Sign In" msgstr "Kirjaudu sisään" #: ../ubuntu_sso/utils/ui.py:150 msgid "Log-in with my existing account." msgstr "" #: ../ubuntu_sso/utils/ui.py:151 msgid "the appname whose ssl error we are going to show." msgstr "sovelluksen nimi, jonka ssl-virhe näytetään." #: ../ubuntu_sso/utils/ui.py:152 msgid "Certificate details" msgstr "Varmenteen tiedot" #: ../ubuntu_sso/utils/ui.py:153 msgid "Connect" msgstr "Yhdistä" #: ../ubuntu_sso/utils/ui.py:154 msgid "the details ssl certificate we are going to show." msgstr "ssl-varmenteen tiedot jotka näytetään." #: ../ubuntu_sso/utils/ui.py:161 msgid "Open the SSL certificate UI." msgstr "Avaa SSL-varmenteiden käyttöliittymä." #: ../ubuntu_sso/utils/ui.py:162 msgid "SSL Certificate Not Valid" msgstr "SSL-varmenne ei ole kelvollinen" #: ../ubuntu_sso/utils/ui.py:163 msgid "the domain whose ssl certificate we are going to show." msgstr "näytettävän ssl-varmenteen palvelinnimi" #: ../ubuntu_sso/utils/ui.py:164 #, python-format msgid "" "You are trying to connect to a proxy server on %(domain)s. This server uses " "a secure connection, and the SSL certificate is not valid because:" msgstr "" "Yrität yhdistää käyttäen välipalvelinta %(domain)s. Tämä palvelin käyttää " "turvallista yhteyttä, ja SSL-varmenne ei ole kelvollinen koska:" #: ../ubuntu_sso/utils/ui.py:167 msgid "The certificate has not been verified" msgstr "Varmennetta ei ole vahvistettu" #: ../ubuntu_sso/utils/ui.py:168 msgid "Do you want to connect to this server?" msgstr "Haluatko yhdistää tähän palvelimeen?" #: ../ubuntu_sso/utils/ui.py:169 msgid "Get Help With SSL" msgstr "Lue ohjeita SSL:stä" #: ../ubuntu_sso/utils/ui.py:170 #, python-format msgid "" "If you are not sure about this server, do not use it to connect to " "%(app_name)s." msgstr "" "Jos et ole varma tähän palvelimeen luottamisesta, älä käytä sitä " "yhdistääksesi sovellukseen %(app_name)s." #: ../ubuntu_sso/utils/ui.py:172 msgid "Remember my settings for this certificate." msgstr "Muista asetukseni tälle varmenteelle." #: ../ubuntu_sso/utils/ui.py:173 msgid "" "The name on the certificate isn't valid or doesn't match the name of the site" msgstr "Varmenteen nimi ei ole kelvollinen tai ei täsmää sivuston nimeen" #: ../ubuntu_sso/utils/ui.py:175 msgid "The certificate has expired" msgstr "Varmenne on vanhentunut" #: ../ubuntu_sso/utils/ui.py:176 #, python-format msgid "You are now logged into %(app_name)s." msgstr "Olet nyt kirjautunut sovellukseen %(app_name)s." #: ../ubuntu_sso/utils/ui.py:177 msgid "Surname" msgstr "Sukunimi" #: ../ubuntu_sso/utils/ui.py:178 msgid "Terms of Service" msgstr "Käyttöehdot" #: ../ubuntu_sso/utils/ui.py:179 msgid "Sign Up to {app_name}" msgstr "Rekisteröityminen sovellukseen {app_name}" #: ../ubuntu_sso/utils/ui.py:180 msgid "Show Terms & Conditions" msgstr "Näytä ehdot" #: ../ubuntu_sso/utils/ui.py:181 #, python-format msgid "" "Agreeing to the %(app_name)s Terms & Conditions is required to subscribe." msgstr "Sovelluksen %(app_name)s ehdot tulee hyväksyä." #: ../ubuntu_sso/utils/ui.py:183 #, python-format msgid "You can also find these terms at %(url)s" msgstr "Löydät nämä ehdot myös osoitteesta %(url)s" #: ../ubuntu_sso/utils/ui.py:184 msgid "Try again" msgstr "Yritä uudelleen" #: ../ubuntu_sso/utils/ui.py:185 msgid "" "There was an error when trying to complete the process. Please check the " "information and try again." msgstr "Prosessin aikana tapahtui virhe. Tarkista tiedot ja koeta uudelleen." #: ../ubuntu_sso/utils/ui.py:187 msgid "Verification code" msgstr "Tarkistuskoodi" #: ../ubuntu_sso/utils/ui.py:188 #, python-format msgid "" "Check %(email)s for an email from Ubuntu Single Sign On. This message " "contains a verification code. Enter the code in the field below and click OK " "to complete creating your %(app_name)s account." msgstr "" "Tarkista %(email)s Ubuntu Single Sign On -sähköpostien varalta. Viesti " "sisältää tarkistuskoodin. Syötä koodi alla olevaan kenttään ja napsauta OK " "viimeistelläksesi sovelluksen %(app_name)s käyttäjätilin luomisen." #: ../ubuntu_sso/utils/ui.py:192 msgid "Enter verification code" msgstr "Kirjoita vahvistuskoodi" #: ../ubuntu_sso/utils/ui.py:195 #, python-format msgid "I agree with the %(app_name)s terms and conditions" msgstr "Hyväksyn %(app_name)s -ehdot" #: ../ubuntu_sso/utils/ui.py:196 #, python-format msgid "Yes! Email me %(app_name)s tips and updates." msgstr "" "Kyllä! Lähettäkää minulle %(app_name)s -palveluun liittyviä vinkkejä ja " "päivityksiä." ubuntu-sso-client-13.10/po/ka.po0000664000202700020270000003400612151461656016725 0ustar dobeydobey00000000000000# Georgian translation for ubuntu-sso-client # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the ubuntu-sso-client package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: ubuntu-sso-client\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-09-11 18:25+0000\n" "PO-Revision-Date: 2010-11-11 18:07+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Georgian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-09-17 18:24+0000\n" "X-Generator: Launchpad (build 15944)\n" #. Undefined variable '_', pylint: disable=E0602 #. all the text that is used in the gui #: ../ubuntu_sso/utils/ui.py:49 msgid "By signing up to {app_name} you agree to our {privacy_policy}" msgstr "" #: ../ubuntu_sso/utils/ui.py:51 msgid "By signing up to {app_name} you agree to our {terms_and_conditions}" msgstr "" #: ../ubuntu_sso/utils/ui.py:53 msgid " and {privacy_policy}" msgstr "" #: ../ubuntu_sso/utils/ui.py:54 msgid "Cancel" msgstr "" #: ../ubuntu_sso/utils/ui.py:55 msgid "Type the characters above" msgstr "შეიყვáƒáƒœáƒ”თ ზემáƒáƒ—მáƒáƒªáƒ”მული სიმბáƒáƒšáƒáƒ”ბი" #: ../ubuntu_sso/utils/ui.py:56 msgid "There was a problem getting the captcha, reloading..." msgstr "შეფერხებრდáƒáƒ›áƒªáƒáƒ•ი გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბის მიღებისáƒáƒ¡, გáƒáƒ“áƒáƒ¢áƒ•ირთვáƒ..." #: ../ubuntu_sso/utils/ui.py:58 #, python-format msgid "If you can't read this then %(reload_link)s this page" msgstr "" #: ../ubuntu_sso/utils/ui.py:60 msgid "refresh" msgstr "" #: ../ubuntu_sso/utils/ui.py:61 msgid "Reload" msgstr "გáƒáƒ“áƒáƒ¢áƒ•ირთვáƒ" #: ../ubuntu_sso/utils/ui.py:62 msgid "The captcha is a required field" msgstr "" #: ../ubuntu_sso/utils/ui.py:63 msgid "Close window and set up later" msgstr "" #: ../ubuntu_sso/utils/ui.py:64 msgid "Congratulations, {app_name} is installed!" msgstr "" #: ../ubuntu_sso/utils/ui.py:65 #, python-format msgid "To connect this computer to %(app_name)s enter your details below." msgstr "" "მიმდინáƒáƒ áƒ” კáƒáƒ›áƒžáƒ˜áƒ£áƒ¢áƒ”რის %(app_name)s-თáƒáƒœ დáƒáƒ™áƒáƒ•შირებისáƒáƒ—ვის, შეიყვáƒáƒœáƒ”თ " "მáƒáƒœáƒáƒªáƒ”მები." #: ../ubuntu_sso/utils/ui.py:67 msgid "Register with {app_name}." msgstr "" #: ../ubuntu_sso/utils/ui.py:68 ../ubuntu_sso/utils/ui.py:93 #: ../ubuntu_sso/utils/ui.py:143 msgid "Email address" msgstr "ელფáƒáƒ¡áƒ¢áƒ˜áƒ¡ მისáƒáƒ›áƒáƒ áƒ—ი" #: ../ubuntu_sso/utils/ui.py:69 msgid "Re-type Email address" msgstr "ელფáƒáƒ¡áƒ¢áƒ˜áƒ¡ მისáƒáƒ›áƒáƒ áƒ—ი (ხელáƒáƒ®áƒšáƒ)" #: ../ubuntu_sso/utils/ui.py:70 msgid "The email must be a valid email address." msgstr "მáƒáƒªáƒ”მული სტრიქáƒáƒœáƒ˜ áƒáƒ  áƒáƒ áƒ˜áƒ¡ ელფáƒáƒ¡áƒ¢áƒ˜áƒ¡ მისáƒáƒ›áƒáƒ áƒ—ი." #: ../ubuntu_sso/utils/ui.py:71 msgid "" "The email addresses don't match, please double check and try entering them " "again." msgstr "" "ელფáƒáƒ¡áƒ¢áƒ˜áƒ¡ მისáƒáƒ›áƒáƒ áƒ—ები áƒáƒ  ემთხვევრერთმáƒáƒœáƒ”თს. გáƒáƒ“áƒáƒáƒ›áƒáƒ¬áƒ›áƒ”თ დრხელáƒáƒ®áƒšáƒ შეიყვáƒáƒœáƒ”თ " "ისინი." #: ../ubuntu_sso/utils/ui.py:73 msgid "Email" msgstr "" #: ../ubuntu_sso/utils/ui.py:74 msgid "The email addresses do not match" msgstr "" #: ../ubuntu_sso/utils/ui.py:75 msgid "Enter code verification here" msgstr "შეიყვáƒáƒœáƒ”თ დáƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒ”ბის კáƒáƒ“ი" #: ../ubuntu_sso/utils/ui.py:76 msgid "Please enter your name" msgstr "" #: ../ubuntu_sso/utils/ui.py:77 msgid "The process did not finish successfully." msgstr "პრáƒáƒªáƒ”სი დáƒáƒ¡áƒ áƒ£áƒšáƒ“რწáƒáƒ áƒ£áƒ›áƒáƒ¢áƒ”ბლáƒáƒ“." #: ../ubuntu_sso/utils/ui.py:79 msgid "Sign me in with my existing account" msgstr "" #: ../ubuntu_sso/utils/ui.py:80 msgid "This field is required." msgstr "ველი áƒáƒ£áƒªáƒ˜áƒšáƒ”ბელიáƒ." #: ../ubuntu_sso/utils/ui.py:81 msgid "I've forgotten my password" msgstr "პáƒáƒ áƒáƒšáƒ˜ დáƒáƒ›áƒáƒ•იწყდáƒ" #: ../ubuntu_sso/utils/ui.py:82 ../ubuntu_sso/utils/ui.py:130 msgid "Reset password" msgstr "პáƒáƒ áƒáƒšáƒ˜áƒ¡ ჩáƒáƒ›áƒáƒ§áƒ áƒ" #: ../ubuntu_sso/utils/ui.py:83 msgid "" "To reset your {app_name} password, enter your registered email address " "below. We will send instructions to reset your password." msgstr "" #: ../ubuntu_sso/utils/ui.py:86 msgid "Please enter a valid email address" msgstr "" #: ../ubuntu_sso/utils/ui.py:87 msgid "There was a problem accessing the Ubuntu Single Sign On backend." msgstr "" #: ../ubuntu_sso/utils/ui.py:89 #, python-format msgid "Create %(app_name)s account" msgstr "%(app_name)s áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜áƒ¡ შექმნáƒ" #: ../ubuntu_sso/utils/ui.py:90 msgid "Loading..." msgstr "იტვირთებáƒ..." #: ../ubuntu_sso/utils/ui.py:91 msgid "Getting information, please wait..." msgstr "" #: ../ubuntu_sso/utils/ui.py:92 msgid "Already have an account? Click here to sign in" msgstr "უკვე გáƒáƒ’áƒáƒ©áƒœáƒ˜áƒáƒ— áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜? შესვლისთვის დáƒáƒ¬áƒ™áƒáƒžáƒ”თ áƒáƒ¥" #: ../ubuntu_sso/utils/ui.py:94 #, python-format msgid "Connect to %(app_name)s" msgstr "დáƒáƒ™áƒáƒ•შირებრ%(app_name)s-თáƒáƒœ" #: ../ubuntu_sso/utils/ui.py:95 ../ubuntu_sso/utils/ui.py:109 msgid "Password" msgstr "პáƒáƒ áƒáƒšáƒ˜" #: ../ubuntu_sso/utils/ui.py:97 msgid "Sign In to {app_name}" msgstr "" #: ../ubuntu_sso/utils/ui.py:99 msgid "Name" msgstr "სáƒáƒ®áƒ”ლი" #: ../ubuntu_sso/utils/ui.py:100 msgid "The name must not be empty." msgstr "" #: ../ubuntu_sso/utils/ui.py:101 msgid "Next" msgstr "შემდეგ" #: ../ubuntu_sso/utils/ui.py:102 msgid "Network detection" msgstr "" #: ../ubuntu_sso/utils/ui.py:103 #, python-format msgid "" "Are you online? We can't detect an internet connection - you will need to be " "connected to set up %(app_name)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:105 msgid "One moment please..." msgstr "გთხáƒáƒ•თ დáƒáƒ˜áƒªáƒáƒ“áƒáƒ—..." #: ../ubuntu_sso/utils/ui.py:106 msgid "Create a password" msgstr "" #: ../ubuntu_sso/utils/ui.py:107 msgid "Your password was successfully changed." msgstr "თქვენი პáƒáƒ áƒáƒšáƒ˜ წáƒáƒ áƒ›áƒáƒ¢áƒ”ბით შეიცვáƒáƒšáƒ." #: ../ubuntu_sso/utils/ui.py:108 msgid "At least one number" msgstr "" #: ../ubuntu_sso/utils/ui.py:110 msgid "Re-type Password" msgstr "პáƒáƒ áƒáƒšáƒ˜ (ხელáƒáƒ®áƒšáƒ)" #: ../ubuntu_sso/utils/ui.py:111 msgid "" "The password must have a minimum of 8 characters and include one uppercase " "character and one number." msgstr "" "პáƒáƒ áƒáƒšáƒ˜ უნდრშედგებáƒáƒ“ეს სულ მცირე 8 სიმბáƒáƒšáƒáƒ“áƒáƒœ. ის უნდრშეიცáƒáƒ•დეს ერთი ზედრ" "რეგისტრის სიმბáƒáƒšáƒáƒ¡ დრერთ ციფრს." #: ../ubuntu_sso/utils/ui.py:113 msgid "At least 8 characters" msgstr "" #: ../ubuntu_sso/utils/ui.py:114 msgid "Passwords don't match" msgstr "" #: ../ubuntu_sso/utils/ui.py:115 msgid "" "The passwords don't match, please double check and try entering them again." msgstr "პáƒáƒ áƒáƒšáƒ”ბი áƒáƒ  ემთხვევრერთმáƒáƒœáƒ”თს. გáƒáƒ“áƒáƒáƒ›áƒáƒ¬áƒ›áƒ”თ დრკიდევ სცáƒáƒ“ეთ." #: ../ubuntu_sso/utils/ui.py:117 msgid "Your password must contain" msgstr "" #: ../ubuntu_sso/utils/ui.py:118 msgid "The password is too weak." msgstr "პáƒáƒ áƒáƒšáƒ˜ მეტისმეტáƒáƒ“ სუსტიáƒ." #: ../ubuntu_sso/utils/ui.py:119 msgid "At least one uppercase letter" msgstr "" #: ../ubuntu_sso/utils/ui.py:120 msgid "Privacy Policy" msgstr "" #: ../ubuntu_sso/utils/ui.py:121 msgid "Connecting to:" msgstr "" #: ../ubuntu_sso/utils/ui.py:122 msgid "Proxy Settings" msgstr "" #: ../ubuntu_sso/utils/ui.py:123 msgid "Incorrect login details. Please try again." msgstr "" #: ../ubuntu_sso/utils/ui.py:124 msgid "Please provide login details." msgstr "" #: ../ubuntu_sso/utils/ui.py:125 msgid "You are connecting through a proxy." msgstr "" #: ../ubuntu_sso/utils/ui.py:126 msgid "Get Help With Proxies" msgstr "" #: ../ubuntu_sso/utils/ui.py:127 msgid "Proxy password:" msgstr "" #: ../ubuntu_sso/utils/ui.py:128 msgid "Save and Connect" msgstr "" #: ../ubuntu_sso/utils/ui.py:129 msgid "Proxy username:" msgstr "" #: ../ubuntu_sso/utils/ui.py:131 msgid "" "A password reset code has been sent to your e-mail. Please enter the code " "below along with your new password." msgstr "" #: ../ubuntu_sso/utils/ui.py:133 msgid "Retype email" msgstr "" #: ../ubuntu_sso/utils/ui.py:134 msgid "Retype password" msgstr "" #: ../ubuntu_sso/utils/ui.py:135 #, python-format msgid "To reset your %(app_name)s password, enter your email address below:" msgstr "" "თქვენი %(app_name)s პáƒáƒ áƒáƒšáƒ˜áƒ¡ ჩáƒáƒ›áƒáƒ¡áƒáƒ§áƒ áƒ”ლáƒáƒ“, შეიყვáƒáƒœáƒ”თ თქვენი ელფáƒáƒ¡áƒ¢áƒ˜áƒ¡ " "მისáƒáƒ›áƒáƒ áƒ—ი:" #: ../ubuntu_sso/utils/ui.py:137 msgid "" "We are very Sorry! The service that signs you on is not responding right " "now\n" "Please try again or come back in a few minutes." msgstr "" #: ../ubuntu_sso/utils/ui.py:140 msgid "Sorry we did not recognize the email address." msgstr "" #: ../ubuntu_sso/utils/ui.py:142 msgid "Reset code" msgstr "ჩáƒáƒ›áƒáƒ§áƒ áƒ˜áƒ¡ კáƒáƒ“ი" #: ../ubuntu_sso/utils/ui.py:145 #, python-format msgid "" "A password reset code has been sent to %(email)s.\n" "Please enter the code below along with your new password." msgstr "" "პáƒáƒ áƒáƒšáƒ˜áƒ¡ ჩáƒáƒ›áƒáƒ¡áƒáƒ§áƒ áƒ”ლი კáƒáƒ“ი გáƒáƒ’ზáƒáƒ•ნილი იქნრმისáƒáƒ›áƒáƒ áƒ—ზე %(email)s.\n" "გთხáƒáƒ•თ შეიყვáƒáƒœáƒáƒ— კáƒáƒ“ი დრáƒáƒ’რეთვე მიუთითáƒáƒ— áƒáƒ®áƒáƒšáƒ˜ პáƒáƒ áƒáƒšáƒ˜." #: ../ubuntu_sso/utils/ui.py:147 msgid "Set Up Account" msgstr "" #: ../ubuntu_sso/utils/ui.py:148 msgid "I don't have an account yet - sign me up" msgstr "" #: ../ubuntu_sso/utils/ui.py:149 msgid "Sign In" msgstr "" #: ../ubuntu_sso/utils/ui.py:150 msgid "Log-in with my existing account." msgstr "" #: ../ubuntu_sso/utils/ui.py:151 msgid "the appname whose ssl error we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:152 msgid "Certificate details" msgstr "" #: ../ubuntu_sso/utils/ui.py:153 msgid "Connect" msgstr "" #: ../ubuntu_sso/utils/ui.py:154 msgid "the details ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:161 msgid "Open the SSL certificate UI." msgstr "" #: ../ubuntu_sso/utils/ui.py:162 msgid "SSL Certificate Not Valid" msgstr "" #: ../ubuntu_sso/utils/ui.py:163 msgid "the domain whose ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:164 #, python-format msgid "" "You are trying to connect to a proxy server on %(domain)s. This server uses " "a secure connection, and the SSL certificate is not valid because:" msgstr "" #: ../ubuntu_sso/utils/ui.py:167 msgid "The certificate has not been verified" msgstr "" #: ../ubuntu_sso/utils/ui.py:168 msgid "Do you want to connect to this server?" msgstr "" #: ../ubuntu_sso/utils/ui.py:169 msgid "Get Help With SSL" msgstr "" #: ../ubuntu_sso/utils/ui.py:170 #, python-format msgid "" "If you are not sure about this server, do not use it to connect to " "%(app_name)s." msgstr "" #: ../ubuntu_sso/utils/ui.py:172 msgid "Remember my settings for this certificate." msgstr "" #: ../ubuntu_sso/utils/ui.py:173 msgid "" "The name on the certificate isn't valid or doesn't match the name of the site" msgstr "" #: ../ubuntu_sso/utils/ui.py:175 msgid "The certificate has expired" msgstr "" #: ../ubuntu_sso/utils/ui.py:176 #, python-format msgid "You are now logged into %(app_name)s." msgstr "" #: ../ubuntu_sso/utils/ui.py:177 msgid "Surname" msgstr "" #: ../ubuntu_sso/utils/ui.py:178 msgid "Terms of Service" msgstr "" #: ../ubuntu_sso/utils/ui.py:179 msgid "Sign Up to {app_name}" msgstr "" #: ../ubuntu_sso/utils/ui.py:180 msgid "Show Terms & Conditions" msgstr "გáƒáƒ›áƒáƒ§áƒ”ნების წესებისრდრპირáƒáƒ‘ების ჩვენებáƒ" #: ../ubuntu_sso/utils/ui.py:181 #, python-format msgid "" "Agreeing to the %(app_name)s Terms & Conditions is required to subscribe." msgstr "" #: ../ubuntu_sso/utils/ui.py:183 #, python-format msgid "You can also find these terms at %(url)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:184 msgid "Try again" msgstr "" #: ../ubuntu_sso/utils/ui.py:185 msgid "" "There was an error when trying to complete the process. Please check the " "information and try again." msgstr "" "პრáƒáƒªáƒ”სის დáƒáƒ¡áƒ áƒ£áƒšáƒ”ბისáƒáƒ¡ დáƒáƒ˜áƒ¨áƒ•რშეცდáƒáƒ›áƒ. გáƒáƒ“áƒáƒáƒ›áƒáƒ¬áƒ›áƒ”თ ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ დრკიდევ სცáƒáƒ“ეთ." #: ../ubuntu_sso/utils/ui.py:187 msgid "Verification code" msgstr "" #: ../ubuntu_sso/utils/ui.py:188 #, python-format msgid "" "Check %(email)s for an email from Ubuntu Single Sign On. This message " "contains a verification code. Enter the code in the field below and click OK " "to complete creating your %(app_name)s account." msgstr "" #: ../ubuntu_sso/utils/ui.py:192 msgid "Enter verification code" msgstr "შეიყვáƒáƒœáƒ”თ დáƒáƒ›áƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒ”ბელი კáƒáƒ“ი" #: ../ubuntu_sso/utils/ui.py:195 #, python-format msgid "I agree with the %(app_name)s terms and conditions" msgstr "ვეთáƒáƒœáƒ®áƒ›áƒ”ბი %(app_name)s-ს გáƒáƒ›áƒáƒ§áƒ”ნების წესებსრდრპირáƒáƒ‘ებს" #: ../ubuntu_sso/utils/ui.py:196 #, python-format msgid "Yes! Email me %(app_name)s tips and updates." msgstr "დიáƒáƒ®! გáƒáƒ›áƒáƒ›áƒ˜áƒ’ზáƒáƒ•ნეთ %(app_name)s-სთáƒáƒœ დáƒáƒ™áƒáƒ•შირებული სიáƒáƒ®áƒšáƒ”ები." ubuntu-sso-client-13.10/po/oc.po0000664000202700020270000003667112151461656016745 0ustar dobeydobey00000000000000# Occitan (post 1500) translation for ubuntu-sso-client # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the ubuntu-sso-client package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: ubuntu-sso-client\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-09-11 18:25+0000\n" "PO-Revision-Date: 2012-09-16 07:14+0000\n" "Last-Translator: Cédric VALMARY (Tot en òc) \n" "Language-Team: Occitan (post 1500) \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-09-17 18:24+0000\n" "X-Generator: Launchpad (build 15944)\n" #. Undefined variable '_', pylint: disable=E0602 #. all the text that is used in the gui #: ../ubuntu_sso/utils/ui.py:49 msgid "By signing up to {app_name} you agree to our {privacy_policy}" msgstr "En vos connectant a {app_name}, acceptatz nòstras {privacy_policy}" #: ../ubuntu_sso/utils/ui.py:51 msgid "By signing up to {app_name} you agree to our {terms_and_conditions}" msgstr "" "En vos connectant a {app_name}, acceptatz nòstres {terms_and_conditions}" #: ../ubuntu_sso/utils/ui.py:53 msgid " and {privacy_policy}" msgstr " e {privacy_policy}" #: ../ubuntu_sso/utils/ui.py:54 msgid "Cancel" msgstr "Anullar" #: ../ubuntu_sso/utils/ui.py:55 msgid "Type the characters above" msgstr "Picatz los caractèrs çaisús" #: ../ubuntu_sso/utils/ui.py:56 msgid "There was a problem getting the captcha, reloading..." msgstr "I a agut un problèma d'obtencion del captcha. Recargament en cors..." #: ../ubuntu_sso/utils/ui.py:58 #, python-format msgid "If you can't read this then %(reload_link)s this page" msgstr "Se capitatz pas de legir, alara %(reload_link)s aquesta pagina" #: ../ubuntu_sso/utils/ui.py:60 msgid "refresh" msgstr "actualizatz" #: ../ubuntu_sso/utils/ui.py:61 msgid "Reload" msgstr "Actualizar" #: ../ubuntu_sso/utils/ui.py:62 msgid "The captcha is a required field" msgstr "Lo captcha es un camp necessari" #: ../ubuntu_sso/utils/ui.py:63 msgid "Close window and set up later" msgstr "Tampar la fenèstra e configurar pus tard" #: ../ubuntu_sso/utils/ui.py:64 msgid "Congratulations, {app_name} is installed!" msgstr "Felicitacions, {app_name} es installat !" #: ../ubuntu_sso/utils/ui.py:65 #, python-format msgid "To connect this computer to %(app_name)s enter your details below." msgstr "" "Per connectar aqueste ordenador a %(app_name)s, picatz vòstras donadas " "çaijós." #: ../ubuntu_sso/utils/ui.py:67 msgid "Register with {app_name}." msgstr "Enregistratz-vos amb {app_name}." #: ../ubuntu_sso/utils/ui.py:68 ../ubuntu_sso/utils/ui.py:93 #: ../ubuntu_sso/utils/ui.py:143 msgid "Email address" msgstr "Adreça electronica" #: ../ubuntu_sso/utils/ui.py:69 msgid "Re-type Email address" msgstr "Picatz vòstra adreça de corrièl tornarmai" #: ../ubuntu_sso/utils/ui.py:70 msgid "The email must be a valid email address." msgstr "L'adreça de corrièr electronic deu èsser valida." #: ../ubuntu_sso/utils/ui.py:71 msgid "" "The email addresses don't match, please double check and try entering them " "again." msgstr "" "Las adreças correspondon pas. Verificatz-las menimosament e ensajatz de las " "picar tornarmai." #: ../ubuntu_sso/utils/ui.py:73 msgid "Email" msgstr "Adreça electronica" #: ../ubuntu_sso/utils/ui.py:74 msgid "The email addresses do not match" msgstr "Las adreças correspondon pas" #: ../ubuntu_sso/utils/ui.py:75 msgid "Enter code verification here" msgstr "Picatz lo còde de verificacion aicí" #: ../ubuntu_sso/utils/ui.py:76 msgid "Please enter your name" msgstr "Picatz vòstre nom" #: ../ubuntu_sso/utils/ui.py:77 msgid "The process did not finish successfully." msgstr "Lo processus s'es pas acabat amb succès." #: ../ubuntu_sso/utils/ui.py:79 msgid "Sign me in with my existing account" msgstr "Me connectar amb mon compte" #: ../ubuntu_sso/utils/ui.py:80 msgid "This field is required." msgstr "Aqueste camp es obligatòri." #: ../ubuntu_sso/utils/ui.py:81 msgid "I've forgotten my password" msgstr "Ai doblidat mon senhal" #: ../ubuntu_sso/utils/ui.py:82 ../ubuntu_sso/utils/ui.py:130 msgid "Reset password" msgstr "Reïnicializar lo senhal" #: ../ubuntu_sso/utils/ui.py:83 msgid "" "To reset your {app_name} password, enter your registered email address " "below. We will send instructions to reset your password." msgstr "" "Per reïnicializar lo senhal de {app_name}, picatz çaijós l'adreça de " "corrièl utilizada al moment de vòstra inscripcion. Vos mandarem las " "instruccions necessàrias per reïnicializar vòstre senhal." #: ../ubuntu_sso/utils/ui.py:86 msgid "Please enter a valid email address" msgstr "Entratz una adreça de corrièl valida" #: ../ubuntu_sso/utils/ui.py:87 msgid "There was a problem accessing the Ubuntu Single Sign On backend." msgstr "" "Un problèma s'es produch al moment de l'accès a Ubuntu Single Sign On." #: ../ubuntu_sso/utils/ui.py:89 #, python-format msgid "Create %(app_name)s account" msgstr "Crear un compte %(app_name)s" #: ../ubuntu_sso/utils/ui.py:90 msgid "Loading..." msgstr "Cargament en cors..." #: ../ubuntu_sso/utils/ui.py:91 msgid "Getting information, please wait..." msgstr "Obtencion de las informacions, pacientatz..." #: ../ubuntu_sso/utils/ui.py:92 msgid "Already have an account? Click here to sign in" msgstr "Avètz ja un compte ? Clicatz aicí per vos i connectar." #: ../ubuntu_sso/utils/ui.py:94 #, python-format msgid "Connect to %(app_name)s" msgstr "Se connectar a %(app_name)s" #: ../ubuntu_sso/utils/ui.py:95 ../ubuntu_sso/utils/ui.py:109 msgid "Password" msgstr "Senhal" #: ../ubuntu_sso/utils/ui.py:97 msgid "Sign In to {app_name}" msgstr "Se connectar a {app_name}" #: ../ubuntu_sso/utils/ui.py:99 msgid "Name" msgstr "Nom" #: ../ubuntu_sso/utils/ui.py:100 msgid "The name must not be empty." msgstr "Lo nom deu pas èsser void." #: ../ubuntu_sso/utils/ui.py:101 msgid "Next" msgstr "Seguent" #: ../ubuntu_sso/utils/ui.py:102 msgid "Network detection" msgstr "Deteccion de la ret" #: ../ubuntu_sso/utils/ui.py:103 #, python-format msgid "" "Are you online? We can't detect an internet connection - you will need to be " "connected to set up %(app_name)s" msgstr "" "Sètz en linha ? Cap de connexion a Internet es pas estada detectada - vos " "cal vos connectar per configurar %(app_name)s" #: ../ubuntu_sso/utils/ui.py:105 msgid "One moment please..." msgstr "Pacientatz..." #: ../ubuntu_sso/utils/ui.py:106 msgid "Create a password" msgstr "Picar un mot senhal" #: ../ubuntu_sso/utils/ui.py:107 msgid "Your password was successfully changed." msgstr "Vòstre senhal es estat cambiat amb succès" #: ../ubuntu_sso/utils/ui.py:108 msgid "At least one number" msgstr "Al mens una chifra" #: ../ubuntu_sso/utils/ui.py:110 msgid "Re-type Password" msgstr "Picatz lo senhal tornarmai" #: ../ubuntu_sso/utils/ui.py:111 msgid "" "The password must have a minimum of 8 characters and include one uppercase " "character and one number." msgstr "" "Lo senhal deu aver al minimum 8 caractèrs e inclòure una majuscula e una " "chifra." #: ../ubuntu_sso/utils/ui.py:113 msgid "At least 8 characters" msgstr "Al mens 8 caractèrs" #: ../ubuntu_sso/utils/ui.py:114 msgid "Passwords don't match" msgstr "Los senhals correspondon pas" #: ../ubuntu_sso/utils/ui.py:115 msgid "" "The passwords don't match, please double check and try entering them again." msgstr "" "Los senhals correspondon pas. Verificatz-los menimosament e ensajatz de las " "picar tornarmai." #: ../ubuntu_sso/utils/ui.py:117 msgid "Your password must contain" msgstr "Vòstre senhal deu comportar" #: ../ubuntu_sso/utils/ui.py:118 msgid "The password is too weak." msgstr "Lo senhal es tròp feble." #: ../ubuntu_sso/utils/ui.py:119 msgid "At least one uppercase letter" msgstr "Al mens una letra majuscula" #: ../ubuntu_sso/utils/ui.py:120 msgid "Privacy Policy" msgstr "Politica de confidencialitat" #: ../ubuntu_sso/utils/ui.py:121 msgid "Connecting to:" msgstr "Connexion a :" #: ../ubuntu_sso/utils/ui.py:122 msgid "Proxy Settings" msgstr "Paramètres del servidor mandatari" #: ../ubuntu_sso/utils/ui.py:123 msgid "Incorrect login details. Please try again." msgstr "Informacions de connexion incorrèctas. Tornatz ensajar." #: ../ubuntu_sso/utils/ui.py:124 msgid "Please provide login details." msgstr "Picatz vòstras informacions de connexion." #: ../ubuntu_sso/utils/ui.py:125 msgid "You are connecting through a proxy." msgstr "Vos connectatz a travèrs un servidor mandatari." #: ../ubuntu_sso/utils/ui.py:126 msgid "Get Help With Proxies" msgstr "Obténer d'ajuda a prepaus dels servidors mandataris" #: ../ubuntu_sso/utils/ui.py:127 msgid "Proxy password:" msgstr "Senhal del proxy :" #: ../ubuntu_sso/utils/ui.py:128 msgid "Save and Connect" msgstr "Salvar e se connectar" #: ../ubuntu_sso/utils/ui.py:129 msgid "Proxy username:" msgstr "Nom d'utilizaire del proxy :" #: ../ubuntu_sso/utils/ui.py:131 msgid "" "A password reset code has been sent to your e-mail. Please enter the code " "below along with your new password." msgstr "" "Un còde de reïnicializacion del senhal es estat mandat a vòstra adreça de " "corrièl. Picatz aqueste còde çaijós amb vòstre senhal novèl." #: ../ubuntu_sso/utils/ui.py:133 msgid "Retype email" msgstr "Tornar picar l'adreça de corrièl" #: ../ubuntu_sso/utils/ui.py:134 msgid "Retype password" msgstr "Tornar picar lo senhal" #: ../ubuntu_sso/utils/ui.py:135 #, python-format msgid "To reset your %(app_name)s password, enter your email address below:" msgstr "" "Per reïnicializar vòstre senhal per %(app_name)s, picatz vòstra adreça de " "corrièl çaijós :" #: ../ubuntu_sso/utils/ui.py:137 msgid "" "We are very Sorry! The service that signs you on is not responding right " "now\n" "Please try again or come back in a few minutes." msgstr "" "O planhèm ! Lo servici que permet de vos inscriure respond pas pel moment\n" "Tornatz ensajar ara o dins qualques minutas." #: ../ubuntu_sso/utils/ui.py:140 msgid "Sorry we did not recognize the email address." msgstr "O planhèm, avèm pas reconegut l'adreça de corrièl." #: ../ubuntu_sso/utils/ui.py:142 msgid "Reset code" msgstr "Còde de reïnicializacion" #: ../ubuntu_sso/utils/ui.py:145 #, python-format msgid "" "A password reset code has been sent to %(email)s.\n" "Please enter the code below along with your new password." msgstr "" "Un còde de reïnicializacion del senhal es estat mandat a %(email)s.\n" "Entratz lo còde çaijós amb vòstre senhal novèl." #: ../ubuntu_sso/utils/ui.py:147 msgid "Set Up Account" msgstr "Configurar lo compte" #: ../ubuntu_sso/utils/ui.py:148 msgid "I don't have an account yet - sign me up" msgstr "Ai pas de compte - Me marcar" #: ../ubuntu_sso/utils/ui.py:149 msgid "Sign In" msgstr "Me connectar" #: ../ubuntu_sso/utils/ui.py:150 msgid "Log-in with my existing account." msgstr "Se connectar amb mon compte existent." #: ../ubuntu_sso/utils/ui.py:151 msgid "the appname whose ssl error we are going to show." msgstr "lo nom de l'aplicacion que se ne va afichar l'error SSL." #: ../ubuntu_sso/utils/ui.py:152 msgid "Certificate details" msgstr "Entresenhas de certificat" #: ../ubuntu_sso/utils/ui.py:153 msgid "Connect" msgstr "Se connectar" #: ../ubuntu_sso/utils/ui.py:154 msgid "the details ssl certificate we are going to show." msgstr "las informacions del certificat SSL que se va afichar." #: ../ubuntu_sso/utils/ui.py:161 msgid "Open the SSL certificate UI." msgstr "Dobrir l'interfàcia d'utilizaire pel certificat SSL." #: ../ubuntu_sso/utils/ui.py:162 msgid "SSL Certificate Not Valid" msgstr "Certificat SSL invalid" #: ../ubuntu_sso/utils/ui.py:163 msgid "the domain whose ssl certificate we are going to show." msgstr "lo domeni que se ne va afichar lo certificat SSL." #: ../ubuntu_sso/utils/ui.py:164 #, python-format msgid "" "You are trying to connect to a proxy server on %(domain)s. This server uses " "a secure connection, and the SSL certificate is not valid because:" msgstr "" "Ensajatz de vos connectar a un servidor mandatari sus %(domain)s. Aqueste " "servidor utiliza una connexion securizada e lo certificat SSL es pas valid " "perque :" #: ../ubuntu_sso/utils/ui.py:167 msgid "The certificate has not been verified" msgstr "Lo certificat es pas estat verificat" #: ../ubuntu_sso/utils/ui.py:168 msgid "Do you want to connect to this server?" msgstr "Vos volètz connectar a aqueste servidor ?" #: ../ubuntu_sso/utils/ui.py:169 msgid "Get Help With SSL" msgstr "Obténer d'ajuda a prepaus de SSL" #: ../ubuntu_sso/utils/ui.py:170 #, python-format msgid "" "If you are not sure about this server, do not use it to connect to " "%(app_name)s." msgstr "" "Se sètz pas segur d'aqueste servidor, i vos connectetz pas amb %(app_name)s." #: ../ubuntu_sso/utils/ui.py:172 msgid "Remember my settings for this certificate." msgstr "Se remembrar de mas preferéncias per aqueste certificat." #: ../ubuntu_sso/utils/ui.py:173 msgid "" "The name on the certificate isn't valid or doesn't match the name of the site" msgstr "" "Lo nom del certificat es invalid o alara correspond pas al nom del site" #: ../ubuntu_sso/utils/ui.py:175 msgid "The certificate has expired" msgstr "Lo certificat a expirat" #: ../ubuntu_sso/utils/ui.py:176 #, python-format msgid "You are now logged into %(app_name)s." msgstr "Ara, sètz connectat a %(app_name)s." #: ../ubuntu_sso/utils/ui.py:177 msgid "Surname" msgstr "Nom d'Ostal" #: ../ubuntu_sso/utils/ui.py:178 msgid "Terms of Service" msgstr "Condicions d'utilizacion" #: ../ubuntu_sso/utils/ui.py:179 msgid "Sign Up to {app_name}" msgstr "S'inscriure sus {app_name}" #: ../ubuntu_sso/utils/ui.py:180 msgid "Show Terms & Conditions" msgstr "Afichar los tèrmes de la licéncia" #: ../ubuntu_sso/utils/ui.py:181 #, python-format msgid "" "Agreeing to the %(app_name)s Terms & Conditions is required to subscribe." msgstr "" "Es necessari d'acceptar las condicions d'utilizacion de %(app_name)s per se " "poder inscriure." #: ../ubuntu_sso/utils/ui.py:183 #, python-format msgid "You can also find these terms at %(url)s" msgstr "" "Tanben podètz trobar aquelas condicions d'utilizacion sus %(url)s" #: ../ubuntu_sso/utils/ui.py:184 msgid "Try again" msgstr "Tornar ensajar" #: ../ubuntu_sso/utils/ui.py:185 msgid "" "There was an error when trying to complete the process. Please check the " "information and try again." msgstr "" "Una error s'es producha al moment de la finalizacion del processus. " "Verificatz las informacions e tornatz ensajar." #: ../ubuntu_sso/utils/ui.py:187 msgid "Verification code" msgstr "Còde de verificacion" #: ../ubuntu_sso/utils/ui.py:188 #, python-format msgid "" "Check %(email)s for an email from Ubuntu Single Sign On. This message " "contains a verification code. Enter the code in the field below and click OK " "to complete creating your %(app_name)s account." msgstr "" "Verificatz dins %(email)s s'avètz recebut un corrièl que proven d'Ubuntu " "Single Sign On. Aqueste messatge conten un còde de verificacion. PIcatz " "aqueste còde dins lo camp çaijós e clicatz sus OK per acabar la creacion de " "vòstre compte %(app_name)s." #: ../ubuntu_sso/utils/ui.py:192 msgid "Enter verification code" msgstr "Picatz lo còde de verificacion" #: ../ubuntu_sso/utils/ui.py:195 #, python-format msgid "I agree with the %(app_name)s terms and conditions" msgstr "Soi d'acòrdi amb los tèrmes de la licéncia de %(app_name)s" #: ../ubuntu_sso/utils/ui.py:196 #, python-format msgid "Yes! Email me %(app_name)s tips and updates." msgstr "Ã’c ! Mandatz-me los conselhs e las mesas a jorn de %(app_name)s." ubuntu-sso-client-13.10/po/en_GB.po0000664000202700020270000003512612151461656017310 0ustar dobeydobey00000000000000# English (United Kingdom) translation for ubuntu-sso-client # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the ubuntu-sso-client package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: ubuntu-sso-client\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-09-11 18:25+0000\n" "PO-Revision-Date: 2012-09-08 10:51+0000\n" "Last-Translator: Andi Chandler \n" "Language-Team: English (United Kingdom) \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-09-17 18:24+0000\n" "X-Generator: Launchpad (build 15944)\n" #. Undefined variable '_', pylint: disable=E0602 #. all the text that is used in the gui #: ../ubuntu_sso/utils/ui.py:49 msgid "By signing up to {app_name} you agree to our {privacy_policy}" msgstr "By signing up to {app_name} you agree to our {privacy_policy}" #: ../ubuntu_sso/utils/ui.py:51 msgid "By signing up to {app_name} you agree to our {terms_and_conditions}" msgstr "By signing up to {app_name} you agree to our {terms_and_conditions}" #: ../ubuntu_sso/utils/ui.py:53 msgid " and {privacy_policy}" msgstr " and {privacy_policy}" #: ../ubuntu_sso/utils/ui.py:54 msgid "Cancel" msgstr "Cancel" #: ../ubuntu_sso/utils/ui.py:55 msgid "Type the characters above" msgstr "Type the characters above" #: ../ubuntu_sso/utils/ui.py:56 msgid "There was a problem getting the captcha, reloading..." msgstr "There was a problem getting the captcha; reloading..." #: ../ubuntu_sso/utils/ui.py:58 #, python-format msgid "If you can't read this then %(reload_link)s this page" msgstr "If you can't read this then %(reload_link)s this page" #: ../ubuntu_sso/utils/ui.py:60 msgid "refresh" msgstr "refresh" #: ../ubuntu_sso/utils/ui.py:61 msgid "Reload" msgstr "Reload" #: ../ubuntu_sso/utils/ui.py:62 msgid "The captcha is a required field" msgstr "The captcha is a required field" #: ../ubuntu_sso/utils/ui.py:63 msgid "Close window and set up later" msgstr "Close window and set up later" #: ../ubuntu_sso/utils/ui.py:64 msgid "Congratulations, {app_name} is installed!" msgstr "Congratulations, {app_name} is installed!" #: ../ubuntu_sso/utils/ui.py:65 #, python-format msgid "To connect this computer to %(app_name)s enter your details below." msgstr "To connect this computer to %(app_name)s enter your details below." #: ../ubuntu_sso/utils/ui.py:67 msgid "Register with {app_name}." msgstr "Register with {app_name}." #: ../ubuntu_sso/utils/ui.py:68 ../ubuntu_sso/utils/ui.py:93 #: ../ubuntu_sso/utils/ui.py:143 msgid "Email address" msgstr "E-mail address" #: ../ubuntu_sso/utils/ui.py:69 msgid "Re-type Email address" msgstr "Re-type E-mail address" #: ../ubuntu_sso/utils/ui.py:70 msgid "The email must be a valid email address." msgstr "The e-mail must be a valid address." #: ../ubuntu_sso/utils/ui.py:71 msgid "" "The email addresses don't match, please double check and try entering them " "again." msgstr "" "The e-mail addresses do not match, please double check and try entering them " "again." #: ../ubuntu_sso/utils/ui.py:73 msgid "Email" msgstr "E-mail" #: ../ubuntu_sso/utils/ui.py:74 msgid "The email addresses do not match" msgstr "The e-mail addresses do not match" #: ../ubuntu_sso/utils/ui.py:75 msgid "Enter code verification here" msgstr "Enter code verification here" #: ../ubuntu_sso/utils/ui.py:76 msgid "Please enter your name" msgstr "Please enter your name" #: ../ubuntu_sso/utils/ui.py:77 msgid "The process did not finish successfully." msgstr "The process did not finish successfully." #: ../ubuntu_sso/utils/ui.py:79 msgid "Sign me in with my existing account" msgstr "Sign me in with my existing account" #: ../ubuntu_sso/utils/ui.py:80 msgid "This field is required." msgstr "This field is required." #: ../ubuntu_sso/utils/ui.py:81 msgid "I've forgotten my password" msgstr "I've forgotten my password" #: ../ubuntu_sso/utils/ui.py:82 ../ubuntu_sso/utils/ui.py:130 msgid "Reset password" msgstr "Reset password" #: ../ubuntu_sso/utils/ui.py:83 msgid "" "To reset your {app_name} password, enter your registered email address " "below. We will send instructions to reset your password." msgstr "" "To reset your {app_name} password, enter your registered e-mail address " "below. We will send instructions to reset your password." #: ../ubuntu_sso/utils/ui.py:86 msgid "Please enter a valid email address" msgstr "Please enter a valid e-mail address" #: ../ubuntu_sso/utils/ui.py:87 msgid "There was a problem accessing the Ubuntu Single Sign On backend." msgstr "There was a problem accessing the Ubuntu Single Sign On backend." #: ../ubuntu_sso/utils/ui.py:89 #, python-format msgid "Create %(app_name)s account" msgstr "Create %(app_name)s account" #: ../ubuntu_sso/utils/ui.py:90 msgid "Loading..." msgstr "Loading..." #: ../ubuntu_sso/utils/ui.py:91 msgid "Getting information, please wait..." msgstr "Getting information, please wait..." #: ../ubuntu_sso/utils/ui.py:92 msgid "Already have an account? Click here to sign in" msgstr "Already have an account? Click here to sign in" #: ../ubuntu_sso/utils/ui.py:94 #, python-format msgid "Connect to %(app_name)s" msgstr "Connect to %(app_name)s" #: ../ubuntu_sso/utils/ui.py:95 ../ubuntu_sso/utils/ui.py:109 msgid "Password" msgstr "Password" #: ../ubuntu_sso/utils/ui.py:97 msgid "Sign In to {app_name}" msgstr "Sign In to {app_name}" #: ../ubuntu_sso/utils/ui.py:99 msgid "Name" msgstr "Name" #: ../ubuntu_sso/utils/ui.py:100 msgid "The name must not be empty." msgstr "The name must not be empty." #: ../ubuntu_sso/utils/ui.py:101 msgid "Next" msgstr "Next" #: ../ubuntu_sso/utils/ui.py:102 msgid "Network detection" msgstr "Network detection" #: ../ubuntu_sso/utils/ui.py:103 #, python-format msgid "" "Are you online? We can't detect an internet connection - you will need to be " "connected to set up %(app_name)s" msgstr "" "Are you online? We can't detect an internet connection - you will need to be " "connected to set up %(app_name)s" #: ../ubuntu_sso/utils/ui.py:105 msgid "One moment please..." msgstr "One moment please..." #: ../ubuntu_sso/utils/ui.py:106 msgid "Create a password" msgstr "Create a password" #: ../ubuntu_sso/utils/ui.py:107 msgid "Your password was successfully changed." msgstr "Your password was successfully changed." #: ../ubuntu_sso/utils/ui.py:108 msgid "At least one number" msgstr "At least one number" #: ../ubuntu_sso/utils/ui.py:110 msgid "Re-type Password" msgstr "Re-type Password" #: ../ubuntu_sso/utils/ui.py:111 msgid "" "The password must have a minimum of 8 characters and include one uppercase " "character and one number." msgstr "" "The password must have a minimum of 8 characters and include one uppercase " "character and one number." #: ../ubuntu_sso/utils/ui.py:113 msgid "At least 8 characters" msgstr "At least 8 characters" #: ../ubuntu_sso/utils/ui.py:114 msgid "Passwords don't match" msgstr "Passwords don't match" #: ../ubuntu_sso/utils/ui.py:115 msgid "" "The passwords don't match, please double check and try entering them again." msgstr "" "The passwords do not match, please double check and try entering them again." #: ../ubuntu_sso/utils/ui.py:117 msgid "Your password must contain" msgstr "Your password must contain" #: ../ubuntu_sso/utils/ui.py:118 msgid "The password is too weak." msgstr "The password is too weak." #: ../ubuntu_sso/utils/ui.py:119 msgid "At least one uppercase letter" msgstr "At least one uppercase letter" #: ../ubuntu_sso/utils/ui.py:120 msgid "Privacy Policy" msgstr "Privacy Policy" #: ../ubuntu_sso/utils/ui.py:121 msgid "Connecting to:" msgstr "Connecting to:" #: ../ubuntu_sso/utils/ui.py:122 msgid "Proxy Settings" msgstr "Proxy Settings" #: ../ubuntu_sso/utils/ui.py:123 msgid "Incorrect login details. Please try again." msgstr "Incorrect login details. Please try again." #: ../ubuntu_sso/utils/ui.py:124 msgid "Please provide login details." msgstr "Please provide login details." #: ../ubuntu_sso/utils/ui.py:125 msgid "You are connecting through a proxy." msgstr "You are connecting through a proxy." #: ../ubuntu_sso/utils/ui.py:126 msgid "Get Help With Proxies" msgstr "Get Help With Proxies" #: ../ubuntu_sso/utils/ui.py:127 msgid "Proxy password:" msgstr "Proxy password:" #: ../ubuntu_sso/utils/ui.py:128 msgid "Save and Connect" msgstr "Save and Connect" #: ../ubuntu_sso/utils/ui.py:129 msgid "Proxy username:" msgstr "Proxy username:" #: ../ubuntu_sso/utils/ui.py:131 msgid "" "A password reset code has been sent to your e-mail. Please enter the code " "below along with your new password." msgstr "" "A password reset code has been sent to your e-mail. Please enter the code " "below along with your new password." #: ../ubuntu_sso/utils/ui.py:133 msgid "Retype email" msgstr "Retype e-mail" #: ../ubuntu_sso/utils/ui.py:134 msgid "Retype password" msgstr "Retype password" #: ../ubuntu_sso/utils/ui.py:135 #, python-format msgid "To reset your %(app_name)s password, enter your email address below:" msgstr "" "To reset your %(app_name)s password, enter your e-mail address below:" #: ../ubuntu_sso/utils/ui.py:137 msgid "" "We are very Sorry! The service that signs you on is not responding right " "now\n" "Please try again or come back in a few minutes." msgstr "" "We are very Sorry! The service that signs you on is not responding right " "now.\n" "Please try again or come back in a few minutes." #: ../ubuntu_sso/utils/ui.py:140 msgid "Sorry we did not recognize the email address." msgstr "Sorry, we did not recognise the e-mail address." #: ../ubuntu_sso/utils/ui.py:142 msgid "Reset code" msgstr "Reset code" #: ../ubuntu_sso/utils/ui.py:145 #, python-format msgid "" "A password reset code has been sent to %(email)s.\n" "Please enter the code below along with your new password." msgstr "" "A password reset code has been sent to %(email)s.\n" "Please enter the code below along with your new password." #: ../ubuntu_sso/utils/ui.py:147 msgid "Set Up Account" msgstr "Set Up Account" #: ../ubuntu_sso/utils/ui.py:148 msgid "I don't have an account yet - sign me up" msgstr "I don't have an account yet - sign me up" #: ../ubuntu_sso/utils/ui.py:149 msgid "Sign In" msgstr "Sign In" #: ../ubuntu_sso/utils/ui.py:150 msgid "Log-in with my existing account." msgstr "Log-in with my existing account." #: ../ubuntu_sso/utils/ui.py:151 msgid "the appname whose ssl error we are going to show." msgstr "the appname whose ssl error we are going to show." #: ../ubuntu_sso/utils/ui.py:152 msgid "Certificate details" msgstr "Certificate details" #: ../ubuntu_sso/utils/ui.py:153 msgid "Connect" msgstr "Connect" #: ../ubuntu_sso/utils/ui.py:154 msgid "the details ssl certificate we are going to show." msgstr "the details ssl certificate we are going to show." #: ../ubuntu_sso/utils/ui.py:161 msgid "Open the SSL certificate UI." msgstr "Open the SSL certificate UI." #: ../ubuntu_sso/utils/ui.py:162 msgid "SSL Certificate Not Valid" msgstr "SSL Certificate Not Valid" #: ../ubuntu_sso/utils/ui.py:163 msgid "the domain whose ssl certificate we are going to show." msgstr "the domain whose ssl certificate we are going to show." #: ../ubuntu_sso/utils/ui.py:164 #, python-format msgid "" "You are trying to connect to a proxy server on %(domain)s. This server uses " "a secure connection, and the SSL certificate is not valid because:" msgstr "" "You are trying to connect to a proxy server on %(domain)s. This server uses " "a secure connection, and the SSL certificate is not valid because:" #: ../ubuntu_sso/utils/ui.py:167 msgid "The certificate has not been verified" msgstr "The certificate has not been verified" #: ../ubuntu_sso/utils/ui.py:168 msgid "Do you want to connect to this server?" msgstr "Do you want to connect to this server?" #: ../ubuntu_sso/utils/ui.py:169 msgid "Get Help With SSL" msgstr "Get Help With SSL" #: ../ubuntu_sso/utils/ui.py:170 #, python-format msgid "" "If you are not sure about this server, do not use it to connect to " "%(app_name)s." msgstr "" "If you are not sure about this server, do not use it to connect to " "%(app_name)s." #: ../ubuntu_sso/utils/ui.py:172 msgid "Remember my settings for this certificate." msgstr "Remember my settings for this certificate." #: ../ubuntu_sso/utils/ui.py:173 msgid "" "The name on the certificate isn't valid or doesn't match the name of the site" msgstr "" "The name on the certificate isn't valid or doesn't match the name of the site" #: ../ubuntu_sso/utils/ui.py:175 msgid "The certificate has expired" msgstr "The certificate has expired" #: ../ubuntu_sso/utils/ui.py:176 #, python-format msgid "You are now logged into %(app_name)s." msgstr "You are now logged into %(app_name)s." #: ../ubuntu_sso/utils/ui.py:177 msgid "Surname" msgstr "Surname" #: ../ubuntu_sso/utils/ui.py:178 msgid "Terms of Service" msgstr "Terms of Service" #: ../ubuntu_sso/utils/ui.py:179 msgid "Sign Up to {app_name}" msgstr "Sign Up to {app_name}" #: ../ubuntu_sso/utils/ui.py:180 msgid "Show Terms & Conditions" msgstr "Show Terms & Conditions" #: ../ubuntu_sso/utils/ui.py:181 #, python-format msgid "" "Agreeing to the %(app_name)s Terms & Conditions is required to subscribe." msgstr "" "Agreeing to the %(app_name)s Terms & Conditions is required, in order to " "subscribe." #: ../ubuntu_sso/utils/ui.py:183 #, python-format msgid "You can also find these terms at %(url)s" msgstr "You can also find these terms at %(url)s" #: ../ubuntu_sso/utils/ui.py:184 msgid "Try again" msgstr "Try again" #: ../ubuntu_sso/utils/ui.py:185 msgid "" "There was an error when trying to complete the process. Please check the " "information and try again." msgstr "" "There was an error when trying to complete the process. Please check the " "information and try again." #: ../ubuntu_sso/utils/ui.py:187 msgid "Verification code" msgstr "Verification code" #: ../ubuntu_sso/utils/ui.py:188 #, python-format msgid "" "Check %(email)s for an email from Ubuntu Single Sign On. This message " "contains a verification code. Enter the code in the field below and click OK " "to complete creating your %(app_name)s account." msgstr "" "Check %(email)s for an e-mail from Ubuntu Single Sign On. This message " "contains a verification code. Enter the code in the field below and click OK " "to complete creating your %(app_name)s account." #: ../ubuntu_sso/utils/ui.py:192 msgid "Enter verification code" msgstr "Enter verification code" #: ../ubuntu_sso/utils/ui.py:195 #, python-format msgid "I agree with the %(app_name)s terms and conditions" msgstr "I agree with the %(app_name)s terms and conditions" #: ../ubuntu_sso/utils/ui.py:196 #, python-format msgid "Yes! Email me %(app_name)s tips and updates." msgstr "Yes! E-mail me %(app_name)s tips and updates." ubuntu-sso-client-13.10/po/ca@valencia.po0000664000202700020270000003023712151461656020522 0ustar dobeydobey00000000000000# Catalan translation for ubuntu-sso-client # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the ubuntu-sso-client package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: ubuntu-sso-client\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-09-11 18:25+0000\n" "PO-Revision-Date: 2011-03-28 23:35+0000\n" "Last-Translator: Joan Duran \n" "Language-Team: Catalan \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-09-17 18:24+0000\n" "X-Generator: Launchpad (build 15944)\n" #. Undefined variable '_', pylint: disable=E0602 #. all the text that is used in the gui #: ../ubuntu_sso/utils/ui.py:49 msgid "By signing up to {app_name} you agree to our {privacy_policy}" msgstr "" #: ../ubuntu_sso/utils/ui.py:51 msgid "By signing up to {app_name} you agree to our {terms_and_conditions}" msgstr "" #: ../ubuntu_sso/utils/ui.py:53 msgid " and {privacy_policy}" msgstr "" #: ../ubuntu_sso/utils/ui.py:54 msgid "Cancel" msgstr "" #: ../ubuntu_sso/utils/ui.py:55 msgid "Type the characters above" msgstr "Introduïu els caràcters d'ací sobre" #: ../ubuntu_sso/utils/ui.py:56 msgid "There was a problem getting the captcha, reloading..." msgstr "" "S'ha produït un problema en obtindre el captcha, s'està tornant a carregar..." #: ../ubuntu_sso/utils/ui.py:58 #, python-format msgid "If you can't read this then %(reload_link)s this page" msgstr "" #: ../ubuntu_sso/utils/ui.py:60 msgid "refresh" msgstr "" #: ../ubuntu_sso/utils/ui.py:61 msgid "Reload" msgstr "Torna a carregar" #: ../ubuntu_sso/utils/ui.py:62 msgid "The captcha is a required field" msgstr "" #: ../ubuntu_sso/utils/ui.py:63 msgid "Close window and set up later" msgstr "" #: ../ubuntu_sso/utils/ui.py:64 msgid "Congratulations, {app_name} is installed!" msgstr "" #: ../ubuntu_sso/utils/ui.py:65 #, python-format msgid "To connect this computer to %(app_name)s enter your details below." msgstr "" "Introduïu els vostres detalls ací sota per connectar este ordinador a " "%(app_name)s." #: ../ubuntu_sso/utils/ui.py:67 msgid "Register with {app_name}." msgstr "" #: ../ubuntu_sso/utils/ui.py:68 ../ubuntu_sso/utils/ui.py:93 #: ../ubuntu_sso/utils/ui.py:143 msgid "Email address" msgstr "Adreça electrònica" #: ../ubuntu_sso/utils/ui.py:69 msgid "Re-type Email address" msgstr "Torneu a introduir l'adreça electrònica" #: ../ubuntu_sso/utils/ui.py:70 msgid "The email must be a valid email address." msgstr "L'adreça electrònica ha de ser una adreça de correu vàlida." #: ../ubuntu_sso/utils/ui.py:71 msgid "" "The email addresses don't match, please double check and try entering them " "again." msgstr "" "Les adreces de correu no coincideixen. Comproveu-les i torneu-les a " "introduir." #: ../ubuntu_sso/utils/ui.py:73 msgid "Email" msgstr "" #: ../ubuntu_sso/utils/ui.py:74 msgid "The email addresses do not match" msgstr "" #: ../ubuntu_sso/utils/ui.py:75 msgid "Enter code verification here" msgstr "Introduïu el codi de verificació ací" #: ../ubuntu_sso/utils/ui.py:76 msgid "Please enter your name" msgstr "" #: ../ubuntu_sso/utils/ui.py:77 msgid "The process did not finish successfully." msgstr "El procés no ha finalitzat correctament." #: ../ubuntu_sso/utils/ui.py:79 msgid "Sign me in with my existing account" msgstr "" #: ../ubuntu_sso/utils/ui.py:80 msgid "This field is required." msgstr "Este camp és obligatori." #: ../ubuntu_sso/utils/ui.py:81 msgid "I've forgotten my password" msgstr "M'he oblidat de la contrasenya" #: ../ubuntu_sso/utils/ui.py:82 ../ubuntu_sso/utils/ui.py:130 msgid "Reset password" msgstr "Reinicialitza la contrasenya" #: ../ubuntu_sso/utils/ui.py:83 msgid "" "To reset your {app_name} password, enter your registered email address " "below. We will send instructions to reset your password." msgstr "" #: ../ubuntu_sso/utils/ui.py:86 msgid "Please enter a valid email address" msgstr "" #: ../ubuntu_sso/utils/ui.py:87 msgid "There was a problem accessing the Ubuntu Single Sign On backend." msgstr "" #: ../ubuntu_sso/utils/ui.py:89 #, python-format msgid "Create %(app_name)s account" msgstr "Creació d'un compte %(app_name)s" #: ../ubuntu_sso/utils/ui.py:90 msgid "Loading..." msgstr "S'està carregant…" #: ../ubuntu_sso/utils/ui.py:91 msgid "Getting information, please wait..." msgstr "" #: ../ubuntu_sso/utils/ui.py:92 msgid "Already have an account? Click here to sign in" msgstr "Ja teniu un compte? Feu clic ací per entrar" #: ../ubuntu_sso/utils/ui.py:94 #, python-format msgid "Connect to %(app_name)s" msgstr "Connecta't a %(app_name)s" #: ../ubuntu_sso/utils/ui.py:95 ../ubuntu_sso/utils/ui.py:109 msgid "Password" msgstr "Contrasenya" #: ../ubuntu_sso/utils/ui.py:97 msgid "Sign In to {app_name}" msgstr "" #: ../ubuntu_sso/utils/ui.py:99 msgid "Name" msgstr "Nom" #: ../ubuntu_sso/utils/ui.py:100 msgid "The name must not be empty." msgstr "" #: ../ubuntu_sso/utils/ui.py:101 msgid "Next" msgstr "Següent" #: ../ubuntu_sso/utils/ui.py:102 msgid "Network detection" msgstr "" #: ../ubuntu_sso/utils/ui.py:103 #, python-format msgid "" "Are you online? We can't detect an internet connection - you will need to be " "connected to set up %(app_name)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:105 msgid "One moment please..." msgstr "Un moment, per favor..." #: ../ubuntu_sso/utils/ui.py:106 msgid "Create a password" msgstr "" #: ../ubuntu_sso/utils/ui.py:107 msgid "Your password was successfully changed." msgstr "S'ha canviat correctament la vostra contrasenya." #: ../ubuntu_sso/utils/ui.py:108 msgid "At least one number" msgstr "" #: ../ubuntu_sso/utils/ui.py:110 msgid "Re-type Password" msgstr "Torneu a escriure la contrasenya" #: ../ubuntu_sso/utils/ui.py:111 msgid "" "The password must have a minimum of 8 characters and include one uppercase " "character and one number." msgstr "" "La contrasenya ha de tindre un mínim de 8 caràcters i ha d'incloure un " "caràcter en majúscula i un nombre." #: ../ubuntu_sso/utils/ui.py:113 msgid "At least 8 characters" msgstr "" #: ../ubuntu_sso/utils/ui.py:114 msgid "Passwords don't match" msgstr "" #: ../ubuntu_sso/utils/ui.py:115 msgid "" "The passwords don't match, please double check and try entering them again." msgstr "" "Les contrasenyes no coincideixen. Comproveu-les i torneu-les a introduir." #: ../ubuntu_sso/utils/ui.py:117 msgid "Your password must contain" msgstr "" #: ../ubuntu_sso/utils/ui.py:118 msgid "The password is too weak." msgstr "La contrasenya és massa dèbil." #: ../ubuntu_sso/utils/ui.py:119 msgid "At least one uppercase letter" msgstr "" #: ../ubuntu_sso/utils/ui.py:120 msgid "Privacy Policy" msgstr "" #: ../ubuntu_sso/utils/ui.py:121 msgid "Connecting to:" msgstr "" #: ../ubuntu_sso/utils/ui.py:122 msgid "Proxy Settings" msgstr "" #: ../ubuntu_sso/utils/ui.py:123 msgid "Incorrect login details. Please try again." msgstr "" #: ../ubuntu_sso/utils/ui.py:124 msgid "Please provide login details." msgstr "" #: ../ubuntu_sso/utils/ui.py:125 msgid "You are connecting through a proxy." msgstr "" #: ../ubuntu_sso/utils/ui.py:126 msgid "Get Help With Proxies" msgstr "" #: ../ubuntu_sso/utils/ui.py:127 msgid "Proxy password:" msgstr "" #: ../ubuntu_sso/utils/ui.py:128 msgid "Save and Connect" msgstr "" #: ../ubuntu_sso/utils/ui.py:129 msgid "Proxy username:" msgstr "" #: ../ubuntu_sso/utils/ui.py:131 msgid "" "A password reset code has been sent to your e-mail. Please enter the code " "below along with your new password." msgstr "" #: ../ubuntu_sso/utils/ui.py:133 msgid "Retype email" msgstr "" #: ../ubuntu_sso/utils/ui.py:134 msgid "Retype password" msgstr "" #: ../ubuntu_sso/utils/ui.py:135 #, python-format msgid "To reset your %(app_name)s password, enter your email address below:" msgstr "" "Introduïu la vostra adreça electrònica ací sota per reinicialitzar la " "contrasenya a %(app_name)s:" #: ../ubuntu_sso/utils/ui.py:137 msgid "" "We are very Sorry! The service that signs you on is not responding right " "now\n" "Please try again or come back in a few minutes." msgstr "" #: ../ubuntu_sso/utils/ui.py:140 msgid "Sorry we did not recognize the email address." msgstr "" #: ../ubuntu_sso/utils/ui.py:142 msgid "Reset code" msgstr "Reinicialitza el codi" #: ../ubuntu_sso/utils/ui.py:145 #, python-format msgid "" "A password reset code has been sent to %(email)s.\n" "Please enter the code below along with your new password." msgstr "" "S'ha enviat un codi de reinicialització a l'adreça %(email)s.\n" "Introduïu el codi ací sota juntament amb la vostra contrasenya nova." #: ../ubuntu_sso/utils/ui.py:147 msgid "Set Up Account" msgstr "" #: ../ubuntu_sso/utils/ui.py:148 msgid "I don't have an account yet - sign me up" msgstr "" #: ../ubuntu_sso/utils/ui.py:149 msgid "Sign In" msgstr "" #: ../ubuntu_sso/utils/ui.py:150 msgid "Log-in with my existing account." msgstr "" #: ../ubuntu_sso/utils/ui.py:151 msgid "the appname whose ssl error we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:152 msgid "Certificate details" msgstr "" #: ../ubuntu_sso/utils/ui.py:153 msgid "Connect" msgstr "" #: ../ubuntu_sso/utils/ui.py:154 msgid "the details ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:161 msgid "Open the SSL certificate UI." msgstr "" #: ../ubuntu_sso/utils/ui.py:162 msgid "SSL Certificate Not Valid" msgstr "" #: ../ubuntu_sso/utils/ui.py:163 msgid "the domain whose ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:164 #, python-format msgid "" "You are trying to connect to a proxy server on %(domain)s. This server uses " "a secure connection, and the SSL certificate is not valid because:" msgstr "" #: ../ubuntu_sso/utils/ui.py:167 msgid "The certificate has not been verified" msgstr "" #: ../ubuntu_sso/utils/ui.py:168 msgid "Do you want to connect to this server?" msgstr "" #: ../ubuntu_sso/utils/ui.py:169 msgid "Get Help With SSL" msgstr "" #: ../ubuntu_sso/utils/ui.py:170 #, python-format msgid "" "If you are not sure about this server, do not use it to connect to " "%(app_name)s." msgstr "" #: ../ubuntu_sso/utils/ui.py:172 msgid "Remember my settings for this certificate." msgstr "" #: ../ubuntu_sso/utils/ui.py:173 msgid "" "The name on the certificate isn't valid or doesn't match the name of the site" msgstr "" #: ../ubuntu_sso/utils/ui.py:175 msgid "The certificate has expired" msgstr "" #: ../ubuntu_sso/utils/ui.py:176 #, python-format msgid "You are now logged into %(app_name)s." msgstr "" #: ../ubuntu_sso/utils/ui.py:177 msgid "Surname" msgstr "" #: ../ubuntu_sso/utils/ui.py:178 msgid "Terms of Service" msgstr "" #: ../ubuntu_sso/utils/ui.py:179 msgid "Sign Up to {app_name}" msgstr "" #: ../ubuntu_sso/utils/ui.py:180 msgid "Show Terms & Conditions" msgstr "Mostra els termes i les condicions" #: ../ubuntu_sso/utils/ui.py:181 #, python-format msgid "" "Agreeing to the %(app_name)s Terms & Conditions is required to subscribe." msgstr "" #: ../ubuntu_sso/utils/ui.py:183 #, python-format msgid "You can also find these terms at %(url)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:184 msgid "Try again" msgstr "" #: ../ubuntu_sso/utils/ui.py:185 msgid "" "There was an error when trying to complete the process. Please check the " "information and try again." msgstr "" "S'ha produït un error en intentar completar el procés. Comproveu la " "informació i torneu-ho a intentar." #: ../ubuntu_sso/utils/ui.py:187 msgid "Verification code" msgstr "" #: ../ubuntu_sso/utils/ui.py:188 #, python-format msgid "" "Check %(email)s for an email from Ubuntu Single Sign On. This message " "contains a verification code. Enter the code in the field below and click OK " "to complete creating your %(app_name)s account." msgstr "" #: ../ubuntu_sso/utils/ui.py:192 msgid "Enter verification code" msgstr "Introduïu el codi de verificació" #: ../ubuntu_sso/utils/ui.py:195 #, python-format msgid "I agree with the %(app_name)s terms and conditions" msgstr "Estic d'acord amb els termes i les condicions del %(app_name)s" #: ../ubuntu_sso/utils/ui.py:196 #, python-format msgid "Yes! Email me %(app_name)s tips and updates." msgstr "" "Sí, vull que m'envieu informació i actualitzacions sobre %(app_name)s." ubuntu-sso-client-13.10/po/th.po0000664000202700020270000003263512151461656016753 0ustar dobeydobey00000000000000# Thai translation for ubuntu-sso-client # Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 # This file is distributed under the same license as the ubuntu-sso-client package. # FIRST AUTHOR , 2011. # msgid "" msgstr "" "Project-Id-Version: ubuntu-sso-client\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-09-11 18:25+0000\n" "PO-Revision-Date: 2011-03-11 10:35+0000\n" "Last-Translator: SiraNokyoongtong \n" "Language-Team: Thai \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-09-17 18:24+0000\n" "X-Generator: Launchpad (build 15944)\n" #. Undefined variable '_', pylint: disable=E0602 #. all the text that is used in the gui #: ../ubuntu_sso/utils/ui.py:49 msgid "By signing up to {app_name} you agree to our {privacy_policy}" msgstr "" #: ../ubuntu_sso/utils/ui.py:51 msgid "By signing up to {app_name} you agree to our {terms_and_conditions}" msgstr "" #: ../ubuntu_sso/utils/ui.py:53 msgid " and {privacy_policy}" msgstr "" #: ../ubuntu_sso/utils/ui.py:54 msgid "Cancel" msgstr "" #: ../ubuntu_sso/utils/ui.py:55 msgid "Type the characters above" msgstr "ป้อนอัà¸à¸‚ระที่อยู่ด้านบน" #: ../ubuntu_sso/utils/ui.py:56 msgid "There was a problem getting the captcha, reloading..." msgstr "มีปัà¸à¸«à¸²à¹ƒà¸™à¸à¸²à¸£à¸£à¸±à¸šà¸£à¸«à¸±à¸ªà¸¢à¸·à¸™à¸¢à¸±à¸™ à¸à¸³à¸¥à¸±à¸‡à¹‚หลดใหม่..." #: ../ubuntu_sso/utils/ui.py:58 #, python-format msgid "If you can't read this then %(reload_link)s this page" msgstr "" #: ../ubuntu_sso/utils/ui.py:60 msgid "refresh" msgstr "" #: ../ubuntu_sso/utils/ui.py:61 msgid "Reload" msgstr "โหลดใหม่" #: ../ubuntu_sso/utils/ui.py:62 msgid "The captcha is a required field" msgstr "" #: ../ubuntu_sso/utils/ui.py:63 msgid "Close window and set up later" msgstr "" #: ../ubuntu_sso/utils/ui.py:64 msgid "Congratulations, {app_name} is installed!" msgstr "" #: ../ubuntu_sso/utils/ui.py:65 #, python-format msgid "To connect this computer to %(app_name)s enter your details below." msgstr "" "เพื่อเชื่อมต่อคอมพิวเตอร์นี้à¸à¸±à¸š %(app_name)s ป้อนรายละเอียดของคุณด้านล่างนี้" #: ../ubuntu_sso/utils/ui.py:67 msgid "Register with {app_name}." msgstr "" #: ../ubuntu_sso/utils/ui.py:68 ../ubuntu_sso/utils/ui.py:93 #: ../ubuntu_sso/utils/ui.py:143 msgid "Email address" msgstr "อีเมล" #: ../ubuntu_sso/utils/ui.py:69 msgid "Re-type Email address" msgstr "ป้อนอีเมลซ้ำ" #: ../ubuntu_sso/utils/ui.py:70 msgid "The email must be a valid email address." msgstr "อีเมลต้องเป็นอีเมลที่ถูà¸à¸•้อง" #: ../ubuntu_sso/utils/ui.py:71 msgid "" "The email addresses don't match, please double check and try entering them " "again." msgstr "อีเมลไม่ตรงà¸à¸±à¸™ โปรดตรวจสอบà¹à¸¥à¹‰à¸§à¸›à¹‰à¸­à¸™à¹ƒà¸«à¸¡à¹ˆ" #: ../ubuntu_sso/utils/ui.py:73 msgid "Email" msgstr "" #: ../ubuntu_sso/utils/ui.py:74 msgid "The email addresses do not match" msgstr "" #: ../ubuntu_sso/utils/ui.py:75 msgid "Enter code verification here" msgstr "ป้อนรหัสยืนยันที่นี่" #: ../ubuntu_sso/utils/ui.py:76 msgid "Please enter your name" msgstr "" #: ../ubuntu_sso/utils/ui.py:77 msgid "The process did not finish successfully." msgstr "ขั้นตอนไม่ได้เสร็จอย่างสมบูรณ์" #: ../ubuntu_sso/utils/ui.py:79 msgid "Sign me in with my existing account" msgstr "" #: ../ubuntu_sso/utils/ui.py:80 msgid "This field is required." msgstr "ช่องนี้จำเป็นต้องป้อน" #: ../ubuntu_sso/utils/ui.py:81 msgid "I've forgotten my password" msgstr "ฉันลืมรหัสผ่าน" #: ../ubuntu_sso/utils/ui.py:82 ../ubuntu_sso/utils/ui.py:130 msgid "Reset password" msgstr "ตั้งรหัสผ่านใหม่" #: ../ubuntu_sso/utils/ui.py:83 msgid "" "To reset your {app_name} password, enter your registered email address " "below. We will send instructions to reset your password." msgstr "" #: ../ubuntu_sso/utils/ui.py:86 msgid "Please enter a valid email address" msgstr "" #: ../ubuntu_sso/utils/ui.py:87 msgid "There was a problem accessing the Ubuntu Single Sign On backend." msgstr "" #: ../ubuntu_sso/utils/ui.py:89 #, python-format msgid "Create %(app_name)s account" msgstr "สร้างบัà¸à¸Šà¸µ %(app_name)s" #: ../ubuntu_sso/utils/ui.py:90 msgid "Loading..." msgstr "à¸à¸³à¸¥à¸±à¸‡à¹‚หลด..." #: ../ubuntu_sso/utils/ui.py:91 msgid "Getting information, please wait..." msgstr "" #: ../ubuntu_sso/utils/ui.py:92 msgid "Already have an account? Click here to sign in" msgstr "มีบัà¸à¸Šà¸µà¹à¸¥à¹‰à¸§à¸«à¸£à¸·à¸­? คลิà¸à¸—ี่นี่เพื่อเข้าระบบ" #: ../ubuntu_sso/utils/ui.py:94 #, python-format msgid "Connect to %(app_name)s" msgstr "เชื่อมต่อà¸à¸±à¸š %(app_name)s" #: ../ubuntu_sso/utils/ui.py:95 ../ubuntu_sso/utils/ui.py:109 msgid "Password" msgstr "รหัสผ่าน" #: ../ubuntu_sso/utils/ui.py:97 msgid "Sign In to {app_name}" msgstr "" #: ../ubuntu_sso/utils/ui.py:99 msgid "Name" msgstr "ชื่อ" #: ../ubuntu_sso/utils/ui.py:100 msgid "The name must not be empty." msgstr "" #: ../ubuntu_sso/utils/ui.py:101 msgid "Next" msgstr "ถัดไป" #: ../ubuntu_sso/utils/ui.py:102 msgid "Network detection" msgstr "" #: ../ubuntu_sso/utils/ui.py:103 #, python-format msgid "" "Are you online? We can't detect an internet connection - you will need to be " "connected to set up %(app_name)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:105 msgid "One moment please..." msgstr "โปรดรอสัà¸à¸„รู่..." #: ../ubuntu_sso/utils/ui.py:106 msgid "Create a password" msgstr "" #: ../ubuntu_sso/utils/ui.py:107 msgid "Your password was successfully changed." msgstr "รหัสผ่านของคุณถูà¸à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¹à¸¥à¹‰à¸§" #: ../ubuntu_sso/utils/ui.py:108 msgid "At least one number" msgstr "" #: ../ubuntu_sso/utils/ui.py:110 msgid "Re-type Password" msgstr "ป้อนรหัสผ่านใหม่" #: ../ubuntu_sso/utils/ui.py:111 msgid "" "The password must have a minimum of 8 characters and include one uppercase " "character and one number." msgstr "" "รหัสผ่านต้องมีอย่างน้อย 8 ตัวอัà¸à¸©à¸£ à¹à¸¥à¸°à¸›à¸£à¸°à¸à¸­à¸šà¹„ปด้วย " "อัà¸à¸‚ระภาษาอังà¸à¸¤à¸©à¸•ัวพิมพ์ใหà¸à¹ˆ à¹à¸¥à¸°à¸•ัวเลข" #: ../ubuntu_sso/utils/ui.py:113 msgid "At least 8 characters" msgstr "" #: ../ubuntu_sso/utils/ui.py:114 msgid "Passwords don't match" msgstr "" #: ../ubuntu_sso/utils/ui.py:115 msgid "" "The passwords don't match, please double check and try entering them again." msgstr "รหัสผ่านไม่ตรงà¸à¸±à¸™ โปรดตรวจสอบà¹à¸¥à¸°à¸›à¹‰à¸­à¸™à¹ƒà¸«à¸¡à¹ˆà¸­à¸µà¸à¸„รั้ง" #: ../ubuntu_sso/utils/ui.py:117 msgid "Your password must contain" msgstr "" #: ../ubuntu_sso/utils/ui.py:118 msgid "The password is too weak." msgstr "รหัสผ่านไม่ปลอดภัย" #: ../ubuntu_sso/utils/ui.py:119 msgid "At least one uppercase letter" msgstr "" #: ../ubuntu_sso/utils/ui.py:120 msgid "Privacy Policy" msgstr "" #: ../ubuntu_sso/utils/ui.py:121 msgid "Connecting to:" msgstr "" #: ../ubuntu_sso/utils/ui.py:122 msgid "Proxy Settings" msgstr "" #: ../ubuntu_sso/utils/ui.py:123 msgid "Incorrect login details. Please try again." msgstr "" #: ../ubuntu_sso/utils/ui.py:124 msgid "Please provide login details." msgstr "" #: ../ubuntu_sso/utils/ui.py:125 msgid "You are connecting through a proxy." msgstr "" #: ../ubuntu_sso/utils/ui.py:126 msgid "Get Help With Proxies" msgstr "" #: ../ubuntu_sso/utils/ui.py:127 msgid "Proxy password:" msgstr "" #: ../ubuntu_sso/utils/ui.py:128 msgid "Save and Connect" msgstr "" #: ../ubuntu_sso/utils/ui.py:129 msgid "Proxy username:" msgstr "" #: ../ubuntu_sso/utils/ui.py:131 msgid "" "A password reset code has been sent to your e-mail. Please enter the code " "below along with your new password." msgstr "" #: ../ubuntu_sso/utils/ui.py:133 msgid "Retype email" msgstr "" #: ../ubuntu_sso/utils/ui.py:134 msgid "Retype password" msgstr "" #: ../ubuntu_sso/utils/ui.py:135 #, python-format msgid "To reset your %(app_name)s password, enter your email address below:" msgstr "เพื่อตั้งรหัสผ่าน %(app_name)s ใหม่ ให้ป้อนอีเมลของคุณด้านล่าง:" #: ../ubuntu_sso/utils/ui.py:137 msgid "" "We are very Sorry! The service that signs you on is not responding right " "now\n" "Please try again or come back in a few minutes." msgstr "" #: ../ubuntu_sso/utils/ui.py:140 msgid "Sorry we did not recognize the email address." msgstr "" #: ../ubuntu_sso/utils/ui.py:142 msgid "Reset code" msgstr "เรียà¸à¹‚ค้ดใหม่" #: ../ubuntu_sso/utils/ui.py:145 #, python-format msgid "" "A password reset code has been sent to %(email)s.\n" "Please enter the code below along with your new password." msgstr "" "โค้ดตั้งรหัสผ่านใหม่ถูà¸à¸ªà¹ˆà¸‡à¹„ปยังอีเมล %(email)s à¹à¸¥à¹‰à¸§\n" "โปรดป้อนโค้ดด้านล่างข้างๆ รหัสผ่านใหม่ของคุณ" #: ../ubuntu_sso/utils/ui.py:147 msgid "Set Up Account" msgstr "" #: ../ubuntu_sso/utils/ui.py:148 msgid "I don't have an account yet - sign me up" msgstr "" #: ../ubuntu_sso/utils/ui.py:149 msgid "Sign In" msgstr "" #: ../ubuntu_sso/utils/ui.py:150 msgid "Log-in with my existing account." msgstr "" #: ../ubuntu_sso/utils/ui.py:151 msgid "the appname whose ssl error we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:152 msgid "Certificate details" msgstr "" #: ../ubuntu_sso/utils/ui.py:153 msgid "Connect" msgstr "" #: ../ubuntu_sso/utils/ui.py:154 msgid "the details ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:161 msgid "Open the SSL certificate UI." msgstr "" #: ../ubuntu_sso/utils/ui.py:162 msgid "SSL Certificate Not Valid" msgstr "" #: ../ubuntu_sso/utils/ui.py:163 msgid "the domain whose ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:164 #, python-format msgid "" "You are trying to connect to a proxy server on %(domain)s. This server uses " "a secure connection, and the SSL certificate is not valid because:" msgstr "" #: ../ubuntu_sso/utils/ui.py:167 msgid "The certificate has not been verified" msgstr "" #: ../ubuntu_sso/utils/ui.py:168 msgid "Do you want to connect to this server?" msgstr "" #: ../ubuntu_sso/utils/ui.py:169 msgid "Get Help With SSL" msgstr "" #: ../ubuntu_sso/utils/ui.py:170 #, python-format msgid "" "If you are not sure about this server, do not use it to connect to " "%(app_name)s." msgstr "" #: ../ubuntu_sso/utils/ui.py:172 msgid "Remember my settings for this certificate." msgstr "" #: ../ubuntu_sso/utils/ui.py:173 msgid "" "The name on the certificate isn't valid or doesn't match the name of the site" msgstr "" #: ../ubuntu_sso/utils/ui.py:175 msgid "The certificate has expired" msgstr "" #: ../ubuntu_sso/utils/ui.py:176 #, python-format msgid "You are now logged into %(app_name)s." msgstr "" #: ../ubuntu_sso/utils/ui.py:177 msgid "Surname" msgstr "" #: ../ubuntu_sso/utils/ui.py:178 msgid "Terms of Service" msgstr "" #: ../ubuntu_sso/utils/ui.py:179 msgid "Sign Up to {app_name}" msgstr "" #: ../ubuntu_sso/utils/ui.py:180 msgid "Show Terms & Conditions" msgstr "à¹à¸ªà¸”งข้อà¸à¸³à¸«à¸™à¸”à¹à¸¥à¸°à¹€à¸‡à¸·à¹ˆà¸­à¸™à¹„ข" #: ../ubuntu_sso/utils/ui.py:181 #, python-format msgid "" "Agreeing to the %(app_name)s Terms & Conditions is required to subscribe." msgstr "" #: ../ubuntu_sso/utils/ui.py:183 #, python-format msgid "You can also find these terms at %(url)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:184 msgid "Try again" msgstr "" #: ../ubuntu_sso/utils/ui.py:185 msgid "" "There was an error when trying to complete the process. Please check the " "information and try again." msgstr "เà¸à¸´à¸”ข้อผิดพลาดขณะขั้นตอนจะสมบูรณ์ โปรดตรวจสอบข้อมูลà¹à¸¥à¸°à¸¥à¸­à¸‡à¹ƒà¸«à¸¡à¹ˆ" #: ../ubuntu_sso/utils/ui.py:187 msgid "Verification code" msgstr "" #: ../ubuntu_sso/utils/ui.py:188 #, python-format msgid "" "Check %(email)s for an email from Ubuntu Single Sign On. This message " "contains a verification code. Enter the code in the field below and click OK " "to complete creating your %(app_name)s account." msgstr "" #: ../ubuntu_sso/utils/ui.py:192 msgid "Enter verification code" msgstr "ป้อนรหัสยืนยัน" #: ../ubuntu_sso/utils/ui.py:195 #, python-format msgid "I agree with the %(app_name)s terms and conditions" msgstr "ฉันเห็นด้วยà¸à¸±à¸šà¹€à¸‡à¸·à¹ˆà¸­à¸™à¹„ขà¹à¸¥à¸°à¸‚้อà¸à¸³à¸«à¸™à¸”ของ %(app_name)s" #: ../ubuntu_sso/utils/ui.py:196 #, python-format msgid "Yes! Email me %(app_name)s tips and updates." msgstr "ใช่ โปรดส่งอีเมลเทคนิควิธีใช้à¹à¸¥à¸°à¸à¸²à¸£à¸›à¸£à¸±à¸šà¸›à¸£à¸¸à¸‡à¸‚อง %(app_name)s ให้ฉัน" ubuntu-sso-client-13.10/po/el.po0000664000202700020270000004732412151461656016741 0ustar dobeydobey00000000000000# Greek translation for ubuntu-sso-client # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the ubuntu-sso-client package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: ubuntu-sso-client\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-09-11 18:25+0000\n" "PO-Revision-Date: 2012-03-25 21:55+0000\n" "Last-Translator: Simos Xenitellis \n" "Language-Team: Greek \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-09-17 18:24+0000\n" "X-Generator: Launchpad (build 15944)\n" #. Undefined variable '_', pylint: disable=E0602 #. all the text that is used in the gui #: ../ubuntu_sso/utils/ui.py:49 msgid "By signing up to {app_name} you agree to our {privacy_policy}" msgstr "" "Με την εγγÏαφή σας στην εφαÏμογή {app_name} συμφωνείτε με τη δική μας " "{privacy_policy}" #: ../ubuntu_sso/utils/ui.py:51 msgid "By signing up to {app_name} you agree to our {terms_and_conditions}" msgstr "" "Με την εγγÏαφή σας στο {app_name} συμφωνείτε με τους δικοÏÏ‚ μας " "{terms_and_conditions}" #: ../ubuntu_sso/utils/ui.py:53 msgid " and {privacy_policy}" msgstr " και {privacy_policy}" #: ../ubuntu_sso/utils/ui.py:54 msgid "Cancel" msgstr "ΑκÏÏωση" #: ../ubuntu_sso/utils/ui.py:55 msgid "Type the characters above" msgstr "ΠληκτÏολογήστε τους παÏαπάνω χαÏακτήÏες" #: ../ubuntu_sso/utils/ui.py:56 msgid "There was a problem getting the captcha, reloading..." msgstr "ΥπήÏξε Ï€Ïόβλημα κατά τη λήψη του captcha, επαναφόÏτωση…" #: ../ubuntu_sso/utils/ui.py:58 #, python-format msgid "If you can't read this then %(reload_link)s this page" msgstr "" "Αν δεν μποÏείτε να το διαβάσετε αυτό, τότε επιλέξτε %(reload_link)s αυτής " "της σελίδας" #: ../ubuntu_sso/utils/ui.py:60 msgid "refresh" msgstr "ανανέωση" #: ../ubuntu_sso/utils/ui.py:61 msgid "Reload" msgstr "ΕπαναφόÏτωση" #: ../ubuntu_sso/utils/ui.py:62 msgid "The captcha is a required field" msgstr "Το captcha είναι απαιτοÏμενο πεδίο" #: ../ubuntu_sso/utils/ui.py:63 msgid "Close window and set up later" msgstr "Κλείσιμο του παÏαθÏÏου και ÏÏθμιση αÏγότεÏα" #: ../ubuntu_sso/utils/ui.py:64 msgid "Congratulations, {app_name} is installed!" msgstr "ΣυγχαÏητήÏια, η εφαÏμογή {app_name} εγκαταστάθηκε!" #: ../ubuntu_sso/utils/ui.py:65 #, python-format msgid "To connect this computer to %(app_name)s enter your details below." msgstr "" "Για να συνδέσετε αυτόν τον υπολογιστή στο %(app_name)s εισάγετε τα στοιχεία " "σας παÏακάτω." #: ../ubuntu_sso/utils/ui.py:67 msgid "Register with {app_name}." msgstr "" #: ../ubuntu_sso/utils/ui.py:68 ../ubuntu_sso/utils/ui.py:93 #: ../ubuntu_sso/utils/ui.py:143 msgid "Email address" msgstr "ΔιεÏθυνση email" #: ../ubuntu_sso/utils/ui.py:69 msgid "Re-type Email address" msgstr "Εισάγετε ξανά την διεÏθυνση email" #: ../ubuntu_sso/utils/ui.py:70 msgid "The email must be a valid email address." msgstr "Η διεÏθυνση email Ï€Ïέπει να είναι έγκυÏη." #: ../ubuntu_sso/utils/ui.py:71 msgid "" "The email addresses don't match, please double check and try entering them " "again." msgstr "" "Οι διευθÏνσεις email δεν ταυτίζονται, παÏακαλώ ελέγξτε τις και εισάγετε τις " "ξανά." #: ../ubuntu_sso/utils/ui.py:73 msgid "Email" msgstr "ΗλεκτÏονικό ταχυδÏομείο" #: ../ubuntu_sso/utils/ui.py:74 msgid "The email addresses do not match" msgstr "Οι διευθÏνσεις ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείου δεν ταιÏιάζουν" #: ../ubuntu_sso/utils/ui.py:75 msgid "Enter code verification here" msgstr "Εισάγετε την επιβεβαίωση ÎºÏ‰Î´Î¹ÎºÎ¿Ï ÎµÎ´ÏŽ" #: ../ubuntu_sso/utils/ui.py:76 msgid "Please enter your name" msgstr "ΠαÏακαλώ εισάγετε το όνομά σας" #: ../ubuntu_sso/utils/ui.py:77 msgid "The process did not finish successfully." msgstr "Η διεÏγασία δεν τεÏματίστηκε επιτυχώς." #: ../ubuntu_sso/utils/ui.py:79 msgid "Sign me in with my existing account" msgstr "Îα εγγÏαφώ με τον υπάÏχοντα λογαÏιασμό μου" #: ../ubuntu_sso/utils/ui.py:80 msgid "This field is required." msgstr "Το πεδίο είναι απαÏαίτητο." #: ../ubuntu_sso/utils/ui.py:81 msgid "I've forgotten my password" msgstr "Ξέχασα τον κωδικό μου" #: ../ubuntu_sso/utils/ui.py:82 ../ubuntu_sso/utils/ui.py:130 msgid "Reset password" msgstr "ΕπαναφοÏά ÎºÏ‰Î´Î¹ÎºÎ¿Ï Ï€Ïόσβασης" #: ../ubuntu_sso/utils/ui.py:83 msgid "" "To reset your {app_name} password, enter your registered email address " "below. We will send instructions to reset your password." msgstr "" "Για να επαναφέÏετε τον κωδικό της εφαÏμογής {app_name}, εισάγετε την " "καταχωÏημένη ηλεκτÏονική σας διεÏθυνση στο πεδίο πιο κάτω. Θα σας στείλουμε " "οδηγίες για το πως θα επαναφέÏετε τον κωδικό σας." #: ../ubuntu_sso/utils/ui.py:86 msgid "Please enter a valid email address" msgstr "ΠαÏακαλώ καταχωÏίστε μια έγκυÏη διεÏθυνση ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείου" #: ../ubuntu_sso/utils/ui.py:87 msgid "There was a problem accessing the Ubuntu Single Sign On backend." msgstr "" "ΥπήÏξε ένα Ï€Ïόβλημα κατά την Ï€Ïόσβαση στο σÏστημα υποστήÏιξης (backend) του " "Ubuntu Single Sign On." #: ../ubuntu_sso/utils/ui.py:89 #, python-format msgid "Create %(app_name)s account" msgstr "ΔημιουÏγία λογαÏÎ¹Î±ÏƒÎ¼Î¿Ï %(app_name)s" #: ../ubuntu_sso/utils/ui.py:90 msgid "Loading..." msgstr "ΦόÏτωση..." #: ../ubuntu_sso/utils/ui.py:91 msgid "Getting information, please wait..." msgstr "Γίνεται λήψη πληÏοφοÏιών, παÏακαλώ πεÏιμένετε…" #: ../ubuntu_sso/utils/ui.py:92 msgid "Already have an account? Click here to sign in" msgstr "Έχετε ήδη λογαÏιασμό; Πατήστε εδώ για να συνδεθείτε" #: ../ubuntu_sso/utils/ui.py:94 #, python-format msgid "Connect to %(app_name)s" msgstr "ΣÏνδεση σε %(app_name)s" #: ../ubuntu_sso/utils/ui.py:95 ../ubuntu_sso/utils/ui.py:109 msgid "Password" msgstr "Κωδικός Ï€Ïόσβασης" #: ../ubuntu_sso/utils/ui.py:97 msgid "Sign In to {app_name}" msgstr "ΕγγÏαφή στο {app_name}" #: ../ubuntu_sso/utils/ui.py:99 msgid "Name" msgstr "Όνομα" #: ../ubuntu_sso/utils/ui.py:100 msgid "The name must not be empty." msgstr "Το όνομα δεν Ï€Ïέπει να είναι κενό" #: ../ubuntu_sso/utils/ui.py:101 msgid "Next" msgstr "Επόμενο" #: ../ubuntu_sso/utils/ui.py:102 msgid "Network detection" msgstr "Ανίχνευση δικτÏου" #: ../ubuntu_sso/utils/ui.py:103 #, python-format msgid "" "Are you online? We can't detect an internet connection - you will need to be " "connected to set up %(app_name)s" msgstr "" "Είστε σε σÏνδεση με το διαδίκτυο; Δεν μποÏοÏμε να ανιχνεÏσουμε κάποια " "σÏνδεση με το διαδίκτυο. Θα χÏειαστεί να συνδεθείτε για τη ÏÏθμιση του " "%(app_name)s" #: ../ubuntu_sso/utils/ui.py:105 msgid "One moment please..." msgstr "Μια στιγμή παÏακαλώ..." #: ../ubuntu_sso/utils/ui.py:106 msgid "Create a password" msgstr "ΔημιουÏγία ÎºÏ‰Î´Î¹ÎºÎ¿Ï Î±ÏƒÏ†Î±Î»ÎµÎ¯Î±Ï‚" #: ../ubuntu_sso/utils/ui.py:107 msgid "Your password was successfully changed." msgstr "Ο κωδικός Ï€Ïόσβασης άλλαξε επιτυχώς." #: ../ubuntu_sso/utils/ui.py:108 msgid "At least one number" msgstr "Τουλάχιστον ένας αÏιθμός" #: ../ubuntu_sso/utils/ui.py:110 msgid "Re-type Password" msgstr "ΠληκτÏολογήστε ξανά τον κωδικό Ï€Ïόσβασης" #: ../ubuntu_sso/utils/ui.py:111 msgid "" "The password must have a minimum of 8 characters and include one uppercase " "character and one number." msgstr "" "Ο κωδικός Ï€Ïόσβασης Ï€Ïέπει να είναι τουλάχιστον 8 χαÏακτήÏων και να πεÏιέχει " "ένα κεφαλαίο χαÏακτήÏα και έναν αÏιθμό." #: ../ubuntu_sso/utils/ui.py:113 msgid "At least 8 characters" msgstr "Τουλάχιστον 8 χαÏακτήÏες" #: ../ubuntu_sso/utils/ui.py:114 msgid "Passwords don't match" msgstr "Οι κωδικοί δεν ταιÏιάζουν" #: ../ubuntu_sso/utils/ui.py:115 msgid "" "The passwords don't match, please double check and try entering them again." msgstr "" "Οι κωδικοί Ï€Ïόσβασης δεν ταυτίζονται, παÏακαλώ ελέγξτε τους και εισάγετε " "τους ξανά." #: ../ubuntu_sso/utils/ui.py:117 msgid "Your password must contain" msgstr "Ο κωδικός σας Ï€Ïέπει να πεÏιέχει" #: ../ubuntu_sso/utils/ui.py:118 msgid "The password is too weak." msgstr "Ο κωδικός Ï€Ïόσβασης είναι υπεÏβολικά αδÏναμος." #: ../ubuntu_sso/utils/ui.py:119 msgid "At least one uppercase letter" msgstr "Τουλάχιστον ένα κεφαλαίο γÏάμμα" #: ../ubuntu_sso/utils/ui.py:120 msgid "Privacy Policy" msgstr "Πολιτική αποÏÏήτου" #: ../ubuntu_sso/utils/ui.py:121 msgid "Connecting to:" msgstr "Γίνεται σÏνδεση στο:" #: ../ubuntu_sso/utils/ui.py:122 msgid "Proxy Settings" msgstr "Ρυθμίσεις Proxy" #: ../ubuntu_sso/utils/ui.py:123 msgid "Incorrect login details. Please try again." msgstr "Λανθασμένες λεπτομέÏειες σÏνδεσης. ΠαÏακαλώ Ï€Ïοσπαθήστε ξανά." #: ../ubuntu_sso/utils/ui.py:124 msgid "Please provide login details." msgstr "ΠαÏακαλώ εισάγετε τις λεπτομέÏειες σÏνδεσης." #: ../ubuntu_sso/utils/ui.py:125 msgid "You are connecting through a proxy." msgstr "Συνδέεστε μέσω διαμεσολαβητή Ï„Ïπου proxy." #: ../ubuntu_sso/utils/ui.py:126 msgid "Get Help With Proxies" msgstr "Λάβετε βοήθεια με τους διαμεσολαβητές proxy." #: ../ubuntu_sso/utils/ui.py:127 msgid "Proxy password:" msgstr "Κωδικός διαμεσολαβητή proxy:" #: ../ubuntu_sso/utils/ui.py:128 msgid "Save and Connect" msgstr "Αποθήκευση και σÏνδεση" #: ../ubuntu_sso/utils/ui.py:129 msgid "Proxy username:" msgstr "Όνομα χÏήστη διαμεσολαβητή proxy:" #: ../ubuntu_sso/utils/ui.py:131 msgid "" "A password reset code has been sent to your e-mail. Please enter the code " "below along with your new password." msgstr "" "Ένα συνθηματικό επαναφοÏάς ÎºÏ‰Î´Î¹ÎºÎ¿Ï Î±ÏƒÏ†Î±Î»ÎµÎ¯Î±Ï‚ έχει σταλεί στην ηλεκτÏονική " "σας διεÏθυνση. ΠαÏακαλώ εισάγετε το συνθηματικό πιο κάτω μαζί με τον νέο σας " "κωδικό ασφαλείας." #: ../ubuntu_sso/utils/ui.py:133 msgid "Retype email" msgstr "ΠληκτÏολογήστε ξανά την ηλεκτÏονική σας διεÏθυνση" #: ../ubuntu_sso/utils/ui.py:134 msgid "Retype password" msgstr "ΠληκτÏολογήστε ξανά τον κωδικό ασφαλείας" #: ../ubuntu_sso/utils/ui.py:135 #, python-format msgid "To reset your %(app_name)s password, enter your email address below:" msgstr "" "Για να επαναφέÏετε τον κωδικό σας για %(app_name)s, εισάγετε την διεÏθυνση " "του email σας παÏακάτω:" #: ../ubuntu_sso/utils/ui.py:137 msgid "" "We are very Sorry! The service that signs you on is not responding right " "now\n" "Please try again or come back in a few minutes." msgstr "" "ΛυποÏμαστε πολÏ! Η υπηÏεσία με την οποία εγγÏάφεστε δεν λειτουÏγεί αυτή τη " "στιγμή.\n" "ΠαÏακαλώ ξαναπÏοσπαθήστε ή επανέλθετε μετά από λίγα λεπτά." #: ../ubuntu_sso/utils/ui.py:140 msgid "Sorry we did not recognize the email address." msgstr "ΛυποÏμαστε, δεν αναγνωÏίστηκε η διεÏθυνση ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείου." #: ../ubuntu_sso/utils/ui.py:142 msgid "Reset code" msgstr "ΕπαναφοÏά κωδικοÏ" #: ../ubuntu_sso/utils/ui.py:145 #, python-format msgid "" "A password reset code has been sent to %(email)s.\n" "Please enter the code below along with your new password." msgstr "" "Ένας κωδικός επαναφοÏάς ÎºÏ‰Î´Î¹ÎºÎ¿Ï Ï€Ïόσβασης εστάλη στο %(email)s.\n" "ΠαÏακαλώ εισάγετε τον κωδικό παÏακάτω μαζί με τον νέο κωδικό Ï€Ïόσβασης" #: ../ubuntu_sso/utils/ui.py:147 msgid "Set Up Account" msgstr "ΡÏθμιση λογαÏιασμοÏ" #: ../ubuntu_sso/utils/ui.py:148 msgid "I don't have an account yet - sign me up" msgstr "Δεν έχω ακόμα κάποιο λογαÏιασμό - να γίνει εγγÏαφή μου" #: ../ubuntu_sso/utils/ui.py:149 msgid "Sign In" msgstr "ΕγγÏαφή" #: ../ubuntu_sso/utils/ui.py:150 msgid "Log-in with my existing account." msgstr "" #: ../ubuntu_sso/utils/ui.py:151 msgid "the appname whose ssl error we are going to show." msgstr "" "το όνομα της εφαÏμογής της οποίας Ï€Ïόκειται να εμφανιστεί το σφάλμα ssl." #: ../ubuntu_sso/utils/ui.py:152 msgid "Certificate details" msgstr "ΛεπτομέÏειες πιστοποιητικοÏ" #: ../ubuntu_sso/utils/ui.py:153 msgid "Connect" msgstr "ΣÏνδεση" #: ../ubuntu_sso/utils/ui.py:154 msgid "the details ssl certificate we are going to show." msgstr "οι λεπτομέÏειες του Ï€Î¹ÏƒÏ„Î¿Ï€Î¿Î¹Î·Ï„Î¹ÎºÎ¿Ï SSL που θα εμφανιστοÏν." #: ../ubuntu_sso/utils/ui.py:161 msgid "Open the SSL certificate UI." msgstr "Άνοιγμα του πεÏιβάλλοντος χÏήσης (UI) του Ï€Î¹ÏƒÏ„Î¿Ï€Î¿Î¹Î·Ï„Î¹ÎºÎ¿Ï SSL." #: ../ubuntu_sso/utils/ui.py:162 msgid "SSL Certificate Not Valid" msgstr "Μη έγκυÏο πιστοποιητικό SSL" #: ../ubuntu_sso/utils/ui.py:163 msgid "the domain whose ssl certificate we are going to show." msgstr "ο ιστότοπος του οποίου το πιστοποιητικό SSL θα εμφανιστεί." #: ../ubuntu_sso/utils/ui.py:164 #, python-format msgid "" "You are trying to connect to a proxy server on %(domain)s. This server uses " "a secure connection, and the SSL certificate is not valid because:" msgstr "" "ΠÏοσπαθείτε να συνδεθείτε σε έναν διαμεσολαβητή (proxy) στο %(domain)s. " "Αυτός ο διαμεσολαβητής χÏησιμοποιεί μια ασφαλή σÏνδεση και το πιστοποιητικό " "SSL δεν είναι έγκυÏο διότι:" #: ../ubuntu_sso/utils/ui.py:167 msgid "The certificate has not been verified" msgstr "Το πιστοποιητικό δεν έχει επαληθευτεί" #: ../ubuntu_sso/utils/ui.py:168 msgid "Do you want to connect to this server?" msgstr "Θέλετε να συνδεθείτε σε αυτόν τον διαμεσολαβητή;" #: ../ubuntu_sso/utils/ui.py:169 msgid "Get Help With SSL" msgstr "Λάβετε βοήθεια με το SSL" #: ../ubuntu_sso/utils/ui.py:170 #, python-format msgid "" "If you are not sure about this server, do not use it to connect to " "%(app_name)s." msgstr "" "Αν δεν είστε σίγουÏος/η για αυτό τον εξυπηÏετητή, μην τον χÏησιμοποιήσετε " "για τη σÏνδεση στο %(app_name)s." #: ../ubuntu_sso/utils/ui.py:172 msgid "Remember my settings for this certificate." msgstr "Îα θυμάσαι τις Ïυθμίσεις μου για αυτό το πιστοποιητικό." #: ../ubuntu_sso/utils/ui.py:173 msgid "" "The name on the certificate isn't valid or doesn't match the name of the site" msgstr "" "Το όνομα του Ï€Î¹ÏƒÏ„Î¿Ï€Î¿Î¹Î·Ï„Î¹ÎºÎ¿Ï Î´ÎµÎ½ είναι έγκυÏο ή δεν ταιÏιάζει με το όνομα της " "ιστοσελίδας" #: ../ubuntu_sso/utils/ui.py:175 msgid "The certificate has expired" msgstr "Το πιστοποιητικό έχει λήξει" #: ../ubuntu_sso/utils/ui.py:176 #, python-format msgid "You are now logged into %(app_name)s." msgstr "ΤώÏα έχετε συνδεθεί στο %(app_name)s." #: ../ubuntu_sso/utils/ui.py:177 msgid "Surname" msgstr "Επώνυμο" #: ../ubuntu_sso/utils/ui.py:178 msgid "Terms of Service" msgstr "ÎŒÏοι της υπηÏεσίας" #: ../ubuntu_sso/utils/ui.py:179 msgid "Sign Up to {app_name}" msgstr "ΕγγÏαφή στο {app_name}" #: ../ubuntu_sso/utils/ui.py:180 msgid "Show Terms & Conditions" msgstr "Εμφάνιση ÏŒÏων και Ï€Ïοϋποθέσεων" #: ../ubuntu_sso/utils/ui.py:181 #, python-format msgid "" "Agreeing to the %(app_name)s Terms & Conditions is required to subscribe." msgstr "" "Για την εγγÏαφή απαιτείται η συμφωνία με τους ÏŒÏους και Ï€Ïοϋποθέσεις του " "%(app_name)s." #: ../ubuntu_sso/utils/ui.py:183 #, python-format msgid "You can also find these terms at %(url)s" msgstr "" "ΜποÏείτε επίσης να βÏείτε αυτοÏÏ‚ τους ÏŒÏους στο %(url)s" #: ../ubuntu_sso/utils/ui.py:184 msgid "Try again" msgstr "Δοκιμάστε ξανά" #: ../ubuntu_sso/utils/ui.py:185 msgid "" "There was an error when trying to complete the process. Please check the " "information and try again." msgstr "" "ΥπήÏξε σφάλμα κατά τη Ï€Ïοσπάθεια ολοκλήÏωσης της διαδικασίας. ΠαÏακαλώ " "ελέγξτε τις πληÏοφοÏίες και ξαναδοκιμάστε." #: ../ubuntu_sso/utils/ui.py:187 msgid "Verification code" msgstr "Κωδικός επαλήθευσης" #: ../ubuntu_sso/utils/ui.py:188 #, python-format msgid "" "Check %(email)s for an email from Ubuntu Single Sign On. This message " "contains a verification code. Enter the code in the field below and click OK " "to complete creating your %(app_name)s account." msgstr "" "Ελέγξτε το %(email)s για ένα μήνυμα από το Ubuntu Single Sign On. Αυτό το " "μήνυμα πεÏιέχει έναν κωδικό επαλήθευσης. Εισάγετε αυτόν τον κωδικό στο πιο " "κάτω πεδίο και κάντε κλικ στο Εντάξει για να ολοκληÏωθεί η δημιουÏγία του " "λογαÏÎ¹Î±ÏƒÎ¼Î¿Ï ÏƒÎ±Ï‚ στο %(app_name)s." #: ../ubuntu_sso/utils/ui.py:192 msgid "Enter verification code" msgstr "Εισάγετε κωδικό επιβαβαίωσης" #: ../ubuntu_sso/utils/ui.py:195 #, python-format msgid "I agree with the %(app_name)s terms and conditions" msgstr "Συμφωνώ με τους ÏŒÏους και Ï€Ïοϋποθέσεις του %(app_name)s" #: ../ubuntu_sso/utils/ui.py:196 #, python-format msgid "Yes! Email me %(app_name)s tips and updates." msgstr "" "Îαι! Îα μου αποστέλλονται email με συμβουλές και ενημεÏώσεις από το " "%(app_name)s." ubuntu-sso-client-13.10/po/ary.po0000664000202700020270000002506712151461656017134 0ustar dobeydobey00000000000000# Moroccan Arabic translation for ubuntu-sso-client # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the ubuntu-sso-client package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: ubuntu-sso-client\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-09-11 18:25+0000\n" "PO-Revision-Date: 2010-09-27 08:27+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Moroccan Arabic \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-09-17 18:24+0000\n" "X-Generator: Launchpad (build 15944)\n" #. Undefined variable '_', pylint: disable=E0602 #. all the text that is used in the gui #: ../ubuntu_sso/utils/ui.py:49 msgid "By signing up to {app_name} you agree to our {privacy_policy}" msgstr "" #: ../ubuntu_sso/utils/ui.py:51 msgid "By signing up to {app_name} you agree to our {terms_and_conditions}" msgstr "" #: ../ubuntu_sso/utils/ui.py:53 msgid " and {privacy_policy}" msgstr "" #: ../ubuntu_sso/utils/ui.py:54 msgid "Cancel" msgstr "" #: ../ubuntu_sso/utils/ui.py:55 msgid "Type the characters above" msgstr "" #: ../ubuntu_sso/utils/ui.py:56 msgid "There was a problem getting the captcha, reloading..." msgstr "" #: ../ubuntu_sso/utils/ui.py:58 #, python-format msgid "If you can't read this then %(reload_link)s this page" msgstr "" #: ../ubuntu_sso/utils/ui.py:60 msgid "refresh" msgstr "" #: ../ubuntu_sso/utils/ui.py:61 msgid "Reload" msgstr "" #: ../ubuntu_sso/utils/ui.py:62 msgid "The captcha is a required field" msgstr "" #: ../ubuntu_sso/utils/ui.py:63 msgid "Close window and set up later" msgstr "" #: ../ubuntu_sso/utils/ui.py:64 msgid "Congratulations, {app_name} is installed!" msgstr "" #: ../ubuntu_sso/utils/ui.py:65 #, python-format msgid "To connect this computer to %(app_name)s enter your details below." msgstr "" #: ../ubuntu_sso/utils/ui.py:67 msgid "Register with {app_name}." msgstr "" #: ../ubuntu_sso/utils/ui.py:68 ../ubuntu_sso/utils/ui.py:93 #: ../ubuntu_sso/utils/ui.py:143 msgid "Email address" msgstr "" #: ../ubuntu_sso/utils/ui.py:69 msgid "Re-type Email address" msgstr "" #: ../ubuntu_sso/utils/ui.py:70 msgid "The email must be a valid email address." msgstr "" #: ../ubuntu_sso/utils/ui.py:71 msgid "" "The email addresses don't match, please double check and try entering them " "again." msgstr "" #: ../ubuntu_sso/utils/ui.py:73 msgid "Email" msgstr "" #: ../ubuntu_sso/utils/ui.py:74 msgid "The email addresses do not match" msgstr "" #: ../ubuntu_sso/utils/ui.py:75 msgid "Enter code verification here" msgstr "" #: ../ubuntu_sso/utils/ui.py:76 msgid "Please enter your name" msgstr "" #: ../ubuntu_sso/utils/ui.py:77 msgid "The process did not finish successfully." msgstr "" #: ../ubuntu_sso/utils/ui.py:79 msgid "Sign me in with my existing account" msgstr "" #: ../ubuntu_sso/utils/ui.py:80 msgid "This field is required." msgstr "" #: ../ubuntu_sso/utils/ui.py:81 msgid "I've forgotten my password" msgstr "" #: ../ubuntu_sso/utils/ui.py:82 ../ubuntu_sso/utils/ui.py:130 msgid "Reset password" msgstr "" #: ../ubuntu_sso/utils/ui.py:83 msgid "" "To reset your {app_name} password, enter your registered email address " "below. We will send instructions to reset your password." msgstr "" #: ../ubuntu_sso/utils/ui.py:86 msgid "Please enter a valid email address" msgstr "" #: ../ubuntu_sso/utils/ui.py:87 msgid "There was a problem accessing the Ubuntu Single Sign On backend." msgstr "" #: ../ubuntu_sso/utils/ui.py:89 #, python-format msgid "Create %(app_name)s account" msgstr "" #: ../ubuntu_sso/utils/ui.py:90 msgid "Loading..." msgstr "" #: ../ubuntu_sso/utils/ui.py:91 msgid "Getting information, please wait..." msgstr "" #: ../ubuntu_sso/utils/ui.py:92 msgid "Already have an account? Click here to sign in" msgstr "" #: ../ubuntu_sso/utils/ui.py:94 #, python-format msgid "Connect to %(app_name)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:95 ../ubuntu_sso/utils/ui.py:109 msgid "Password" msgstr "" #: ../ubuntu_sso/utils/ui.py:97 msgid "Sign In to {app_name}" msgstr "" #: ../ubuntu_sso/utils/ui.py:99 msgid "Name" msgstr "" #: ../ubuntu_sso/utils/ui.py:100 msgid "The name must not be empty." msgstr "" #: ../ubuntu_sso/utils/ui.py:101 msgid "Next" msgstr "" #: ../ubuntu_sso/utils/ui.py:102 msgid "Network detection" msgstr "" #: ../ubuntu_sso/utils/ui.py:103 #, python-format msgid "" "Are you online? We can't detect an internet connection - you will need to be " "connected to set up %(app_name)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:105 msgid "One moment please..." msgstr "" #: ../ubuntu_sso/utils/ui.py:106 msgid "Create a password" msgstr "" #: ../ubuntu_sso/utils/ui.py:107 msgid "Your password was successfully changed." msgstr "" #: ../ubuntu_sso/utils/ui.py:108 msgid "At least one number" msgstr "" #: ../ubuntu_sso/utils/ui.py:110 msgid "Re-type Password" msgstr "" #: ../ubuntu_sso/utils/ui.py:111 msgid "" "The password must have a minimum of 8 characters and include one uppercase " "character and one number." msgstr "" #: ../ubuntu_sso/utils/ui.py:113 msgid "At least 8 characters" msgstr "" #: ../ubuntu_sso/utils/ui.py:114 msgid "Passwords don't match" msgstr "" #: ../ubuntu_sso/utils/ui.py:115 msgid "" "The passwords don't match, please double check and try entering them again." msgstr "" #: ../ubuntu_sso/utils/ui.py:117 msgid "Your password must contain" msgstr "" #: ../ubuntu_sso/utils/ui.py:118 msgid "The password is too weak." msgstr "" #: ../ubuntu_sso/utils/ui.py:119 msgid "At least one uppercase letter" msgstr "" #: ../ubuntu_sso/utils/ui.py:120 msgid "Privacy Policy" msgstr "" #: ../ubuntu_sso/utils/ui.py:121 msgid "Connecting to:" msgstr "" #: ../ubuntu_sso/utils/ui.py:122 msgid "Proxy Settings" msgstr "" #: ../ubuntu_sso/utils/ui.py:123 msgid "Incorrect login details. Please try again." msgstr "" #: ../ubuntu_sso/utils/ui.py:124 msgid "Please provide login details." msgstr "" #: ../ubuntu_sso/utils/ui.py:125 msgid "You are connecting through a proxy." msgstr "" #: ../ubuntu_sso/utils/ui.py:126 msgid "Get Help With Proxies" msgstr "" #: ../ubuntu_sso/utils/ui.py:127 msgid "Proxy password:" msgstr "" #: ../ubuntu_sso/utils/ui.py:128 msgid "Save and Connect" msgstr "" #: ../ubuntu_sso/utils/ui.py:129 msgid "Proxy username:" msgstr "" #: ../ubuntu_sso/utils/ui.py:131 msgid "" "A password reset code has been sent to your e-mail. Please enter the code " "below along with your new password." msgstr "" #: ../ubuntu_sso/utils/ui.py:133 msgid "Retype email" msgstr "" #: ../ubuntu_sso/utils/ui.py:134 msgid "Retype password" msgstr "" #: ../ubuntu_sso/utils/ui.py:135 #, python-format msgid "To reset your %(app_name)s password, enter your email address below:" msgstr "" #: ../ubuntu_sso/utils/ui.py:137 msgid "" "We are very Sorry! The service that signs you on is not responding right " "now\n" "Please try again or come back in a few minutes." msgstr "" #: ../ubuntu_sso/utils/ui.py:140 msgid "Sorry we did not recognize the email address." msgstr "" #: ../ubuntu_sso/utils/ui.py:142 msgid "Reset code" msgstr "" #: ../ubuntu_sso/utils/ui.py:145 #, python-format msgid "" "A password reset code has been sent to %(email)s.\n" "Please enter the code below along with your new password." msgstr "" #: ../ubuntu_sso/utils/ui.py:147 msgid "Set Up Account" msgstr "" #: ../ubuntu_sso/utils/ui.py:148 msgid "I don't have an account yet - sign me up" msgstr "" #: ../ubuntu_sso/utils/ui.py:149 msgid "Sign In" msgstr "" #: ../ubuntu_sso/utils/ui.py:150 msgid "Log-in with my existing account." msgstr "" #: ../ubuntu_sso/utils/ui.py:151 msgid "the appname whose ssl error we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:152 msgid "Certificate details" msgstr "" #: ../ubuntu_sso/utils/ui.py:153 msgid "Connect" msgstr "" #: ../ubuntu_sso/utils/ui.py:154 msgid "the details ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:161 msgid "Open the SSL certificate UI." msgstr "" #: ../ubuntu_sso/utils/ui.py:162 msgid "SSL Certificate Not Valid" msgstr "" #: ../ubuntu_sso/utils/ui.py:163 msgid "the domain whose ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:164 #, python-format msgid "" "You are trying to connect to a proxy server on %(domain)s. This server uses " "a secure connection, and the SSL certificate is not valid because:" msgstr "" #: ../ubuntu_sso/utils/ui.py:167 msgid "The certificate has not been verified" msgstr "" #: ../ubuntu_sso/utils/ui.py:168 msgid "Do you want to connect to this server?" msgstr "" #: ../ubuntu_sso/utils/ui.py:169 msgid "Get Help With SSL" msgstr "" #: ../ubuntu_sso/utils/ui.py:170 #, python-format msgid "" "If you are not sure about this server, do not use it to connect to " "%(app_name)s." msgstr "" #: ../ubuntu_sso/utils/ui.py:172 msgid "Remember my settings for this certificate." msgstr "" #: ../ubuntu_sso/utils/ui.py:173 msgid "" "The name on the certificate isn't valid or doesn't match the name of the site" msgstr "" #: ../ubuntu_sso/utils/ui.py:175 msgid "The certificate has expired" msgstr "" #: ../ubuntu_sso/utils/ui.py:176 #, python-format msgid "You are now logged into %(app_name)s." msgstr "" #: ../ubuntu_sso/utils/ui.py:177 msgid "Surname" msgstr "" #: ../ubuntu_sso/utils/ui.py:178 msgid "Terms of Service" msgstr "" #: ../ubuntu_sso/utils/ui.py:179 msgid "Sign Up to {app_name}" msgstr "" #: ../ubuntu_sso/utils/ui.py:180 msgid "Show Terms & Conditions" msgstr "" #: ../ubuntu_sso/utils/ui.py:181 #, python-format msgid "" "Agreeing to the %(app_name)s Terms & Conditions is required to subscribe." msgstr "" #: ../ubuntu_sso/utils/ui.py:183 #, python-format msgid "You can also find these terms at %(url)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:184 msgid "Try again" msgstr "" #: ../ubuntu_sso/utils/ui.py:185 msgid "" "There was an error when trying to complete the process. Please check the " "information and try again." msgstr "" #: ../ubuntu_sso/utils/ui.py:187 msgid "Verification code" msgstr "" #: ../ubuntu_sso/utils/ui.py:188 #, python-format msgid "" "Check %(email)s for an email from Ubuntu Single Sign On. This message " "contains a verification code. Enter the code in the field below and click OK " "to complete creating your %(app_name)s account." msgstr "" #: ../ubuntu_sso/utils/ui.py:192 msgid "Enter verification code" msgstr "" #: ../ubuntu_sso/utils/ui.py:195 #, python-format msgid "I agree with the %(app_name)s terms and conditions" msgstr "" #: ../ubuntu_sso/utils/ui.py:196 #, python-format msgid "Yes! Email me %(app_name)s tips and updates." msgstr "" ubuntu-sso-client-13.10/po/te.po0000664000202700020270000002575112151461656016751 0ustar dobeydobey00000000000000# Telugu translation for ubuntu-sso-client # Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 # This file is distributed under the same license as the ubuntu-sso-client package. # FIRST AUTHOR , 2011. # msgid "" msgstr "" "Project-Id-Version: ubuntu-sso-client\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-09-11 18:25+0000\n" "PO-Revision-Date: 2011-04-06 01:14+0000\n" "Last-Translator: Praveen Illa \n" "Language-Team: Telugu \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-09-17 18:24+0000\n" "X-Generator: Launchpad (build 15944)\n" #. Undefined variable '_', pylint: disable=E0602 #. all the text that is used in the gui #: ../ubuntu_sso/utils/ui.py:49 msgid "By signing up to {app_name} you agree to our {privacy_policy}" msgstr "" #: ../ubuntu_sso/utils/ui.py:51 msgid "By signing up to {app_name} you agree to our {terms_and_conditions}" msgstr "" #: ../ubuntu_sso/utils/ui.py:53 msgid " and {privacy_policy}" msgstr "" #: ../ubuntu_sso/utils/ui.py:54 msgid "Cancel" msgstr "" #: ../ubuntu_sso/utils/ui.py:55 msgid "Type the characters above" msgstr "" #: ../ubuntu_sso/utils/ui.py:56 msgid "There was a problem getting the captcha, reloading..." msgstr "" #: ../ubuntu_sso/utils/ui.py:58 #, python-format msgid "If you can't read this then %(reload_link)s this page" msgstr "" #: ../ubuntu_sso/utils/ui.py:60 msgid "refresh" msgstr "" #: ../ubuntu_sso/utils/ui.py:61 msgid "Reload" msgstr "తిరిగినింపà±" #: ../ubuntu_sso/utils/ui.py:62 msgid "The captcha is a required field" msgstr "" #: ../ubuntu_sso/utils/ui.py:63 msgid "Close window and set up later" msgstr "" #: ../ubuntu_sso/utils/ui.py:64 msgid "Congratulations, {app_name} is installed!" msgstr "" #: ../ubuntu_sso/utils/ui.py:65 #, python-format msgid "To connect this computer to %(app_name)s enter your details below." msgstr "" #: ../ubuntu_sso/utils/ui.py:67 msgid "Register with {app_name}." msgstr "" #: ../ubuntu_sso/utils/ui.py:68 ../ubuntu_sso/utils/ui.py:93 #: ../ubuntu_sso/utils/ui.py:143 msgid "Email address" msgstr "ఈమెయిలౠచిరà±à°¨à°¾à°®à°¾" #: ../ubuntu_sso/utils/ui.py:69 msgid "Re-type Email address" msgstr "ఈమెయిలౠచిరà±à°¨à°¾à°®à°¾à°¨à± మళà±à°³à±€-టైపà±à°šà±‡à°¯à°‚à°¡à°¿" #: ../ubuntu_sso/utils/ui.py:70 msgid "The email must be a valid email address." msgstr "" #: ../ubuntu_sso/utils/ui.py:71 msgid "" "The email addresses don't match, please double check and try entering them " "again." msgstr "" #: ../ubuntu_sso/utils/ui.py:73 msgid "Email" msgstr "" #: ../ubuntu_sso/utils/ui.py:74 msgid "The email addresses do not match" msgstr "" #: ../ubuntu_sso/utils/ui.py:75 msgid "Enter code verification here" msgstr "" #: ../ubuntu_sso/utils/ui.py:76 msgid "Please enter your name" msgstr "" #: ../ubuntu_sso/utils/ui.py:77 msgid "The process did not finish successfully." msgstr "" #: ../ubuntu_sso/utils/ui.py:79 msgid "Sign me in with my existing account" msgstr "" #: ../ubuntu_sso/utils/ui.py:80 msgid "This field is required." msgstr "" #: ../ubuntu_sso/utils/ui.py:81 msgid "I've forgotten my password" msgstr "" #: ../ubuntu_sso/utils/ui.py:82 ../ubuntu_sso/utils/ui.py:130 msgid "Reset password" msgstr "" #: ../ubuntu_sso/utils/ui.py:83 msgid "" "To reset your {app_name} password, enter your registered email address " "below. We will send instructions to reset your password." msgstr "" #: ../ubuntu_sso/utils/ui.py:86 msgid "Please enter a valid email address" msgstr "" #: ../ubuntu_sso/utils/ui.py:87 msgid "There was a problem accessing the Ubuntu Single Sign On backend." msgstr "" #: ../ubuntu_sso/utils/ui.py:89 #, python-format msgid "Create %(app_name)s account" msgstr "" #: ../ubuntu_sso/utils/ui.py:90 msgid "Loading..." msgstr "నింపà±à°¤à±‹à°‚ది..." #: ../ubuntu_sso/utils/ui.py:91 msgid "Getting information, please wait..." msgstr "" #: ../ubuntu_sso/utils/ui.py:92 msgid "Already have an account? Click here to sign in" msgstr "" #: ../ubuntu_sso/utils/ui.py:94 #, python-format msgid "Connect to %(app_name)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:95 ../ubuntu_sso/utils/ui.py:109 msgid "Password" msgstr "సంకేతపదం" #: ../ubuntu_sso/utils/ui.py:97 msgid "Sign In to {app_name}" msgstr "" #: ../ubuntu_sso/utils/ui.py:99 msgid "Name" msgstr "పేరà±" #: ../ubuntu_sso/utils/ui.py:100 msgid "The name must not be empty." msgstr "" #: ../ubuntu_sso/utils/ui.py:101 msgid "Next" msgstr "తరà±à°µà°¾à°¤" #: ../ubuntu_sso/utils/ui.py:102 msgid "Network detection" msgstr "" #: ../ubuntu_sso/utils/ui.py:103 #, python-format msgid "" "Are you online? We can't detect an internet connection - you will need to be " "connected to set up %(app_name)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:105 msgid "One moment please..." msgstr "" #: ../ubuntu_sso/utils/ui.py:106 msgid "Create a password" msgstr "" #: ../ubuntu_sso/utils/ui.py:107 msgid "Your password was successfully changed." msgstr "మీ సంకేతపదం విజయవంతంగా మారà±à°šà°¬à°¡à°¿à°‚ది." #: ../ubuntu_sso/utils/ui.py:108 msgid "At least one number" msgstr "" #: ../ubuntu_sso/utils/ui.py:110 msgid "Re-type Password" msgstr "సంకేతపదానà±à°¨à°¿ మళà±à°³à±€-టైపà±à°šà±‡à°¯à°‚à°¡à°¿" #: ../ubuntu_sso/utils/ui.py:111 msgid "" "The password must have a minimum of 8 characters and include one uppercase " "character and one number." msgstr "" #: ../ubuntu_sso/utils/ui.py:113 msgid "At least 8 characters" msgstr "" #: ../ubuntu_sso/utils/ui.py:114 msgid "Passwords don't match" msgstr "" #: ../ubuntu_sso/utils/ui.py:115 msgid "" "The passwords don't match, please double check and try entering them again." msgstr "" #: ../ubuntu_sso/utils/ui.py:117 msgid "Your password must contain" msgstr "" #: ../ubuntu_sso/utils/ui.py:118 msgid "The password is too weak." msgstr "" #: ../ubuntu_sso/utils/ui.py:119 msgid "At least one uppercase letter" msgstr "" #: ../ubuntu_sso/utils/ui.py:120 msgid "Privacy Policy" msgstr "" #: ../ubuntu_sso/utils/ui.py:121 msgid "Connecting to:" msgstr "" #: ../ubuntu_sso/utils/ui.py:122 msgid "Proxy Settings" msgstr "" #: ../ubuntu_sso/utils/ui.py:123 msgid "Incorrect login details. Please try again." msgstr "" #: ../ubuntu_sso/utils/ui.py:124 msgid "Please provide login details." msgstr "" #: ../ubuntu_sso/utils/ui.py:125 msgid "You are connecting through a proxy." msgstr "" #: ../ubuntu_sso/utils/ui.py:126 msgid "Get Help With Proxies" msgstr "" #: ../ubuntu_sso/utils/ui.py:127 msgid "Proxy password:" msgstr "" #: ../ubuntu_sso/utils/ui.py:128 msgid "Save and Connect" msgstr "" #: ../ubuntu_sso/utils/ui.py:129 msgid "Proxy username:" msgstr "" #: ../ubuntu_sso/utils/ui.py:131 msgid "" "A password reset code has been sent to your e-mail. Please enter the code " "below along with your new password." msgstr "" #: ../ubuntu_sso/utils/ui.py:133 msgid "Retype email" msgstr "" #: ../ubuntu_sso/utils/ui.py:134 msgid "Retype password" msgstr "" #: ../ubuntu_sso/utils/ui.py:135 #, python-format msgid "To reset your %(app_name)s password, enter your email address below:" msgstr "" #: ../ubuntu_sso/utils/ui.py:137 msgid "" "We are very Sorry! The service that signs you on is not responding right " "now\n" "Please try again or come back in a few minutes." msgstr "" #: ../ubuntu_sso/utils/ui.py:140 msgid "Sorry we did not recognize the email address." msgstr "" #: ../ubuntu_sso/utils/ui.py:142 msgid "Reset code" msgstr "" #: ../ubuntu_sso/utils/ui.py:145 #, python-format msgid "" "A password reset code has been sent to %(email)s.\n" "Please enter the code below along with your new password." msgstr "" #: ../ubuntu_sso/utils/ui.py:147 msgid "Set Up Account" msgstr "" #: ../ubuntu_sso/utils/ui.py:148 msgid "I don't have an account yet - sign me up" msgstr "" #: ../ubuntu_sso/utils/ui.py:149 msgid "Sign In" msgstr "" #: ../ubuntu_sso/utils/ui.py:150 msgid "Log-in with my existing account." msgstr "" #: ../ubuntu_sso/utils/ui.py:151 msgid "the appname whose ssl error we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:152 msgid "Certificate details" msgstr "" #: ../ubuntu_sso/utils/ui.py:153 msgid "Connect" msgstr "" #: ../ubuntu_sso/utils/ui.py:154 msgid "the details ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:161 msgid "Open the SSL certificate UI." msgstr "" #: ../ubuntu_sso/utils/ui.py:162 msgid "SSL Certificate Not Valid" msgstr "" #: ../ubuntu_sso/utils/ui.py:163 msgid "the domain whose ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:164 #, python-format msgid "" "You are trying to connect to a proxy server on %(domain)s. This server uses " "a secure connection, and the SSL certificate is not valid because:" msgstr "" #: ../ubuntu_sso/utils/ui.py:167 msgid "The certificate has not been verified" msgstr "" #: ../ubuntu_sso/utils/ui.py:168 msgid "Do you want to connect to this server?" msgstr "" #: ../ubuntu_sso/utils/ui.py:169 msgid "Get Help With SSL" msgstr "" #: ../ubuntu_sso/utils/ui.py:170 #, python-format msgid "" "If you are not sure about this server, do not use it to connect to " "%(app_name)s." msgstr "" #: ../ubuntu_sso/utils/ui.py:172 msgid "Remember my settings for this certificate." msgstr "" #: ../ubuntu_sso/utils/ui.py:173 msgid "" "The name on the certificate isn't valid or doesn't match the name of the site" msgstr "" #: ../ubuntu_sso/utils/ui.py:175 msgid "The certificate has expired" msgstr "" #: ../ubuntu_sso/utils/ui.py:176 #, python-format msgid "You are now logged into %(app_name)s." msgstr "" #: ../ubuntu_sso/utils/ui.py:177 msgid "Surname" msgstr "" #: ../ubuntu_sso/utils/ui.py:178 msgid "Terms of Service" msgstr "" #: ../ubuntu_sso/utils/ui.py:179 msgid "Sign Up to {app_name}" msgstr "" #: ../ubuntu_sso/utils/ui.py:180 msgid "Show Terms & Conditions" msgstr "" #: ../ubuntu_sso/utils/ui.py:181 #, python-format msgid "" "Agreeing to the %(app_name)s Terms & Conditions is required to subscribe." msgstr "" #: ../ubuntu_sso/utils/ui.py:183 #, python-format msgid "You can also find these terms at %(url)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:184 msgid "Try again" msgstr "" #: ../ubuntu_sso/utils/ui.py:185 msgid "" "There was an error when trying to complete the process. Please check the " "information and try again." msgstr "" #: ../ubuntu_sso/utils/ui.py:187 msgid "Verification code" msgstr "" #: ../ubuntu_sso/utils/ui.py:188 #, python-format msgid "" "Check %(email)s for an email from Ubuntu Single Sign On. This message " "contains a verification code. Enter the code in the field below and click OK " "to complete creating your %(app_name)s account." msgstr "" #: ../ubuntu_sso/utils/ui.py:192 msgid "Enter verification code" msgstr "" #: ../ubuntu_sso/utils/ui.py:195 #, python-format msgid "I agree with the %(app_name)s terms and conditions" msgstr "" #: ../ubuntu_sso/utils/ui.py:196 #, python-format msgid "Yes! Email me %(app_name)s tips and updates." msgstr "" ubuntu-sso-client-13.10/po/pt.po0000664000202700020270000003246312151461656016762 0ustar dobeydobey00000000000000# Portuguese translation for ubuntu-sso-client # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the ubuntu-sso-client package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: ubuntu-sso-client\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-09-11 18:25+0000\n" "PO-Revision-Date: 2012-06-04 13:47+0000\n" "Last-Translator: Mykas0 \n" "Language-Team: Portuguese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-09-17 18:24+0000\n" "X-Generator: Launchpad (build 15944)\n" #. Undefined variable '_', pylint: disable=E0602 #. all the text that is used in the gui #: ../ubuntu_sso/utils/ui.py:49 msgid "By signing up to {app_name} you agree to our {privacy_policy}" msgstr "Ao inscrever-se no {app_name} concorda com a nossa {privacy_policy}" #: ../ubuntu_sso/utils/ui.py:51 msgid "By signing up to {app_name} you agree to our {terms_and_conditions}" msgstr "" #: ../ubuntu_sso/utils/ui.py:53 msgid " and {privacy_policy}" msgstr " e {privacy_policy}" #: ../ubuntu_sso/utils/ui.py:54 msgid "Cancel" msgstr "Cancelar" #: ../ubuntu_sso/utils/ui.py:55 msgid "Type the characters above" msgstr "Escreva os caracteres acima" #: ../ubuntu_sso/utils/ui.py:56 msgid "There was a problem getting the captcha, reloading..." msgstr "Ocorreu um problema com a obtenção do captcha, a recarregar..." #: ../ubuntu_sso/utils/ui.py:58 #, python-format msgid "If you can't read this then %(reload_link)s this page" msgstr "Se não consegue ler isto então %(reload_link)s esta página" #: ../ubuntu_sso/utils/ui.py:60 msgid "refresh" msgstr "actualizar" #: ../ubuntu_sso/utils/ui.py:61 msgid "Reload" msgstr "Actualizar" #: ../ubuntu_sso/utils/ui.py:62 msgid "The captcha is a required field" msgstr "O captcha é um campo obrigatório" #: ../ubuntu_sso/utils/ui.py:63 msgid "Close window and set up later" msgstr "Fechar a janela e configurar mais tarde" #: ../ubuntu_sso/utils/ui.py:64 msgid "Congratulations, {app_name} is installed!" msgstr "Parabéns, {app_name} está instalado!" #: ../ubuntu_sso/utils/ui.py:65 #, python-format msgid "To connect this computer to %(app_name)s enter your details below." msgstr "" "Para ligar este computador a %(app_name)s introduza os seus detalhes em " "baixo." #: ../ubuntu_sso/utils/ui.py:67 msgid "Register with {app_name}." msgstr "" #: ../ubuntu_sso/utils/ui.py:68 ../ubuntu_sso/utils/ui.py:93 #: ../ubuntu_sso/utils/ui.py:143 msgid "Email address" msgstr "Endereço de correio electrónico" #: ../ubuntu_sso/utils/ui.py:69 msgid "Re-type Email address" msgstr "Reescreva o Endereço de Correio Electrónico" #: ../ubuntu_sso/utils/ui.py:70 msgid "The email must be a valid email address." msgstr "O endereço de correio electrónico deve ser um válido." #: ../ubuntu_sso/utils/ui.py:71 msgid "" "The email addresses don't match, please double check and try entering them " "again." msgstr "" "Os endereços de correio electrónico não coincidem, por favor verifique e " "tente introduzir novamente." #: ../ubuntu_sso/utils/ui.py:73 msgid "Email" msgstr "Correio eletrónico" #: ../ubuntu_sso/utils/ui.py:74 msgid "The email addresses do not match" msgstr "Os endereços de E-Mail não coincidem" #: ../ubuntu_sso/utils/ui.py:75 msgid "Enter code verification here" msgstr "Introduza aqui o código de verificação" #: ../ubuntu_sso/utils/ui.py:76 msgid "Please enter your name" msgstr "Por favor introduza o seu nome" #: ../ubuntu_sso/utils/ui.py:77 msgid "The process did not finish successfully." msgstr "O processo não terminou com sucesso." #: ../ubuntu_sso/utils/ui.py:79 msgid "Sign me in with my existing account" msgstr "Ligar-me com a minha conta já existente" #: ../ubuntu_sso/utils/ui.py:80 msgid "This field is required." msgstr "Este campo é obrigatório." #: ../ubuntu_sso/utils/ui.py:81 msgid "I've forgotten my password" msgstr "Esqueci-me a minha palavra-passe" #: ../ubuntu_sso/utils/ui.py:82 ../ubuntu_sso/utils/ui.py:130 msgid "Reset password" msgstr "Reiniciar palavra-passe" #: ../ubuntu_sso/utils/ui.py:83 msgid "" "To reset your {app_name} password, enter your registered email address " "below. We will send instructions to reset your password." msgstr "" "Para repor a sua palavra-passe de {app_name}, tem de introduzir o endereço " "de E-Mail com o qual se registou. Enviaremos as instruções para repor a sua " "palavra-passe." #: ../ubuntu_sso/utils/ui.py:86 msgid "Please enter a valid email address" msgstr "Por favor introduza um endereço de e-Mail válido" #: ../ubuntu_sso/utils/ui.py:87 msgid "There was a problem accessing the Ubuntu Single Sign On backend." msgstr "" #: ../ubuntu_sso/utils/ui.py:89 #, python-format msgid "Create %(app_name)s account" msgstr "Criar conta do %(app_name)s" #: ../ubuntu_sso/utils/ui.py:90 msgid "Loading..." msgstr "A carregar..." #: ../ubuntu_sso/utils/ui.py:91 msgid "Getting information, please wait..." msgstr "A obter informação, por favor aguarde..." #: ../ubuntu_sso/utils/ui.py:92 msgid "Already have an account? Click here to sign in" msgstr "Já tem uma conta? Clique aqui para entrar" #: ../ubuntu_sso/utils/ui.py:94 #, python-format msgid "Connect to %(app_name)s" msgstr "Ligar a %(app_name)s" #: ../ubuntu_sso/utils/ui.py:95 ../ubuntu_sso/utils/ui.py:109 msgid "Password" msgstr "Palavra-passe" #: ../ubuntu_sso/utils/ui.py:97 msgid "Sign In to {app_name}" msgstr "" #: ../ubuntu_sso/utils/ui.py:99 msgid "Name" msgstr "Nome" #: ../ubuntu_sso/utils/ui.py:100 msgid "The name must not be empty." msgstr "O nome não pode ser vazio." #: ../ubuntu_sso/utils/ui.py:101 msgid "Next" msgstr "Seguinte" #: ../ubuntu_sso/utils/ui.py:102 msgid "Network detection" msgstr "Detecção de rede" #: ../ubuntu_sso/utils/ui.py:103 #, python-format msgid "" "Are you online? We can't detect an internet connection - you will need to be " "connected to set up %(app_name)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:105 msgid "One moment please..." msgstr "Um momento, por favor ..." #: ../ubuntu_sso/utils/ui.py:106 msgid "Create a password" msgstr "" #: ../ubuntu_sso/utils/ui.py:107 msgid "Your password was successfully changed." msgstr "A sua palavra-passe foi alterada com sucesso." #: ../ubuntu_sso/utils/ui.py:108 msgid "At least one number" msgstr "Pelo menos um número" #: ../ubuntu_sso/utils/ui.py:110 msgid "Re-type Password" msgstr "Reescreva a Palavra-passe" #: ../ubuntu_sso/utils/ui.py:111 msgid "" "The password must have a minimum of 8 characters and include one uppercase " "character and one number." msgstr "" "A palavra-passe deve de ter um mínimo de 8 caracteres e incluir uma letra " "maiúscula e um número." #: ../ubuntu_sso/utils/ui.py:113 msgid "At least 8 characters" msgstr "Pelo menos 8 caracteres" #: ../ubuntu_sso/utils/ui.py:114 msgid "Passwords don't match" msgstr "As passwords não são iguais" #: ../ubuntu_sso/utils/ui.py:115 msgid "" "The passwords don't match, please double check and try entering them again." msgstr "" "As palavras-passe não coincidem, por favor verifique e tente introduzi-las " "novamente." #: ../ubuntu_sso/utils/ui.py:117 msgid "Your password must contain" msgstr "A sua password deve conter" #: ../ubuntu_sso/utils/ui.py:118 msgid "The password is too weak." msgstr "A palavra-passe é demasiado fraca." #: ../ubuntu_sso/utils/ui.py:119 msgid "At least one uppercase letter" msgstr "Pelo menos uma letra maiúscula" #: ../ubuntu_sso/utils/ui.py:120 msgid "Privacy Policy" msgstr "Polícia de Privacidade" #: ../ubuntu_sso/utils/ui.py:121 msgid "Connecting to:" msgstr "A ligar a:" #: ../ubuntu_sso/utils/ui.py:122 msgid "Proxy Settings" msgstr "Definições de Proxy" #: ../ubuntu_sso/utils/ui.py:123 msgid "Incorrect login details. Please try again." msgstr "" #: ../ubuntu_sso/utils/ui.py:124 msgid "Please provide login details." msgstr "" #: ../ubuntu_sso/utils/ui.py:125 msgid "You are connecting through a proxy." msgstr "" #: ../ubuntu_sso/utils/ui.py:126 msgid "Get Help With Proxies" msgstr "Obtenha ajuda com os Proxies" #: ../ubuntu_sso/utils/ui.py:127 msgid "Proxy password:" msgstr "" #: ../ubuntu_sso/utils/ui.py:128 msgid "Save and Connect" msgstr "Gravar e Ligar" #: ../ubuntu_sso/utils/ui.py:129 msgid "Proxy username:" msgstr "" #: ../ubuntu_sso/utils/ui.py:131 msgid "" "A password reset code has been sent to your e-mail. Please enter the code " "below along with your new password." msgstr "" #: ../ubuntu_sso/utils/ui.py:133 msgid "Retype email" msgstr "" #: ../ubuntu_sso/utils/ui.py:134 msgid "Retype password" msgstr "" #: ../ubuntu_sso/utils/ui.py:135 #, python-format msgid "To reset your %(app_name)s password, enter your email address below:" msgstr "" "Para reiniciar a sua palavra-passe do %(app_name)s, introduza o seu endereço " "de correio electrónico abaixo:" #: ../ubuntu_sso/utils/ui.py:137 msgid "" "We are very Sorry! The service that signs you on is not responding right " "now\n" "Please try again or come back in a few minutes." msgstr "" #: ../ubuntu_sso/utils/ui.py:140 msgid "Sorry we did not recognize the email address." msgstr "" #: ../ubuntu_sso/utils/ui.py:142 msgid "Reset code" msgstr "Reiniciar código" #: ../ubuntu_sso/utils/ui.py:145 #, python-format msgid "" "A password reset code has been sent to %(email)s.\n" "Please enter the code below along with your new password." msgstr "" "Um código para reiniciar a palavra-passe foi enviado para %(email)s.\n" "Por favor introduza o código em baixo junto com a sua nova palavra-passe." #: ../ubuntu_sso/utils/ui.py:147 msgid "Set Up Account" msgstr "" #: ../ubuntu_sso/utils/ui.py:148 msgid "I don't have an account yet - sign me up" msgstr "" #: ../ubuntu_sso/utils/ui.py:149 msgid "Sign In" msgstr "Iniciar sessão" #: ../ubuntu_sso/utils/ui.py:150 msgid "Log-in with my existing account." msgstr "" #: ../ubuntu_sso/utils/ui.py:151 msgid "the appname whose ssl error we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:152 msgid "Certificate details" msgstr "Detalhes do certificado" #: ../ubuntu_sso/utils/ui.py:153 msgid "Connect" msgstr "Ligar" #: ../ubuntu_sso/utils/ui.py:154 msgid "the details ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:161 msgid "Open the SSL certificate UI." msgstr "" #: ../ubuntu_sso/utils/ui.py:162 msgid "SSL Certificate Not Valid" msgstr "Certificado SSL não válido" #: ../ubuntu_sso/utils/ui.py:163 msgid "the domain whose ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:164 #, python-format msgid "" "You are trying to connect to a proxy server on %(domain)s. This server uses " "a secure connection, and the SSL certificate is not valid because:" msgstr "" #: ../ubuntu_sso/utils/ui.py:167 msgid "The certificate has not been verified" msgstr "O certificado não foi verificado" #: ../ubuntu_sso/utils/ui.py:168 msgid "Do you want to connect to this server?" msgstr "" #: ../ubuntu_sso/utils/ui.py:169 msgid "Get Help With SSL" msgstr "Obtenha ajuda com SSL" #: ../ubuntu_sso/utils/ui.py:170 #, python-format msgid "" "If you are not sure about this server, do not use it to connect to " "%(app_name)s." msgstr "" #: ../ubuntu_sso/utils/ui.py:172 msgid "Remember my settings for this certificate." msgstr "" #: ../ubuntu_sso/utils/ui.py:173 msgid "" "The name on the certificate isn't valid or doesn't match the name of the site" msgstr "" #: ../ubuntu_sso/utils/ui.py:175 msgid "The certificate has expired" msgstr "O certificado expirou" #: ../ubuntu_sso/utils/ui.py:176 #, python-format msgid "You are now logged into %(app_name)s." msgstr "" #: ../ubuntu_sso/utils/ui.py:177 msgid "Surname" msgstr "Apelido" #: ../ubuntu_sso/utils/ui.py:178 msgid "Terms of Service" msgstr "Termos de Serviço" #: ../ubuntu_sso/utils/ui.py:179 msgid "Sign Up to {app_name}" msgstr "" #: ../ubuntu_sso/utils/ui.py:180 msgid "Show Terms & Conditions" msgstr "Mostrar os Termos e Condições" #: ../ubuntu_sso/utils/ui.py:181 #, python-format msgid "" "Agreeing to the %(app_name)s Terms & Conditions is required to subscribe." msgstr "" #: ../ubuntu_sso/utils/ui.py:183 #, python-format msgid "You can also find these terms at %(url)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:184 msgid "Try again" msgstr "Tentar novamente" #: ../ubuntu_sso/utils/ui.py:185 msgid "" "There was an error when trying to complete the process. Please check the " "information and try again." msgstr "" "Ocorreu um erro ao tentar completar o processo. Por favor verifique a " "informação e tente novamente." #: ../ubuntu_sso/utils/ui.py:187 msgid "Verification code" msgstr "Código de verificação" #: ../ubuntu_sso/utils/ui.py:188 #, python-format msgid "" "Check %(email)s for an email from Ubuntu Single Sign On. This message " "contains a verification code. Enter the code in the field below and click OK " "to complete creating your %(app_name)s account." msgstr "" #: ../ubuntu_sso/utils/ui.py:192 msgid "Enter verification code" msgstr "Introduza o código de verificação" #: ../ubuntu_sso/utils/ui.py:195 #, python-format msgid "I agree with the %(app_name)s terms and conditions" msgstr "Eu aceito os Termos e Condições da aplicação %(app_name)s" #: ../ubuntu_sso/utils/ui.py:196 #, python-format msgid "Yes! Email me %(app_name)s tips and updates." msgstr "" "Sim! Envie-me uma mensagem de correio electrónico com sugestões e " "actualizações sobre %(app_name)s." ubuntu-sso-client-13.10/po/ckb.po0000664000202700020270000002762012151461656017075 0ustar dobeydobey00000000000000# Kurdish (Sorani) translation for ubuntu-sso-client # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the ubuntu-sso-client package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: ubuntu-sso-client\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-09-11 18:25+0000\n" "PO-Revision-Date: 2010-09-23 22:01+0000\n" "Last-Translator: jwtear nariman \n" "Language-Team: Kurdish (Sorani) \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-09-17 18:24+0000\n" "X-Generator: Launchpad (build 15944)\n" #. Undefined variable '_', pylint: disable=E0602 #. all the text that is used in the gui #: ../ubuntu_sso/utils/ui.py:49 msgid "By signing up to {app_name} you agree to our {privacy_policy}" msgstr "" #: ../ubuntu_sso/utils/ui.py:51 msgid "By signing up to {app_name} you agree to our {terms_and_conditions}" msgstr "" #: ../ubuntu_sso/utils/ui.py:53 msgid " and {privacy_policy}" msgstr "" #: ../ubuntu_sso/utils/ui.py:54 msgid "Cancel" msgstr "" #: ../ubuntu_sso/utils/ui.py:55 msgid "Type the characters above" msgstr "نووسەکان لێبدە Ù„Û• خوارەوە" #: ../ubuntu_sso/utils/ui.py:56 msgid "There was a problem getting the captcha, reloading..." msgstr "" #: ../ubuntu_sso/utils/ui.py:58 #, python-format msgid "If you can't read this then %(reload_link)s this page" msgstr "" #: ../ubuntu_sso/utils/ui.py:60 msgid "refresh" msgstr "" #: ../ubuntu_sso/utils/ui.py:61 msgid "Reload" msgstr "باركردنه‌وه" #: ../ubuntu_sso/utils/ui.py:62 msgid "The captcha is a required field" msgstr "" #: ../ubuntu_sso/utils/ui.py:63 msgid "Close window and set up later" msgstr "" #: ../ubuntu_sso/utils/ui.py:64 msgid "Congratulations, {app_name} is installed!" msgstr "" #: ../ubuntu_sso/utils/ui.py:65 #, python-format msgid "To connect this computer to %(app_name)s enter your details below." msgstr "" #: ../ubuntu_sso/utils/ui.py:67 msgid "Register with {app_name}." msgstr "" #: ../ubuntu_sso/utils/ui.py:68 ../ubuntu_sso/utils/ui.py:93 #: ../ubuntu_sso/utils/ui.py:143 msgid "Email address" msgstr "پۆستی ئەلکترۆنی" #: ../ubuntu_sso/utils/ui.py:69 msgid "Re-type Email address" msgstr "دووبارە پۆستی ئەلکترۆنی بنوسەوە" #: ../ubuntu_sso/utils/ui.py:70 msgid "The email must be a valid email address." msgstr "پۆستی ئەلکترۆنی ئەبێت ڕاست بێت" #: ../ubuntu_sso/utils/ui.py:71 msgid "" "The email addresses don't match, please double check and try entering them " "again." msgstr "" "ئەم پۆستی ئەلکترۆنیە هەڵەیە ØŒ تکایە دووبارە Ú†ÛŽÚ© بکەرەوە وهەوڵ بدەرەوە." #: ../ubuntu_sso/utils/ui.py:73 msgid "Email" msgstr "" #: ../ubuntu_sso/utils/ui.py:74 msgid "The email addresses do not match" msgstr "" #: ../ubuntu_sso/utils/ui.py:75 msgid "Enter code verification here" msgstr "کۆدی سەلماندن بنووسە لێرە" #: ../ubuntu_sso/utils/ui.py:76 msgid "Please enter your name" msgstr "" #: ../ubuntu_sso/utils/ui.py:77 msgid "The process did not finish successfully." msgstr "" #: ../ubuntu_sso/utils/ui.py:79 msgid "Sign me in with my existing account" msgstr "" #: ../ubuntu_sso/utils/ui.py:80 msgid "This field is required." msgstr "ئەم بۆشاییە داواکراوە" #: ../ubuntu_sso/utils/ui.py:81 msgid "I've forgotten my password" msgstr "وشەی تێپەڕبوونم ون کردووە" #: ../ubuntu_sso/utils/ui.py:82 ../ubuntu_sso/utils/ui.py:130 msgid "Reset password" msgstr "وشەی تێپەڕبوون نوێبکەرەوە" #: ../ubuntu_sso/utils/ui.py:83 msgid "" "To reset your {app_name} password, enter your registered email address " "below. We will send instructions to reset your password." msgstr "" #: ../ubuntu_sso/utils/ui.py:86 msgid "Please enter a valid email address" msgstr "" #: ../ubuntu_sso/utils/ui.py:87 msgid "There was a problem accessing the Ubuntu Single Sign On backend." msgstr "" #: ../ubuntu_sso/utils/ui.py:89 #, python-format msgid "Create %(app_name)s account" msgstr "" #: ../ubuntu_sso/utils/ui.py:90 msgid "Loading..." msgstr "دادەبزێت" #: ../ubuntu_sso/utils/ui.py:91 msgid "Getting information, please wait..." msgstr "" #: ../ubuntu_sso/utils/ui.py:92 msgid "Already have an account? Click here to sign in" msgstr "ئایە کاونتی خۆت هەیە؟ کرتە لیرە بکەبۆ چونە ژورەوە" #: ../ubuntu_sso/utils/ui.py:94 #, python-format msgid "Connect to %(app_name)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:95 ../ubuntu_sso/utils/ui.py:109 msgid "Password" msgstr "تێپەڕەوشە" #: ../ubuntu_sso/utils/ui.py:97 msgid "Sign In to {app_name}" msgstr "" #: ../ubuntu_sso/utils/ui.py:99 msgid "Name" msgstr "ناو" #: ../ubuntu_sso/utils/ui.py:100 msgid "The name must not be empty." msgstr "" #: ../ubuntu_sso/utils/ui.py:101 msgid "Next" msgstr "داهاتوو" #: ../ubuntu_sso/utils/ui.py:102 msgid "Network detection" msgstr "" #: ../ubuntu_sso/utils/ui.py:103 #, python-format msgid "" "Are you online? We can't detect an internet connection - you will need to be " "connected to set up %(app_name)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:105 msgid "One moment please..." msgstr "تۆزێک بوەستە تکایە ..." #: ../ubuntu_sso/utils/ui.py:106 msgid "Create a password" msgstr "" #: ../ubuntu_sso/utils/ui.py:107 msgid "Your password was successfully changed." msgstr "تێپەڕە وشەکەت بە سەرکەتووی گۆڕدرا" #: ../ubuntu_sso/utils/ui.py:108 msgid "At least one number" msgstr "" #: ../ubuntu_sso/utils/ui.py:110 msgid "Re-type Password" msgstr "دووبارە وشەی تێپەڕبوون بنوسەرەوە" #: ../ubuntu_sso/utils/ui.py:111 msgid "" "The password must have a minimum of 8 characters and include one uppercase " "character and one number." msgstr "وشەی تێپەڕبوون نابێت Ù„Û• Û¸ پیت Ùˆ ژمارە کەمتر نەبێت." #: ../ubuntu_sso/utils/ui.py:113 msgid "At least 8 characters" msgstr "" #: ../ubuntu_sso/utils/ui.py:114 msgid "Passwords don't match" msgstr "" #: ../ubuntu_sso/utils/ui.py:115 msgid "" "The passwords don't match, please double check and try entering them again." msgstr "" "وشەی تێپەڕبوون هەڵەیە ØŒ تکایە دووبارە Ú†ÛŽÚ© بکەرەوە Ùˆ دووبارە بیکەرەوە ." #: ../ubuntu_sso/utils/ui.py:117 msgid "Your password must contain" msgstr "" #: ../ubuntu_sso/utils/ui.py:118 msgid "The password is too weak." msgstr "وشەی تێپەڕبوون زۆر لاوازە" #: ../ubuntu_sso/utils/ui.py:119 msgid "At least one uppercase letter" msgstr "" #: ../ubuntu_sso/utils/ui.py:120 msgid "Privacy Policy" msgstr "" #: ../ubuntu_sso/utils/ui.py:121 msgid "Connecting to:" msgstr "" #: ../ubuntu_sso/utils/ui.py:122 msgid "Proxy Settings" msgstr "" #: ../ubuntu_sso/utils/ui.py:123 msgid "Incorrect login details. Please try again." msgstr "" #: ../ubuntu_sso/utils/ui.py:124 msgid "Please provide login details." msgstr "" #: ../ubuntu_sso/utils/ui.py:125 msgid "You are connecting through a proxy." msgstr "" #: ../ubuntu_sso/utils/ui.py:126 msgid "Get Help With Proxies" msgstr "" #: ../ubuntu_sso/utils/ui.py:127 msgid "Proxy password:" msgstr "" #: ../ubuntu_sso/utils/ui.py:128 msgid "Save and Connect" msgstr "" #: ../ubuntu_sso/utils/ui.py:129 msgid "Proxy username:" msgstr "" #: ../ubuntu_sso/utils/ui.py:131 msgid "" "A password reset code has been sent to your e-mail. Please enter the code " "below along with your new password." msgstr "" #: ../ubuntu_sso/utils/ui.py:133 msgid "Retype email" msgstr "" #: ../ubuntu_sso/utils/ui.py:134 msgid "Retype password" msgstr "" #: ../ubuntu_sso/utils/ui.py:135 #, python-format msgid "To reset your %(app_name)s password, enter your email address below:" msgstr "" #: ../ubuntu_sso/utils/ui.py:137 msgid "" "We are very Sorry! The service that signs you on is not responding right " "now\n" "Please try again or come back in a few minutes." msgstr "" #: ../ubuntu_sso/utils/ui.py:140 msgid "Sorry we did not recognize the email address." msgstr "" #: ../ubuntu_sso/utils/ui.py:142 msgid "Reset code" msgstr "کۆدەکە نوێبکەرەوە" #: ../ubuntu_sso/utils/ui.py:145 #, python-format msgid "" "A password reset code has been sent to %(email)s.\n" "Please enter the code below along with your new password." msgstr "" #: ../ubuntu_sso/utils/ui.py:147 msgid "Set Up Account" msgstr "" #: ../ubuntu_sso/utils/ui.py:148 msgid "I don't have an account yet - sign me up" msgstr "" #: ../ubuntu_sso/utils/ui.py:149 msgid "Sign In" msgstr "" #: ../ubuntu_sso/utils/ui.py:150 msgid "Log-in with my existing account." msgstr "" #: ../ubuntu_sso/utils/ui.py:151 msgid "the appname whose ssl error we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:152 msgid "Certificate details" msgstr "" #: ../ubuntu_sso/utils/ui.py:153 msgid "Connect" msgstr "" #: ../ubuntu_sso/utils/ui.py:154 msgid "the details ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:161 msgid "Open the SSL certificate UI." msgstr "" #: ../ubuntu_sso/utils/ui.py:162 msgid "SSL Certificate Not Valid" msgstr "" #: ../ubuntu_sso/utils/ui.py:163 msgid "the domain whose ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:164 #, python-format msgid "" "You are trying to connect to a proxy server on %(domain)s. This server uses " "a secure connection, and the SSL certificate is not valid because:" msgstr "" #: ../ubuntu_sso/utils/ui.py:167 msgid "The certificate has not been verified" msgstr "" #: ../ubuntu_sso/utils/ui.py:168 msgid "Do you want to connect to this server?" msgstr "" #: ../ubuntu_sso/utils/ui.py:169 msgid "Get Help With SSL" msgstr "" #: ../ubuntu_sso/utils/ui.py:170 #, python-format msgid "" "If you are not sure about this server, do not use it to connect to " "%(app_name)s." msgstr "" #: ../ubuntu_sso/utils/ui.py:172 msgid "Remember my settings for this certificate." msgstr "" #: ../ubuntu_sso/utils/ui.py:173 msgid "" "The name on the certificate isn't valid or doesn't match the name of the site" msgstr "" #: ../ubuntu_sso/utils/ui.py:175 msgid "The certificate has expired" msgstr "" #: ../ubuntu_sso/utils/ui.py:176 #, python-format msgid "You are now logged into %(app_name)s." msgstr "" #: ../ubuntu_sso/utils/ui.py:177 msgid "Surname" msgstr "" #: ../ubuntu_sso/utils/ui.py:178 msgid "Terms of Service" msgstr "" #: ../ubuntu_sso/utils/ui.py:179 msgid "Sign Up to {app_name}" msgstr "" #: ../ubuntu_sso/utils/ui.py:180 msgid "Show Terms & Conditions" msgstr "" #: ../ubuntu_sso/utils/ui.py:181 #, python-format msgid "" "Agreeing to the %(app_name)s Terms & Conditions is required to subscribe." msgstr "" #: ../ubuntu_sso/utils/ui.py:183 #, python-format msgid "You can also find these terms at %(url)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:184 msgid "Try again" msgstr "" #: ../ubuntu_sso/utils/ui.py:185 msgid "" "There was an error when trying to complete the process. Please check the " "information and try again." msgstr "" "هەڵەیەک ڕوویدا Ù„Û• کاتی تەواوکردنی ئەم پرۆسەیە . تکایە دووبارە Ú†ÛŽÚ©ÛŒ " "زانیاریەکانت بکە Ùˆ Ù‡Û•ÙˆÚµ بدەرەوە" #: ../ubuntu_sso/utils/ui.py:187 msgid "Verification code" msgstr "" #: ../ubuntu_sso/utils/ui.py:188 #, python-format msgid "" "Check %(email)s for an email from Ubuntu Single Sign On. This message " "contains a verification code. Enter the code in the field below and click OK " "to complete creating your %(app_name)s account." msgstr "" #: ../ubuntu_sso/utils/ui.py:192 msgid "Enter verification code" msgstr "کۆدی سەلماندن بنووسە" #: ../ubuntu_sso/utils/ui.py:195 #, python-format msgid "I agree with the %(app_name)s terms and conditions" msgstr "" #: ../ubuntu_sso/utils/ui.py:196 #, python-format msgid "Yes! Email me %(app_name)s tips and updates." msgstr "" ubuntu-sso-client-13.10/po/sl.po0000664000202700020270000003504212151461656016751 0ustar dobeydobey00000000000000# Slovenian translation for ubuntu-sso-client # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the ubuntu-sso-client package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: ubuntu-sso-client\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-09-11 18:25+0000\n" "PO-Revision-Date: 2012-09-07 20:21+0000\n" "Last-Translator: Andrej Znidarsic \n" "Language-Team: Slovenian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-09-17 18:24+0000\n" "X-Generator: Launchpad (build 15944)\n" #. Undefined variable '_', pylint: disable=E0602 #. all the text that is used in the gui #: ../ubuntu_sso/utils/ui.py:49 msgid "By signing up to {app_name} you agree to our {privacy_policy}" msgstr "S prijavo v {app_name} se strinjate z naÅ¡imi {privacy_policy}" #: ../ubuntu_sso/utils/ui.py:51 msgid "By signing up to {app_name} you agree to our {terms_and_conditions}" msgstr "S prijavo v {app_name} se strinjate z naÅ¡imi {terms_and_conditions}" #: ../ubuntu_sso/utils/ui.py:53 msgid " and {privacy_policy}" msgstr " ter {privacy_policy}" #: ../ubuntu_sso/utils/ui.py:54 msgid "Cancel" msgstr "PrekliÄi" #: ../ubuntu_sso/utils/ui.py:55 msgid "Type the characters above" msgstr "PrepiÅ¡ite zgornje znake" #: ../ubuntu_sso/utils/ui.py:56 msgid "There was a problem getting the captcha, reloading..." msgstr "" "Med pridobivanjem captch-e je priÅ¡lo do napake, ponovno nalaganje ..." #: ../ubuntu_sso/utils/ui.py:58 #, python-format msgid "If you can't read this then %(reload_link)s this page" msgstr "ÄŒe tega ni mogoÄe prebrati potem %(reload_link)s to stran" #: ../ubuntu_sso/utils/ui.py:60 msgid "refresh" msgstr "osveži" #: ../ubuntu_sso/utils/ui.py:61 msgid "Reload" msgstr "Znova naloži" #: ../ubuntu_sso/utils/ui.py:62 msgid "The captcha is a required field" msgstr "Polje captcha morate obvezno izpolnit" #: ../ubuntu_sso/utils/ui.py:63 msgid "Close window and set up later" msgstr "Zapri okno in nadaljuj kasneje" #: ../ubuntu_sso/utils/ui.py:64 msgid "Congratulations, {app_name} is installed!" msgstr "ÄŒestitke, {app_name} je nameÅ¡Äen!" #: ../ubuntu_sso/utils/ui.py:65 #, python-format msgid "To connect this computer to %(app_name)s enter your details below." msgstr "" "Za povezavo tega raÄunalnika z %(app_name)s vnesite svoje podrobnosti spodaj." #: ../ubuntu_sso/utils/ui.py:67 msgid "Register with {app_name}." msgstr "Registriraj z {app_name}." #: ../ubuntu_sso/utils/ui.py:68 ../ubuntu_sso/utils/ui.py:93 #: ../ubuntu_sso/utils/ui.py:143 msgid "Email address" msgstr "Naslov e-poÅ¡te" #: ../ubuntu_sso/utils/ui.py:69 msgid "Re-type Email address" msgstr "Znova vnesite naslov e-poÅ¡te" #: ../ubuntu_sso/utils/ui.py:70 msgid "The email must be a valid email address." msgstr "Naslov e-poÅ¡te mora biti veljaven." #: ../ubuntu_sso/utils/ui.py:71 msgid "" "The email addresses don't match, please double check and try entering them " "again." msgstr "Naslova e-poÅ¡te se ne ujemata. Preverite ju in poskusite znova." #: ../ubuntu_sso/utils/ui.py:73 msgid "Email" msgstr "E-poÅ¡ta" #: ../ubuntu_sso/utils/ui.py:74 msgid "The email addresses do not match" msgstr "E-poÅ¡tni naslovi se ne ujemajo" #: ../ubuntu_sso/utils/ui.py:75 msgid "Enter code verification here" msgstr "Sem vnesite kodo za potrditev" #: ../ubuntu_sso/utils/ui.py:76 msgid "Please enter your name" msgstr "Vnesite vaÅ¡e ime" #: ../ubuntu_sso/utils/ui.py:77 msgid "The process did not finish successfully." msgstr "Opravilo se ni zakljuÄilo uspeÅ¡no." #: ../ubuntu_sso/utils/ui.py:79 msgid "Sign me in with my existing account" msgstr "Prijavi me z obstojeÄim raÄunom" #: ../ubuntu_sso/utils/ui.py:80 msgid "This field is required." msgstr "To polje je obvezno." #: ../ubuntu_sso/utils/ui.py:81 msgid "I've forgotten my password" msgstr "Pozabil sem svoje geslo" #: ../ubuntu_sso/utils/ui.py:82 ../ubuntu_sso/utils/ui.py:130 msgid "Reset password" msgstr "Ponastavi geslo" #: ../ubuntu_sso/utils/ui.py:83 msgid "" "To reset your {app_name} password, enter your registered email address " "below. We will send instructions to reset your password." msgstr "" "Za ponastavitev gesla {app_name}, vnesite vaÅ¡ e-poÅ¡tni naslov spodaj. " "Poslali vam bomo navodila za ponastavitev gesla." #: ../ubuntu_sso/utils/ui.py:86 msgid "Please enter a valid email address" msgstr "Vnesite veljaven e-poÅ¡tni naslov" #: ../ubuntu_sso/utils/ui.py:87 msgid "There was a problem accessing the Ubuntu Single Sign On backend." msgstr "Pojavile so se težave z dostopom zaledja Ubuntu Single Sign On." #: ../ubuntu_sso/utils/ui.py:89 #, python-format msgid "Create %(app_name)s account" msgstr "Ustvari raÄun %(app_name)s" #: ../ubuntu_sso/utils/ui.py:90 msgid "Loading..." msgstr "Nalaganje ..." #: ../ubuntu_sso/utils/ui.py:91 msgid "Getting information, please wait..." msgstr "Pridobivanje podatkov, poÄakajte ..." #: ../ubuntu_sso/utils/ui.py:92 msgid "Already have an account? Click here to sign in" msgstr "Že imate raÄun? Kliknite sem za prijavo" #: ../ubuntu_sso/utils/ui.py:94 #, python-format msgid "Connect to %(app_name)s" msgstr "Povezava z %(app_name)s" #: ../ubuntu_sso/utils/ui.py:95 ../ubuntu_sso/utils/ui.py:109 msgid "Password" msgstr "Geslo" #: ../ubuntu_sso/utils/ui.py:97 msgid "Sign In to {app_name}" msgstr "Prijavite se v {app_name}" #: ../ubuntu_sso/utils/ui.py:99 msgid "Name" msgstr "Ime" #: ../ubuntu_sso/utils/ui.py:100 msgid "The name must not be empty." msgstr "Polje ime ne sme biti prazno." #: ../ubuntu_sso/utils/ui.py:101 msgid "Next" msgstr "Naprej" #: ../ubuntu_sso/utils/ui.py:102 msgid "Network detection" msgstr "Zaznavanje omrežja" #: ../ubuntu_sso/utils/ui.py:103 #, python-format msgid "" "Are you online? We can't detect an internet connection - you will need to be " "connected to set up %(app_name)s" msgstr "" "Ali ste povezani? Ne moremo zaznati internetne povezave - morate biti " "povezani za nastavitev %(app_name)s." #: ../ubuntu_sso/utils/ui.py:105 msgid "One moment please..." msgstr "Samo trenutek ..." #: ../ubuntu_sso/utils/ui.py:106 msgid "Create a password" msgstr "Ustvarite geslo" #: ../ubuntu_sso/utils/ui.py:107 msgid "Your password was successfully changed." msgstr "VaÅ¡e geslo je bilo uspeÅ¡no spremenjeno." #: ../ubuntu_sso/utils/ui.py:108 msgid "At least one number" msgstr "Vsaj eno Å¡tevilko" #: ../ubuntu_sso/utils/ui.py:110 msgid "Re-type Password" msgstr "Ponovno vnesite geslo" #: ../ubuntu_sso/utils/ui.py:111 msgid "" "The password must have a minimum of 8 characters and include one uppercase " "character and one number." msgstr "" "Geslo mora vsebovati najmanj 8 znakov in mora vsebovati vsaj eno veliko Ärko " "in eno Å¡tevilko." #: ../ubuntu_sso/utils/ui.py:113 msgid "At least 8 characters" msgstr "Vsaj 8 znakov" #: ../ubuntu_sso/utils/ui.py:114 msgid "Passwords don't match" msgstr "Gesli se ne ujemata" #: ../ubuntu_sso/utils/ui.py:115 msgid "" "The passwords don't match, please double check and try entering them again." msgstr "Gesli se ne ujemata. Preverite ju in poskusite znova." #: ../ubuntu_sso/utils/ui.py:117 msgid "Your password must contain" msgstr "VaÅ¡e geslo mora vsebovati" #: ../ubuntu_sso/utils/ui.py:118 msgid "The password is too weak." msgstr "Geslo je preÅ¡ibko." #: ../ubuntu_sso/utils/ui.py:119 msgid "At least one uppercase letter" msgstr "Najmanj eno veliko Ärko" #: ../ubuntu_sso/utils/ui.py:120 msgid "Privacy Policy" msgstr "Izjava o zasebnosti" #: ../ubuntu_sso/utils/ui.py:121 msgid "Connecting to:" msgstr "Povezujem na:" #: ../ubuntu_sso/utils/ui.py:122 msgid "Proxy Settings" msgstr "Nastavitve posredniÅ¡kega strežnika" #: ../ubuntu_sso/utils/ui.py:123 msgid "Incorrect login details. Please try again." msgstr "NapaÄne podrobnosti prijave. Poskusite znova." #: ../ubuntu_sso/utils/ui.py:124 msgid "Please provide login details." msgstr "Vnesite podrobnosti za prijavo" #: ../ubuntu_sso/utils/ui.py:125 msgid "You are connecting through a proxy." msgstr "Povezujete se prek posrednika." #: ../ubuntu_sso/utils/ui.py:126 msgid "Get Help With Proxies" msgstr "Pridobite pomoÄ s posredniki" #: ../ubuntu_sso/utils/ui.py:127 msgid "Proxy password:" msgstr "Geslo posrednika:" #: ../ubuntu_sso/utils/ui.py:128 msgid "Save and Connect" msgstr "Shrani ter poveži" #: ../ubuntu_sso/utils/ui.py:129 msgid "Proxy username:" msgstr "UporabniÅ¡ko ime posrednika:" #: ../ubuntu_sso/utils/ui.py:131 msgid "" "A password reset code has been sent to your e-mail. Please enter the code " "below along with your new password." msgstr "" "Koda za ponastavitev gesla je bila poslana na vaÅ¡o e-poÅ¡to. Vnesite kodo " "spodaj skupaj z vaÅ¡im novim geslom." #: ../ubuntu_sso/utils/ui.py:133 msgid "Retype email" msgstr "Ponovno vnesite e-poÅ¡to" #: ../ubuntu_sso/utils/ui.py:134 msgid "Retype password" msgstr "Ponovno vnesite geslo" #: ../ubuntu_sso/utils/ui.py:135 #, python-format msgid "To reset your %(app_name)s password, enter your email address below:" msgstr "" "Za ponastavitev gesla %(app_name)s spodaj vnesite svoj naslov e-poÅ¡te:" #: ../ubuntu_sso/utils/ui.py:137 msgid "" "We are very Sorry! The service that signs you on is not responding right " "now\n" "Please try again or come back in a few minutes." msgstr "" "Se opraviÄujemo! Storitev za prijavo se trenutno ne odziva\n" "Prosim, poskusite znova ali pridite nazaj za nekaj minut." #: ../ubuntu_sso/utils/ui.py:140 msgid "Sorry we did not recognize the email address." msgstr "Nismo prepoznali e-poÅ¡tnega naslova." #: ../ubuntu_sso/utils/ui.py:142 msgid "Reset code" msgstr "Ponastavi kodo" #: ../ubuntu_sso/utils/ui.py:145 #, python-format msgid "" "A password reset code has been sent to %(email)s.\n" "Please enter the code below along with your new password." msgstr "" "Koda za ponastavitev gesla je bila poslana na %(email)s.\n" "Spodaj vnesite kodo skupaj s svojim novim geslom." #: ../ubuntu_sso/utils/ui.py:147 msgid "Set Up Account" msgstr "Nastavite raÄun" #: ../ubuntu_sso/utils/ui.py:148 msgid "I don't have an account yet - sign me up" msgstr "Nimam Å¡e raÄuna - prijavi me" #: ../ubuntu_sso/utils/ui.py:149 msgid "Sign In" msgstr "Prijava" #: ../ubuntu_sso/utils/ui.py:150 msgid "Log-in with my existing account." msgstr "Prijavi se z mojim obstojeÄim raÄunom." #: ../ubuntu_sso/utils/ui.py:151 msgid "the appname whose ssl error we are going to show." msgstr "ime programa, katerega bomo pokazali SSLnapako." #: ../ubuntu_sso/utils/ui.py:152 msgid "Certificate details" msgstr "Podrobnosti potrdila" #: ../ubuntu_sso/utils/ui.py:153 msgid "Connect" msgstr "Poveži se" #: ../ubuntu_sso/utils/ui.py:154 msgid "the details ssl certificate we are going to show." msgstr "podrobnosti potrdila SSL, katerega bomo pokazali." #: ../ubuntu_sso/utils/ui.py:161 msgid "Open the SSL certificate UI." msgstr "Odpri uporabniÅ¡ki vmesnik za potrdilo SSL" #: ../ubuntu_sso/utils/ui.py:162 msgid "SSL Certificate Not Valid" msgstr "Potrdilo SSL ni veljavno" #: ../ubuntu_sso/utils/ui.py:163 msgid "the domain whose ssl certificate we are going to show." msgstr "Domena katere potrdilo bo prikazano." #: ../ubuntu_sso/utils/ui.py:164 #, python-format msgid "" "You are trying to connect to a proxy server on %(domain)s. This server uses " "a secure connection, and the SSL certificate is not valid because:" msgstr "" "PoskuÅ¡ate se povezati s posredniÅ¡kim strežnikom na %(domain)s. Ta strežnik " "uporablja varno povezavo in potrdilo SSL ni veljavno, ker:" #: ../ubuntu_sso/utils/ui.py:167 msgid "The certificate has not been verified" msgstr "Potrdilo ni bilo potrjeno" #: ../ubuntu_sso/utils/ui.py:168 msgid "Do you want to connect to this server?" msgstr "Ali se želite povezati s tem strežnikom?" #: ../ubuntu_sso/utils/ui.py:169 msgid "Get Help With SSL" msgstr "PomoÄ o SSL" #: ../ubuntu_sso/utils/ui.py:170 #, python-format msgid "" "If you are not sure about this server, do not use it to connect to " "%(app_name)s." msgstr "" "ÄŒe niste prepriÄani glede strežnika, ga ne uporabit za povezavo z " "%(app_name)s." #: ../ubuntu_sso/utils/ui.py:172 msgid "Remember my settings for this certificate." msgstr "Zapomni si moje nastavitve za to potrdilo." #: ../ubuntu_sso/utils/ui.py:173 msgid "" "The name on the certificate isn't valid or doesn't match the name of the site" msgstr "Ime na potrdilu ni veljavno ali se ne ujema z naslovom strani" #: ../ubuntu_sso/utils/ui.py:175 msgid "The certificate has expired" msgstr "Potrdilo je poteklo." #: ../ubuntu_sso/utils/ui.py:176 #, python-format msgid "You are now logged into %(app_name)s." msgstr "Trenutno ste prijavljeni v %(app_name)s." #: ../ubuntu_sso/utils/ui.py:177 msgid "Surname" msgstr "Priimek" #: ../ubuntu_sso/utils/ui.py:178 msgid "Terms of Service" msgstr "Pogoji uporabe" #: ../ubuntu_sso/utils/ui.py:179 msgid "Sign Up to {app_name}" msgstr "Prijavi se v {app_name}" #: ../ubuntu_sso/utils/ui.py:180 msgid "Show Terms & Conditions" msgstr "Pokaži pogoje uporabe" #: ../ubuntu_sso/utils/ui.py:181 #, python-format msgid "" "Agreeing to the %(app_name)s Terms & Conditions is required to subscribe." msgstr "Za naroÄnino je zahtevano strinjanje s pogoji uporabe %(app_name)s." #: ../ubuntu_sso/utils/ui.py:183 #, python-format msgid "You can also find these terms at %(url)s" msgstr "Te pogoje lahko najdete tudi na %(url)s" #: ../ubuntu_sso/utils/ui.py:184 msgid "Try again" msgstr "Poskusite znova" #: ../ubuntu_sso/utils/ui.py:185 msgid "" "There was an error when trying to complete the process. Please check the " "information and try again." msgstr "" "Med poskusom dokonÄanja opravila je priÅ¡lo do napake. Preverite podatke in " "poskusite znova." #: ../ubuntu_sso/utils/ui.py:187 msgid "Verification code" msgstr "Potrditvena koda" #: ../ubuntu_sso/utils/ui.py:188 #, python-format msgid "" "Check %(email)s for an email from Ubuntu Single Sign On. This message " "contains a verification code. Enter the code in the field below and click OK " "to complete creating your %(app_name)s account." msgstr "" "Preverite %(email)s za e-poÅ¡to z Ubuntu Single Sign On. To sporoÄilo vsebuje " "potrditveno kodo. Vnesite kodo v polje spodaj in kliknite V redu za " "dokonÄanje ustvarjanje raÄuna %(app_name)s." #: ../ubuntu_sso/utils/ui.py:192 msgid "Enter verification code" msgstr "Vnesite potrditveno kodo" #: ../ubuntu_sso/utils/ui.py:195 #, python-format msgid "I agree with the %(app_name)s terms and conditions" msgstr "Strinjam se s pogoji %(app_name)s" #: ../ubuntu_sso/utils/ui.py:196 #, python-format msgid "Yes! Email me %(app_name)s tips and updates." msgstr "Da! PoÅ¡lji mi namige in posodobitve o %(app_name)s preko e-poÅ¡te." ubuntu-sso-client-13.10/po/ar.po0000664000202700020270000003606212151461656016740 0ustar dobeydobey00000000000000# Arabic translation for ubuntu-sso-client # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the ubuntu-sso-client package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: ubuntu-sso-client\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-09-11 18:25+0000\n" "PO-Revision-Date: 2012-08-10 20:34+0000\n" "Last-Translator: Ibrahim Saed \n" "Language-Team: Arabic \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-09-17 18:24+0000\n" "X-Generator: Launchpad (build 15944)\n" #. Undefined variable '_', pylint: disable=E0602 #. all the text that is used in the gui #: ../ubuntu_sso/utils/ui.py:49 msgid "By signing up to {app_name} you agree to our {privacy_policy}" msgstr "بتسجيلك ÙÙŠ {app_name} أنت تواÙÙ‚ على {privacy_policy} الخاصة بنا." #: ../ubuntu_sso/utils/ui.py:51 msgid "By signing up to {app_name} you agree to our {terms_and_conditions}" msgstr "" "بتسجيلك ÙÙŠ {app_name} أنت تواÙÙ‚ على {terms_and_conditions} الخاصة بنا." #: ../ubuntu_sso/utils/ui.py:53 msgid " and {privacy_policy}" msgstr " Ùˆ {privacy_policy}" #: ../ubuntu_sso/utils/ui.py:54 msgid "Cancel" msgstr "ألغÙ" #: ../ubuntu_sso/utils/ui.py:55 msgid "Type the characters above" msgstr "اكتب الأحر٠الظاهرة ÙÙŠ الصورة أعلاه" #: ../ubuntu_sso/utils/ui.py:56 msgid "There was a problem getting the captcha, reloading..." msgstr "هناك مشكلة ÙÙŠ الحصول على كلمة التحقق، لذا يعاد تحميلها..." #: ../ubuntu_sso/utils/ui.py:58 #, python-format msgid "If you can't read this then %(reload_link)s this page" msgstr "إذا لم يكن بمقدورك قراءة هذا، إذن %(reload_link)s هذه الصورة" #: ../ubuntu_sso/utils/ui.py:60 msgid "refresh" msgstr "حدّث" #: ../ubuntu_sso/utils/ui.py:61 msgid "Reload" msgstr "Ø£Ø¹ÙØ¯ التحميل" #: ../ubuntu_sso/utils/ui.py:62 msgid "The captcha is a required field" msgstr "كلمة التحقق حقل مطلوب" #: ../ubuntu_sso/utils/ui.py:63 msgid "Close window and set up later" msgstr "أغلق Ø§Ù„Ù†Ø§ÙØ°Ø© وقم بالإعداد لاحقًا" #: ../ubuntu_sso/utils/ui.py:64 msgid "Congratulations, {app_name} is installed!" msgstr "تهانينا، تم تثبيت {app_name}!" #: ../ubuntu_sso/utils/ui.py:65 #, python-format msgid "To connect this computer to %(app_name)s enter your details below." msgstr "لربط هذا الحاسوب بـ%(app_name)s أدخل بياناتك أدناه." #: ../ubuntu_sso/utils/ui.py:67 msgid "Register with {app_name}." msgstr "" #: ../ubuntu_sso/utils/ui.py:68 ../ubuntu_sso/utils/ui.py:93 #: ../ubuntu_sso/utils/ui.py:143 msgid "Email address" msgstr "البريد الإلكتروني" #: ../ubuntu_sso/utils/ui.py:69 msgid "Re-type Email address" msgstr "Ø£Ø¹ÙØ¯ كتابة البريد الإلكتروني" #: ../ubuntu_sso/utils/ui.py:70 msgid "The email must be a valid email address." msgstr "يجب أن يكون عنوان البريد الإلكتروني صحيح." #: ../ubuntu_sso/utils/ui.py:71 msgid "" "The email addresses don't match, please double check and try entering them " "again." msgstr "عنوانا البريد الإلكتروني غير متطابقان، رجاءً تحقق من كلاهما." #: ../ubuntu_sso/utils/ui.py:73 msgid "Email" msgstr "البريد الإلكتروني" #: ../ubuntu_sso/utils/ui.py:74 msgid "The email addresses do not match" msgstr "عنوانا البريد الإلكتروني غير متطابقان" #: ../ubuntu_sso/utils/ui.py:75 msgid "Enter code verification here" msgstr "أدخل كود التحقق هنا" #: ../ubuntu_sso/utils/ui.py:76 msgid "Please enter your name" msgstr "من ÙØ¶Ù„Ùƒ أدخل اسمك" #: ../ubuntu_sso/utils/ui.py:77 msgid "The process did not finish successfully." msgstr "لم تنتهي العملية بنجاح." #: ../ubuntu_sso/utils/ui.py:79 msgid "Sign me in with my existing account" msgstr "ولوج باستخدام حسابي الموجود" #: ../ubuntu_sso/utils/ui.py:80 msgid "This field is required." msgstr "هذا الحقل ضروري." #: ../ubuntu_sso/utils/ui.py:81 msgid "I've forgotten my password" msgstr "لقد نسيت كلمة السر" #: ../ubuntu_sso/utils/ui.py:82 ../ubuntu_sso/utils/ui.py:130 msgid "Reset password" msgstr "استرجع كلمة السر" #: ../ubuntu_sso/utils/ui.py:83 msgid "" "To reset your {app_name} password, enter your registered email address " "below. We will send instructions to reset your password." msgstr "" "لاسترجاع كلمة سرّك على {app_name}ØŒ أدخل عنوان البريد الإلكتروني الذي سجلت به " "أدناه. وسنرسل لك تعليمات لاسترجاع كلمة سرّك." #: ../ubuntu_sso/utils/ui.py:86 msgid "Please enter a valid email address" msgstr "من ÙØ¶Ù„Ùƒ أدخل عنوان بريد إلكتروني صحيح" #: ../ubuntu_sso/utils/ui.py:87 msgid "There was a problem accessing the Ubuntu Single Sign On backend." msgstr "" #: ../ubuntu_sso/utils/ui.py:89 #, python-format msgid "Create %(app_name)s account" msgstr "أنشئ حساب %(app_name)s" #: ../ubuntu_sso/utils/ui.py:90 msgid "Loading..." msgstr "يحمل..." #: ../ubuntu_sso/utils/ui.py:91 msgid "Getting information, please wait..." msgstr "يجلب المعلومات، يرجى الانتظار..." #: ../ubuntu_sso/utils/ui.py:92 msgid "Already have an account? Click here to sign in" msgstr "ألديك حساب؟ انقر هنا للولوج" #: ../ubuntu_sso/utils/ui.py:94 #, python-format msgid "Connect to %(app_name)s" msgstr "اتصل بـ%(app_name)s" #: ../ubuntu_sso/utils/ui.py:95 ../ubuntu_sso/utils/ui.py:109 msgid "Password" msgstr "كلمة السر" #: ../ubuntu_sso/utils/ui.py:97 msgid "Sign In to {app_name}" msgstr "ولوج إلى {app_name}" #: ../ubuntu_sso/utils/ui.py:99 msgid "Name" msgstr "الاسم" #: ../ubuntu_sso/utils/ui.py:100 msgid "The name must not be empty." msgstr "يجب أن لا يكون الاسم ÙØ§Ø±ØºØ§." #: ../ubuntu_sso/utils/ui.py:101 msgid "Next" msgstr "التالي" #: ../ubuntu_sso/utils/ui.py:102 msgid "Network detection" msgstr "الكش٠عن الشبكة" #: ../ubuntu_sso/utils/ui.py:103 #, python-format msgid "" "Are you online? We can't detect an internet connection - you will need to be " "connected to set up %(app_name)s" msgstr "" "هل انت متصل؟ لا يمكن للجهاز اكتشا٠اتصال إنترنت - انت بحاجة أنت تكون متصلًا " "لإعداد %(app_name)s" #: ../ubuntu_sso/utils/ui.py:105 msgid "One moment please..." msgstr "لحظة من ÙØ¶Ù„Ùƒ..." #: ../ubuntu_sso/utils/ui.py:106 msgid "Create a password" msgstr "أنشئ كلمة سر" #: ../ubuntu_sso/utils/ui.py:107 msgid "Your password was successfully changed." msgstr "تغيرت كلمة سرك بنجاح." #: ../ubuntu_sso/utils/ui.py:108 msgid "At least one number" msgstr "رقم واحد على الأقل" #: ../ubuntu_sso/utils/ui.py:110 msgid "Re-type Password" msgstr "Ø£Ø¹ÙØ¯ كتابة كلمة السر" #: ../ubuntu_sso/utils/ui.py:111 msgid "" "The password must have a minimum of 8 characters and include one uppercase " "character and one number." msgstr "" "يجب أن تتكون كلمة السر من 8 أحر٠على الأقل وأن تشتمل حر٠واحد كبير ورقم واحد." #: ../ubuntu_sso/utils/ui.py:113 msgid "At least 8 characters" msgstr "8 أحر٠على الأقل" #: ../ubuntu_sso/utils/ui.py:114 msgid "Passwords don't match" msgstr "كلمتا السر غير متطابقتان" #: ../ubuntu_sso/utils/ui.py:115 msgid "" "The passwords don't match, please double check and try entering them again." msgstr "" "كلمتا السر غير متطابقتان، من ÙØ¶Ù„Ùƒ تحقق منهما وحاول إدخالهما مرة أخرى." #: ../ubuntu_sso/utils/ui.py:117 msgid "Your password must contain" msgstr "كلمة السر يجب أن تحتوي" #: ../ubuntu_sso/utils/ui.py:118 msgid "The password is too weak." msgstr "كلمة السر Ø¶Ø¹ÙŠÙØ© جدًا." #: ../ubuntu_sso/utils/ui.py:119 msgid "At least one uppercase letter" msgstr "حر٠علوي واحد على الأقل" #: ../ubuntu_sso/utils/ui.py:120 msgid "Privacy Policy" msgstr "سياسة الخصوصية" #: ../ubuntu_sso/utils/ui.py:121 msgid "Connecting to:" msgstr "الاتصال بـ:" #: ../ubuntu_sso/utils/ui.py:122 msgid "Proxy Settings" msgstr "إعدادات الوسيط" #: ../ubuntu_sso/utils/ui.py:123 msgid "Incorrect login details. Please try again." msgstr "ØªÙØ§ØµÙŠÙ„ ولوج غير صحيحة. من ÙØ¶Ù„Ùƒ حاول Ù…ÙØ¬Ø¯Ø¯Ù‹Ø§." #: ../ubuntu_sso/utils/ui.py:124 msgid "Please provide login details." msgstr "برجاء تقديم ØªÙØ§ØµÙŠÙ„ الولوج." #: ../ubuntu_sso/utils/ui.py:125 msgid "You are connecting through a proxy." msgstr "انت متصل حاليًا خلال وسيط." #: ../ubuntu_sso/utils/ui.py:126 msgid "Get Help With Proxies" msgstr "" #: ../ubuntu_sso/utils/ui.py:127 msgid "Proxy password:" msgstr "كلمة سرّ الوسيط:" #: ../ubuntu_sso/utils/ui.py:128 msgid "Save and Connect" msgstr "Ø§Ø­ÙØ¸ واتصل" #: ../ubuntu_sso/utils/ui.py:129 msgid "Proxy username:" msgstr "اسم المستخدم للوسيط:" #: ../ubuntu_sso/utils/ui.py:131 msgid "" "A password reset code has been sent to your e-mail. Please enter the code " "below along with your new password." msgstr "" "تم إرسال كود استعادة كلمة السر إلى بريدك الإلكتروني. من ÙØ¶Ù„Ùƒ أدخÙÙ„ الكود " "أدناه إلى جانب كلمة السر الجديدة." #: ../ubuntu_sso/utils/ui.py:133 msgid "Retype email" msgstr "Ø£Ø¹ÙØ¯ كتابة البريد الإلكتروني" #: ../ubuntu_sso/utils/ui.py:134 msgid "Retype password" msgstr "Ø£Ø¹ÙØ¯ كتابة كلمة السر" #: ../ubuntu_sso/utils/ui.py:135 #, python-format msgid "To reset your %(app_name)s password, enter your email address below:" msgstr "" "لاسترجاع كلمة سرّك على %(app_name)sØŒ أدخل عنوان البريد الإلكتروني الذي سجلت " "به أدناه:" #: ../ubuntu_sso/utils/ui.py:137 msgid "" "We are very Sorry! The service that signs you on is not responding right " "now\n" "Please try again or come back in a few minutes." msgstr "" "نأس٠للغاية! الخدمة التي تحاول الولوج إليها لا تستجيب ÙÙŠ الوقت الحالي.\n" "من ÙØ¶Ù„Ùƒ حاول مجددا أو حاول بعد بضع دقائق." #: ../ubuntu_sso/utils/ui.py:140 msgid "Sorry we did not recognize the email address." msgstr "" #: ../ubuntu_sso/utils/ui.py:142 msgid "Reset code" msgstr "" #: ../ubuntu_sso/utils/ui.py:145 #, python-format msgid "" "A password reset code has been sent to %(email)s.\n" "Please enter the code below along with your new password." msgstr "" #: ../ubuntu_sso/utils/ui.py:147 msgid "Set Up Account" msgstr "إعداد الحساب" #: ../ubuntu_sso/utils/ui.py:148 msgid "I don't have an account yet - sign me up" msgstr "لا أملك حساب بعد - أريد التسجيل" #: ../ubuntu_sso/utils/ui.py:149 msgid "Sign In" msgstr "ولوج" #: ../ubuntu_sso/utils/ui.py:150 msgid "Log-in with my existing account." msgstr "" #: ../ubuntu_sso/utils/ui.py:151 msgid "the appname whose ssl error we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:152 msgid "Certificate details" msgstr "ØªÙØ§ØµÙŠÙ„ الشّهادات" #: ../ubuntu_sso/utils/ui.py:153 msgid "Connect" msgstr "اتّصل" #: ../ubuntu_sso/utils/ui.py:154 msgid "the details ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:161 msgid "Open the SSL certificate UI." msgstr "" #: ../ubuntu_sso/utils/ui.py:162 msgid "SSL Certificate Not Valid" msgstr "" #: ../ubuntu_sso/utils/ui.py:163 msgid "the domain whose ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:164 #, python-format msgid "" "You are trying to connect to a proxy server on %(domain)s. This server uses " "a secure connection, and the SSL certificate is not valid because:" msgstr "" #: ../ubuntu_sso/utils/ui.py:167 msgid "The certificate has not been verified" msgstr "" #: ../ubuntu_sso/utils/ui.py:168 msgid "Do you want to connect to this server?" msgstr "هل تريد الاتصال بهذا الخادوم؟" #: ../ubuntu_sso/utils/ui.py:169 msgid "Get Help With SSL" msgstr "" #: ../ubuntu_sso/utils/ui.py:170 #, python-format msgid "" "If you are not sure about this server, do not use it to connect to " "%(app_name)s." msgstr "" "إذا كنت غير واثقًا بشأن هذا الخادوم، لا تستخدمه ÙÙŠ الاتصال بـ%(app_name)s." #: ../ubuntu_sso/utils/ui.py:172 msgid "Remember my settings for this certificate." msgstr "" #: ../ubuntu_sso/utils/ui.py:173 msgid "" "The name on the certificate isn't valid or doesn't match the name of the site" msgstr "" #: ../ubuntu_sso/utils/ui.py:175 msgid "The certificate has expired" msgstr "انتهت صلاحية الشهادة" #: ../ubuntu_sso/utils/ui.py:176 #, python-format msgid "You are now logged into %(app_name)s." msgstr "أنت الآن والج إلى %(app_name)s." #: ../ubuntu_sso/utils/ui.py:177 msgid "Surname" msgstr "الكÙنية" #: ../ubuntu_sso/utils/ui.py:178 msgid "Terms of Service" msgstr "شروط الخدمة" #: ../ubuntu_sso/utils/ui.py:179 msgid "Sign Up to {app_name}" msgstr "سجّل ÙÙŠ {app_name}" #: ../ubuntu_sso/utils/ui.py:180 msgid "Show Terms & Conditions" msgstr "عرض الشروط والأحكام" #: ../ubuntu_sso/utils/ui.py:181 #, python-format msgid "" "Agreeing to the %(app_name)s Terms & Conditions is required to subscribe." msgstr "" #: ../ubuntu_sso/utils/ui.py:183 #, python-format msgid "You can also find these terms at %(url)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:184 msgid "Try again" msgstr "Ø£Ø¹ÙØ¯ المحاولة" #: ../ubuntu_sso/utils/ui.py:185 msgid "" "There was an error when trying to complete the process. Please check the " "information and try again." msgstr "" "حدث خطأ عند محاولة إكمال العملية. من ÙØ¶Ù„Ùƒ تحقق من المعلومات ÙˆØ£Ø¹ÙØ¯ المحاولة " "مجددًا." #: ../ubuntu_sso/utils/ui.py:187 msgid "Verification code" msgstr "رمز التحقق" #: ../ubuntu_sso/utils/ui.py:188 #, python-format msgid "" "Check %(email)s for an email from Ubuntu Single Sign On. This message " "contains a verification code. Enter the code in the field below and click OK " "to complete creating your %(app_name)s account." msgstr "" #: ../ubuntu_sso/utils/ui.py:192 msgid "Enter verification code" msgstr "ادخل رمز التحقق" #: ../ubuntu_sso/utils/ui.py:195 #, python-format msgid "I agree with the %(app_name)s terms and conditions" msgstr "أنا أواÙÙ‚ على شروط Ùˆ أحكام %(app_name)s" #: ../ubuntu_sso/utils/ui.py:196 #, python-format msgid "Yes! Email me %(app_name)s tips and updates." msgstr "نعم! أرسل لي نصائح وتحديثات %(app_name)s عبر البريد الإلكتروني." ubuntu-sso-client-13.10/po/eu.po0000664000202700020270000003062212151461656016743 0ustar dobeydobey00000000000000# Basque translation for ubuntu-sso-client # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the ubuntu-sso-client package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: ubuntu-sso-client\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-09-11 18:25+0000\n" "PO-Revision-Date: 2011-03-28 13:04+0000\n" "Last-Translator: Oier Mees \n" "Language-Team: Basque \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-09-17 18:24+0000\n" "X-Generator: Launchpad (build 15944)\n" #. Undefined variable '_', pylint: disable=E0602 #. all the text that is used in the gui #: ../ubuntu_sso/utils/ui.py:49 msgid "By signing up to {app_name} you agree to our {privacy_policy}" msgstr "{app_name}(e)n izena ematean, gure {privacy_policy} onartzen duzu" #: ../ubuntu_sso/utils/ui.py:51 msgid "By signing up to {app_name} you agree to our {terms_and_conditions}" msgstr "" "{app_name}(e)n izena ematean, gure {terms_and_conditions} onartzen dituzu" #: ../ubuntu_sso/utils/ui.py:53 msgid " and {privacy_policy}" msgstr " , eta baita {privacy_policy} ere" #: ../ubuntu_sso/utils/ui.py:54 msgid "Cancel" msgstr "Utzi" #: ../ubuntu_sso/utils/ui.py:55 msgid "Type the characters above" msgstr "Idatzi goiko karaktereak" #: ../ubuntu_sso/utils/ui.py:56 msgid "There was a problem getting the captcha, reloading..." msgstr "Arazo bat egon da captcha eskuratzerakoan, birkargatzen..." #: ../ubuntu_sso/utils/ui.py:58 #, python-format msgid "If you can't read this then %(reload_link)s this page" msgstr "Ezin baduzu hau irakurri, %(reload_link)s orria" #: ../ubuntu_sso/utils/ui.py:60 msgid "refresh" msgstr "berritu" #: ../ubuntu_sso/utils/ui.py:61 msgid "Reload" msgstr "Birkargatu" #: ../ubuntu_sso/utils/ui.py:62 msgid "The captcha is a required field" msgstr "Captcha derrigorrezko eremua da" #: ../ubuntu_sso/utils/ui.py:63 msgid "Close window and set up later" msgstr "" #: ../ubuntu_sso/utils/ui.py:64 msgid "Congratulations, {app_name} is installed!" msgstr "Zorionak, {app_name} instalatu da!" #: ../ubuntu_sso/utils/ui.py:65 #, python-format msgid "To connect this computer to %(app_name)s enter your details below." msgstr "" "Sartu ordenagailu hau %(app_name)s(e)ra konektatzeko zure xehetasunak." #: ../ubuntu_sso/utils/ui.py:67 msgid "Register with {app_name}." msgstr "" #: ../ubuntu_sso/utils/ui.py:68 ../ubuntu_sso/utils/ui.py:93 #: ../ubuntu_sso/utils/ui.py:143 msgid "Email address" msgstr "E-posta helbidea" #: ../ubuntu_sso/utils/ui.py:69 msgid "Re-type Email address" msgstr "Idatzi berriz e-posta" #: ../ubuntu_sso/utils/ui.py:70 msgid "The email must be a valid email address." msgstr "E-posta helbide zuzena idatzi behar duzu" #: ../ubuntu_sso/utils/ui.py:71 msgid "" "The email addresses don't match, please double check and try entering them " "again." msgstr "" "Idatzitako e-posta helbideak ez dira berdinak. Egiaztatu idatzitakoa eta " "saiatu berriz." #: ../ubuntu_sso/utils/ui.py:73 msgid "Email" msgstr "E-posta" #: ../ubuntu_sso/utils/ui.py:74 msgid "The email addresses do not match" msgstr "Helbide elektronikoak ez datoz bat" #: ../ubuntu_sso/utils/ui.py:75 msgid "Enter code verification here" msgstr "Sartu egiaztapen kodea hemen" #: ../ubuntu_sso/utils/ui.py:76 msgid "Please enter your name" msgstr "Idatzi zure izena" #: ../ubuntu_sso/utils/ui.py:77 msgid "The process did not finish successfully." msgstr "Prozesua ez da arrakastarekin amaitu." #: ../ubuntu_sso/utils/ui.py:79 msgid "Sign me in with my existing account" msgstr "Hasi saioa zure kontuarekin" #: ../ubuntu_sso/utils/ui.py:80 msgid "This field is required." msgstr "Eremu hau beharrezkoa da" #: ../ubuntu_sso/utils/ui.py:81 msgid "I've forgotten my password" msgstr "Pasahitza ahaztu dut" #: ../ubuntu_sso/utils/ui.py:82 ../ubuntu_sso/utils/ui.py:130 msgid "Reset password" msgstr "Berrezarri pasahitza" #: ../ubuntu_sso/utils/ui.py:83 msgid "" "To reset your {app_name} password, enter your registered email address " "below. We will send instructions to reset your password." msgstr "" #: ../ubuntu_sso/utils/ui.py:86 msgid "Please enter a valid email address" msgstr "Idatzi baliozko helbide elektroniko bat" #: ../ubuntu_sso/utils/ui.py:87 msgid "There was a problem accessing the Ubuntu Single Sign On backend." msgstr "" #: ../ubuntu_sso/utils/ui.py:89 #, python-format msgid "Create %(app_name)s account" msgstr "Sortu %(app_name)s kontua" #: ../ubuntu_sso/utils/ui.py:90 msgid "Loading..." msgstr "Kargatzen..." #: ../ubuntu_sso/utils/ui.py:91 msgid "Getting information, please wait..." msgstr "Informazioa eskuratzen, itxaron mesedez..." #: ../ubuntu_sso/utils/ui.py:92 msgid "Already have an account? Click here to sign in" msgstr "Iada kontu bat daukazu? Klikatu hemen saioa hasteko" #: ../ubuntu_sso/utils/ui.py:94 #, python-format msgid "Connect to %(app_name)s" msgstr "Konektatu %(app_name)s(e)ra" #: ../ubuntu_sso/utils/ui.py:95 ../ubuntu_sso/utils/ui.py:109 msgid "Password" msgstr "Pasahitza" #: ../ubuntu_sso/utils/ui.py:97 msgid "Sign In to {app_name}" msgstr "" #: ../ubuntu_sso/utils/ui.py:99 msgid "Name" msgstr "Izena" #: ../ubuntu_sso/utils/ui.py:100 msgid "The name must not be empty." msgstr "" #: ../ubuntu_sso/utils/ui.py:101 msgid "Next" msgstr "Hurrengoa" #: ../ubuntu_sso/utils/ui.py:102 msgid "Network detection" msgstr "" #: ../ubuntu_sso/utils/ui.py:103 #, python-format msgid "" "Are you online? We can't detect an internet connection - you will need to be " "connected to set up %(app_name)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:105 msgid "One moment please..." msgstr "Egon une batean, mesedez..." #: ../ubuntu_sso/utils/ui.py:106 msgid "Create a password" msgstr "" #: ../ubuntu_sso/utils/ui.py:107 msgid "Your password was successfully changed." msgstr "Arrakasta zure pasahitza aldatzerakoan" #: ../ubuntu_sso/utils/ui.py:108 msgid "At least one number" msgstr "" #: ../ubuntu_sso/utils/ui.py:110 msgid "Re-type Password" msgstr "Berridatzi pasahitza" #: ../ubuntu_sso/utils/ui.py:111 msgid "" "The password must have a minimum of 8 characters and include one uppercase " "character and one number." msgstr "" "Pasahitzak gutxienez 8 karaktere izan behar ditu eta gutxienez karaktere bat " "letra larriz egon behar da eta beste batek zenbakia izan behar du." #: ../ubuntu_sso/utils/ui.py:113 msgid "At least 8 characters" msgstr "" #: ../ubuntu_sso/utils/ui.py:114 msgid "Passwords don't match" msgstr "" #: ../ubuntu_sso/utils/ui.py:115 msgid "" "The passwords don't match, please double check and try entering them again." msgstr "" "Pasahitzak ez datozte bat, mesedez egiaztatu itzazu eta saiatu berriro " "idazten." #: ../ubuntu_sso/utils/ui.py:117 msgid "Your password must contain" msgstr "" #: ../ubuntu_sso/utils/ui.py:118 msgid "The password is too weak." msgstr "Pasahitza ahulegia da" #: ../ubuntu_sso/utils/ui.py:119 msgid "At least one uppercase letter" msgstr "" #: ../ubuntu_sso/utils/ui.py:120 msgid "Privacy Policy" msgstr "Pribatutasun-politika" #: ../ubuntu_sso/utils/ui.py:121 msgid "Connecting to:" msgstr "" #: ../ubuntu_sso/utils/ui.py:122 msgid "Proxy Settings" msgstr "Proxy-aren ezarpenak" #: ../ubuntu_sso/utils/ui.py:123 msgid "Incorrect login details. Please try again." msgstr "" #: ../ubuntu_sso/utils/ui.py:124 msgid "Please provide login details." msgstr "" #: ../ubuntu_sso/utils/ui.py:125 msgid "You are connecting through a proxy." msgstr "" #: ../ubuntu_sso/utils/ui.py:126 msgid "Get Help With Proxies" msgstr "" #: ../ubuntu_sso/utils/ui.py:127 msgid "Proxy password:" msgstr "" #: ../ubuntu_sso/utils/ui.py:128 msgid "Save and Connect" msgstr "" #: ../ubuntu_sso/utils/ui.py:129 msgid "Proxy username:" msgstr "" #: ../ubuntu_sso/utils/ui.py:131 msgid "" "A password reset code has been sent to your e-mail. Please enter the code " "below along with your new password." msgstr "" #: ../ubuntu_sso/utils/ui.py:133 msgid "Retype email" msgstr "" #: ../ubuntu_sso/utils/ui.py:134 msgid "Retype password" msgstr "" #: ../ubuntu_sso/utils/ui.py:135 #, python-format msgid "To reset your %(app_name)s password, enter your email address below:" msgstr "" "%(app_name)s-ko zure pasahitza berrezartzeko, idatzi zure e-posta helbidea:" #: ../ubuntu_sso/utils/ui.py:137 msgid "" "We are very Sorry! The service that signs you on is not responding right " "now\n" "Please try again or come back in a few minutes." msgstr "" #: ../ubuntu_sso/utils/ui.py:140 msgid "Sorry we did not recognize the email address." msgstr "" #: ../ubuntu_sso/utils/ui.py:142 msgid "Reset code" msgstr "Berrezarri kodea" #: ../ubuntu_sso/utils/ui.py:145 #, python-format msgid "" "A password reset code has been sent to %(email)s.\n" "Please enter the code below along with your new password." msgstr "" "Pasahitza berrezartzeko kodea helbide honetara bidali dizugu: %(email)s\n" "Idatzi mezuan bidali dizugun kodea eta zure pasahitz berria." #: ../ubuntu_sso/utils/ui.py:147 msgid "Set Up Account" msgstr "" #: ../ubuntu_sso/utils/ui.py:148 msgid "I don't have an account yet - sign me up" msgstr "" #: ../ubuntu_sso/utils/ui.py:149 msgid "Sign In" msgstr "" #: ../ubuntu_sso/utils/ui.py:150 msgid "Log-in with my existing account." msgstr "" #: ../ubuntu_sso/utils/ui.py:151 msgid "the appname whose ssl error we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:152 msgid "Certificate details" msgstr "" #: ../ubuntu_sso/utils/ui.py:153 msgid "Connect" msgstr "" #: ../ubuntu_sso/utils/ui.py:154 msgid "the details ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:161 msgid "Open the SSL certificate UI." msgstr "" #: ../ubuntu_sso/utils/ui.py:162 msgid "SSL Certificate Not Valid" msgstr "" #: ../ubuntu_sso/utils/ui.py:163 msgid "the domain whose ssl certificate we are going to show." msgstr "" #: ../ubuntu_sso/utils/ui.py:164 #, python-format msgid "" "You are trying to connect to a proxy server on %(domain)s. This server uses " "a secure connection, and the SSL certificate is not valid because:" msgstr "" #: ../ubuntu_sso/utils/ui.py:167 msgid "The certificate has not been verified" msgstr "" #: ../ubuntu_sso/utils/ui.py:168 msgid "Do you want to connect to this server?" msgstr "" #: ../ubuntu_sso/utils/ui.py:169 msgid "Get Help With SSL" msgstr "" #: ../ubuntu_sso/utils/ui.py:170 #, python-format msgid "" "If you are not sure about this server, do not use it to connect to " "%(app_name)s." msgstr "" #: ../ubuntu_sso/utils/ui.py:172 msgid "Remember my settings for this certificate." msgstr "" #: ../ubuntu_sso/utils/ui.py:173 msgid "" "The name on the certificate isn't valid or doesn't match the name of the site" msgstr "" #: ../ubuntu_sso/utils/ui.py:175 msgid "The certificate has expired" msgstr "" #: ../ubuntu_sso/utils/ui.py:176 #, python-format msgid "You are now logged into %(app_name)s." msgstr "" #: ../ubuntu_sso/utils/ui.py:177 msgid "Surname" msgstr "" #: ../ubuntu_sso/utils/ui.py:178 msgid "Terms of Service" msgstr "" #: ../ubuntu_sso/utils/ui.py:179 msgid "Sign Up to {app_name}" msgstr "" #: ../ubuntu_sso/utils/ui.py:180 msgid "Show Terms & Conditions" msgstr "Erakutsi baldintzak" #: ../ubuntu_sso/utils/ui.py:181 #, python-format msgid "" "Agreeing to the %(app_name)s Terms & Conditions is required to subscribe." msgstr "" #: ../ubuntu_sso/utils/ui.py:183 #, python-format msgid "You can also find these terms at %(url)s" msgstr "" #: ../ubuntu_sso/utils/ui.py:184 msgid "Try again" msgstr "" #: ../ubuntu_sso/utils/ui.py:185 msgid "" "There was an error when trying to complete the process. Please check the " "information and try again." msgstr "" "Errorea gertatu da prozesua osatzean. Egiaztatu zure informazioa eta saiatu " "berriz." #: ../ubuntu_sso/utils/ui.py:187 msgid "Verification code" msgstr "" #: ../ubuntu_sso/utils/ui.py:188 #, python-format msgid "" "Check %(email)s for an email from Ubuntu Single Sign On. This message " "contains a verification code. Enter the code in the field below and click OK " "to complete creating your %(app_name)s account." msgstr "" #: ../ubuntu_sso/utils/ui.py:192 msgid "Enter verification code" msgstr "Sartu egiaztapen kodea" #: ../ubuntu_sso/utils/ui.py:195 #, python-format msgid "I agree with the %(app_name)s terms and conditions" msgstr "%(app_name)-ren baldintzak onartzen ditut" #: ../ubuntu_sso/utils/ui.py:196 #, python-format msgid "Yes! Email me %(app_name)s tips and updates." msgstr "Bai! Bidali %(app_name)s-n inguruko eguneraketak e-postaz." ubuntu-sso-client-13.10/ubuntu_sso/0000755000202700020270000000000012225013301017533 5ustar dobeydobey00000000000000ubuntu-sso-client-13.10/ubuntu_sso/account.py0000664000202700020270000002620412151461656021571 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2010-2013 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Single Sign On account management. All the methods in Account expect unicode as parameters. """ from __future__ import unicode_literals import os import re from twisted.internet import defer from ubuntu_sso import SSO_AUTH_BASE_URL from ubuntu_sso.logger import setup_logging from ubuntu_sso.utils import compat, webclient from ubuntu_sso.utils.webclient import restful from ubuntu_sso.utils.webclient.common import WebClientError logger = setup_logging("ubuntu_sso.account") SERVICE_URL = "%s/api/1.0/" % SSO_AUTH_BASE_URL SSO_STATUS_OK = 'ok' SSO_STATUS_ERROR = 'error' class InvalidEmailError(Exception): """The email is not valid.""" class InvalidPasswordError(Exception): """The password is not valid. Must provide at least 8 characters, one upper case, one number. """ class RegistrationError(Exception): """The registration failed.""" class AuthenticationError(Exception): """The authentication failed.""" class EmailTokenError(Exception): """The email token is not valid.""" class ResetPasswordTokenError(Exception): """The token for password reset could not be generated.""" class NewPasswordError(Exception): """The new password could not be set.""" class Account(object): """Login and register users using the Ubuntu Single Sign On service.""" def __init__(self, service_url=None): """Create a new SSO Account manager.""" if service_url is not None: self.service_url = service_url else: self.service_url = os.environ.get('USSOC_SERVICE_URL', SERVICE_URL) logger.info('Creating a new SSO access layer for service url %r', self.service_url) assert self.service_url.endswith("/") def _valid_email(self, email): """Validate the given email.""" return email is not None and '@' in email def _valid_password(self, password): """Validate the given password.""" res = (len(password) > 7 and # at least 8 characters re.search('[A-Z]', password) and # one upper case re.search('\d+', password)) # one number return res def _format_webservice_errors(self, errdict): """Turn each list of strings in the errdict into a LF separated str.""" result = {} for key, val in errdict.items(): # workaround until bug #624955 is solved if isinstance(val, compat.basestring): result[key] = val else: result[key] = "\n".join(val) return result @defer.inlineCallbacks def generate_captcha(self, filename): """Generate a captcha using the SSO service.""" logger.debug('generate_captcha: requesting captcha, filename: %r', filename) restful_client = restful.RestfulClient(self.service_url) try: captcha = yield restful_client.restcall("captchas.new") finally: restful_client.shutdown() # download captcha and save to 'filename' logger.debug('generate_captcha: server answered: %r', captcha) wc = webclient.webclient_factory() try: response = yield wc.request(captcha['image_url']) with open(filename, 'wb') as f: f.write(response.content) except: msg = 'generate_captcha crashed while downloading the image.' logger.exception(msg) raise finally: wc.shutdown() defer.returnValue(captcha['captcha_id']) @defer.inlineCallbacks def register_user(self, email, password, displayname, captcha_id, captcha_solution): """Register a new user with 'email' and 'password'.""" logger.debug('register_user: email: %r password: , ' 'displayname: %r, captcha_id: %r, captcha_solution: %r', email, displayname, captcha_id, captcha_solution) restful_client = restful.RestfulClient(self.service_url) try: if not self._valid_email(email): logger.error('register_user: InvalidEmailError for email: %r', email) raise InvalidEmailError() if not self._valid_password(password): logger.error('register_user: InvalidPasswordError') raise InvalidPasswordError() result = yield restful_client.restcall("registration.register", email=email, password=password, displayname=displayname, captcha_id=captcha_id, captcha_solution=captcha_solution) finally: restful_client.shutdown() logger.info('register_user: email: %r result: %r', email, result) if result['status'].lower() == SSO_STATUS_ERROR: errorsdict = self._format_webservice_errors(result['errors']) raise RegistrationError(errorsdict) elif result['status'].lower() != SSO_STATUS_OK: raise RegistrationError('Received unknown status: %s' % result) else: defer.returnValue(email) @defer.inlineCallbacks def login(self, email, password, token_name): """Login a user with 'email' and 'password'.""" logger.debug('login: email: %r password: , token_name: %r', email, token_name) restful_client = restful.RestfulClient(self.service_url, username=email, password=password) try: credentials = yield restful_client.restcall( "authentications.authenticate", token_name=token_name) except WebClientError: logger.exception('login failed with:') raise AuthenticationError() finally: restful_client.shutdown() logger.debug('login: authentication successful! consumer_key: %r, ' 'token_name: %r', credentials['consumer_key'], token_name) defer.returnValue(credentials) @defer.inlineCallbacks def is_validated(self, token): """Return if user with 'email' and 'password' is validated.""" logger.debug('is_validated: requesting accounts.me() info.') restful_client = restful.RestfulClient(self.service_url, oauth_credentials=token) try: me_info = yield restful_client.restcall("accounts.me") finally: restful_client.shutdown() key = 'preferred_email' result = key in me_info and me_info[key] is not None logger.info('is_validated: consumer_key: %r, result: %r.', token['consumer_key'], result) defer.returnValue(result) @defer.inlineCallbacks def validate_email(self, email, password, email_token, token_name): """Validate an email token for user with 'email' and 'password'.""" logger.debug('validate_email: email: %r password: , ' 'email_token: %r, token_name: %r.', email, email_token, token_name) credentials = yield self.login(email=email, password=password, token_name=token_name) restful_client = restful.RestfulClient(self.service_url, oauth_credentials=credentials) try: result = yield restful_client.restcall("accounts.validate_email", email_token=email_token) finally: restful_client.shutdown() logger.info('validate_email: email: %r result: %r', email, result) if 'errors' in result: errorsdict = self._format_webservice_errors(result['errors']) raise EmailTokenError(errorsdict) elif 'email' in result: defer.returnValue(credentials) else: raise EmailTokenError('Received invalid reply: %s' % result) @defer.inlineCallbacks def request_password_reset_token(self, email): """Request a token to reset the password for the account 'email'.""" restful_client = restful.RestfulClient(self.service_url) try: operation = "registration.request_password_reset_token" result = yield restful_client.restcall(operation, email=email) except WebClientError as e: logger.exception('request_password_reset_token failed with:') raise ResetPasswordTokenError(e[1].split('\n')[0]) finally: restful_client.shutdown() if result['status'].lower() == SSO_STATUS_OK: defer.returnValue(email) else: raise ResetPasswordTokenError('Received invalid reply: %s' % result) @defer.inlineCallbacks def set_new_password(self, email, token, new_password): """Set a new password for the account 'email' to be 'new_password'. The 'token' has to be the one resulting from a call to 'request_password_reset_token'. """ restful_client = restful.RestfulClient(self.service_url) try: result = yield restful_client.restcall( "registration.set_new_password", email=email, token=token, new_password=new_password) except WebClientError as e: logger.exception('set_new_password failed with:') raise NewPasswordError(e[1].split('\n')[0]) finally: restful_client.shutdown() if result['status'].lower() == SSO_STATUS_OK: defer.returnValue(email) else: raise NewPasswordError('Received invalid reply: %s' % result) ubuntu-sso-client-13.10/ubuntu_sso/keyring/0000755000202700020270000000000012225013301021203 5ustar dobeydobey00000000000000ubuntu-sso-client-13.10/ubuntu_sso/keyring/__init__.py0000664000202700020270000001045412151461656023344 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2011-2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Implementations of different keyrings.""" from __future__ import unicode_literals import socket import sys try: # pylint: disable=E0611,F0401 from urllib.parse import quote # pylint: enable=E0611,F0401 except ImportError: from urllib import quote from twisted.internet.defer import inlineCallbacks, returnValue from ubuntu_sso.logger import setup_logging from ubuntu_sso.utils import compat logger = setup_logging("ubuntu_sso.keyring") TOKEN_SEPARATOR = ' @ ' SEPARATOR_REPLACEMENT = ' AT ' U1_APP_NAME = "Ubuntu One" U1_KEY_NAME = "UbuntuOne token for https://ubuntuone.com" U1_KEY_ATTR = { "oauth-consumer-key": "ubuntuone", "ubuntuone-realm": "https://ubuntuone.com", } def gethostname(): """Get the hostname, return the name as unicode.""" sys_encoding = sys.getfilesystemencoding() hostname = socket.gethostname() if isinstance(hostname, compat.binary_type): return hostname.decode(sys_encoding) return hostname def get_old_token_name(app_name): """Build the token name (old style). Return an unicode.""" quoted_app_name = quote(app_name) computer_name = gethostname() quoted_computer_name = quote(computer_name) assert isinstance(computer_name, compat.text_type) assert isinstance(quoted_computer_name, compat.text_type) return "%s - %s" % (quoted_app_name, quoted_computer_name) def get_token_name(app_name): """Build the token name.. Return an unicode.""" computer_name = gethostname() computer_name = computer_name.replace(TOKEN_SEPARATOR, SEPARATOR_REPLACEMENT) assert isinstance(computer_name, compat.text_type) assert isinstance(computer_name, compat.text_type) return TOKEN_SEPARATOR.join((app_name, computer_name)) @inlineCallbacks def try_old_credentials(app_name): """Try to get old U1 credentials and format them as new.""" logger.debug('trying to get old credentials.') old_creds = yield UbuntuOneOAuthKeyring().get_credentials(U1_KEY_NAME) if old_creds is not None: # Old creds found, build a new credentials dict with them creds = { 'consumer_key': "ubuntuone", 'consumer_secret': "hammertime", 'name': U1_KEY_NAME, 'token': old_creds["oauth_token"], 'token_secret': old_creds["oauth_token_secret"], } logger.debug('found old credentials') returnValue(creds) logger.debug('try_old_credentials: No old credentials for this app.') returnValue(None) Keyring = None if sys.platform in ('win32', 'darwin'): from ubuntu_sso.keyring import pykeyring Keyring = pykeyring.Keyring else: from ubuntu_sso.keyring import linux as linux_kr Keyring = linux_kr.Keyring class UbuntuOneOAuthKeyring(Keyring): """A particular Keyring for Ubuntu One.""" def _get_keyring_attr(self, app_name): """Build the keyring attributes for this credentials.""" return U1_KEY_ATTR ubuntu-sso-client-13.10/ubuntu_sso/keyring/pykeyring.py0000664000202700020270000000613312151461656023625 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2011-2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Keyring implementation for Windows and Darwin.""" from json import loads, dumps from ubuntu_sso.utils.qtwisted import qtDeferToThread as deferToThread USERNAME = 'ubuntu_sso' class Keyring(object): """A Keyring for a given application name.""" def __init__(self, keyring=None): """Create a new instance.""" if keyring is None: import keyring as pykeyring keyring = pykeyring self.keyring = keyring def set_credentials(self, app_name, cred): """Set the credentials of the Ubuntu SSO item.""" # the windows keyring can only store a pair username-password # so we store the data using ubuntu_sso as the user name. Then # the cred will be stored as the string representation of the dict. return deferToThread(self.keyring.set_password, app_name, USERNAME, dumps(cred)) def _get_credentials_obj(self, app_name): """A dict with the credentials.""" creds = self.keyring.get_password(app_name, USERNAME) if creds: return loads(creds) def get_credentials(self, app_name): """A deferred with the secret of the SSO item in a dictionary.""" return deferToThread(self._get_credentials_obj, app_name) def delete_credentials(self, app_name): """Delete a set of credentials from the keyring.""" # this call depends on a patch I sent to pykeyring. The patch has # not landed as of version 0.5.1. If you have that version you can # clone my patch in the following way: # hg clone https://bitbucket.org/mandel/pykeyring-delete-password # pylint: disable=E1103 return deferToThread(self.keyring.delete_password, app_name, USERNAME) ubuntu-sso-client-13.10/ubuntu_sso/keyring/linux.py0000664000202700020270000001271712151461656022750 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright (C) 2010-2012 Canonical # # This program is free software; you can redistribute it and/or modify it under # the terms of the GNU General Public License as published by the Free Software # Foundation; version 3. # # This program is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more # details. # # You should have received a copy of the GNU General Public License along with # this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Handle keys in the local kerying.""" try: # pylint: disable=E0611,F0401 from urllib.parse import parse_qsl, urlencode # pylint: enable=E0611,F0401 except ImportError: from urllib import urlencode from urlparse import parse_qsl from twisted.internet.defer import inlineCallbacks, returnValue from ubuntu_sso.logger import setup_logging from ubuntu_sso.utils.txsecrets import SecretService from ubuntu_sso.keyring import ( get_token_name, get_old_token_name, U1_APP_NAME, try_old_credentials) logger = setup_logging("ubuntu_sso.keyring.linux") class Keyring(object): """A Keyring for a given application name.""" def __init__(self): """Initialize this instance.""" self.service = SecretService() @inlineCallbacks def _find_keyring_item(self, app_name, attr=None): """Return the keyring item or None if not found.""" if attr is None: attr = self._get_keyring_attr(app_name) logger.debug("Finding all items for app_name %r.", app_name) items = yield self.service.search_items(attr) if len(items) == 0: # if no items found, return None logger.debug("No items found!") returnValue(None) logger.debug("Returning first item found.") returnValue(items[0]) def _get_keyring_attr(self, app_name): """Build the keyring attributes for this credentials.""" attr = {"key-type": "Ubuntu SSO credentials", "token-name": get_token_name(app_name)} return attr @inlineCallbacks def set_credentials(self, app_name, cred): """Set the credentials of the Ubuntu SSO item.""" # Creates the secret from the credentials secret = urlencode(cred) attr = self._get_keyring_attr(app_name) # Add our SSO credentials to the keyring yield self.service.open_session() collection = yield self.service.get_default_collection() yield collection.create_item(app_name, attr, secret, True) @inlineCallbacks def _migrate_old_token_name(self, app_name): """Migrate credentials with old name, store them with new name.""" logger.debug("Migrating old token name.") attr = self._get_keyring_attr(app_name) attr['token-name'] = get_old_token_name(app_name) item = yield self._find_keyring_item(app_name, attr=attr) if item is not None: yield self.set_credentials(app_name, dict(parse_qsl(item.secret))) yield item.delete() result = yield self._find_keyring_item(app_name) returnValue(result) @inlineCallbacks def get_credentials(self, app_name): """A deferred with the secret of the SSO item in a dictionary.""" # If we have no attributes, return None logger.debug("Getting credentials for %r.", app_name) yield self.service.open_session() item = yield self._find_keyring_item(app_name) if item is None: item = yield self._migrate_old_token_name(app_name) if item is not None: logger.debug("Parsing secret.") secret = yield item.get_value() returnValue(dict(parse_qsl(secret))) else: # if no item found, try getting the old credentials if app_name == U1_APP_NAME: logger.debug("Trying old credentials for %r.", app_name) old_creds = yield try_old_credentials(app_name) returnValue(old_creds) # nothing was found returnValue(None) @inlineCallbacks def delete_credentials(self, app_name): """Delete a set of credentials from the keyring.""" attr = self._get_keyring_attr(app_name) # Add our SSO credentials to the keyring yield self.service.open_session() collection = yield self.service.get_default_collection() yield collection.create_item(app_name, attr, "secret!", True) item = yield self._find_keyring_item(app_name) if item is not None: yield item.delete() ubuntu-sso-client-13.10/ubuntu_sso/keyring/tests/0000755000202700020270000000000012225013301022345 5ustar dobeydobey00000000000000ubuntu-sso-client-13.10/ubuntu_sso/keyring/tests/__init__.py0000664000202700020270000000266512151461656024513 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # Author: Manuel de la Pena # # Copyright 2011-2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Keyring tests.""" ubuntu-sso-client-13.10/ubuntu_sso/keyring/tests/test_linux.py0000664000202700020270000002071412151461656025145 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # test_linux - tests for ubuntu_sso.keyring under linux # # Author: Alejandro J. Cura # Author: Natalia B. Bidart # # Copyright 2010-2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Tests for the keyring.py module.""" from __future__ import unicode_literals from twisted.internet import defer from twisted.internet.defer import inlineCallbacks from twisted.trial.unittest import TestCase from ubuntu_sso import keyring as common_keyring from ubuntu_sso.keyring import linux as keyring class MockItem(object): """An item contains a secret, lookup attributes and has a label.""" def __init__(self, label, collection, attr, value): """Initialize a new Item.""" self.label = label self.collection = collection self.attributes = attr self.value = value def get_value(self): """Retrieve the secret for this item.""" return defer.succeed(self.value) def delete(self): """Delete this item.""" self.collection.items.remove(self) return defer.succeed(None) def matches(self, search_attr): """See if this item matches a given search.""" for k, val in search_attr.items(): if k not in self.attributes: return False if self.attributes[k] != val: return False return True class MockCollection(object): """A collection of items containing secrets.""" def __init__(self, label, service): """Initialize a new collection.""" self.label = label self.service = service self.items = [] def create_item(self, label, attr, value, replace=True): """Create an item with the given attributes, secret and label.""" item = MockItem(label, self, attr, value) self.items.append(item) return defer.succeed(item) class MockSecretService(object): """A class that mocks txsecrets.SecretService.""" def __init__(self, *args, **kwargs): super(MockSecretService, self).__init__(*args, **kwargs) self.collections = {} def open_session(self, window_id=0): """Open a unique session for the caller application.""" return defer.succeed(self) def search_items(self, attributes): """Find items in any collection.""" results = [] for collection in self.collections.values(): for item in collection.items: if item.matches(attributes): results.append(item) return defer.succeed(results) def create_collection(self, label): """Create a new collection with the specified properties.""" collection = MockCollection(label, self) self.collections[label] = collection if "default" not in self.collections: self.collections["default"] = collection return defer.succeed(collection) def get_default_collection(self): """The collection were default items should be created.""" if len(self.collections) == 0: self.create_collection("default") return defer.succeed(self.collections["default"]) class TestKeyring(TestCase): """Test the keyring related functions.""" timeout = 5 @defer.inlineCallbacks def setUp(self): """Initialize the mock used in these tests.""" yield super(TestKeyring, self).setUp() self.mock_service = None self.service = self.patch(keyring, "SecretService", self.get_mock_service) self.patch(common_keyring, "gethostname", lambda: "darkstar") def get_mock_service(self): """Create only one instance of the mock service per test.""" if self.mock_service is None: self.mock_service = MockSecretService() return self.mock_service @inlineCallbacks def test_set_credentials(self): """Test that the set method does not erase previous keys.""" sample_creds = {"name": "sample creds name"} sample_creds2 = {"name": "sample creds name 2"} kr = keyring.Keyring() yield kr.set_credentials("appname", sample_creds) yield kr.set_credentials("appname", sample_creds2) # pylint: disable=E1101 self.assertEqual(len(kr.service.collections["default"].items), 2) @inlineCallbacks def test_delete_credentials(self): """Test that a given key is deleted.""" sample_creds = {"name": "sample creds name"} kr = keyring.Keyring() yield kr.set_credentials("appname", sample_creds) yield kr.delete_credentials("appname") # pylint: disable=E1101 self.assertEqual(len(kr.service.collections["default"].items), 1) @inlineCallbacks def test_get_credentials(self): """Test that credentials are properly retrieved.""" sample_creds = {"name": "sample creds name"} kr = keyring.Keyring() yield kr.set_credentials("appname", sample_creds) result = yield kr.get_credentials("appname") self.assertEqual(result, sample_creds) @inlineCallbacks def test_get_credentials_migrating_token(self): """Test that credentials are properly retrieved and migrated.""" sample_creds = {"name": "sample creds name"} kr = keyring.Keyring() self.patch(keyring, "get_token_name", keyring.get_old_token_name) yield kr.set_credentials("app name", sample_creds) result = yield kr.get_credentials("app name") self.assertEqual(result, sample_creds) @inlineCallbacks def test_get_old_cred_found(self): """The method returns a new set of creds if old creds are found.""" sample_oauth_token = "sample oauth token" sample_oauth_secret = "sample oauth secret" old_creds = { "oauth_token": sample_oauth_token, "oauth_token_secret": sample_oauth_secret, } u1kr = common_keyring.UbuntuOneOAuthKeyring() yield u1kr.set_credentials(keyring.U1_APP_NAME, old_creds) kr = keyring.Keyring() result = yield kr.get_credentials(keyring.U1_APP_NAME) self.assertIn("token", result) self.assertEqual(result["token"], sample_oauth_token) self.assertIn("token_secret", result) self.assertEqual(result["token_secret"], sample_oauth_secret) @inlineCallbacks def test_get_old_cred_found_but_not_asked_for(self): """Returns None if old creds are present but the appname is not U1""" sample_oauth_token = "sample oauth token" sample_oauth_secret = "sample oauth secret" old_creds = { "oauth_token": sample_oauth_token, "oauth_token_secret": sample_oauth_secret, } u1kr = common_keyring.UbuntuOneOAuthKeyring() yield u1kr.set_credentials(keyring.U1_APP_NAME, old_creds) kr = keyring.Keyring() result = yield kr.get_credentials("Software Center") self.assertEqual(result, None) @inlineCallbacks def test_get_old_cred_not_found(self): """The method returns None if no old nor new credentials found.""" kr = keyring.Keyring() result = yield kr.get_credentials(keyring.U1_APP_NAME) self.assertEqual(result, None) ubuntu-sso-client-13.10/ubuntu_sso/keyring/tests/test_pykeyring.py0000664000202700020270000001037512151461656026031 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2011-2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Test the pykeyring implementation.""" from json import dumps from twisted.internet import defer from twisted.trial.unittest import TestCase from ubuntu_sso.keyring import pykeyring class FakePyKeyring(object): """Fake Keyring""" def __init__(self): """Initialize object.""" self.data = {} def set_password(self, *args): """Fake set_password for keyring.""" self.data['set_password'] = args self.data['app_name'] = args[0][0] return self def get_password(self, app_name, username): """Fake get_password.""" self.data['get_password'] = True password = dict(password='password', app_name=app_name) return dumps(password) def delete_password(self, *args): """Fake delete_password.""" self.data['delete_password'] = True class FakeDefer(object): """Fake Deferred.""" def fake_defer_to_thread(self, func, *args): """Fake deferToThread.""" return func(args) class TestPyKeyring(TestCase): """Test the pykeyring implementation.""" @defer.inlineCallbacks def setUp(self): """Setup tests.""" yield super(TestPyKeyring, self).setUp() self.app_name = 'app_name' self.fake_keyring = FakePyKeyring() self.keyring = pykeyring.Keyring(self.fake_keyring) self.fake_defer = FakeDefer() self.patch(pykeyring, "deferToThread", self.fake_defer.fake_defer_to_thread) # pylint: disable=E1103 def test_set_credentials(self): """Test setting the credentials.""" self.keyring = pykeyring.Keyring(self.fake_keyring) d = self.keyring.set_credentials(self.app_name, 'password') self.assertEqual(d.data['set_password'], (('app_name', 'ubuntu_sso', '"password"'), )) def test_get_credentials(self): """Test getting the credentials.""" d = self.keyring.get_credentials(self.app_name) self.assertTrue('password' in d) self.assertEqual(d['password'], 'password') self.assertTrue('app_name' in d) self.assertEqual(d['app_name'], ['app_name']) self.assertTrue(self.fake_keyring.data.get('get_password', False)) def test_get_credentials_not_present(self): """Test getting creds that are not present.""" d = self.keyring.get_credentials('app_name_not_there') self.assertTrue('password' in d) self.assertEqual(d['password'], 'password') self.assertTrue('app_name' in d) self.assertNotEqual(d['app_name'], [self.app_name]) self.assertTrue(self.fake_keyring.data.get('get_password', False)) def test_delete_credentials(self): """Test deleting the credentials.""" result = self.keyring.delete_credentials(self.app_name) self.assertTrue(result is None) self.assertTrue(self.fake_keyring.data.get('delete_password', False)) # pylint: enable=E1103 ubuntu-sso-client-13.10/ubuntu_sso/keyring/tests/test_common.py0000664000202700020270000001063212151461656025274 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # test_keyring - tests for ubuntu_sso.keyring # # Author: Alejandro J. Cura # Author: Natalia B. Bidart # # Copyright 2010-2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Tests for the keyring common module.""" from __future__ import unicode_literals from twisted.trial.unittest import TestCase from ubuntu_sso import keyring class TestGetHostname(TestCase): """Test the function that gets the hostname.""" def test_get_hostname(self): """The common case.""" fake_hostname = "fake hostname" self.patch(keyring.socket, "gethostname", lambda: fake_hostname) self.assertEqual(keyring.gethostname(), fake_hostname) def test_get_hostname_uses_filesystem_encoding(self): """The fs encoding is used to decode the name returned by socket.""" fake_hostname = "Привет-ПК" hostname_koi8r = fake_hostname.encode("koi8-r") self.patch(keyring.socket, "gethostname", lambda: hostname_koi8r) self.patch(keyring.sys, "getfilesystemencoding", lambda: "koi8-r") self.assertEqual(keyring.gethostname(), fake_hostname) class TestTokenNameBuilder(TestCase): """Test the function that builds the token name.""" def check_build(self, sample_app_name, sample_hostname, expected_result): """Check the build of a given token.""" self.patch(keyring, "gethostname", lambda *a: sample_hostname) result = keyring.get_token_name(sample_app_name) self.assertEqual(result, expected_result) def test_get_simple_token_name(self): """A simple token name is built right.""" sample_app_name = "UbuntuTwo" sample_hostname = "Darkstar" expected_result = "UbuntuTwo @ Darkstar" self.check_build(sample_app_name, sample_hostname, expected_result) def test_get_complex_token_name_for_app_name(self): """A complex token name is built right too.""" sample_app_name = "Ubuntu @ Eleven" sample_hostname = "Mate+Cocido" expected_result = "Ubuntu @ Eleven @ Mate+Cocido" self.check_build(sample_app_name, sample_hostname, expected_result) def test_get_complex_token_name_for_hostname(self): """A complex token name is built right too.""" sample_app_name = "Ubuntu Eleven" sample_hostname = "Mate @ Cocido" expected_result = "Ubuntu Eleven @ Mate AT Cocido" self.check_build(sample_app_name, sample_hostname, expected_result) def test_get_unicode_appname_token_name(self): """A token name with unicode in the app name.""" sample_app_name = "Ubuntu 四百六åä¹" sample_hostname = "Darkstar" expected_result = "Ubuntu 四百六åä¹ @ Darkstar" self.check_build(sample_app_name, sample_hostname, expected_result) def test_get_utf8_hostname_token_name(self): """A token name with utf8 in the host name.""" sample_app_name = "Ubuntu Eleven" sample_hostname = "Привет-ПК" expected_result = "Ubuntu Eleven @ Привет-ПК" self.check_build(sample_app_name, sample_hostname, expected_result) ubuntu-sso-client-13.10/ubuntu_sso/__init__.py0000664000202700020270000000427112151461656021674 0ustar dobeydobey00000000000000# # Copyright 2009-2013 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Ubuntu Single Sign On client code.""" import os # Host URL changing environment variables SSO_AUTH_BASE_URL = os.environ.get( 'SSO_AUTH_BASE_URL', 'https://login.ubuntu.com') SSO_UONE_BASE_URL = os.environ.get( 'SSO_UONE_BASE_URL', 'https://one.ubuntu.com') # DBus constants DBUS_BUS_NAME = "com.ubuntu.sso" DBUS_ACCOUNT_PATH = "/com/ubuntu/sso/accounts" DBUS_IFACE_USER_NAME = "com.ubuntu.sso.UserManagement" DBUS_CREDENTIALS_PATH = "/com/ubuntu/sso/credentials" DBUS_CREDENTIALS_IFACE = "com.ubuntu.sso.CredentialsManagement" NO_OP = lambda *args, **kwargs: None # return codes for UIs USER_SUCCESS = 0 USER_CANCELLATION = 10 EXCEPTION_RAISED = 11 BACKEND_EXECUTABLE = 'ubuntu-sso-login' # available UIs UI_SSL_DIALOG = 'ubuntu-sso-ssl-certificate-qt' UI_EXECUTABLE_QT = 'ubuntu-sso-login-qt' UI_PROXY_CREDS_DIALOG = 'ubuntu-sso-proxy-creds-qt' ubuntu-sso-client-13.10/ubuntu_sso/networkstate/0000755000202700020270000000000012225013301022265 5ustar dobeydobey00000000000000ubuntu-sso-client-13.10/ubuntu_sso/networkstate/windows.py0000664000202700020270000002134312151461656024360 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2011-2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Network status implementation on Windows.""" # pylint: disable=F0401 # distutils-extra: ignore-import=pythoncom,win32com.server.policy # distutils-extra: ignore-import=win32com.client import pythoncom # pylint: enable=F0401 from ctypes import windll, byref from ctypes.wintypes import DWORD from threading import Thread from twisted.internet import defer # pylint: disable=F0401 from win32com.server.policy import DesignatedWrapPolicy from win32com.client import Dispatch # pylint: enable=F0401 from ubuntu_sso.networkstate import NetworkFailException from ubuntu_sso.networkstate.networkstates import ONLINE, OFFLINE from ubuntu_sso.logger import setup_logging logger = setup_logging("ubuntu_sso.networkstate") # naming errors are deliberated because we are following the COM naming to make # it clear for later developers. # pylint: disable=C0103 ## from EventSys.h PROGID_EventSystem = "EventSystem.EventSystem" PROGID_EventSubscription = "EventSystem.EventSubscription" # SENS (System Event Notification Service) values for the events, # this events contain the uuid of the event, the name of the event to be used # as well as the method name of the method in the ISesNetwork interface that # will be executed for the event. # For more info look at: # http://msdn.microsoft.com/en-us/library/aa377384(v=vs.85).aspx SUBSCRIPTION_NETALIVE = ('{cd1dcbd6-a14d-4823-a0d2-8473afde360f}', 'UbuntuOne Network Alive', 'ConnectionMade') SUBSCRIPTION_NETALIVE_NOQOC = ('{a82f0e80-1305-400c-ba56-375ae04264a1}', 'UbuntuOne Net Alive No Info', 'ConnectionMadeNoQOCInfo') SUBSCRIPTION_NETLOST = ('{45233130-b6c3-44fb-a6af-487c47cee611}', 'UbuntuOne Network Lost', 'ConnectionLost') SUBSCRIPTION_REACH = ('{4c6b2afa-3235-4185-8558-57a7a922ac7b}', 'UbuntuOne Network Reach', 'ConnectionMade') SUBSCRIPTION_REACH_NOQOC = ('{db62fa23-4c3e-47a3-aef2-b843016177cf}', 'UbuntuOne Network Reach No Info', 'ConnectionMadeNoQOCInfo') SUBSCRIPTION_REACH_NOQOC2 = ('{d4d8097a-60c6-440d-a6da-918b619ae4b7}', 'UbuntuOne Network Reach No Info 2', 'ConnectionMadeNoQOCInfo') SUBSCRIPTIONS = [SUBSCRIPTION_NETALIVE, SUBSCRIPTION_NETALIVE_NOQOC, SUBSCRIPTION_NETLOST, SUBSCRIPTION_REACH, SUBSCRIPTION_REACH_NOQOC, SUBSCRIPTION_REACH_NOQOC2] SENSGUID_EVENTCLASS_NETWORK = '{d5978620-5b9f-11d1-8dd2-00aa004abd5e}' SENSGUID_PUBLISHER = "{5fee1bd6-5b9b-11d1-8dd2-00aa004abd5e}" # uuid of the implemented com interface IID_ISesNetwork = '{d597bab1-5b9f-11d1-8dd2-00aa004abd5e}' class NetworkManager(DesignatedWrapPolicy): """Implement ISesNetwork to know about the network status.""" _com_interfaces_ = [IID_ISesNetwork] _public_methods_ = ['ConnectionMade', 'ConnectionMadeNoQOCInfo', 'ConnectionLost'] _reg_clsid_ = '{41B032DA-86B5-4907-A7F7-958E59333010}' _reg_progid_ = "UbuntuOne.NetworkManager" def __init__(self, connected_cb=None, connected_cb_info=None, disconnected_cb=None): # pylint: disable=E1101,E1120,W0231 self._wrap_(self) # pylint: enable=E1101,E1120 self.connected_cb = connected_cb self.connected_cb_info = connected_cb_info self.disconnected_cb = disconnected_cb def ConnectionMade(self, *args): """Tell that the connection is up again.""" logger.info('Connection was made.') if self.connected_cb_info: self.connected_cb_info() def ConnectionMadeNoQOCInfo(self, *args): """Tell that the connection is up again.""" logger.info('Connection was made no info.') if self.connected_cb: self.connected_cb() def ConnectionLost(self, *args): """Tell the connection was lost.""" logger.info('Connection was lost.') if self.disconnected_cb: self.disconnected_cb() def register(self): """Register to listen to network events.""" # call the CoInitialize to allow the registration to run in another # thread # pylint: disable=E1101 pythoncom.CoInitialize() # interface to be used by com manager_interface = pythoncom.WrapObject(self) event_system = Dispatch(PROGID_EventSystem) # register to listen to each of the events to make sure that # the code will work on all platforms. for current_event in SUBSCRIPTIONS: # create an event subscription and add it to the event # service event_subscription = Dispatch(PROGID_EventSubscription) event_subscription.EventClassId = SENSGUID_EVENTCLASS_NETWORK event_subscription.PublisherID = SENSGUID_PUBLISHER event_subscription.SubscriptionID = current_event[0] event_subscription.SubscriptionName = current_event[1] event_subscription.MethodName = current_event[2] event_subscription.SubscriberInterface = manager_interface event_subscription.PerUser = True # store the event try: event_system.Store(PROGID_EventSubscription, event_subscription) except pythoncom.com_error as e: logger.error( 'Error registering %s to event %s', e, current_event[1]) pythoncom.PumpMessages() # pylint: enable=E1101 def is_machine_connected(): """Return a deferred that when fired, returns if the machine is online.""" # pylint: disable=W0703, W0702 try: wininet = windll.wininet flags = DWORD() connected = wininet.InternetGetConnectedState(byref(flags), None) return defer.succeed(connected == 1) except Exception as e: logger.exception('is_machine_connected failed with:') return defer.fail(NetworkFailException(e)) # pylint: enable=W0703, W0702 class NetworkManagerState(object): """Check for status changed in the network on Windows.""" def __init__(self, result_cb, **kwargs): """Initialize this instance with a result and error callbacks.""" self.result_cb = result_cb def connection_made(self): """Return the connection state over the call back.""" self.result_cb(ONLINE) def connection_lost(self): """Return the connection was lost over the call back.""" self.result_cb(OFFLINE) def find_online_state(self, listener=None, listener_thread=None): """Get the network state and return it thru the set callback.""" # check the current status right now if is_machine_connected(): self.result_cb(ONLINE) else: self.result_cb(OFFLINE) if listener is None: # start listening for network changes listener = NetworkManager(connected_cb=self.connection_made, disconnected_cb=self.connection_lost) if listener_thread is None: listener_thread = Thread(target=listener.register, name='Ubuntu SSO NetworkManager') listener_thread.daemon = True listener_thread.start() ubuntu-sso-client-13.10/ubuntu_sso/networkstate/__init__.py0000664000202700020270000000376212151461656024432 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2011-2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Platform specific network status.""" import sys # ignore global naming issues. # pylint: disable=C0103 NetworkManagerState = None class NetworkFailException(Exception): """Exception for when the network detect process fails.""" if sys.platform == 'win32': from ubuntu_sso.networkstate import windows networksource = windows elif sys.platform == 'darwin': from ubuntu_sso.networkstate import darwin networksource = darwin else: from ubuntu_sso.networkstate import linux networksource = linux NetworkManagerState = networksource.NetworkManagerState is_machine_connected = networksource.is_machine_connected ubuntu-sso-client-13.10/ubuntu_sso/networkstate/networkstates.py0000664000202700020270000000415712151461656025607 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . """Network states.""" class NetworkState(object): """ A simple class to add a label and make debugging easier. """ def __init__(self, label="unlabeled"): self.label = label def __repr__(self): return "Network state (%s)" % self.label # Values returned by the callback (ONLINE, OFFLINE, UNKNOWN) = (NetworkState("online"), NetworkState("offline"), NetworkState("unknown")) # Internal NetworkManager State constants NM_STATE_UNKNOWN = 0 NM_STATE_UNKNOWN_LIST = [NM_STATE_UNKNOWN] NM_STATE_ASLEEP_OLD = 1 NM_STATE_ASLEEP = 10 NM_STATE_ASLEEP_LIST = [NM_STATE_ASLEEP_OLD, NM_STATE_ASLEEP] NM_STATE_CONNECTING_OLD = 2 NM_STATE_CONNECTING = 40 NM_STATE_CONNECTING_LIST = [NM_STATE_CONNECTING_OLD, NM_STATE_CONNECTING] NM_STATE_CONNECTED_OLD = 3 NM_STATE_CONNECTED_LOCAL = 50 NM_STATE_CONNECTED_SITE = 60 NM_STATE_CONNECTED_GLOBAL = 70 # Specifically don't include local and site, as they won't let us get to server NM_STATE_CONNECTED_LIST = [NM_STATE_CONNECTED_OLD, NM_STATE_CONNECTED_GLOBAL] NM_STATE_DISCONNECTED_OLD = 4 NM_STATE_DISCONNECTED = 20 # For us, local and site connections are the same as diconnected NM_STATE_DISCONNECTED_LIST = [NM_STATE_DISCONNECTED_OLD, NM_STATE_DISCONNECTED, NM_STATE_CONNECTED_LOCAL, NM_STATE_CONNECTED_SITE] ubuntu-sso-client-13.10/ubuntu_sso/networkstate/linux.py0000664000202700020270000001160312151461656024023 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2010-2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Implementation of network state detection.""" import dbus from twisted.internet import defer from ubuntu_sso.networkstate import NetworkFailException from ubuntu_sso.networkstate.networkstates import ( ONLINE, OFFLINE, NM_STATE_CONNECTING_LIST, NM_STATE_CONNECTED_LIST, NM_STATE_DISCONNECTED_LIST, ) from ubuntu_sso.logger import setup_logging logger = setup_logging("ubuntu_sso.networkstate") NM_DBUS_INTERFACE = "org.freedesktop.NetworkManager" NM_DBUS_OBJECTPATH = "/org/freedesktop/NetworkManager" class NetworkManagerState(object): """Checks the state of NetworkManager thru DBus.""" def __init__(self, result_cb, dbus_module=dbus): """Initialize this instance with a result and error callbacks.""" self.result_cb = result_cb self.dbus = dbus_module self.state_signal = None def call_result_cb(self, state): """Return the state thru the result callback.""" self.result_cb(state) def got_state(self, state): """Called by DBus when the state is retrieved from NM.""" if state in NM_STATE_CONNECTED_LIST: self.call_result_cb(ONLINE) elif state in NM_STATE_CONNECTING_LIST: logger.debug("Currently connecting, waiting for signal") else: self.call_result_cb(OFFLINE) def got_error(self, error): """Called by DBus when the state is retrieved from NM.""" # Assuming since Network Manager is not running, # the user has connected in some other way logger.error("Error contacting NetworkManager: %s" % str(error)) self.call_result_cb(ONLINE) def state_changed(self, state): """Called when a signal is emmited by Network Manager.""" if int(state) in NM_STATE_CONNECTED_LIST: self.call_result_cb(ONLINE) elif int(state) in NM_STATE_DISCONNECTED_LIST: self.call_result_cb(OFFLINE) else: logger.debug("Not yet connected: continuing to wait") def find_online_state(self): """Get the network state and return it thru the set callback.""" try: sysbus = self.dbus.SystemBus() nm_proxy = sysbus.get_object(NM_DBUS_INTERFACE, NM_DBUS_OBJECTPATH, follow_name_owner_changes=True) nm_if = self.dbus.Interface(nm_proxy, NM_DBUS_INTERFACE) self.state_signal = nm_if.connect_to_signal( signal_name="StateChanged", handler_function=self.state_changed, dbus_interface=NM_DBUS_INTERFACE) nm_proxy.Get(NM_DBUS_INTERFACE, "State", reply_handler=self.got_state, error_handler=self.got_error) except Exception as e: self.got_error(e) def is_machine_connected(): """Return a deferred that when fired, returns if the machine is online.""" d = defer.Deferred() def got_state(state): """The state was retrieved from the Network Manager.""" if type(state) is not type(ONLINE): logger.exception("bad callback argument in is_machine_connected") raise NetworkFailException() result = (state == ONLINE) d.callback(result) try: network = NetworkManagerState(got_state) network.find_online_state() except Exception as e: logger.exception('is_machine_connected failed with:') d.errback(NetworkFailException(e)) return d ubuntu-sso-client-13.10/ubuntu_sso/networkstate/darwin.py0000664000202700020270000002411012151461656024145 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . """Network state detection on OS X. is_machine_connected(): (deferred) returns connected state as bool NetworkManagerState: class with listening thread, calls back with state changes """ from twisted.internet import defer from threading import Thread from ubuntu_sso.networkstate import NetworkFailException from ubuntu_sso.networkstate.networkstates import (ONLINE, OFFLINE, UNKNOWN) from ubuntu_sso.logger import setup_logging logger = setup_logging("ubuntu_sso.networkstate") HOSTNAME_TO_CHECK = 'one.ubuntu.com' from ctypes import ( CDLL, POINTER, CFUNCTYPE, Structure, pointer, c_bool, c_long, c_void_p, c_uint32) from ctypes.util import find_library # pylint: disable=C0103 # Functions and constants below are from # /System/Library/CoreFoundation.framework/ CoreFoundationPath = find_library("CoreFoundation") CoreFoundation = CDLL(CoreFoundationPath) # CFRunLoopRef CFRunLoopGetCurrent() CFRunLoopGetCurrent = CoreFoundation.CFRunLoopGetCurrent CFRunLoopGetCurrent.restype = c_void_p CFRunLoopGetCurrent.argtypes = [] # void CFRelease(CFTypeRef) CFRelease = CoreFoundation.CFRelease CFRelease.restype = None CFRelease.argtypes = [c_void_p] # void CFRunLoopRun() CFRunLoopRun = CoreFoundation.CFRunLoopRun # const CFStringRef kCFRunLoopDefaultMode # pylint: disable=E1101 kCFRunLoopDefaultMode = c_void_p.in_dll(CoreFoundation, "kCFRunLoopDefaultMode") # Functions and constants below are from # /System/Library/SystemConfiguration.framework/ SystemConfigurationPath = find_library("SystemConfiguration") # SystemConfiguration abbreviated as "SC" below: SC = CDLL(SystemConfigurationPath) # "SCNetworkReachability" functions abbreviated to "SCNR*" here. # SCNetworkReachabilityRef # SCNetworkReachabilityCreateWithName(CFAllocatorRef, const char *) SCNRCreateWithName = SC.SCNetworkReachabilityCreateWithName SCNRCreateWithName.restype = c_void_p # Boolean SCNetworkReachabilityGetFlags(SCNetworkReachabilityRef, # SCNetworkReachabilityFlags) SCNRGetFlags = SC.SCNetworkReachabilityGetFlags SCNRGetFlags.restype = c_bool SCNRGetFlags.argtypes = [c_void_p, POINTER(c_uint32)] SCNRScheduleWithRunLoop = SC.SCNetworkReachabilityScheduleWithRunLoop SCNRScheduleWithRunLoop.restype = c_bool SCNRScheduleWithRunLoop.argtypes = [c_void_p, c_void_p, c_void_p] # ctypes callback type to match SCNetworkReachabilityCallback # void (*SCNetworkReachabilityCallback) (SCNetworkReachabilityRef, # SCNetworkReachabilityFlags, # void *) SCNRCallbackType = CFUNCTYPE(None, c_void_p, c_uint32, c_void_p) # NOTE: need to keep this reference alive as long as a callback might occur. # Boolean SCNetworkReachabilitySetCallback(SCNetworkReachabilityRef, # SCNetworkReachabilityCallback, # SCNetworkReachabilityContext) SCNRSetCallback = SC.SCNetworkReachabilitySetCallback SCNRSetCallback.restype = c_bool SCNRSetCallback.argtypes = [c_void_p, SCNRCallbackType, c_void_p] # pylint: enable=E1101 def check_connected_state(): """Calls Synchronous SCNR API, returns bool.""" target = SCNRCreateWithName(None, HOSTNAME_TO_CHECK) if target is None: logger.error("Error creating network reachability reference.") raise NetworkFailException() flags = c_uint32(0) ok = SCNRGetFlags(target, pointer(flags)) CFRelease(target) if not ok: logger.error("Error getting reachability status of '%s'" % HOSTNAME_TO_CHECK) raise NetworkFailException() return flags_say_reachable(flags.value) def flags_say_reachable(flags): """Check flags returned from SCNetworkReachability API. Returns bool. Requires some logic: reachable_flag isn't enough on its own. A down wifi will return flags = 7, or reachable_flag and connection_required_flag, meaning that the host *would be* reachable, but you need a connection first. (And then you'd presumably be best off checking again.) """ # values from SCNetworkReachability.h reachable_flag = 1 << 1 connection_required_flag = 1 << 2 if flags & connection_required_flag: return False elif flags & reachable_flag: return True else: return False class SCNRContext(Structure): """A struct to send as SCNetworkReachabilityContext to SCNRSetCallback. We don't use the fields currently. """ _fields_ = [("version", c_long), ("info", c_void_p), ("retain", c_void_p), # func ptr ("release", c_void_p), # func ptr ("copyDescription", c_void_p)] # func ptr class NetworkManagerState(object): """Probe Network State and receive callbacks on changes. This class uses both synchronous and async API from the SystemConfiguration framework. To use: Initialize with a callback function, then call find_online_state. The callback will be called once immediately with the current state and then only on state changes. Any exceptions in checking state will result in the callback being called with UNKNOWN. At this point the listening thread is no longer runing, and a new NetworkManagerState should be created. NOTE: the callback will be called from the separate listening thread, except for the first call. """ def __init__(self, result_cb): """Initialize and save result callback function. result_cb should take one argument, a networkstate object. The callback will be called with one of ONLINE, OFFLINE, or UNKNOWN, as defined in networkstates.py. """ self.result_cb = result_cb self.listener_thread = None def _state_changed(self, flags): """Testable callback called by reachability_state_changed_cb. Used because reachability_state_changed_cb has to have a particular method signature. Clients should not call this method. """ if flags_say_reachable(flags): self.result_cb(ONLINE) else: self.result_cb(OFFLINE) def _listen_on_separate_thread(self): """In separate thread, setup callback and listen for changes. On error, calls result_cb(UNKNOWN) and returns. """ def reachability_state_changed_cb(targetref, flags, info): """Callback for SCNetworkReachability API This callback is passed to the SCNetworkReachability API, so its method signature has to be exactly this. Therefore, we declare it here and just call _state_changed with flags.""" self._state_changed(flags) c_callback = SCNRCallbackType(reachability_state_changed_cb) context = SCNRContext(0, None, None, None, None) target = SCNRCreateWithName(None, HOSTNAME_TO_CHECK) if target is None: logger.error("Error creating SCNetworkReachability target") self.result_cb(UNKNOWN) return ok = SCNRSetCallback(target, c_callback, pointer(context)) if not ok: logger.error("error setting SCNetworkReachability callback") CFRelease(target) self.result_cb(UNKNOWN) return ok = SCNRScheduleWithRunLoop(target, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode) if not ok: logger.error("error scheduling on runloop: SCNetworkReachability") CFRelease(target) self.result_cb(UNKNOWN) return CFRunLoopRun() CFRelease(target) # won't happen def _start_listening_thread(self): """Start the separate listener thread. Currently will not start one more than once. Should be OK because we don't expect errors the listen method. To add more error handling support, you could either add a call to join and re-start, or client could just create a new NetworkManagerState. """ if self.listener_thread is None: self.listener_thread = Thread( target=self._listen_on_separate_thread, name="Ubuntu SSO Network Connection Monitor") self.listener_thread.daemon = True self.listener_thread.start() def find_online_state(self): """Calls callback with current state. Starts listening thread.""" try: if check_connected_state(): self.result_cb(ONLINE) else: self.result_cb(OFFLINE) except Exception: # pylint: disable=W0703 logger.exception("Getting state from SCNetworkReachability") self.result_cb(UNKNOWN) return # don't start thread on error self._start_listening_thread() def is_machine_connected(): """Return a deferred that when fired, returns online state as a bool. Raises NetworkFailException for errors. """ try: return defer.succeed(check_connected_state()) except Exception as e: # pylint: disable=W0703 logger.exception("Exception calling check_connected_state:") return defer.fail(NetworkFailException(e)) ubuntu-sso-client-13.10/ubuntu_sso/networkstate/tests/0000755000202700020270000000000012225013301023427 5ustar dobeydobey00000000000000ubuntu-sso-client-13.10/ubuntu_sso/networkstate/tests/__init__.py0000664000202700020270000000273012151461656025566 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # Author: Manuel de la Pena # # Copyright 2011-2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Test the different networkstatus implementations.""" ubuntu-sso-client-13.10/ubuntu_sso/networkstate/tests/test_linux.py0000664000202700020270000003103212151461656026222 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2010-2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Tests for the network state detection code.""" from collections import defaultdict from twisted.internet.defer import inlineCallbacks from mocker import ARGS, KWARGS, ANY, MockerTestCase from ubuntu_sso.tests import TestCase from ubuntu_sso.networkstate import ( linux, NetworkFailException, NetworkManagerState, ) from ubuntu_sso.networkstate.networkstates import ( ONLINE, OFFLINE, UNKNOWN, NM_STATE_ASLEEP, NM_STATE_ASLEEP_OLD, NM_STATE_CONNECTING, NM_STATE_CONNECTING_OLD, NM_STATE_CONNECTED_OLD, NM_STATE_CONNECTED_LOCAL, NM_STATE_CONNECTED_SITE, NM_STATE_CONNECTED_GLOBAL, NM_STATE_DISCONNECTED, NM_STATE_DISCONNECTED_OLD, NM_STATE_UNKNOWN, ) from ubuntu_sso.networkstate.linux import ( is_machine_connected, NM_DBUS_INTERFACE, NM_DBUS_OBJECTPATH, ) class TestException(Exception): """An exception to test error conditions.""" def get_dbus_name(self): """A fake dbus name for this exception.""" return "Test Exception Message" class FakeNetworkManagerState(object): """Fake Network Manager State.""" connection_state = None def __init__(self, function): """Initialize Fake class.""" self.call_function = function def find_online_state(self): """Fake find_online_state for linux module.""" self.call_function(self.connection_state) class FakeDBusMatch(object): """Fake a DBus match.""" def __init__(self, name, callback, interface): self.name = name self.callback = callback self.interface = interface self.removed = False def remove(self): """Stop calling the handler function on remove.""" self.removed = True class FakeDBusInterface(object): """Fake DBus Interface.""" def __init__(self): self._signals = defaultdict(list) # pylint: disable=C0103 def Get(self, *args, **kwargs): """Fake Get.""" # pylint: enable=C0103 def connect_to_signal(self, signal_name, handler_function, dbus_interface): """Fake connect_to_signal.""" match = FakeDBusMatch(signal_name, handler_function, dbus_interface) self._signals[signal_name].append(match) return match def emit_signal(self, signal_name, state): """Emit signal for network state change.""" for match in self._signals[signal_name]: match.callback(state) class FakeSystemBus(object): """Fake SystemBus.""" objects = {(NM_DBUS_INTERFACE, NM_DBUS_OBJECTPATH, True): object()} def get_object(self, interface, object_path, follow_name_owner_changes): """Fake get_object.""" key = (interface, object_path, follow_name_owner_changes) return self.objects[key] class TestConnection(TestCase): """Test the state of the connection. This TestCase tests over all the connection states possible. """ @inlineCallbacks def setUp(self): """Setup the mocker dbus object tree.""" yield super(TestConnection, self).setUp() self.patch(linux, "NetworkManagerState", FakeNetworkManagerState) self.patch(linux.dbus, 'SystemBus', FakeSystemBus) self.nm_interface = FakeDBusInterface() self.patch(linux.dbus, 'Interface', lambda *a: self.nm_interface) self.network_changes = [] def _listen_network_changes(self, state): """Fake callback function.""" self.network_changes.append(state) def test_network_state_change(self): """Test the changes in the network connection.""" nms = NetworkManagerState(self._listen_network_changes) nms.find_online_state() self.nm_interface.emit_signal('StateChanged', NM_STATE_CONNECTED_GLOBAL) self.nm_interface.emit_signal('StateChanged', NM_STATE_DISCONNECTED) self.nm_interface.emit_signal('StateChanged', NM_STATE_CONNECTED_GLOBAL) self.assertEqual(nms.state_signal.name, "StateChanged") self.assertEqual(nms.state_signal.callback, nms.state_changed) self.assertEqual(nms.state_signal.interface, "org.freedesktop.NetworkManager") self.assertEqual(self.network_changes, [ONLINE, ONLINE, OFFLINE, ONLINE]) self.assertFalse(nms.state_signal.removed) @inlineCallbacks def test_is_machine_connected_nm_state_online(self): """Callback given ONLINE should mean we are online""" self.patch(FakeNetworkManagerState, "connection_state", ONLINE) d = yield is_machine_connected() self.assertTrue(d) @inlineCallbacks def test_is_machine_connected_nm_state_offline(self): """Callback given OFFLINE should mean we are offline""" self.patch(FakeNetworkManagerState, "connection_state", OFFLINE) d = yield is_machine_connected() self.assertFalse(d) @inlineCallbacks def test_is_machine_connected_nm_state_unknown(self): """Callback given ONLINE should mean we are not online""" self.patch(FakeNetworkManagerState, "connection_state", UNKNOWN) d = yield is_machine_connected() self.assertFalse(d) @inlineCallbacks def test_is_machine_connected_callback_error(self): """Test bad argument to is_machine_connected's internal callback. Passing anything other than ONLINE/OFFLINE/UNKNOWN should cause an exception. """ self.patch(FakeNetworkManagerState, "connection_state", NM_STATE_CONNECTED_GLOBAL) yield self.assertFailure(is_machine_connected(), NetworkFailException) class NetworkManagerBaseTestCase(MockerTestCase): """Base test case for NM state tests.""" def setUp(self): """Setup the dbus object tree.""" super(NetworkManagerBaseTestCase, self).setUp() self.dbusmock = self.mocker.mock() self.dbusmock.SystemBus() sysbusmock = self.mocker.mock() self.mocker.result(sysbusmock) sysbusmock.get_object(ARGS, KWARGS) def connect_proxy(self, exc=None): """Get a proxy mock object, and allow failing with specified exc.""" proxymock = self.mocker.mock() self.mocker.result(proxymock) self.dbusmock.Interface(proxymock, ANY) ifmock = self.mocker.mock() self.mocker.result(ifmock) ifmock.connect_to_signal(ARGS, KWARGS) signalmock = self.mocker.mock() self.mocker.result(signalmock) proxymock.Get(ARGS, KWARGS) if exc is not None: self.mocker.result(exc) self.mocker.replay() # Invalid name "assert[A-Z].*" # pylint: disable=C0103 def assertOnline(self, state): """Check that the state given is ONLINE.""" self.assertEquals(state, ONLINE) def assertOffline(self, state): """Check that the state given is OFFLINE.""" self.assertEquals(state, OFFLINE) def assertUnknown(self, state): """Check that the state was UNKNOWN.""" self.assertEquals(state, UNKNOWN) # pylint: enable=C0103 def get_nms(self, callback): """Get the NetworkManagerState object.""" nms = NetworkManagerState(callback, self.dbusmock) nms.find_online_state() return nms def check_nm_error(self, callback, error): """Check that the error handling is correct.""" nms = self.get_nms(callback) nms.got_error(error) def check_nm_state(self, callback, state): """Check the state handling is correct.""" nms = self.get_nms(callback) nms.got_state(state) def check_nm_state_change(self, callback, fmstate, tostate): """Check the state change handling is correct.""" nms = self.get_nms(callback) nms.got_state(fmstate) nms.state_changed(tostate) class NetworkManagerStateTestCase(NetworkManagerBaseTestCase): """Test NetworkManager state retrieval code.""" def setUp(self): """Setup the dbus object tree.""" super(NetworkManagerStateTestCase, self).setUp() self.connect_proxy() def test_nm_asleep(self): """Asleep status should mean offline.""" self.check_nm_state(self.assertOffline, NM_STATE_ASLEEP) def test_nm_asleep_old(self): """Asleep, old status, should mean offline.""" self.check_nm_state(self.assertOffline, NM_STATE_ASLEEP_OLD) def test_nm_unknown(self): """Unknown status should be treated the same as OFFLINE.""" self.check_nm_state(self.assertOffline, NM_STATE_UNKNOWN) def test_nm_online_old(self): """Check the connected, old status, case.""" self.check_nm_state(self.assertOnline, NM_STATE_CONNECTED_OLD) def test_nm_offline_local(self): """Check the connected, local status, case.""" self.check_nm_state(self.assertOffline, NM_STATE_CONNECTED_LOCAL) def test_nm_offline_site(self): """Check the connected, site status, case.""" self.check_nm_state(self.assertOffline, NM_STATE_CONNECTED_SITE) def test_nm_online_global(self): """Check the connected, global status, case.""" self.check_nm_state(self.assertOnline, NM_STATE_CONNECTED_GLOBAL) def test_nm_offline_old(self): """Check the disconnected, old status, case.""" self.check_nm_state(self.assertOffline, NM_STATE_DISCONNECTED_OLD) def test_nm_offline(self): """Check the disconnected case.""" self.check_nm_state(self.assertOffline, NM_STATE_DISCONNECTED) def test_nm_connecting_then_online_old(self): """Check the waiting for connection, old status, case.""" self.check_nm_state_change(self.assertOnline, NM_STATE_CONNECTING_OLD, NM_STATE_CONNECTED_OLD) def test_nm_connecting_then_online(self): """Check the waiting for connection case.""" self.check_nm_state_change(self.assertOnline, NM_STATE_CONNECTING, NM_STATE_CONNECTED_GLOBAL) def test_nm_connecting_then_offline_old(self): """Check the waiting but fail, old status, case.""" self.check_nm_state_change(self.assertOffline, NM_STATE_CONNECTING_OLD, NM_STATE_DISCONNECTED_OLD) def test_nm_connecting_then_offline(self): """Check the waiting but fail case.""" self.check_nm_state_change(self.assertOffline, NM_STATE_CONNECTING, NM_STATE_DISCONNECTED) class NetworkManagerStateErrorsTestCase(NetworkManagerBaseTestCase): """Test NetworkManager state retrieval code.""" def mock_except_while_getting_proxy(self, exc): """Simulate an exception while getting the DBus proxy object.""" self.mocker.throw(exc) self.mocker.result(exc) self.mocker.replay() def test_nm_check_errors(self): """Trying to reach NM fails with some error.""" self.connect_proxy(Exception) self.check_nm_error(self.assertOnline, Exception()) def test_dbus_problem(self): """Check the case when DBus throws some other exception.""" self.mock_except_while_getting_proxy(TestException) self.get_nms(self.assertOnline) ubuntu-sso-client-13.10/ubuntu_sso/networkstate/tests/run_nwmgr_standalone.py0000664000202700020270000000233012151461656030251 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . """ A test script to start a NetworkManagerState instance and print out the current actual state of the system. """ from __future__ import print_function from ubuntu_sso.networkstate import (NetworkManagerState, is_machine_connected) def my_cb(state): """simple callback just prints state""" print("one.ubuntu.com:", state) if __name__ == '__main__': # test once with direct call: is_machine_connected().addCallback(my_cb) NMS = NetworkManagerState(my_cb) NMS.find_online_state() import time time.sleep(60) ubuntu-sso-client-13.10/ubuntu_sso/networkstate/tests/test_darwin.py0000664000202700020270000001573212151461656026360 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2010-2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Tests for the network state detection code.""" from twisted.internet.defer import inlineCallbacks from ubuntu_sso.tests import TestCase from ubuntu_sso.networkstate import ( darwin, NetworkFailException, ) from ubuntu_sso.networkstate.networkstates import ( ONLINE, OFFLINE, UNKNOWN, ) from ubuntu_sso.networkstate.darwin import ( is_machine_connected, NetworkManagerState ) from ubuntu_sso.networkstate.darwin import flags_say_reachable REACHABLE_FLAG = 1 << 1 CONNECTION_REQUIRED_FLAG = 1 << 2 class TestSCNRFailingInDirect(TestCase): """Test that we handle a problem getting status in a direct call to check_connected_state (used by is_machine_connected) by raising an exception. """ def test_cant_create_target(self): """SCNRCreateWithName returning None should cause an exception.""" self.patch(darwin, "SCNRCreateWithName", lambda _1, _2: None) # pylint: disable=W0212 self.assertRaises(NetworkFailException, darwin.check_connected_state) def test_cant_get_flags(self): """SCNRGetFlags returning False should cause an exception.""" self.patch(darwin, "SCNRGetFlags", lambda _1, _2: False) # pylint: disable=W0212 self.assertRaises(NetworkFailException, darwin.check_connected_state) class TestFailingSCNRInCallbacks(TestCase): """Test that we handle a problem getting status in the separate listening thread by updating the status to UNKNOWN. """ def expect_unknown(self, state): """A convenience callback that fails unless it sees UNKNOWN.""" self.assertEquals(state, UNKNOWN) def test_exc_in_find_online_state(self): """Expect UNKNOWN from find_online_state in case of exception.""" def fake_check_connected_state(): "fake a broken check_connected_state" raise NetworkFailException() self.patch(darwin, "check_connected_state", fake_check_connected_state) NetworkManagerState(self.expect_unknown) def test_cant_create_target(self): """SCNRCreateWithName returning None -> callback gets UNKNOWN.""" self.patch(darwin, "SCNRCreateWithName", lambda _1, _2: None) nms = NetworkManagerState(self.expect_unknown) # pylint: disable=W0212 nms._listen_on_separate_thread() def test_cant_set_callback(self): """SCNRSetCallback returning false -> callback gets UNKNOWN.""" self.patch(darwin, "SCNRSetCallback", lambda _1, _2, _3: False) nms = NetworkManagerState(self.expect_unknown) # pylint: disable=W0212 nms._listen_on_separate_thread() def test_cant_schedule_with_runloop(self): """SCNRScheduleWithRunLoop returning false -> callback gets UNKNOWN.""" self.patch(darwin, "SCNRScheduleWithRunLoop", lambda _1, _2, _3: False) nms = NetworkManagerState(self.expect_unknown) # pylint: disable=W0212 nms._listen_on_separate_thread() class TestReadingFlags(TestCase): """Test interpretation of flags returned from SCNR API""" def test_flag_reachable(self): """Reachable by itself is OK.""" flag = REACHABLE_FLAG self.assertTrue(flags_say_reachable(flag)) def test_flag_reachable_and_flag_connection_required(self): """Reachable and connection-required is NOT OK""" flag = REACHABLE_FLAG | CONNECTION_REQUIRED_FLAG self.assertFalse(flags_say_reachable(flag)) def test_other_flagvals(self): """All other flag configurations are false for our purposes. They either indicate an iOS device, which we won't run this code on, or that the server we're testing for is on this machine or wired directly to it. These cases won't happen. """ for flag in range(0, 17) + [1 << 16, 1 << 17, 1 << 18]: # only test cases without the reachable bit set: flag = flag & ~ 2 self.assertEqual(False, flags_say_reachable(flag)) class TestNMSListeningForNWStateChanges(TestCase): """ Test that the NetworkManagerState class calls the callback with ONLINE/OFFLINE when the state changes appropriately """ @inlineCallbacks def setUp(self): """Setup array to hold state changes.""" yield super(TestNMSListeningForNWStateChanges, self).setUp() self.network_changes = [] def _listen_network_changes(self, state): """Fake callback function, records state changes.""" self.network_changes.append(state) def test_network_state_change(self): """Test the changes in the network connection.""" nms = NetworkManagerState(self._listen_network_changes) # pylint: disable=W0212 nms._state_changed(2) nms._state_changed(0) # 0 or anything other than 2. nms._state_changed(2) self.assertEqual(self.network_changes, [ONLINE, OFFLINE, ONLINE]) class TestIsMachineConnectedFunc(TestCase): """Simple test of is_machine_connected.""" @inlineCallbacks def test_not_connected_returns_false(self): """test that False comes back False""" self.patch(darwin, "check_connected_state", lambda: False) con = yield is_machine_connected() self.assertEqual(con, False) @inlineCallbacks def test_connected_returns_true(self): """check that True comes back True""" self.patch(darwin, "check_connected_state", lambda: True) con = yield is_machine_connected() self.assertEqual(con, True) ubuntu-sso-client-13.10/ubuntu_sso/networkstate/tests/test_windows.py0000664000202700020270000001510212151461656026555 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2011-2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Tests for the network manager.""" from ctypes import windll from mocker import MockerTestCase from twisted.internet.defer import inlineCallbacks from ubuntu_sso.tests import TestCase from ubuntu_sso.networkstate import NetworkFailException from ubuntu_sso.networkstate.windows import ( is_machine_connected, NetworkManager, NetworkManagerState, ONLINE, OFFLINE) class TestNetworkManager(MockerTestCase): """Test he Network Manager.""" def setUp(self): super(TestNetworkManager, self).setUp() self.connection_info = self.mocker.mock() self.connection_no_info = self.mocker.mock() self.disconnected = self.mocker.mock() self.manager = NetworkManager(self.connection_no_info, self.connection_info, self.disconnected) def test_connection_made(self): """Ensure db is called.""" self.connection_info() self.mocker.replay() self.manager.ConnectionMade() def test_connection_made_no_cb(self): """Ensure db is called.""" self.manager.connected_cb_info = None self.mocker.replay() self.manager.ConnectionMade() def test_connection_made_no_info(self): """Ensure db is called.""" self.connection_no_info() self.mocker.replay() self.manager.ConnectionMadeNoQOCInfo() def test_connection_made_no_info_no_cb(self): """Ensure db is called.""" self.manager.connected_cb = None self.mocker.replay() self.manager.ConnectionMadeNoQOCInfo() def test_disconnection(self): """Ensure db is called.""" self.disconnected() self.mocker.replay() self.manager.ConnectionLost() def test_disconnection_no_cb(self): """Ensure db is called.""" self.manager.disconnected_cb = None self.mocker.replay() self.manager.ConnectionLost() class TestNetworkManagerState(MockerTestCase): """Test the Network Manager State.""" def setUp(self): super(TestNetworkManagerState, self).setUp() self.network_manager = self.mocker.mock() self.is_connected = self.mocker.replace( 'ubuntu_sso.networkstate.windows.is_machine_connected') self.thread = self.mocker.mock() self.cb = self.mocker.mock() self.state = NetworkManagerState(self.cb) def test_connection_made(self): """Test that the cb is actually called.""" self.cb(ONLINE) self.mocker.replay() self.state.connection_made() def test_connection_lost(self): """Test that the cb is actually called.""" self.cb(OFFLINE) self.mocker.replay() self.state.connection_lost() def test_find_online_state_not_connected(self): """Test that we do find the online state correctly.""" self.is_connected() self.mocker.result(False) self.cb(OFFLINE) self.mocker.result(self.thread) self.thread.daemon = True self.thread.start() self.mocker.replay() self.state.find_online_state(listener=self.network_manager, listener_thread=self.thread) def test_find_online_state_connected(self): """Test that we do find the online state correctly.""" self.is_connected() self.mocker.result(ONLINE) self.cb(ONLINE) self.mocker.result(self.thread) self.thread.daemon = True self.thread.start() self.mocker.replay() self.state.find_online_state(listener=self.network_manager, listener_thread=self.thread) class FakeWininet(object): """Fake wininet for windll.""" connection_state = -1 # pylint: disable=C0103 def InternetGetConnectedState(self, *args, **kwargs): """Fake InternetGetConnectedState function from wininet.""" return self.connection_state # pylint: enable=C0103 class FakeWininetException(object): """Fake wininet for windll.""" connection_state = -1 # pylint: disable=C0103 def InternetGetConnectedState(self, *args, **kwargs): """Fake InternetGetConnectedState function from wininet.""" raise Exception() # pylint: enable=C0103 class TestConnection(TestCase): """Test the state of the connection.""" @inlineCallbacks def setUp(self): """Setup the mocker dbus object tree.""" yield super(TestConnection, self).setUp() self.patch(windll, "wininet", FakeWininet()) @inlineCallbacks def test_is_machine_connected_connected(self): """Fake the NetworkManagerState.""" self.patch(FakeWininet, "connection_state", 1) result = yield is_machine_connected() self.assertTrue(result) @inlineCallbacks def test_is_machine_connected_disconnected(self): """Fake the NetworkManagerState.""" self.patch(FakeWininet, "connection_state", 0) result = yield is_machine_connected() self.assertFalse(result) @inlineCallbacks def test_is_machine_connected_error(self): """Fake the NetworkManagerState.""" self.patch(windll, "wininet", FakeWininetException()) yield self.assertFailure(is_machine_connected(), NetworkFailException) ubuntu-sso-client-13.10/ubuntu_sso/qt/0000755000202700020270000000000012225013301020157 5ustar dobeydobey00000000000000ubuntu-sso-client-13.10/ubuntu_sso/qt/current_user_sign_in_page.py0000664000202700020270000001677212151461656026014 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Page to allow the user to login into Ubuntu Single Sign On.""" from functools import partial from PyQt4 import QtGui, QtCore from ubuntu_sso import NO_OP from ubuntu_sso.logger import setup_gui_logging from ubuntu_sso.qt import LINK_STYLE, build_general_error_message from ubuntu_sso.qt.sso_wizard_page import SSOWizardPage from ubuntu_sso.qt.ui.current_user_sign_in_ui import Ui_CurrentUserSignInPage from ubuntu_sso.utils import compat from ubuntu_sso.utils.ui import ( CANCEL_BUTTON, CREATE_ACCOUNT_LABEL, EMAIL_LABEL, FORGOTTEN_PASSWORD_BUTTON, is_correct_email, LOGIN_PASSWORD_LABEL, LOGIN_TITLE, LOGIN_SUBTITLE, SIGN_IN_BUTTON, ) logger = setup_gui_logging('ubuntu_sso.current_user_sign_in_page') class CurrentUserSignInPage(SSOWizardPage): """Wizard Page that lets a current user Sign into Ubuntu Single Sign On.""" ui_class = Ui_CurrentUserSignInPage userLoggedIn = QtCore.pyqtSignal(compat.text_type) passwordForgotten = QtCore.pyqtSignal() createAccount = QtCore.pyqtSignal() userNotValidated = QtCore.pyqtSignal(compat.text_type) @property def _signals(self): """The signals to connect to the backend.""" result = {'LoggedIn': self._filter_by_app_name(self.on_logged_in), 'LoginError': self._filter_by_app_name(self.on_login_error), 'UserNotValidated': self._filter_by_app_name(self.on_user_not_validated), } return result @property def password(self): """Return the content of the password edit.""" return compat.text_type(self.ui.password_edit.text()) def on_user_not_validated(self, app_name, email): """Show the validate email page.""" self.hide_overlay() email = compat.text_type(self.ui.email_edit.text()) self.userNotValidated.emit(email) # Invalid names of Qt-inherited methods # pylint: disable=C0103 def nextId(self): """Provide the next id.""" return self.next def initializePage(self): """Setup UI details.""" logger.debug('initializePage - About to show CurrentUserSignInPage') self.setButtonText(QtGui.QWizard.CancelButton, CANCEL_BUTTON) # Layout without custom button 1, # without finish button self.wizard().setButtonLayout([]) # Set sign_in_button as default when the page is shown. self.ui.sign_in_button.setDefault(True) self.ui.sign_in_button.setEnabled(False) def cleanupPage(self): """Reset the wizard buttons.""" super(CurrentUserSignInPage, self).cleanupPage() self.wizard().setButtonLayout([QtGui.QWizard.Stretch]) def _set_translated_strings(self): """Set the translated strings.""" self.setTitle(LOGIN_TITLE.format(app_name=self.app_name)) self.setSubTitle(LOGIN_SUBTITLE % {'app_name': self.app_name}) self.ui.email_label.setText(EMAIL_LABEL) self.ui.password_label.setText(LOGIN_PASSWORD_LABEL) forgotten_text = LINK_STYLE.format(link_url='#', link_text=FORGOTTEN_PASSWORD_BUTTON) self.ui.forgot_password_label.setText(forgotten_text) link_text = CREATE_ACCOUNT_LABEL.format(app_name=self.app_name) account_text = LINK_STYLE.format(link_url='#', link_text=link_text) self.ui.create_account_label.setText(account_text) self.ui.sign_in_button.setText(SIGN_IN_BUTTON) def _connect_ui(self): """Connect the buttons to perform actions.""" self.ui.forgot_password_label.linkActivated.connect( self.on_forgotten_password) self.ui.create_account_label.linkActivated.connect( self.on_create_account) self.ui.email_edit.textChanged.connect(self._validate) self.ui.password_edit.textChanged.connect(self._validate) self.ui.sign_in_button.clicked.connect(self.login) def _validate(self): """Perform input validation.""" correct_mail = is_correct_email( compat.text_type(self.ui.email_edit.text())) correct_password = len( compat.text_type(self.ui.password_edit.text())) > 0 enabled = correct_mail and correct_password self.ui.sign_in_button.setEnabled(enabled) def login(self): """Perform the login using the self.backend.""" # grab the data from the view and call the backend email = compat.text_type(self.ui.email_edit.text()) logger.info('CurrentUserSignInPage.login for: %s', email) password = compat.text_type(self.ui.password_edit.text()) args = (self.app_name, email, password) if self.ping_url: f = self.backend.login_and_ping args = args + (self.ping_url,) else: f = self.backend.login self.hide_error() self.show_overlay() error_handler = partial(self._handle_error, f, self.on_login_error) f(*args, reply_handler=NO_OP, error_handler=error_handler) def on_login_error(self, app_name, error): """There was an error when login in.""" # let the user know logger.error('Got error when login %s, error: %s', self.app_name, error) self.show_error(build_general_error_message(error)) def on_logged_in(self, app_name, result): """We managed to log in.""" logger.info('Logged in for %s', app_name) self.hide_overlay() email = compat.text_type(self.ui.email_edit.text()) logger.debug('About to emit userLoggedIn signal with: (%s).', email) self.userLoggedIn.emit(email) def on_forgotten_password(self, link=None): """Show the user the forgotten password page.""" self.hide_overlay() logger.debug('About to emit passwordForgotten signal') self.passwordForgotten.emit() def on_create_account(self, link=None): """Show the user the account creation page.""" self.hide_overlay() logger.debug('About to emit createAccount signal') self.createAccount.emit() ubuntu-sso-client-13.10/ubuntu_sso/qt/reset_password_page.py0000664000202700020270000002113512151461656024617 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Reset Password page UI.""" from functools import partial from PyQt4.QtCore import Qt, SIGNAL, pyqtSignal from PyQt4.QtGui import QApplication from ubuntu_sso import NO_OP from ubuntu_sso.logger import setup_gui_logging from ubuntu_sso.qt import build_general_error_message, common from ubuntu_sso.qt.sso_wizard_page import SSOWizardEnhancedEditPage from ubuntu_sso.qt.ui.reset_password_ui import Ui_ResetPasswordPage from ubuntu_sso.utils import compat from ubuntu_sso.utils.ui import ( is_min_required_password, PASSWORD1_ENTRY, PASSWORD2_ENTRY, PASSWORD_HELP, RESET_CODE_ENTRY, RESET_PASSWORD, RESET_TITLE, RESET_SUBTITLE, ) logger = setup_gui_logging('ubuntu_sso.reset_password_page') class ResetPasswordPage(SSOWizardEnhancedEditPage): """Widget used to allow the user change his password.""" ui_class = Ui_ResetPasswordPage passwordChanged = pyqtSignal(compat.text_type) @property def _signals(self): """The signals to connect to the backend.""" result = { 'PasswordChanged': self._filter_by_app_name(self.on_password_changed), 'PasswordChangeError': self._filter_by_app_name(self.on_password_change_error), } return result def focus_changed(self, old, now): """Check who has the focus to activate password popups if necessary.""" if now == self.ui.password_line_edit: self.ui.password_assistance.setVisible(True) common.password_default_assistance(self.ui.password_assistance) elif now == self.ui.confirm_password_line_edit: common.password_check_match(self.ui.password_line_edit, self.ui.confirm_password_line_edit, self.ui.password_assistance) # Invalid name "initializePage" # pylint: disable=C0103 def initializePage(self): """Extends QWizardPage initializePage method.""" logger.debug('initializePage - About to show ResetPasswordPage') super(ResetPasswordPage, self).initializePage() self.ui.gridLayout.setAlignment(Qt.AlignLeft) common.password_default_assistance(self.ui.password_assistance) self.ui.password_assistance.setVisible(False) self.setTitle(RESET_TITLE) self.setSubTitle(RESET_SUBTITLE) self.ui.password_label.setText(PASSWORD1_ENTRY) self.ui.confirm_password_label.setText(PASSWORD2_ENTRY) self.ui.reset_code.setText(RESET_CODE_ENTRY) self.ui.reset_password_button.setDefault(True) self.ui.reset_password_button.setEnabled(False) def showEvent(self, event): """Connect focusChanged signal from the application.""" super(ResetPasswordPage, self).showEvent(event) self.connect(QApplication.instance(), SIGNAL("focusChanged(QWidget*, QWidget*)"), self.focus_changed) def hideEvent(self, event): """Disconnect the focusChanged signal when the page change.""" super(ResetPasswordPage, self).hideEvent(event) try: self.disconnect(QApplication.instance(), SIGNAL("focusChanged(QWidget*, QWidget*)"), self.focus_changed) except TypeError: pass # pylint: enable=C0103 def _set_translated_strings(self): """Translate the diff strings used in the app.""" self.ui.reset_password_button.setText(RESET_PASSWORD) self.setSubTitle(PASSWORD_HELP) def _connect_ui(self): """Connect the different ui signals.""" self.ui.password_line_edit.textEdited.connect( lambda: common.password_assistance(self.ui.password_line_edit, self.ui.password_assistance, common.NORMAL)) self.ui.confirm_password_line_edit.textEdited.connect( lambda: common.password_check_match(self.ui.password_line_edit, self.ui.confirm_password_line_edit, self.ui.password_assistance)) self.ui.reset_password_button.clicked.connect( self.set_new_password) self.ui.reset_code_line_edit.textChanged.connect(self._validate) self.ui.password_line_edit.textChanged.connect(self._validate) self.ui.confirm_password_line_edit.textChanged.connect( self._validate) self._add_line_edits_validations() def _validate(self): """Enable the submit button if data is valid.""" enabled = True code = compat.text_type(self.ui.reset_code_line_edit.text()) password = compat.text_type(self.ui.password_line_edit.text()) confirm_password = compat.text_type( self.ui.confirm_password_line_edit.text()) if not is_min_required_password(password): enabled = False elif not self.is_correct_password_confirmation(confirm_password): enabled = False elif not code: enabled = False self.ui.reset_password_button.setEnabled(enabled) def _add_line_edits_validations(self): """Add the validations to be use by the line edits.""" self.set_line_edit_validation_rule( self.ui.password_line_edit, is_min_required_password) self.set_line_edit_validation_rule( self.ui.confirm_password_line_edit, self.is_correct_password_confirmation) # same as the above case, lets connect a signal to a signal self.ui.password_line_edit.textChanged.connect( self.ui.confirm_password_line_edit.textChanged.emit) def on_password_changed(self, app_name, email): """Let user know that the password was changed.""" logger.info('ResetPasswordPage.on_password_changed for %s, email: %s', app_name, email) self.hide_overlay() email = compat.text_type( self.wizard().forgotten.ui.email_line_edit.text()) self.passwordChanged.emit(email) def on_password_change_error(self, app_name, error): """Let the user know that there was an error.""" logger.error('Got error changing password for %s, error: %s', self.app_name, error) self.show_error(build_general_error_message(error)) def set_new_password(self): """Request a new password to be set.""" self.hide_error() email = compat.text_type( self.wizard().forgotten.ui.email_line_edit.text()) code = compat.text_type(self.ui.reset_code_line_edit.text()) password = compat.text_type(self.ui.password_line_edit.text()) logger.info('Setting new password for %r and email %r with code %r', self.app_name, email, code) args = (self.app_name, email, code, password) f = self.backend.set_new_password error_handler = partial(self._handle_error, f, self.on_password_change_error) self.show_overlay() f(*args, reply_handler=NO_OP, error_handler=error_handler) def is_correct_password_confirmation(self, password): """Return if the password is correct.""" return compat.text_type(self.ui.password_line_edit.text()) == password ubuntu-sso-client-13.10/ubuntu_sso/qt/network_detection_page.py0000664000202700020270000000752612151461656025312 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Pages from SSO.""" from twisted.internet import defer from PyQt4 import QtGui, QtCore from ubuntu_sso import networkstate from ubuntu_sso.logger import setup_logging from ubuntu_sso.qt.sso_wizard_page import SSOWizardPage from ubuntu_sso.qt.ui import network_detection_ui from ubuntu_sso.utils.ui import ( CLOSE_AND_SETUP_LATER, NETWORK_DETECTION_TITLE, NETWORK_DETECTION_WARNING, TRY_AGAIN_BUTTON, ) logger = setup_logging('ubuntu_sso.network_detection_page') class NetworkDetectionPage(SSOWizardPage): """Widget to show if we don't detect a network connection.""" ui_class = network_detection_ui.Ui_Form connectionDetected = QtCore.pyqtSignal() def __init__(self, *args, **kwargs): super(NetworkDetectionPage, self).__init__(*args, **kwargs) banner_pixmap = kwargs.pop('banner_pixmap', None) if banner_pixmap is not None: self.ui.image_label.setPixmap(banner_pixmap) self.btn_try_again = None # pylint: disable=C0103 def initializePage(self): """Set UI details.""" logger.debug('initializePage - About to show NetworkDetectionPage') self.wizard()._next_id = -1 self.setButtonText(QtGui.QWizard.CustomButton1, TRY_AGAIN_BUTTON) self.setButtonText(QtGui.QWizard.CancelButton, CLOSE_AND_SETUP_LATER) self.wizard().setButtonLayout([QtGui.QWizard.Stretch, QtGui.QWizard.CustomButton1, QtGui.QWizard.CancelButton, ]) try: self.wizard().customButtonClicked.disconnect() except TypeError: pass self.ui.label.setText(NETWORK_DETECTION_WARNING % {'app_name': self.app_name}) self.btn_try_again = self.wizard().button(QtGui.QWizard.CustomButton1) self.btn_try_again.setDefault(True) self.wizard().customButtonClicked.connect(self.try_again) # pylint: enable=C0103 @defer.inlineCallbacks def try_again(self, button_id=QtGui.QWizard.CustomButton1): """Test the connection again.""" if button_id == QtGui.QWizard.CustomButton1: d = yield networkstate.is_machine_connected() if d: self.connectionDetected.emit() def _set_translated_strings(self): """Implement in each child.""" self.setTitle(NETWORK_DETECTION_TITLE) def _connect_ui(self): """Implement in each child.""" ubuntu-sso-client-13.10/ubuntu_sso/qt/loadingoverlay.py0000664000202700020270000001245012151461656023576 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Loading animation over a widget.""" from __future__ import unicode_literals from PyQt4 import QtGui, QtCore from ubuntu_sso.qt.ui import loadingoverlay_ui from ubuntu_sso.utils.ui import LOADING_OVERLAY LOADING_STYLE = '{0}' class LoadingOverlay(QtGui.QFrame): """The widget that shows a loading animation and disable the widget below. In order to have this working, the Widget which is going to use this overlay has to reimplement the resizeEvent as follows: def resizeEvent(self, event): self.overlay.resize(event.size()) event.accept() """ def __init__(self, parent=None): super(LoadingOverlay, self).__init__(parent=parent) self.ui = loadingoverlay_ui.Ui_Form() self.ui.setupUi(self) self.timer = None self.counter = 0 self.orientation = False self.ui.label.setText(LOADING_STYLE.format(LOADING_OVERLAY)) # Invalid name "paintEvent", "eventFilter", "showEvent", "timerEvent" # pylint: disable=C0103 def paintEvent(self, event): """Paint over the widget to overlay its content.""" painter = QtGui.QPainter() painter.begin(self) painter.setRenderHint(QtGui.QPainter.TextAntialiasing, True) painter.setRenderHint(QtGui.QPainter.Antialiasing, True) painter.fillRect(event.rect(), QtGui.QBrush( QtGui.QColor(255, 255, 255, 135))) painter.setPen(QtGui.QPen(QtCore.Qt.NoPen)) painter.end() QtGui.QFrame.paintEvent(self, event) def eventFilter(self, obj, event): """Filter events from Frame content to draw the dot animation.""" if getattr(self, 'ui', None) is not None and \ obj == self.ui.frm_box and event.type() == QtCore.QEvent.Paint: painter = QtGui.QPainter() painter.begin(obj) painter.setRenderHint(QtGui.QPainter.Antialiasing, True) pos_x = self.ui.frm_box.width() / 3 x_padding = pos_x / 5 for i in range(5): if self.counter != i: linear_gradient = QtGui.QLinearGradient( pos_x + (x_padding * i), self.ui.frm_box.height() / 2 + 10, pos_x + (x_padding * i) + 15, self.ui.frm_box.height() / 2 + 25) linear_gradient.setColorAt(0, QtGui.QColor(205, 200, 198)) linear_gradient.setColorAt(1, QtGui.QColor(237, 237, 237)) painter.setBrush(QtGui.QBrush(linear_gradient)) else: linear_gradient = QtGui.QLinearGradient( pos_x + (x_padding * i), self.ui.frm_box.height() / 2 + 10, pos_x + (x_padding * i) + 15, self.ui.frm_box.height() / 2 + 25) linear_gradient.setColorAt(0, QtGui.QColor(240, 67, 26)) linear_gradient.setColorAt(1, QtGui.QColor(255, 122, 53)) painter.setBrush(QtGui.QBrush(linear_gradient)) painter.drawEllipse( pos_x + (x_padding * i), self.ui.frm_box.height() / 2 + 10, 15, 15) painter.end() return False def showEvent(self, event): """Start the dot animation.""" self.ui.frm_box.installEventFilter(self) palette = QtGui.QPalette(self.palette()) palette.setColor(palette.Background, QtCore.Qt.transparent) self.setPalette(palette) if not self.timer: self.timer = self.startTimer(200) def timerEvent(self, event): """Execute a loop to update the dot animation.""" if self.counter in (0, 4): self.orientation = not self.orientation if self.orientation: self.counter += 1 else: self.counter -= 1 self.update() # pylint: enable=C0103 ubuntu-sso-client-13.10/ubuntu_sso/qt/expander.py0000664000202700020270000001067212151461656022371 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """A Expander widget similar to the GtkExpander.""" from PyQt4.QtCore import pyqtSignal from PyQt4.QtGui import QHBoxLayout, QLabel, QSizePolicy, QVBoxLayout, QWidget from ubuntu_sso.qt.arrow import QArrow # we are following the Qt style, lets tell pylint to ignore it # pylint: disable=C0103 class QExpanderLabel(QWidget): """Widget used to show the label of a QExpander.""" clicked = pyqtSignal() def __init__(self, label, parent=None): """Create a new instance.""" super(QExpanderLabel, self).__init__(parent) self.arrow = QArrow(QArrow.RIGHT) self.label = QLabel(label) layout = QHBoxLayout() layout.setContentsMargins(0, 0, 0, 0) self.setLayout(layout) layout.addWidget(self.arrow) layout.addWidget(self.label) def mousePressEvent(self, event): """Mouse clicked.""" if self.arrow.direction == QArrow.DOWN: self.arrow.direction = QArrow.RIGHT else: self.arrow.direction = QArrow.DOWN self.clicked.emit() def text(self): """Return the text of the label.""" return self.label.text() def setText(self, text): """Set the text of the label.""" self.label.setText(text) class QExpander(QWidget): """A Qt implementation similar to GtkExpander.""" def __init__(self, label, expanded=False, parent=None): """Create a new instance.""" super(QExpander, self).__init__(parent) self.label = QExpanderLabel(label) self.label.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Minimum) self.content = None self.layout = QVBoxLayout() self.layout.setContentsMargins(0, 0, 0, 0) self.setLayout(self.layout) self.layout.addWidget(self.label) self.layout.addStretch() self.label.clicked.connect(self._on_label_clicked) self.setExpanded(expanded) def _on_label_clicked(self): """The expander widget was clicked.""" self._expanded = not self._expanded self.setExpanded(self._expanded) def addWidget(self, widget): """Add a widget to the expander. The previous widget will be removed. """ if self.content is not None: self.layout.removeWidget(self.content) self.content = widget self.content.setVisible(self._expanded) self.layout.insertWidget(1, self.content) def text(self): """Return the text of the label.""" return self.label.text() def setText(self, text): """Set the text of the label.""" self.label.setText(text) def expanded(self): """Return if widget is expanded.""" return self._expanded # pylint: disable=W0201 def setExpanded(self, is_expanded): """Expand the widget or not.""" self._expanded = is_expanded if self._expanded: self.label.arrow.direction = QArrow.DOWN else: self.label.arrow.direction = QArrow.RIGHT if self.content is not None: self.content.setVisible(self._expanded) # pylint: enable=W0201 ubuntu-sso-client-13.10/ubuntu_sso/qt/__init__.py0000664000202700020270000000764212151461656022325 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2011-2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """The Qt graphical interface for the Ubuntu Single Sign On Client.""" from __future__ import unicode_literals import sys import collections from PyQt4 import QtGui, QtCore from ubuntu_sso.logger import setup_gui_logging from ubuntu_sso.utils.ui import GENERIC_BACKEND_ERROR logger = setup_gui_logging('ubuntu_sso.qt') LINK_STYLE = ('' '{link_text}') ERROR_ALL = '__all__' ERROR_STYLE = '%s' ERROR_MESSAGE = 'message' PREFERED_UI_SIZE = {'width': 550, 'height': 525} TITLE_STYLE = '%s' WINDOW_TITLE = 'Ubuntu Single Sign On' # TODO: There is a pixel discrepancy between Qt on Linux and Windows # and Mac OS X. On Mac OS X, one test fails with the height being # off. For now, we're forcing a different UI height on darwin. if sys.platform == 'darwin': PREFERED_UI_SIZE['height'] = 533 def build_general_error_message(errordict): """Build a user-friendly error message from the errordict.""" logger.debug('build_general_error_message: errordict is: %r.', errordict) result = '' if isinstance(errordict, collections.Mapping): msg1 = errordict.get(ERROR_ALL) msg2 = errordict.get(ERROR_MESSAGE) if msg2 is None: # See the errordict in LP: 828417 msg2 = errordict.get('error_message') if msg1 is not None and msg2 is not None: result = '\n'.join((msg1, msg2)) elif msg1 is not None: result = msg1 elif msg2 is not None: result = msg2 else: if 'errtype' in errordict: del errordict['errtype'] result = '\n'.join( [('%s: %s' % (k, v)) for k, v in errordict.items()]) else: result = GENERIC_BACKEND_ERROR logger.error('build_general_error_message with unknown error: %r', errordict) logger.info('build_general_error_message: returning %r.', result) return result def maybe_elide_text(label, text, width, markup=None): """Set 'text' to be the 'label's text. If 'text' is longer than 'width', set the label's tooltip to be the full text, and the text itself to be the elided version of 'text'. """ fm = QtGui.QFontMetrics(label.font()) elided_text = fm.elidedText(text, QtCore.Qt.ElideRight, width) if elided_text != text: label.setToolTip(text) if markup is not None: elided_text = markup % elided_text label.setText(elided_text) ubuntu-sso-client-13.10/ubuntu_sso/qt/main/0000755000202700020270000000000012225013301021103 5ustar dobeydobey00000000000000ubuntu-sso-client-13.10/ubuntu_sso/qt/main/windows.py0000664000202700020270000000374612151461656023205 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Main method to be used on windows.""" from PyQt4 import QtGui def main(app): """Apply style sheet and fonts.""" # Apply font to the entire application QtGui.QFontDatabase.addApplicationFont(':/Ubuntu-R.ttf') QtGui.QFontDatabase.addApplicationFont(':/Ubuntu-B.ttf') # Module 'reactor' has no 'run'/'stop' member, pylint: disable=E1101 def main_start(app): """Start the mainloop.""" from twisted.internet import reactor reactor.run() def main_quit(app): """Stop the mainloop.""" from twisted.internet import reactor reactor.stop() # pylint: enable=E1101 PLATFORM_QSS = ":/windows.qss" ubuntu-sso-client-13.10/ubuntu_sso/qt/main/__init__.py0000664000202700020270000000610212151461656023237 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Main module to open the QT UI.""" import os import sys from PyQt4 import QtGui, QtCore # Module used to include the resources into this file from ubuntu_sso.qt.ui import resources_rc from ubuntu_sso.qt.ubuntu_sso_wizard import UbuntuSSOClientGUI from ubuntu_sso.utils import compat, PLATFORM_QSS # Poke resources_rc to avoid pyflakes complaining about unused import assert(resources_rc) if sys.platform in ('win32', 'darwin'): from ubuntu_sso.qt.main import windows source = windows else: from ubuntu_sso.qt.main import linux source = linux def main(**kwargs): """Start the QT mainloop and open the main window.""" if os.environ.get('TESTABILITY', False) and \ '-testability' not in sys.argv: sys.argv.append('-testability') app = QtGui.QApplication(sys.argv) source.main(app) data = [] for qss_name in (PLATFORM_QSS, ":/stylesheet.qss"): qss = QtCore.QResource(qss_name) data.append(compat.text_type(qss.data())) app.setStyleSheet('\n'.join(data)) # Fix the string that contains unicode chars. for key in kwargs: value = kwargs[key] if isinstance(value, compat.binary_type): kwargs[key] = value.decode('utf-8') close_callback = lambda: source.main_quit(app) ui = UbuntuSSOClientGUI(close_callback=close_callback, **kwargs) style = QtGui.QStyle.alignedRect( QtCore.Qt.LeftToRight, QtCore.Qt.AlignCenter, ui.size(), app.desktop().availableGeometry()) ui.setGeometry(style) app = QtGui.QApplication.instance() app.setWindowIcon(QtGui.QIcon.fromTheme("ubuntuone")) ui.show() if sys.platform == 'darwin': ui.raise_() source.main_start(app) ubuntu-sso-client-13.10/ubuntu_sso/qt/main/linux.py0000664000202700020270000000327212151461656022644 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Main method to be used on linux.""" def main(app): """Apply style sheet.""" from dbus.mainloop.qt import DBusQtMainLoop DBusQtMainLoop(set_as_default=True) def main_start(app): """Start the mainloop.""" app.exec_() def main_quit(app): """Stop the mainloop.""" app.exit() PLATFORM_QSS = ":/linux.qss" ubuntu-sso-client-13.10/ubuntu_sso/qt/main/tests/0000755000202700020270000000000012225013301022245 5ustar dobeydobey00000000000000ubuntu-sso-client-13.10/ubuntu_sso/qt/main/tests/__init__.py0000664000202700020270000000262412151461656024406 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """The test suite for the Qt UI for SSO.""" ubuntu-sso-client-13.10/ubuntu_sso/qt/main/tests/test_main.py0000664000202700020270000001603212151461656024630 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Tests for the main module.""" from copy import copy import os import sys from PyQt4 import QtCore from twisted.internet import defer from twisted.trial.unittest import TestCase from ubuntu_sso.qt import main from ubuntu_sso.utils import compat from ubuntu_sso import tests # pylint: disable=C0103 class FakeUi(object): """A fake UI.""" def size(self): """Fake size.""" return QtCore.QSize(100, 100) def setGeometry(self, *args): """Fake setGeometry.""" show = setGeometry raise_ = lambda self: None class FakeDesktop(object): """Fake Desktop Widget.""" def availableGeometry(self): """Fake availableGeometry for desktop.-""" return QtCore.QRect(100, 100, 100, 100) class FakeApplication(object): """Fake QApplication.""" called = {} __instance = None def __init__(self, args): self.called['args'] = args FakeApplication.__instance = self def setStyleSheet(self, style): """Fake setStyleSheet.""" self.called["setStyleSheet"] = style def styleSheet(self): """Fake get style sheet.""" return self.called.get("setStyleSheet", '') def desktop(self): """Fake Desktop.""" return FakeDesktop() def exec_(self): """Fake exec_.""" def exit(self): """Fake exit.""" def setWindowIcon(self, icon_path): """Fake setWindowIcon.""" @classmethod def instance(cls): """Fake instance.""" return FakeApplication.__instance # pylint: enable=C0103 class BasicTestCase(TestCase): """Test case with a helper tracker.""" @defer.inlineCallbacks def setUp(self): yield super(BasicTestCase, self).setUp() self.called = [] self._close_callback = None self._app = None def called_ui(method, *args, **kw): """record ui call.""" if 'close_callback' in kw: self._close_callback = kw.pop('close_callback') self.called.append((method, args, kw)) return FakeUi() self.patch(main, 'UbuntuSSOClientGUI', lambda *arg, **kw: called_ui('GUI', *arg, **kw)) self.patch(main.source, 'main', lambda *arg, **kw: called_ui('main', *arg, **kw)) self.patch(main.source, 'main_start', lambda *arg, **kw: called_ui('main_start', *arg, **kw)) self.patch(main.QtGui, 'QApplication', FakeApplication) FakeApplication.called['args'] = [] def test_main(self): """Calling main.main() a UI instance is created.""" kwargs = dict(app_name='APP_NAME', foo='foo', bar='bar', baz='yadda', yadda=0) main.main(**kwargs) expected = [('main', (FakeApplication.instance(),), {}), ('GUI', (), kwargs), ('main_start', (FakeApplication.instance(),), {})] self.assertEqual(self.called, expected) def test_testability(self): """Calling main.main() with TESTABILITY=1, adds -testability.""" environ = copy(os.environ) environ['TESTABILITY'] = '1' self.patch(os, 'environ', environ) self.patch(sys, 'argv', []) kwargs = dict(app_name='APP_NAME', foo='foo', bar='bar', baz='yadda', yadda=0) main.main(**kwargs) self.assertIn('-testability', FakeApplication.called['args']) def test_no_testability(self): """Calling main.main() with TESTABILITY unset.""" environ = copy(os.environ) if 'TESTABILITY' in environ: environ['TESTABILITY'] = '' self.patch(os, 'environ', environ) self.patch(sys, 'argv', []) kwargs = dict(app_name='APP_NAME', foo='foo', bar='bar', baz='yadda', yadda=0) main.main(**kwargs) self.assertNotIn('-testability', FakeApplication.called['args']) def test_check_close_callback(self): """Check that the close callback is main_quit.""" def called_quit(app): """Record the call to quit.""" self._app = app self.patch(main.source, 'main_quit', called_quit) kwargs = dict(app_name='APP_NAME', foo='foo', bar='bar', baz='yadda', yadda=0) main.main(**kwargs) expected = [('main', (FakeApplication.instance(),), {}), ('GUI', (), kwargs), ('main_start', (FakeApplication.instance(),), {})] self._close_callback() self.assertEqual(self.called, expected) self.assertEqual(self._app, FakeApplication.instance()) def test_main_args(self): """Calling main.main() a UI instance is created.""" arg_list = (tests.APP_NAME, tests.NAME, tests.PASSWORD, tests.EMAIL_TOKEN) kwargs = dict(app_name=arg_list[0].encode('utf-8'), foo=arg_list[1].encode('utf-8'), bar=arg_list[2].encode('utf-8'), baz=arg_list[3].encode('utf-8')) main.main(**kwargs) args_unicode = dict(app_name=arg_list[0], foo=arg_list[1], bar=arg_list[2], baz=arg_list[3]) expected = [('main', (FakeApplication.instance(),), {}), ('GUI', (), args_unicode), ('main_start', (FakeApplication.instance(),), {})] self.assertEqual(self.called, expected) def test_styles_load(self): """Test that all stylesheets load.""" kwargs = dict(foo='foo', bar='bar', baz='yadda', yadda=0) main.main(**kwargs) data = [] for qss_name in (main.PLATFORM_QSS, ":/stylesheet.qss"): qss = QtCore.QResource(qss_name) data.append(compat.text_type(qss.data())) self.assertEqual( compat.text_type(main.QtGui.QApplication.instance().styleSheet()), '\n'.join(data)) ubuntu-sso-client-13.10/ubuntu_sso/qt/error_page.py0000664000202700020270000000362012151461656022703 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Email Verification page UI.""" from ubuntu_sso.qt.sso_wizard_page import SSOWizardPage from ubuntu_sso.qt.ui.error_message_ui import Ui_ErrorPage from ubuntu_sso.utils.ui import ERROR class ErrorPage(SSOWizardPage): """Widget used to show the diff errors.""" ui_class = Ui_ErrorPage next = None def _set_translated_strings(self): """Set the translated strings.""" self.ui.error_message_label.setText(ERROR) def _connect_ui(self): """Connect the buttons to perform actions.""" self.next = -1 ubuntu-sso-client-13.10/ubuntu_sso/qt/proxy_dialog.py0000664000202700020270000001600512151461656023257 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Qt implementation of proxy UI.""" import argparse import sys from PyQt4.QtGui import QApplication, QDialog, QIcon from twisted.internet import defer from ubuntu_sso import EXCEPTION_RAISED, USER_SUCCESS, USER_CANCELLATION from ubuntu_sso.logger import setup_gui_logging from ubuntu_sso.keyring import Keyring from ubuntu_sso.qt.ui.proxy_credentials_dialog_ui import Ui_ProxyCredsDialog from ubuntu_sso.utils import compat from ubuntu_sso.utils.ui import ( CANCEL_BUTTON, PROXY_CREDS_DIALOG_TITLE, PROXY_CREDS_HEADER, PROXY_CREDS_EXPLANATION, PROXY_CREDS_CONNECTION, PROXY_CREDS_ERROR, PROXY_CREDS_USER_LABEL, PROXY_CREDS_PSWD_LABEL, PROXY_CREDS_HELP_BUTTON, PROXY_CREDS_SAVE_BUTTON, ) logger = setup_gui_logging("ubuntu_sso.qt.proxy_dialog") class ProxyCredsDialog(QDialog): """Dialog used to require the proxy credentials.""" def __init__(self, retry=False, domain=None): """Create a new instance.""" super(ProxyCredsDialog, self).__init__() if domain is None: logger.debug('Domain passed as None.') domain = '' self.domain = domain self.keyring = Keyring() self.ui = Ui_ProxyCredsDialog() self.ui.setupUi(self) # lets set the different basic contents for the ui self._set_labels() self._set_buttons() self._set_icon() if retry: self._load_creds() self.ui.error_label.setVisible(True) else: self.ui.error_label.setVisible(False) @defer.inlineCallbacks def _load_creds(self): """Tries to load the creds in a retry event.""" # pylint: disable=W0703 try: creds = yield self.keyring.get_credentials(self.domain) if creds is not None: logger.debug('Go no empty credentials.') # lets set the text for the inputs self.ui.username_entry.setText(creds['username']) self.ui.password_entry.setText(creds['password']) except Exception: logger.error('Problem getting old creds.') # pylint: enable=W0703 def _set_labels(self): """Set the labels translations.""" self.setWindowTitle(PROXY_CREDS_DIALOG_TITLE) self.ui.title_label.setText(PROXY_CREDS_HEADER) self.ui.explanation_label.setText(PROXY_CREDS_EXPLANATION) self.ui.connection_label.setText(PROXY_CREDS_CONNECTION) # HACK: later this should be set using qss self.ui.error_label.setText("%s" % PROXY_CREDS_ERROR) self.ui.username_label.setText(PROXY_CREDS_USER_LABEL) self.ui.password_label.setText(PROXY_CREDS_PSWD_LABEL) self.ui.domain_label.setText(self.domain) @defer.inlineCallbacks def _on_save_clicked(self, *args): """Save the new credentials.""" username = compat.text_type( self.ui.username_entry.text()).encode('utf8') password = compat.text_type( self.ui.password_entry.text()).encode('utf8') creds = dict(username=username, password=password) try: logger.debug('Save credentials as for domain %s.', self.domain) yield self.keyring.set_credentials(self.domain, creds) except Exception as e: logger.exception('Could not set credentials: %s', e) self.done(EXCEPTION_RAISED) logger.debug('Stored creds') self.done(USER_SUCCESS) def _on_cancel_clicked(self, *args): """End the dialog.""" logger.debug('User canceled credentials dialog.') self.done(USER_CANCELLATION) def _set_buttons(self): """Set the labels of the buttons.""" self.ui.help_button.setText(PROXY_CREDS_HELP_BUTTON) self.ui.cancel_button.setText(CANCEL_BUTTON) self.ui.cancel_button.clicked.connect(self._on_cancel_clicked) self.ui.save_button.setText(PROXY_CREDS_SAVE_BUTTON) self.ui.save_button.clicked.connect(self._on_save_clicked) def _set_icon(self): """Set the icon used in the dialog.""" icon = QIcon.fromTheme('gtk-dialog-authentication') self.ui.logo_label.setText('') self.ui.logo_label.setPixmap(icon.pixmap(48, 48)) def parse_args(): """Parse sys.arg options.""" parser = argparse.ArgumentParser( description='Open the Qt Proxy Credentials UI.') parser.add_argument('--domain', required=True, help='the domain whose credentials are going to be stored.') parser.add_argument('--retry', action='store_true', default=False, help='whether we are retrying to get the creds.') return parser.parse_args() def exit_code(return_code): """Use the window result code and the sys.exit.""" logger.debug('exit %s', return_code) QApplication.instance().exit(return_code) if sys.platform == 'win32': logger.debug('Stop qt reactor') from twisted.internet import reactor reactor.stop() def main(): """Main method used to show the creds dialog.""" if sys.platform == 'win32': import qt4reactor qt4reactor.install() logger.debug('Qt reactor installed.') app = QApplication(sys.argv) app args = parse_args() win = ProxyCredsDialog(domain=args.domain, retry=args.retry) if sys.platform == 'win32': win.show() win.finished.connect(exit_code) logger.debug('Starting reactor') from twisted.internet import reactor logger.debug('QApp is %s', reactor.qApp) reactor.run() else: return_code = win.exec_() sys.exit(return_code) ubuntu-sso-client-13.10/ubuntu_sso/qt/success_page.py0000664000202700020270000000404512151461656023224 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Success page UI.""" from PyQt4 import QtGui from ubuntu_sso.qt.sso_wizard_page import SSOWizardPage from ubuntu_sso.qt.ui.success_message_ui import Ui_SuccessPage from ubuntu_sso.utils.ui import SUCCESS class SuccessPage(SSOWizardPage): """Page used to display success message.""" ui_class = Ui_SuccessPage def _set_translated_strings(self): """Set proper strings to widgets.""" # we may want to customize the image_label in some future self.ui.image_label.setPixmap(QtGui.QPixmap()) message = SUCCESS % {'app_name': self.app_name} self.ui.success_message_body.setText(message) def _connect_ui(self): """Nothing to connect.""" ubuntu-sso-client-13.10/ubuntu_sso/qt/enhanced_check_box.py0000664000202700020270000000540312151461656024331 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # Authors: Diego Sarmentero # # Copyright 2011-2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Customized Check Box to support links.""" from PyQt4 import QtGui, QtCore class EnhancedCheckBox(QtGui.QCheckBox): """Enhanced QCheckBox to support links in the message displayed.""" def __init__(self, text="", parent=None): QtGui.QCheckBox.__init__(self, parent) hbox = QtGui.QHBoxLayout() hbox.setAlignment(QtCore.Qt.AlignLeft) self.text_label = QtGui.QLabel(text) self.text_label.setWordWrap(True) self.text_label.setOpenExternalLinks(True) padding = self.iconSize().width() self.text_label.setStyleSheet("margin-top: -3px;" "padding-left: 2px;") hbox.setContentsMargins(padding, 0, 0, 0) hbox.addWidget(self.text_label) self.setLayout(hbox) if parent is not None: lines = self.text_label.width() / float(parent.width()) self.text_label.setMinimumWidth(parent.width()) self.setMinimumHeight(self.height() * lines) self.stateChanged.connect(self.text_label.setFocus) def text(self): """Return the text of this widget.""" return self.text_label.text() # Invalid name "setText" # pylint: disable=C0103 def setText(self, text): """Set a new text to this widget.""" self.text_label.setText(text) # pylint: enable=C0103 ubuntu-sso-client-13.10/ubuntu_sso/qt/arrow.py0000664000202700020270000000572712151461656021722 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Widget written in Qt that works as a GtkArrow.""" from PyQt4.QtGui import QPainter, QStyle, QStyleOption, QWidget class QArrow(QWidget): """Custom widget.""" UP = 0 DOWN = 1 LEFT = 2 RIGHT = 3 def __init__(self, direction, parent=None): """Create a new instance.""" super(QArrow, self).__init__(parent) self._set_direction(direction) self.setFixedWidth(16) # pylint: disable=C0103 def paintEvent(self, event): """Paint the widget.""" opt = QStyleOption() opt.initFrom(self) painter = QPainter(self) if self._direction == QArrow.UP: primitive = QStyle.PE_IndicatorArrowUp elif self._direction == QArrow.DOWN: primitive = QStyle.PE_IndicatorArrowDown elif self._direction == QArrow.LEFT: primitive = QStyle.PE_IndicatorArrowLeft else: primitive = QStyle.PE_IndicatorArrowRight painter.translate(-5, 0) painter.setViewTransformEnabled(True) self.style().drawPrimitive(primitive, opt, painter, self) # pylint: enable=C0103 def _get_direction(self): """Return the direction used.""" return self._direction # pylint: disable=W0201 def _set_direction(self, direction): """Set the direction.""" if direction not in (QArrow.UP, QArrow.DOWN, QArrow.LEFT, QArrow.RIGHT): raise ValueError('Wrong arrow direction.') self._direction = direction self.repaint() # pylint: enable=W0201 direction = property(_get_direction, _set_direction) ubuntu-sso-client-13.10/ubuntu_sso/qt/sso_wizard_page.py0000664000202700020270000003010612165077706023741 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2011-2013 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Qt implementation of the UI.""" from functools import wraps # pylint: disable=F0401,E0611 from PyQt4.QtCore import Qt, pyqtSignal from PyQt4.QtGui import ( QApplication, QCursor, QFrame, QHBoxLayout, QLabel, QStyle, QVBoxLayout, QWizardPage, ) from twisted.internet import defer from ubuntu_sso import main from ubuntu_sso.constants import APP_NAME, TC_URL, POLICY_URL, PING_URL from ubuntu_sso.logger import setup_gui_logging, log_call from ubuntu_sso.qt import ( ERROR_STYLE, maybe_elide_text, PREFERED_UI_SIZE, TITLE_STYLE, ) from ubuntu_sso.utils.ui import GENERIC_BACKEND_ERROR logger = setup_gui_logging('ubuntu_sso.sso_wizard_page') class WizardHeader(QFrame): """WizardHeader Class for Title and Subtitle in all wizard pages.""" def __init__(self, max_width, parent=None): """Create a new instance.""" super(WizardHeader, self).__init__(parent=parent) self.max_width = max_width self.max_title_width = self.max_width * 0.95 self.max_subtitle_width = self.max_width * 1.8 vbox = QVBoxLayout(self) vbox.setContentsMargins(0, 0, 0, 0) self.title_label = QLabel() self.title_label.setWordWrap(True) self.title_label.setObjectName('title_label') self.subtitle_label = QLabel() self.subtitle_label.setWordWrap(True) self.subtitle_label.setFixedHeight(32) vbox.addWidget(self.title_label) vbox.addWidget(self.subtitle_label) self.title_label.setVisible(False) self.subtitle_label.setVisible(False) def set_title(self, title): """Set the Title of the page or hide it otherwise""" if title: maybe_elide_text(self.title_label, title, self.max_title_width, markup=TITLE_STYLE) self.title_label.setVisible(True) else: self.title_label.setVisible(False) def set_subtitle(self, subtitle): """Set the Subtitle of the page or hide it otherwise""" if subtitle: maybe_elide_text(self.subtitle_label, subtitle, self.max_subtitle_width) self.subtitle_label.setVisible(True) else: self.subtitle_label.setVisible(False) class BaseWizardPage(QWizardPage): """Base class for all wizard pages.""" ui_class = None max_width = 0 processingStarted = pyqtSignal() processingFinished = pyqtSignal() def __init__(self, parent=None): super(BaseWizardPage, self).__init__(parent=parent) self.ui = None if self.ui_class is not None: # self.ui_class is not callable, pylint: disable=E1102 self.ui = self.ui_class() self.ui.setupUi(self) if self.layout() is None: self.setLayout(QVBoxLayout(self)) # Set the error area self.form_errors_label = QLabel() self.form_errors_label.setObjectName('form_errors') self.form_errors_label.setAlignment(Qt.AlignBottom) self.layout().insertWidget(0, self.form_errors_label) # Set the header self.header = WizardHeader(max_width=self.max_width) self.header.set_title(title='') self.header.set_subtitle(subtitle='') self.layout().insertWidget(0, self.header) self.layout().setAlignment(Qt.AlignLeft) self._is_processing = False def _get_is_processing(self): """Is this widget processing any request?""" return self._is_processing def _set_is_processing(self, new_value): """Set this widget to be processing a request.""" self._is_processing = new_value self.setEnabled(not new_value) if not self._is_processing: self.processingFinished.emit() else: self.processingStarted.emit() is_processing = property(fget=_get_is_processing, fset=_set_is_processing) # pylint: disable=C0103 def cleanupPage(self): """Hide the errors.""" self.hide_error() def setTitle(self, title=''): """Set the Wizard Page Title.""" self.header.set_title(title) def setSubTitle(self, subtitle=''): """Set the Wizard Page Subtitle.""" self.header.set_subtitle(subtitle) def title(self): """Return the header's title.""" return self.header.title_label.text() def subTitle(self): """Return the header's subtitle.""" return self.header.subtitle_label.text() # pylint: enable=C0103 @log_call(logger.error) def show_error(self, message): """Show an error message inside the page.""" self.is_processing = False maybe_elide_text(self.form_errors_label, message, self.max_width * 0.95, markup=ERROR_STYLE) def hide_error(self): """Hide the label errors in the current page.""" # We actually want the label with one empty char, because if it is an # empty string, the height of the label is 0 self.form_errors_label.setText(' ') class SSOWizardPage(BaseWizardPage): """Root class for all SSO specific wizard pages.""" _signals = {} # override in children max_width = PREFERED_UI_SIZE['width'] def __init__(self, app_name, **kwargs): """Create a new instance.""" parent = kwargs.pop('parent', None) super(SSOWizardPage, self).__init__(parent=parent) # store common useful data provided by the app self.app_name = APP_NAME self.ping_url = PING_URL self.tc_url = TC_URL self.policy_url = POLICY_URL self.help_text = kwargs.get('help_text', '') self._signals_receivers = {} self.backend = None self.setup_page() def hide_overlay(self): """Emit the signal to notify the upper container that ends loading.""" self.is_processing = False def show_overlay(self): """Emit the signal to notify the upper container that is loading.""" self.is_processing = True @defer.inlineCallbacks def setup_page(self): """Setup the widget components.""" logger.info('Starting setup_page for: %r', self) # pylint: disable=W0702,W0703 try: # Get Backend client = yield main.get_sso_client() self.backend = client.sso_login self._set_translated_strings() self._connect_ui() # Call _setup_signals at the end, so we ensure that the UI # is at least styled as expected if the operations with the # backend fails. self._setup_signals() except: message = 'There was a problem trying to setup the page %r' % self self.show_error(message) logger.exception(message) self.setEnabled(False) # pylint: enable=W0702,W0703 logger.info('%r - setup_page ends, backend is %r.', self, self.backend) def _filter_by_app_name(self, f): """Excecute the decorated function only for 'self.app_name'.""" @wraps(f) def inner(app_name, *args, **kwargs): """Execute 'f' only if 'app_name' matches 'self.app_name'.""" result = None if app_name == self.app_name: result = f(app_name, *args, **kwargs) else: logger.info('%s: ignoring call since received app_name ' '"%s" (expected "%s")', f.__name__, app_name, self.app_name) return result return inner def _setup_signals(self): """Bind signals to callbacks to be able to test the pages.""" for signal, method in self._signals.items(): actual = self._signals_receivers.get(signal) if actual is not None: msg = 'Signal %r is already connected with %r.' logger.warning(msg, signal, actual) match = self.backend.connect_to_signal(signal, method) self._signals_receivers[signal] = match def _set_translated_strings(self): """Implement in each child.""" def _connect_ui(self): """Implement in each child.""" def _handle_error(self, remote_call, handler, error): """Handle any error when calling the remote backend.""" logger.error('Remote call %r failed with: %r', remote_call, error) errordict = {'message': GENERIC_BACKEND_ERROR} handler(self.app_name, errordict) class EnhancedLineEdit(object): """Represents and enhanced lineedit. This class works on an already added lineedit to the widget so that we are just adding extra items to it. """ def __init__(self, line_edit, valid_cb=lambda x: False, warning_sign=False): """Create an instance.""" super(EnhancedLineEdit, self).__init__() self._line_edit = line_edit layout = QHBoxLayout(self._line_edit) layout.setMargin(0) self._line_edit.setLayout(layout) self.valid_cb = valid_cb layout.addStretch() self.clear_label = QLabel(self._line_edit) self.clear_label.setMargin(2) self.clear_label.setProperty("lineEditWarning", True) layout.addWidget(self.clear_label) self.clear_label.setMinimumSize(16, 16) self.clear_label.setVisible(False) self.clear_label.setCursor(QCursor(Qt.ArrowCursor)) if warning_sign: icon = QApplication.style().standardIcon( QStyle.SP_MessageBoxWarning) self.clear_label.setPixmap(icon.pixmap(16, 16)) # connect the change of text to the cation that will check if the # text is valid and if the icon should be shown. self._line_edit.textChanged.connect(self.show_button) def show_button(self, string): """Decide if we show the button or not.""" if not self.valid_cb(string) and self.clear_label.pixmap() is not None: self.clear_label.setVisible(True) else: self.clear_label.setVisible(False) class SSOWizardEnhancedEditPage(SSOWizardPage): """Page that contains enhanced line edits.""" # Method '_connect_ui', '_set_translated_strings' is abstract in class # 'SSOWizardPage' but is not overridden # pylint: disable=W0223 def __init__(self, *args, **kwargs): """Create a new instance.""" self._enhanced_edits = {} super(SSOWizardEnhancedEditPage, self).__init__(*args, **kwargs) def set_line_edit_validation_rule(self, edit, cb): """Set a new enhanced edit so that we can show an icon.""" if edit in self._enhanced_edits: self._enhanced_edits[edit].valid_cb = cb else: # create a new enhanced edit enhanced_edit = EnhancedLineEdit(edit, cb) self._enhanced_edits[edit] = enhanced_edit ubuntu-sso-client-13.10/ubuntu_sso/qt/common.py0000664000202700020270000000745312151461656022056 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Author: Diego Sarmentero # # Copyright 2011-2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Common functionality used by the UI modules.""" from __future__ import unicode_literals import re from ubuntu_sso.utils import compat from ubuntu_sso.utils.ui import ( PASSWORD_DIGIT, PASSWORD_LENGTH, PASSWORD_MATCH, PASSWORD_MUST_CONTAIN, PASSWORD_UPPER, ) # all the text + styles that are used in the gui BAD = ' %s ' GOOD = ' %s ' NORMAL = ' %s ' def password_assistance(line_edit, assistance, icon_type=BAD): """Show help for the password field.""" text1 = compat.text_type(line_edit.text()) label_text = ["%s" % PASSWORD_MUST_CONTAIN, ] if len(text1) < 8: sign = icon_type else: sign = GOOD label_text.append(sign % PASSWORD_LENGTH) if re.search('[A-Z]', text1) is None: sign = icon_type else: sign = GOOD label_text.append(sign % PASSWORD_UPPER) if re.search('[\d+]', text1) is None: sign = icon_type else: sign = GOOD label_text.append(sign % PASSWORD_DIGIT) assistance.setText("
".join(label_text)) def password_check_match(line_edit, line_edit_confirm, assistance): """Check if passwords match, otherwise show a message.""" password_assistance(line_edit, assistance) label_text = compat.text_type(assistance.text()) text1 = compat.text_type(line_edit.text()) text2 = compat.text_type(line_edit_confirm.text()) if text1 != text2: label_text += "
" + BAD % PASSWORD_MATCH assistance.setText(label_text) def password_default_assistance(assistance): """Show default help for the password field.""" label_text = ["%s" % PASSWORD_MUST_CONTAIN, ] label_text.append(NORMAL % PASSWORD_LENGTH) label_text.append(NORMAL % PASSWORD_UPPER) label_text.append(NORMAL % PASSWORD_DIGIT) assistance.setText("
".join(label_text)) def check_as_invalid(line_edit): """Set QLineEdit's formError property as True, refresh the style.""" line_edit.setProperty("formError", True) line_edit.style().unpolish(line_edit) line_edit.style().polish(line_edit) def check_as_valid(line_edit): """Set QLineEdit's formError property as False, refresh the style.""" line_edit.setProperty("formError", False) line_edit.style().unpolish(line_edit) line_edit.style().polish(line_edit) ubuntu-sso-client-13.10/ubuntu_sso/qt/ui/0000755000202700020270000000000012225013301020574 5ustar dobeydobey00000000000000ubuntu-sso-client-13.10/ubuntu_sso/qt/ui/__init__.py0000664000202700020270000000261312151461656022733 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2011-2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """The UI generated files.""" ubuntu-sso-client-13.10/ubuntu_sso/qt/ubuntu_sso_wizard.py0000664000202700020270000003031512151461656024345 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """SSO Wizard UI.""" import sys from PyQt4.QtCore import pyqtSignal from PyQt4.QtGui import ( QFrame, QVBoxLayout, QWizard, ) from twisted.internet import defer from ubuntu_sso import ( networkstate, USER_CANCELLATION, USER_SUCCESS, ) from ubuntu_sso.logger import setup_gui_logging from ubuntu_sso.utils import compat from ubuntu_sso.qt import PREFERED_UI_SIZE, WINDOW_TITLE from ubuntu_sso.qt.current_user_sign_in_page import CurrentUserSignInPage from ubuntu_sso.qt.email_verification_page import EmailVerificationPage from ubuntu_sso.qt.error_page import ErrorPage from ubuntu_sso.qt.forgotten_password_page import ForgottenPasswordPage from ubuntu_sso.qt.loadingoverlay import LoadingOverlay from ubuntu_sso.qt.network_detection_page import NetworkDetectionPage from ubuntu_sso.qt.reset_password_page import ResetPasswordPage from ubuntu_sso.qt.setup_account_page import SetupAccountPage from ubuntu_sso.qt.success_page import SuccessPage logger = setup_gui_logging('ubuntu_sso.gui') class UbuntuSSOWizard(QWizard): """Wizard used to create or use sso.""" # definition of the signals raised by the widget recoverableError = pyqtSignal('QString', 'QString') loginSuccess = pyqtSignal('QString', 'QString') registrationSuccess = pyqtSignal('QString', 'QString') def __init__(self, app_name, **kwargs): """Create a new wizard.""" logger.debug('UbuntuSSOWizard: app_name %r, kwargs %r.', app_name, kwargs) parent = kwargs.pop('parent', None) super(UbuntuSSOWizard, self).__init__(parent=parent) self.overlay = LoadingOverlay(self) self.overlay.hide() self._next_id = -1 self.setOption(QWizard.HaveFinishButtonOnEarlyPages, True) self.setOption(QWizard.NoBackButtonOnStartPage, True) self.exit_code = USER_CANCELLATION self.app_name = app_name self.login_only = kwargs.pop('login_only', False) self.close_callback = kwargs.pop('close_callback', lambda: None) # store the ids of the pages so that it is easier to access them later self._pages = {} # prepare kwargs to be suitable for the pages kwargs['app_name'] = self.app_name kwargs['parent'] = self self.network_page = NetworkDetectionPage(self.app_name) self.network_page.connectionDetected.connect(self._connection_detected) self.addPage(self.network_page) # set the diff pages of the QWizard self.setup_account = SetupAccountPage(**kwargs) self.setup_account.userRegistered.connect( self._move_to_email_verification_page) # There are no tests for signal connections on # this file (LP:1046886) self.setup_account.signIn.connect(self._move_to_login_page) self.addPage(self.setup_account) self.current_user = CurrentUserSignInPage(**kwargs) self.current_user.userNotValidated.connect( self._move_to_email_verification_page) self.current_user.userLoggedIn.connect(self._move_to_success_page) self.current_user.passwordForgotten.connect( self._move_to_forgotten_page) self.current_user.createAccount.connect( self._move_to_setup_account_page) self.addPage(self.current_user) self.email_verification = EmailVerificationPage(**kwargs) self.email_verification.registrationSuccess.connect( self._move_to_success_page) self.addPage(self.email_verification) self.success = SuccessPage(**kwargs) self.addPage(self.success) self.error = ErrorPage(**kwargs) self.addPage(self.error) self.forgotten = ForgottenPasswordPage(**kwargs) self.forgotten.passwordResetTokenSent.connect( self._move_to_reset_password_page) self.addPage(self.forgotten) self.reset_password = ResetPasswordPage(**kwargs) back = lambda *a: self._go_back_to_page(self.current_user) self.reset_password.passwordChanged.connect(back) self.addPage(self.reset_password) # set the buttons layout to only have cancel and back since the next # buttons are the ones used in the diff pages. buttons_layout = [] buttons_layout.append(QWizard.Stretch) buttons_layout.append(QWizard.BackButton) buttons_layout.append(QWizard.CancelButton) self.setButtonLayout(buttons_layout) self.setWindowTitle(self.app_name) self.setWizardStyle(QWizard.ModernStyle) self.button(QWizard.CancelButton).clicked.connect(self.close) self.setMinimumSize(PREFERED_UI_SIZE['width'], PREFERED_UI_SIZE['height']) # This is missing tests (LP:1046887) if self.login_only: self._move_to_login_page() else: self._move_to_setup_account_page() @defer.inlineCallbacks def check_network_connection(self): """Check if the NetworkDetectionPage is needed to be shown.""" d = yield networkstate.is_machine_connected() if d: self._connection_detected() def _connection_detected(self): """Connection restablished, move to the proper page.""" if self.login_only: self._next_id = self.current_user_page_id else: self._next_id = self.setup_account_page_id self.next() self._next_id = -1 # pylint: disable=C0103 def showEvent(self, event): """Check the network connection before the ui is shown.""" super(UbuntuSSOWizard, self).showEvent(event) self.check_network_connection() def nextId(self): """Return the id of the next page.""" return self._next_id def addPage(self, page): """Add 'page' to this wizard.""" page_id = super(UbuntuSSOWizard, self).addPage(page) page.processingStarted.connect(self.overlay.show) page.processingFinished.connect(self.overlay.hide) self._pages[page] = page_id # pylint: enable=C0103 def _go_back_to_page(self, page): """Move back until it reaches the 'page'.""" logger.debug('Moving back from page: %s, to page: %s', self.currentPage(), page) page_id = self._pages[page] visited_pages = self.visitedPages() for index in reversed(visited_pages): if index == page_id: break self.back() def _move_to_reset_password_page(self): """Move to the reset password page wizard.""" logger.debug('Moving to ResetPasswordPage from: %s', self.currentPage()) self._next_id = self.reset_password_page_id self.next() self._next_id = -1 def _move_to_email_verification_page(self, email): """Move to the email verification page wizard.""" logger.debug('Moving to EmailVerificationPage from: %s', self.currentPage()) self._next_id = self.email_verification_page_id self.email_verification.email = compat.text_type(email) self.email_verification.password = self.currentPage().password self.next() self._next_id = -1 def _move_to_setup_account_page(self): """Move to the setup account page wizard.""" logger.debug('Moving to SetupAccountPage from: %s', self.currentPage()) self.setStartId(self.setup_account_page_id) self.restart() def _move_to_login_page(self): """Move to the login page wizard.""" logger.debug('Moving to CurrentUserSignInPage from: %s', self.currentPage()) self.setStartId(self.current_user_page_id) self.restart() def _move_to_success_page(self): """Move to the success page wizard.""" logger.debug('Moving to SuccessPage from: %s', self.currentPage()) self._next_id = self.success_page_id self.next() self.setButtonLayout([ QWizard.Stretch, QWizard.FinishButton]) self.button(QWizard.FinishButton).setEnabled(True) self.button(QWizard.FinishButton).setFocus() self.exit_code = USER_SUCCESS self._next_id = -1 def _move_to_forgotten_page(self): """Move to the forgotten page wizard.""" logger.debug('Moving to ForgottenPasswordPage from: %s', self.currentPage()) self._next_id = self.forgotten_password_page_id self.next() self._next_id = -1 @property def setup_account_page_id(self): """Return the id of the page used for sign in.""" return self._pages[self.setup_account] @property def email_verification_page_id(self): """Return the id of the verification page.""" return self._pages[self.email_verification] @property def current_user_page_id(self): """Return the id used to signin by a current user.""" return self._pages[self.current_user] @property def success_page_id(self): """Return the id of the success page.""" return self._pages[self.success] @property def forgotten_password_page_id(self): """Return the id of the forgotten password page.""" return self._pages[self.forgotten] @property def reset_password_page_id(self): """Return the id of the reset password page.""" return self._pages[self.reset_password] @property def error_page_id(self): """Return the id of the error page.""" return self._pages[self.error] def done(self, result): """Replace the done method from the wizard.""" self.closeEvent(None) # pylint: disable=C0103 def closeEvent(self, event): """Catch close event and send the proper return code.""" if self.parent() is not None: self.parent().close() else: sys.exit(self.exit_code) def resizeEvent(self, event): """Resize the overlay to fit all the widget.""" super(UbuntuSSOWizard, self).resizeEvent(event) self.overlay.resize(event.size()) # pylint: enable=C0103 class UbuntuSSOClientGUI(QFrame): """Ubuntu single sign-on GUI.""" def __init__(self, app_name, **kwargs): """Create a new instance.""" super(UbuntuSSOClientGUI, self).__init__() self.setObjectName("ubuntussoframe") vbox = QVBoxLayout(self) vbox.setContentsMargins(0, 0, 0, 0) logger.debug('UbuntuSSOClientGUI: app_name %r, kwargs %r.', app_name, kwargs) self.app_name = app_name self.setWindowTitle(WINDOW_TITLE) # create the controller and the ui, then set the cb and call the show # method so that we can work self.wizard = UbuntuSSOWizard(app_name=app_name, **kwargs) vbox.addWidget(self.wizard) # pylint: disable=C0103 def closeEvent(self, event): """Catch close event and send the proper return code.""" sys.exit(self.wizard.exit_code) # pylint: enable=C0103 ubuntu-sso-client-13.10/ubuntu_sso/qt/setup_account_page.py0000664000202700020270000005350112151461656024431 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Customized Setup Account page for SSO.""" import tempfile import os from io import BytesIO from functools import partial # pylint: disable=F0401 try: from PIL import Image except ImportError: import Image # pylint: enable=F0401 from PyQt4 import QtGui, QtCore from ubuntu_sso import NO_OP from ubuntu_sso.logger import setup_gui_logging, log_call from ubuntu_sso.qt import ( LINK_STYLE, build_general_error_message, common, enhanced_check_box, ERROR_STYLE, ) from ubuntu_sso.qt.sso_wizard_page import SSOWizardEnhancedEditPage from ubuntu_sso.qt.ui.setup_account_ui import Ui_SetUpAccountPage from ubuntu_sso.utils import compat from ubuntu_sso.utils.ui import ( AGREE_TO_PRIVACY_POLICY, AGREE_TO_TERMS, AGREE_TO_TERMS_AND_PRIVACY_POLICY, CAPTCHA_LOAD_ERROR, CAPTCHA_RELOAD_MESSAGE, CAPTCHA_RELOAD_TEXT, CAPTCHA_REQUIRED_ERROR, CAPTCHA_SOLUTION_ENTRY, EMAIL, EMAIL1_ENTRY, EMAIL2_ENTRY, EMAIL_INVALID, EMAIL_MATCH, EMAIL_MISMATCH, EMPTY_NAME, INVALID_EMAIL, is_min_required_password, is_correct_email, JOIN_HEADER_LABEL, NAME_ENTRY, NAME_INVALID, PASSWORD, PASSWORD1_ENTRY, PASSWORD2_ENTRY, PASSWORD_HELP, PASSWORD_MISMATCH, PASSWORD_TOO_WEAK, PRIVACY_POLICY_TEXT, RETYPE_EMAIL, RETYPE_PASSWORD, SET_UP_ACCOUNT_BUTTON, SIGN_IN_LABEL, TERMS_TEXT, REGISTER_TITLE, ) logger = setup_gui_logging('ubuntu_sso.setup_account_page') ERROR_EMAIL = 'email' class SetupAccountPage(SSOWizardEnhancedEditPage): """Customized Setup Account page for SSO.""" ui_class = Ui_SetUpAccountPage userRegistered = QtCore.pyqtSignal(compat.text_type) signIn = QtCore.pyqtSignal() def __init__(self, *args, **kwargs): self.captcha_file = None self.captcha_id = None self.captcha_received = False self.set_up_button = None self.terms_checkbox = None super(SetupAccountPage, self).__init__(*args, **kwargs) @property def _signals(self): """The signals to connect to the backend.""" result = { 'CaptchaGenerated': self._filter_by_app_name(self.on_captcha_generated), 'CaptchaGenerationError': self._filter_by_app_name(self.on_captcha_generation_error), 'UserRegistered': self._filter_by_app_name(self.on_user_registered), 'UserRegistrationError': self._filter_by_app_name(self.on_user_registration_error), } return result @property def password(self): """Return the content of the password edit.""" return compat.text_type(self.ui.password_edit.text()) # Invalid name "initializePage" # pylint: disable=C0103 def initializePage(self): """Setup UI details.""" logger.debug('initializePage - About to show SetupAccountPage') # Set Setup Account button self.wizard().setOption(QtGui.QWizard.HaveCustomButton3, True) try: self.wizard().customButtonClicked.disconnect() except TypeError: pass self.setButtonText(QtGui.QWizard.CustomButton3, SET_UP_ACCOUNT_BUTTON) self.set_up_button = self.wizard().button(QtGui.QWizard.CustomButton3) self.set_up_button.clicked.connect(self.set_next_validation) self.set_up_button.setEnabled(False) self.ui.name_label.setText(NAME_ENTRY) self.ui.email_label.setText(EMAIL) self.ui.confirm_email_label.setText(RETYPE_EMAIL) self.ui.password_label.setText(PASSWORD) self.ui.confirm_password_label.setText(RETYPE_PASSWORD) # Button setup self.wizard().setButtonLayout([ QtGui.QWizard.Stretch, QtGui.QWizard.CustomButton3]) common.password_default_assistance(self.ui.password_assistance) # Hide assistance labels by default self.ui.name_assistance.setVisible(False) self.ui.email_assistance.setVisible(False) self.ui.confirm_email_assistance.setVisible(False) self.ui.password_assistance.setVisible(False) self.ui.refresh_label.setVisible(True) # pylint: enable=C0103 def _set_translated_strings(self): """Set the strings.""" # set the translated string title_page = REGISTER_TITLE.format(app_name=self.app_name) self.setTitle(title_page) self.setSubTitle(self.help_text) self.ui.name_label.setText(NAME_ENTRY) sign_in_link = LINK_STYLE.format(link_url='#', link_text=SIGN_IN_LABEL) self.ui.sign_in_label.setText(sign_in_link) self.ui.email_label.setText(EMAIL1_ENTRY) self.ui.confirm_email_label.setText(EMAIL2_ENTRY) self.ui.password_label.setText(PASSWORD1_ENTRY) self.ui.confirm_password_label.setText(PASSWORD2_ENTRY) self.ui.password_edit.setToolTip(PASSWORD_HELP) self.ui.captcha_solution_edit.setPlaceholderText( CAPTCHA_SOLUTION_ENTRY) link = LINK_STYLE.format(link_url='#', link_text=CAPTCHA_RELOAD_TEXT) self.ui.refresh_label.setText(CAPTCHA_RELOAD_MESSAGE % {'reload_link': link}) if self.tc_url: terms_links = LINK_STYLE.format(link_url=self.tc_url, link_text=TERMS_TEXT) if self.policy_url: privacy_policy_link = LINK_STYLE.format(link_url=self.policy_url, link_text=PRIVACY_POLICY_TEXT) terms = '' if self.tc_url and self.policy_url: terms = AGREE_TO_TERMS_AND_PRIVACY_POLICY.format( app_name=self.app_name, terms_and_conditions=terms_links, privacy_policy=privacy_policy_link) elif self.tc_url: terms = AGREE_TO_TERMS.format(app_name=self.app_name, terms_and_conditions=terms_links) elif self.policy_url: terms = AGREE_TO_PRIVACY_POLICY.format(app_name=self.app_name, privacy_policy=privacy_policy_link) self.terms_checkbox = enhanced_check_box.EnhancedCheckBox(terms, self) self.ui.hlayout_check.addWidget(self.terms_checkbox) self.terms_checkbox.setVisible(bool(self.tc_url or self.policy_url)) self._register_fields() def _set_line_edits_validations(self): """Set the validations to be performed on the edits.""" logger.debug('SetUpAccountPage._set_line_edits_validations') self.set_line_edit_validation_rule(self.ui.email_edit, is_correct_email) # set the validation rule for the email confirmation self.set_line_edit_validation_rule( self.ui.confirm_email_edit, self.is_correct_email_confirmation) # connect the changed text of the password to trigger a changed text # in the confirm so that the validation is redone self.ui.email_edit.textChanged.connect( self.ui.confirm_email_edit.textChanged.emit) self.set_line_edit_validation_rule(self.ui.password_edit, is_min_required_password) self.set_line_edit_validation_rule( self.ui.confirm_password_edit, self.is_correct_password_confirmation) # same as the above case, lets connect a signal to a signal self.ui.password_edit.textChanged.connect( self.ui.confirm_password_edit.textChanged.emit) def _connect_ui(self): """Set the connection of signals.""" self._set_line_edits_validations() self.ui.captcha_view.setPixmap(QtGui.QPixmap()) self.ui.password_edit.textEdited.connect( lambda: common.password_assistance(self.ui.password_edit, self.ui.password_assistance, common.NORMAL)) self.ui.refresh_label.linkActivated.connect(self.hide_error) self.ui.refresh_label.linkActivated.connect( lambda url: self._refresh_captcha()) # We need to check if we enable the button on many signals self.ui.name_edit.textEdited.connect(self._enable_setup_button) self.ui.email_edit.textEdited.connect(self._enable_setup_button) self.ui.confirm_email_edit.textEdited.connect( self._enable_setup_button) self.ui.password_edit.textEdited.connect(self._enable_setup_button) self.ui.confirm_password_edit.textEdited.connect( self._enable_setup_button) self.ui.captcha_solution_edit.textEdited.connect( self._enable_setup_button) self.terms_checkbox.stateChanged.connect(self._enable_setup_button) self.ui.sign_in_label.linkActivated.connect(self.signIn) self._refresh_captcha() def _enable_setup_button(self): """Only enable the setup button if the form is valid.""" name = compat.text_type(self.ui.name_edit.text()).strip() email = compat.text_type(self.ui.email_edit.text()) confirm_email = compat.text_type(self.ui.confirm_email_edit.text()) password = compat.text_type(self.ui.password_edit.text()) confirm_password = compat.text_type( self.ui.confirm_password_edit.text()) captcha_solution = compat.text_type( self.ui.captcha_solution_edit.text()) # Check for len(name) > 0 to ensure that a bool is assigned to enabled if not self.terms_checkbox.isVisible(): checkbox_terms = True else: checkbox_terms = self.terms_checkbox.isChecked() enabled = checkbox_terms and \ len(captcha_solution) > 0 and \ is_min_required_password(password) and \ password == confirm_password and is_correct_email(email) and \ email == confirm_email and len(name) > 0 self.set_up_button.setEnabled(enabled) def _refresh_captcha(self): """Refresh the captcha image shown in the ui.""" logger.debug('SetUpAccountPage._refresh_captcha') # lets clean behind us, do we have the old file arround? if self.captcha_file and os.path.exists(self.captcha_file): os.unlink(self.captcha_file) fd = tempfile.NamedTemporaryFile() file_name = fd.name self.captcha_file = file_name args = (self.app_name, file_name) f = self.backend.generate_captcha error_handler = partial(self._handle_error, f, self.on_captcha_generation_error) f(*args, reply_handler=NO_OP, error_handler=error_handler) self.on_captcha_refreshing() def _set_titles(self): """Set the diff titles of the view.""" logger.debug('SetUpAccountPage._set_titles') self.header.set_title( JOIN_HEADER_LABEL % {'app_name': self.app_name}) self.header.set_subtitle(self._subtitle) def _register_fields(self): """Register the diff fields of the Ui.""" self.registerField('email_address', self.ui.email_edit) self.registerField('password', self.ui.password_edit) @log_call(logger.debug) def on_captcha_generated(self, app_name, result): """A new image was generated.""" self.captcha_id = result # HACK: First, let me apologize before hand, you can mention my mother # if needed I would do the same (mandel) # In an ideal world we could use the Qt plug-in for the images so that # we could load jpgs etc.. but this won't work when the app has been # brozen win py2exe using bundle_files=1 # The main issue is that Qt will complain about the thread not being # the correct one when performing a moveToThread operation which is # done either by a setParent or something within the qtreactor, PIL # in this case does solve the issue. Sorry :( pil_image = Image.open(self.captcha_file) bytes_io = BytesIO() pil_image.save(bytes_io, format='png') pixmap_image = QtGui.QPixmap() pixmap_image.loadFromData(bytes_io.getvalue()) self.captcha_image = pixmap_image self.on_captcha_refresh_complete() @log_call(logger.error) def on_captcha_generation_error(self, app_name, error): """An error ocurred.""" self.show_error(CAPTCHA_LOAD_ERROR) self.on_captcha_refresh_complete() @log_call(logger.error) def on_user_registration_error(self, app_name, error): """Let the user know we could not register.""" # errors are returned as a dict with the data we want to show. msg = error.pop(ERROR_EMAIL, '') if msg: self.set_error_message(self.ui.email_assistance, msg) error_msg = build_general_error_message(error) if error_msg: self.show_error(error_msg) self._refresh_captcha() @log_call(logger.info) def on_user_registered(self, app_name, email): """Execute when the user did register.""" self.hide_overlay() email = compat.text_type(self.ui.email_edit.text()) self.userRegistered.emit(email) def validate_form(self): """Validate the info of the form and return an error.""" logger.debug('SetUpAccountPage.validate_form') name = compat.text_type(self.ui.name_edit.text()).strip() email = compat.text_type(self.ui.email_edit.text()) confirm_email = compat.text_type(self.ui.confirm_email_edit.text()) password = compat.text_type(self.ui.password_edit.text()) confirm_password = compat.text_type( self.ui.confirm_password_edit.text()) captcha_solution = compat.text_type( self.ui.captcha_solution_edit.text()) condition = True messages = [] if not name: condition = False self.set_error_message(self.ui.name_assistance, NAME_INVALID) if not is_correct_email(email): condition = False self.set_error_message(self.ui.email_assistance, EMAIL_INVALID) if email != confirm_email: condition = False self.set_error_message(self.ui.confirm_email_assistance, EMAIL_MISMATCH) if not is_min_required_password(password): messages.append(PASSWORD_TOO_WEAK) if password != confirm_password: messages.append(PASSWORD_MISMATCH) if not captcha_solution: messages.append(CAPTCHA_REQUIRED_ERROR) if len(messages) > 0: condition = False self.show_error('\n'.join(messages)) return condition def set_next_validation(self): """Set the validation as the next page.""" logger.debug('SetUpAccountPage.set_next_validation') email = compat.text_type(self.ui.email_edit.text()) password = compat.text_type(self.ui.password_edit.text()) name = compat.text_type(self.ui.name_edit.text()) captcha_id = self.captcha_id captcha_solution = compat.text_type( self.ui.captcha_solution_edit.text()) # validate the current info of the form, try to perform the action # to register the user, and then move foward if self.validate_form(): self.show_overlay() self.hide_error() args = (self.app_name, email, password, name, captcha_id, captcha_solution) f = self.backend.register_user error_handler = partial(self._handle_error, f, self.on_user_registration_error) f(*args, reply_handler=NO_OP, error_handler=error_handler) def is_correct_email(self, email_address): """Return if the email is correct.""" return '@' in email_address def is_correct_email_confirmation(self, email_address): """Return that the email is the same.""" return compat.text_type(self.ui.email_edit.text()) == email_address def is_correct_password_confirmation(self, password): """Return that the passwords are correct.""" return compat.text_type(self.ui.password_edit.text()) == password def focus_changed(self, old, now): """Check who has the focus to activate password popups if necessary.""" if old == self.ui.name_edit: self.name_assistance() elif old == self.ui.email_edit: self.email_assistance() elif old == self.ui.confirm_email_edit: self.confirm_email_assistance() elif old == self.ui.confirm_password_edit: common.password_check_match(self.ui.password_edit, self.ui.confirm_password_edit, self.ui.password_assistance) if now == self.ui.password_edit: self.ui.password_assistance.setVisible(True) def name_assistance(self): """Show help for the name field.""" text = compat.text_type(self.ui.name_edit.text()) if not text.strip(): self.set_error_message(self.ui.name_assistance, EMPTY_NAME) common.check_as_invalid(self.ui.name_edit) else: self.ui.name_assistance.setVisible(False) common.check_as_valid(self.ui.name_edit) def email_assistance(self): """Show help for the email field.""" text = compat.text_type(self.ui.email_edit.text()) if not is_correct_email(text): self.set_error_message(self.ui.email_assistance, INVALID_EMAIL) common.check_as_invalid(self.ui.email_edit) else: self.ui.email_assistance.setVisible(False) common.check_as_valid(self.ui.email_edit) def confirm_email_assistance(self): """Show help for the confirm email field.""" text1 = compat.text_type(self.ui.email_edit.text()) text2 = compat.text_type(self.ui.confirm_email_edit.text()) if text1 != text2: self.set_error_message(self.ui.confirm_email_assistance, EMAIL_MATCH) common.check_as_invalid(self.ui.confirm_email_edit) else: self.ui.confirm_email_assistance.setVisible(False) common.check_as_valid(self.ui.confirm_email_edit) def set_error_message(self, label, msg): """Set the message to the proper label applying the error style.""" label.setText(ERROR_STYLE % msg) label.setVisible(True) # pylint: disable=C0103 def showEvent(self, event): """Set set_up_button as default button when the page is shown.""" # This method should stays here because if we move it to initializePage # set_up_button won't take the proper style for hover and press if self.set_up_button is not None: self.set_up_button.setVisible(True) self.set_up_button.setDefault(True) self.connect(QtGui.QApplication.instance(), QtCore.SIGNAL("focusChanged(QWidget*, QWidget*)"), self.focus_changed) super(SetupAccountPage, self).showEvent(event) if not self.captcha_received: self.show_overlay() def hideEvent(self, event): """Disconnect the focusChanged signal when the page change.""" if self.set_up_button is not None: self.set_up_button.setVisible(False) try: self.disconnect(QtGui.QApplication.instance(), QtCore.SIGNAL("focusChanged(QWidget*, QWidget*)"), self.focus_changed) except TypeError: pass super(SetupAccountPage, self).hideEvent(event) # pylint: enable=C0103 def on_captcha_refreshing(self): """Show overlay when captcha is refreshing.""" logger.info('SetUpAccountPage.on_captcha_refreshing') if self.isVisible(): self.show_overlay() self.captcha_received = False def on_captcha_refresh_complete(self): """Hide overlay when captcha finished refreshing.""" logger.info('SetUpAccountPage.on_captcha_refresh_complete') self.hide_overlay() self.captcha_received = True def get_captcha_image(self): """Return the path to the captcha image.""" return self.ui.captcha_view.pixmap() def set_captcha_image(self, pixmap_image): """Set the new image of the captcha.""" # lets set the QPixmap for the label self.ui.captcha_view.setPixmap(pixmap_image) captcha_image = property(get_captcha_image, set_captcha_image) ubuntu-sso-client-13.10/ubuntu_sso/qt/ssl_dialog.py0000664000202700020270000001400012151461656022670 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Qt implementation of the SSL ui.""" import argparse import sys from PyQt4.QtGui import ( QApplication, QDialog, QScrollArea, QStyle, QTextEdit, ) from ubuntu_sso import USER_CANCELLATION, USER_SUCCESS from ubuntu_sso.logger import setup_gui_logging from ubuntu_sso.qt.ui import resources_rc from ubuntu_sso.qt.expander import QExpander from ubuntu_sso.qt.ui.ssl_dialog_ui import Ui_SSLDialog from ubuntu_sso.utils.ui import ( CANCEL_BUTTON, SSL_APPNAME_HELP, SSL_DETAILS_HELP, SSL_DIALOG_TITLE, SSL_DESCRIPTION, SSL_DOMAIN_HELP, SSL_HEADER, SSL_EXPLANATION, SSL_FIRST_REASON, SSL_SECOND_REASON, SSL_THIRD_REASON, SSL_CERT_DETAILS, SSL_NOT_SURE, SSL_REMEMBER_DECISION, SSL_HELP_BUTTON, SSL_CONNECT_BUTTON, ) REASONS_TEMPLATE = ('

%(explanation)s

' '
    ' '
  • %(first_reason)s
  • ' '
  • %(second_reason)s
  • ' '
  • %(third_reason)s
  • ' '
') logger = setup_gui_logging("ubuntu_sso.qt.proxy_dialog") assert(resources_rc) class SSLDialog(QDialog): """"Dialog used to show SSL exceptions.""" def __init__(self, app_name, domain=None, details=None, parent=None): """Create a new instance.""" super(SSLDialog, self).__init__() if domain is None: logger.debug('Domain passed as None.') domain = '' self.domain = domain if details is None: logger.debug('Details passed as None.') details = '' self.details = details self.app_name = app_name self.ssl_text = None self.expander = None self.ui = Ui_SSLDialog() self.ui.setupUi(self) self.setWindowTitle(SSL_DIALOG_TITLE) self._set_expander() self._set_labels() self._set_buttons() self._set_icon() def _set_labels(self): """Set the labels translations.""" self.ui.title_label.setText(SSL_HEADER) explanation = SSL_EXPLANATION % dict(domain=self.domain) intro = REASONS_TEMPLATE % dict(explanation=explanation, first_reason=SSL_FIRST_REASON, second_reason=SSL_SECOND_REASON, third_reason=SSL_THIRD_REASON) self.ui.intro_label.setText(intro) self.ui.not_sure_label.setText(SSL_NOT_SURE % {'app_name': self.app_name}) self.ui.remember_checkbox.setText(SSL_REMEMBER_DECISION) def _on_cancel_clicked(self): """Cancel was cliked.""" logger.debug('User canceled the ssl dialog.') self.done(USER_CANCELLATION) def _on_connect_clicked(self): """Connect was clicked.""" logger.debug('User accepted the ssl certificate.') self.done(USER_SUCCESS) def _set_buttons(self): """Set the labels of the buttons.""" self.ui.help_button.setText(SSL_HELP_BUTTON) self.ui.cancel_button.setText(CANCEL_BUTTON) self.ui.cancel_button.clicked.connect(self._on_cancel_clicked) self.ui.connect_button.setText(SSL_CONNECT_BUTTON) self.ui.connect_button.clicked.connect(self._on_connect_clicked) def _set_expander(self): """Set the expander widget.""" self.ssl_text = QTextEdit() self.ssl_text.setText(self.details) scroll_area = QScrollArea() scroll_area.setViewport(self.ssl_text) scroll_area.setFixedHeight(50) self.expander = QExpander(SSL_CERT_DETAILS) self.expander.addWidget(scroll_area) self.ui.expander_layout.insertWidget(2, self.expander) def _set_icon(self): """Set the icon used in the dialog.""" icon = self.style().standardIcon(QStyle.SP_MessageBoxWarning) self.ui.logo_label.setText('') self.ui.logo_label.setPixmap(icon.pixmap(48, 48)) def parse_args(): """Parse sys.arg options.""" parser = argparse.ArgumentParser( description=SSL_DESCRIPTION) parser.add_argument('--domain', required=True, help=SSL_DOMAIN_HELP) parser.add_argument('--details', required=True, help=SSL_DETAILS_HELP) parser.add_argument('--appname', required=True, help=SSL_APPNAME_HELP) return parser.parse_args() def main(): """Main method used to show the creds dialog.""" app = QApplication(sys.argv) assert(app) args = parse_args() win = SSLDialog(args.appname, domain=args.domain, details=args.details) return_code = win.exec_() sys.exit(return_code) ubuntu-sso-client-13.10/ubuntu_sso/qt/email_verification_page.py0000664000202700020270000001370412151461656025407 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Email Verification page UI.""" from functools import partial from PyQt4 import QtGui, QtCore from ubuntu_sso import NO_OP from ubuntu_sso.logger import setup_gui_logging from ubuntu_sso.qt import build_general_error_message from ubuntu_sso.qt.sso_wizard_page import SSOWizardPage from ubuntu_sso.qt.ui.email_verification_ui import Ui_EmailVerificationPage from ubuntu_sso.utils import compat from ubuntu_sso.utils.ui import ( ERROR_EMAIL_TOKEN, NEXT, VERIFICATION_CODE, VERIFY_EMAIL_TITLE, VERIFY_EMAIL_CONTENT, ) logger = setup_gui_logging('ubuntu_sso.email_verification_page') class EmailVerificationPage(SSOWizardPage): """Widget used to input the email verification code.""" ui_class = Ui_EmailVerificationPage registrationSuccess = QtCore.pyqtSignal(compat.text_type) def __init__(self, *args, **kwargs): self.email = '' self.password = '' super(EmailVerificationPage, self).__init__(*args, **kwargs) @property def _signals(self): """The signals to connect to the backend.""" result = { 'EmailValidated': self._filter_by_app_name(self.on_email_validated), 'EmailValidationError': self._filter_by_app_name(self.on_email_validation_error), } return result @property def verification_code(self): """Return the content of the verification code edit.""" return str(self.ui.verification_code_edit.text()) @property def next_button(self): """Return the button that move to the next stage.""" return self.ui.next_button def _connect_ui(self): """Set the connection of signals.""" self.ui.verification_code_edit.textChanged.connect( self.validate_form) self.next_button.clicked.connect(self.validate_email) def validate_form(self): """Check the state of the form.""" code = self.verification_code.strip() enabled = len(code) > 0 self.next_button.setEnabled(enabled) def _set_translated_strings(self): """Set the different titles.""" self.header.set_title(VERIFY_EMAIL_TITLE) self.header.set_subtitle(VERIFY_EMAIL_CONTENT % { "app_name": self.app_name, "email": self.email, }) self.ui.label.setText(VERIFICATION_CODE) self.ui.next_button.setText(NEXT) def set_titles(self, email): """This class needs to have a public set_titles. Since the subtitle contains data that is only known after SetupAccount and _set_translated_strings is only called on initialization. """ self._set_translated_strings() def validate_email(self): """Call the next action.""" logger.debug('EmailVerificationController.validate_email for: %s', self.email) code = compat.text_type(self.ui.verification_code_edit.text()) args = (self.app_name, self.email, self.password, code) self.hide_error() self.show_overlay() if self.ping_url: f = self.backend.validate_email_and_ping args = args + (self.ping_url,) else: f = self.backend.validate_email logger.info('Calling validate_email with email %r, password , ' 'app_name %r and email_token %r.', self.email, self.app_name, code) error_handler = partial(self._handle_error, f, self.on_email_validation_error) f(*args, reply_handler=NO_OP, error_handler=error_handler) def on_email_validated(self, app_name, email): """Signal thrown after the email is validated.""" logger.info('EmailVerificationController.on_email_validated for %s, ' 'email: %s', app_name, email) self.hide_overlay() self.registrationSuccess.emit(self.email) def on_email_validation_error(self, app_name, error): """Signal thrown when there's a problem validating the email.""" logger.error('Got error on email validation %s, error: %s', app_name, error) self.hide_overlay() msg = error.pop(ERROR_EMAIL_TOKEN, '') msg += build_general_error_message(error) self.show_error(msg) # pylint: disable=C0103 def initializePage(self): """Called to prepare the page just before it is shown.""" logger.debug('initializePage - About to show EmailVerificationPage') self.next_button.setDefault(True) self.next_button.setEnabled(False) self.wizard().setButtonLayout([QtGui.QWizard.Stretch]) #pylint: enable=C0103 ubuntu-sso-client-13.10/ubuntu_sso/qt/forgotten_password_page.py0000664000202700020270000001274112151461656025507 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Forgotten Password page UI.""" from functools import partial from PyQt4 import QtCore from ubuntu_sso import NO_OP from ubuntu_sso.logger import setup_gui_logging, log_call from ubuntu_sso.qt.sso_wizard_page import SSOWizardEnhancedEditPage from ubuntu_sso.qt.ui.forgotten_password_ui import Ui_ForgottenPasswordPage from ubuntu_sso.utils import compat from ubuntu_sso.utils.ui import ( EMAIL_LABEL, FORGOTTEN_PASSWORD_TITLE, FORGOTTEN_PASSWORD_SUBTITLE, is_correct_email, RESET_PASSWORD, REQUEST_PASSWORD_TOKEN_WRONG_EMAIL, ) logger = setup_gui_logging('ubuntu_sso.forgotten_password_page') class ForgottenPasswordPage(SSOWizardEnhancedEditPage): """Widget used to deal with users that forgot the password.""" ui_class = Ui_ForgottenPasswordPage passwordResetTokenSent = QtCore.pyqtSignal(compat.text_type) @property def _signals(self): """The signals to connect to the backend.""" result = { 'PasswordResetTokenSent': self._filter_by_app_name(self.on_password_reset_token_sent), 'PasswordResetError': self._filter_by_app_name(self.on_password_reset_error), } return result @property def email_address(self): """Return the email address provided by the user.""" return compat.text_type(self.ui.email_line_edit.text()) #pylint: disable=C0103 def initializePage(self): """Set the initial state of ForgottenPassword page.""" logger.debug('initializePage - About to show ForgottenPasswordPage') self.ui.send_button.setDefault(True) enabled = not self.ui.email_line_edit.text().isEmpty() self.ui.send_button.setEnabled(enabled) #pylint: enable=C0103 def _register_fields(self): """Register the fields of the wizard page.""" self.registerField('email_address', self.ui.email_line_edit) def _set_translated_strings(self): """Set the translated strings in the view.""" self.setTitle(FORGOTTEN_PASSWORD_TITLE) subtitle = FORGOTTEN_PASSWORD_SUBTITLE.format(app_name=self.app_name) self.setSubTitle(subtitle) self.ui.email_address_label.setText(EMAIL_LABEL) self.ui.send_button.setText(RESET_PASSWORD) def _set_enhanced_line_edit(self): """Set the extra logic to the line edits.""" self.set_line_edit_validation_rule(self.ui.email_line_edit, is_correct_email) def _connect_ui(self): """Connect the diff signals from the Ui.""" self.ui.email_line_edit.textChanged.connect(self._validate) self.ui.send_button.clicked.connect(self.request_new_password) self._set_enhanced_line_edit() self._register_fields() def request_new_password(self): """Send the request password operation.""" self.hide_error() args = (self.app_name, self.email_address) logger.debug('Sending request new password for %s, email: %s', *args) f = self.backend.request_password_reset_token error_handler = partial(self._handle_error, f, self.on_password_reset_error) self.show_overlay() f(*args, reply_handler=NO_OP, error_handler=error_handler) def _validate(self): """Validate that we have an email.""" email = compat.text_type(self.ui.email_line_edit.text()) self.ui.send_button.setEnabled(is_correct_email(email)) def on_password_reset_token_sent(self, app_name, email): """Action taken when we managed to get the password reset done.""" logger.info('ForgottenPasswordPage.on_password_reset_token_sent for ' '%s, email: %s', app_name, email) # ignore the result and move to the reset page self.hide_overlay() self.passwordResetTokenSent.emit(email) @log_call(logger.error) def on_password_reset_error(self, app_name, error): """Action taken when there was an error requesting the reset.""" # set the error message self.hide_overlay() msg = REQUEST_PASSWORD_TOKEN_WRONG_EMAIL self.show_error(msg) ubuntu-sso-client-13.10/ubuntu_sso/qt/tests/0000755000202700020270000000000012225013301021321 5ustar dobeydobey00000000000000ubuntu-sso-client-13.10/ubuntu_sso/qt/tests/test_setup_account.py0000664000202700020270000004320412151461656025635 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2011-2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Tests for the Setup Account page Qt UI.""" from PyQt4 import QtGui, QtCore from ubuntu_sso.utils import compat from ubuntu_sso.tests import CAPTCHA_PATH from ubuntu_sso.qt import common, setup_account_page as gui from ubuntu_sso.qt.tests import PageBaseTestCase class SetupAccountTestCase(PageBaseTestCase): """Test the SetupAccountPage code.""" ui_class = gui.SetupAccountPage ui_signals = ('userRegistered', 'signIn') ui_backend_signals = ('CaptchaGenerated', 'CaptchaGenerationError', 'UserRegistered', 'UserRegistrationError') def test_password_receiver(self): """Check the initial state of SetupAccount.""" self.assertEqual(self.ui.ui.password_edit.receivers( QtCore.SIGNAL('textEdited(QString)')), 2) def test_empty_name(self): """Status when the name field is empty. * Name Assistance label visible. * Correct error message in it. """ self.ui.ui.name_edit.setText("") self.ui.name_assistance() self.assertTrue(self.ui.ui.name_assistance.isVisible()) self.assert_error_correct(self.ui.ui.name_assistance, gui.EMPTY_NAME, max_width=self.ui.header.max_title_width) def test_hide_error_on_refresh_clicked(self): """Hide form errors when the user click to refresh the captcha.""" self.ui.show_error('error') self.assert_error_correct(self.ui.form_errors_label, 'error', max_width=self.ui.header.max_title_width) self.ui.ui.refresh_label.linkActivated.emit('error') message = compat.text_type(self.ui.form_errors_label.text()) self.assertEqual(message, ' ') def test_enable_setup_button_with_visible_check(self): """Test _enable_setup_button method with terms check visible.""" self.patch(self.ui, "set_up_button", QtGui.QPushButton()) self.ui.ui.name_edit.setText('name') email = 'email@example.com' self.ui.ui.email_edit.setText(email) self.ui.ui.confirm_email_edit.setText(email) password = 'T3st3rqwe' self.ui.ui.password_edit.setText(password) self.ui.ui.confirm_password_edit.setText(password) self.ui.ui.captcha_solution_edit.setText('captcha solution') self.ui.terms_checkbox.setChecked(True) self.ui.terms_checkbox.setVisible(True) self.ui.ui.captcha_solution_edit.textEdited.emit('') self.assertTrue(self.ui.set_up_button.isEnabled()) def test_enable_setup_button_without_visible_check(self): """Test _enable_setup_button method with terms check not visible.""" self.patch(self.ui, "set_up_button", QtGui.QPushButton()) self.ui.ui.name_edit.setText('name') email = 'email@example.com' self.ui.ui.email_edit.setText(email) self.ui.ui.confirm_email_edit.setText(email) password = 'T3st3rqwe' self.ui.ui.password_edit.setText(password) self.ui.ui.confirm_password_edit.setText(password) self.ui.ui.captcha_solution_edit.setText('captcha solution') self.ui.terms_checkbox.setVisible(False) self.ui.ui.captcha_solution_edit.textEdited.emit('') self.assertTrue(self.ui.set_up_button.isEnabled()) def test_password_default_assistance(self): """Status when the password line edit receive focus and shows popup. * Password assistance contains the right message. """ self.ui.ui.password_edit.setText("") self.ui.ui.confirm_password_edit.setText("") common.password_default_assistance(self.ui.ui.password_assistance) self.ui.focus_changed(None, self.ui.ui.password_edit) self.assertIn( common.NORMAL % common.PASSWORD_LENGTH, compat.text_type(self.ui.ui.password_assistance.text()), ) self.assertIn( common.NORMAL % common.PASSWORD_UPPER, compat.text_type(self.ui.ui.password_assistance.text()), ) self.assertIn( common.NORMAL % common.PASSWORD_DIGIT, compat.text_type(self.ui.ui.password_assistance.text()), ) def test_password_focus_gain(self): """Check functions execution when focus_changed() is executed.""" self.ui.ui.password_assistance.setVisible(False) self.assertFalse(self.ui.ui.password_assistance.isVisible()) self.patch(self.ui, 'name_assistance', self._set_called) self.ui.focus_changed(None, self.ui.ui.password_edit) self.assertTrue(self.ui.ui.password_assistance.isVisible()) def test_name_focus_lost(self): """Check functions execution when focus_changed() is executed.""" self.patch(self.ui, 'name_assistance', self._set_called) self.ui.focus_changed(self.ui.ui.name_edit, None) self.assertTrue(self._called) def test_email_focus_lost(self): """Check functions execution when focus_changed() is executed.""" self.patch(self.ui, 'email_assistance', self._set_called) self.ui.focus_changed(self.ui.ui.email_edit, None) self.assertTrue(self._called) def test_confirm_email_focus_lost(self): """Check functions execution when focus_changed() is executed.""" self.patch(self.ui, 'confirm_email_assistance', self._set_called) self.ui.focus_changed(self.ui.ui.confirm_email_edit, None) self.assertTrue(self._called) def test_confirm_password_focus_lost(self): """Check functions execution when focus_changed() is executed.""" self.patch(common, 'password_check_match', self._set_called) self.ui.focus_changed(self.ui.ui.confirm_password_edit, None) self.assertTrue(self._called) def test_on_user_registered(self): """Test on_user_registered method.""" self.patch(self.ui, "validate_form", lambda: True) self.patch(self.ui, "hide_error", self._set_called) email = 'email@example' password = 'password' name = 'name' captcha_id = 1 captcha_solution = 'solution' self.ui.ui.email_edit.setText(email) self.ui.ui.password_edit.setText(password) self.ui.ui.name_edit.setText(name) self.ui.captcha_id = captcha_id self.ui.ui.captcha_solution_edit.setText(captcha_solution) self.ui.set_next_validation() self.assert_backend_called('register_user', self.app_name, email, password, name, captcha_id, captcha_solution) expected = ((), {}) self.assertEqual(expected, self._called) def test_set_next_validation(self): """Test on_user_registered method.""" email = 'email@example' self.ui.ui.email_edit.setText(email) self.assert_signal_emitted(self.ui.userRegistered, (email,), self.ui.on_user_registered, self.app_name, email) def test_captcha_image_is_requested_as_startup(self): """The captcha image is requested at startup.""" # assert generate_captcha was called self.assert_backend_called('generate_captcha', self.app_name, self.ui.captcha_file) def test_set_translated_strings(self): """Test the translated string method.""" expected = gui.REGISTER_TITLE.format(app_name=self.app_name) self.assert_title_correct(expected) self.assert_subtitle_correct(self.ui.help_text) def test_initialize_page(self): """Widgets are properly initialized.""" self.ui.initializePage() # set up account button expected = [QtGui.QWizard.Stretch, QtGui.QWizard.CustomButton3] self.assertIn(('setButtonLayout', ((expected,), {})), self.ui.wizard().called) self.assertEqual(gui.SET_UP_ACCOUNT_BUTTON, self.ui.buttonText(QtGui.QWizard.CustomButton3)) self.assertTrue(self.ui.wizard().button(QtGui.QWizard.CustomButton3) is self.ui.set_up_button) self.assertFalse(self.ui.set_up_button.isEnabled()) self.assertFalse(self.ui.captcha_received) # labels self.assertEqual(compat.text_type(self.ui.ui.name_label.text()), gui.NAME_ENTRY) self.assertEqual(compat.text_type(self.ui.ui.email_label.text()), gui.EMAIL) self.assertEqual( compat.text_type(self.ui.ui.confirm_email_label.text()), gui.RETYPE_EMAIL) self.assertEqual(compat.text_type(self.ui.ui.password_label.text()), gui.PASSWORD) self.assertEqual( compat.text_type(self.ui.ui.confirm_password_label.text()), gui.RETYPE_PASSWORD) expected = gui.LINK_STYLE.format(link_url='#', link_text=gui.SIGN_IN_LABEL) self.assertEqual( compat.text_type(self.ui.ui.sign_in_label.text()), expected) # connections self.assertEqual(self.ui.set_up_button.receivers( QtCore.SIGNAL("clicked(const bool)")), 1) # assistants self.assertFalse(self.ui.ui.name_assistance.isVisible()) self.assertFalse(self.ui.ui.email_assistance.isVisible()) self.assertFalse(self.ui.ui.confirm_email_assistance.isVisible()) self.assertFalse(self.ui.ui.password_assistance.isVisible()) self.assertTrue(self.ui.ui.refresh_label.isVisible()) def test_connect_ui(self): """Test the connect ui method.""" self.assertEqual(self.ui.ui.password_edit.receivers( QtCore.SIGNAL("textEdited(const QString&)")), 2) self.assertEqual(self.ui.ui.refresh_label.receivers( QtCore.SIGNAL("linkActivated(const QString&)")), 2) self.assertEqual(self.ui.ui.name_edit.receivers( QtCore.SIGNAL("textEdited(const QString&)")), 1) self.assertEqual(self.ui.ui.email_edit.receivers( QtCore.SIGNAL("textEdited(const QString&)")), 1) self.assertEqual(self.ui.ui.confirm_email_edit.receivers( QtCore.SIGNAL("textEdited(const QString&)")), 1) self.assertEqual(self.ui.ui.password_edit.receivers( QtCore.SIGNAL("textEdited(const QString&)")), 2) self.assertEqual(self.ui.ui.confirm_password_edit.receivers( QtCore.SIGNAL("textEdited(const QString&)")), 1) self.assertEqual(self.ui.ui.sign_in_label.receivers( QtCore.SIGNAL("linkActivated(const QString&)")), 1) def test_connect_ui_2(self): """Test more connections from connect_ui""" self.assertEqual(self.ui.ui.captcha_solution_edit.receivers( QtCore.SIGNAL("textEdited(const QString&)")), 1) self.assertEqual(self.ui.terms_checkbox.receivers( QtCore.SIGNAL("stateChanged(bool)")), 1) test_connect_ui_2.skip = "These oscilate 0/1 (LP:1046885)" def test_set_up_button_clicked(self): """Validation and overlay is shown when the setupbutton is clicked.""" self.patch(self.ui, 'set_next_validation', self._set_called) self.ui.initializePage() self.ui.captcha_received = True self.ui.set_up_button.clicked.emit(False) self.assertEqual(self._called, ((False,), {})) def test_set_error_message(self): """Check the state of the label after calling: set_error_message.""" self.ui.email_assistance() self.ui.set_error_message(self.ui.ui.email_assistance, "message") self.assertTrue(self.ui.ui.email_assistance.isVisible()) self.assert_error_correct(self.ui.ui.email_assistance, "message", max_width=self.ui.header.max_title_width) def test_blank_name(self): """Status when the name field is blank (spaces). * Name Assistance label visible. * Correct error message in it. """ self.ui.ui.name_edit.setText(" ") self.ui.name_assistance() self.assertTrue(self.ui.ui.name_assistance.isVisible()) self.assert_error_correct(self.ui.ui.name_assistance, gui.EMPTY_NAME, max_width=self.ui.header.max_title_width) def test_valid_name(self): """Status when the name field is valid. * Name Assistance label invisible. """ self.ui.ui.name_edit.setText("John Doe") self.ui.name_assistance() self.assertFalse(self.ui.ui.name_assistance.isVisible()) def test_invalid_email(self): """Status when the email field has no @. * Email Assistance label visible. * Correct error message in it. """ self.ui.ui.email_edit.setText("foobar") self.ui.email_assistance() self.assertTrue(self.ui.ui.email_assistance.isVisible()) self.assert_error_correct(self.ui.ui.email_assistance, gui.INVALID_EMAIL, max_width=self.ui.header.max_title_width) def test_valid_email(self): """Status when the email field has a @. * Email Assistance label invisible. """ self.ui.ui.email_edit.setText("foo@bar") self.ui.email_assistance() self.assertFalse(self.ui.ui.email_assistance.isVisible()) def test_matching_emails(self): """Status when the email fields match. * Email Assistance label invisible. """ self.ui.ui.email_edit.setText("foo@bar") self.ui.ui.confirm_email_edit.setText("foo@bar") self.ui.confirm_email_assistance() self.assertFalse(self.ui.ui.confirm_email_assistance.isVisible()) def test_not_matching_emails(self): """Status when the email fields don't match. * Email Assistance label visible. * Correct error message. """ self.ui.ui.email_edit.setText("foo@bar") self.ui.ui.confirm_email_edit.setText("foo@baz") self.ui.confirm_email_assistance() self.assertTrue(self.ui.ui.confirm_email_assistance.isVisible()) self.assert_error_correct(self.ui.ui.confirm_email_assistance, gui.EMAIL_MATCH, max_width=self.ui.header.max_title_width) def test_focus_changed_password_visibility(self): """Check visibility changes when focus_changed() is executed.""" self.ui.focus_changed(None, self.ui.ui.password_edit) self.assertTrue(self.ui.ui.password_assistance.isVisible()) def test_hide_event(self): """Check that hide_event works when set_up_button is none.""" self.assertEqual(self.ui.set_up_button, None) self.ui.hideEvent(QtGui.QHideEvent()) def test_show_event(self): """Check that show_event works when set_up_button is none.""" self.assertEqual(self.ui.set_up_button, None) self.ui.show() self.addCleanup(self.ui.hide) def test_on_captcha_generated(self): """Check that the captcha image is handled correctly.""" self.ui.captcha_file = CAPTCHA_PATH self.ui.on_captcha_generated(u"fake app name", "fake id") pixmap_empty = self.ui.captcha_image.size().isEmpty() self.assertEqual(pixmap_empty, False) def test_on_captcha_refreshing_visible(self): """Check the state of the overlay on captcha refreshing.""" self.ui.hide_overlay() self.assertEqual(self._overlay_show_counter, 0) self.assertTrue(self.ui.isEnabled()) self.ui.on_captcha_refreshing() self.assertFalse(self.ui.isEnabled()) self.assertEqual(self._overlay_show_counter, 1) def test_on_captcha_refreshing_not_visible(self): """Check the state of the overlay on captcha refreshing.""" self.ui.hide_overlay() self.assertEqual(self._overlay_show_counter, 0) self.assertTrue(self.ui.isEnabled()) self.ui.hide() self.ui.on_captcha_refreshing() self.assertEqual(self._overlay_show_counter, 0) self.assertTrue(self.ui.isEnabled()) def test_on_captcha_refresh_complete(self): """Check the state of the overlay on captcha refreshing complete.""" self.assertEqual(self._overlay_hide_counter, 0) self.ui.on_captcha_refresh_complete() self.assertEqual(self._overlay_hide_counter, 1) def test_hide_error_on_refresh_captcha(self): """Test that the errors are hidden on refresh captcha.""" self.ui.show_error('error-message') self.ui.ui.refresh_label.linkActivated.emit('link') self.assertEqual(self.ui.form_errors_label.text(), ' ') ubuntu-sso-client-13.10/ubuntu_sso/qt/tests/test_network_detection.py0000664000202700020270000000636112151461656026513 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # Copyright 2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """The test suite for Network Detection UI.""" from PyQt4 import QtGui from ubuntu_sso.qt import network_detection_page from ubuntu_sso.qt.tests import ( FakeSignal, PageBaseTestCase, FakeWizardButtonStyle, ) # is ok to access private method/attrs in tests # pylint: disable=W0212, E1101 class NetworkDetectionTestCase(PageBaseTestCase): """Test the CurrentUserController.""" ui_class = network_detection_page.NetworkDetectionPage ui_wizard_class = FakeWizardButtonStyle def test_initialize_page(self): """Check Network detection initialize page.""" self.ui.initializePage() self.assertEqual(self.wizard._next_id, -1) self.assertTrue(('setButtonLayout', ([ QtGui.QWizard.Stretch, QtGui.QWizard.CustomButton1, QtGui.QWizard.CancelButton], {})), self.wizard.called) def test_initialize_page_button_property(self): """Test the Try Again button properties.""" self.ui.initializePage() self.assertTrue(self.ui.btn_try_again.isDefault()) def test_try_again_with_connection(self): """Check try again method with connection.""" self.patch(network_detection_page.networkstate, 'is_machine_connected', lambda: True) fake_signal = FakeSignal() fake_signal.target = self._set_called self.patch(self.ui, 'connectionDetected', fake_signal) self.ui.try_again() self.assertEqual(self._called, ((), {})) def test_try_again_without_connection(self): """Check try again method without connection.""" self.patch(network_detection_page.networkstate, 'is_machine_connected', lambda: False) fake_signal = FakeSignal() fake_signal.target = self._set_called self.patch(self.ui, 'connectionDetected', fake_signal) self.ui.try_again() self.assertFalse(self._called) ubuntu-sso-client-13.10/ubuntu_sso/qt/tests/test_reset_password.py0000664000202700020270000001277412151461656026035 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2011-2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Test the Reset Password Page.""" # pylint: disable=F0401,E0611,E1101 from PyQt4 import QtGui, QtCore from ubuntu_sso.utils import compat from ubuntu_sso.utils.ui import ( PASSWORD1_ENTRY, PASSWORD2_ENTRY, RESET_CODE_ENTRY, ) from ubuntu_sso.qt import common from ubuntu_sso.qt.reset_password_page import ( ResetPasswordPage, RESET_SUBTITLE, RESET_TITLE, ) from ubuntu_sso.qt.tests import PageBaseTestCase # We need this Fake until a future refactor. class FakeForgottenPage(object): """Fake Forgotten Page.""" def __init__(self): self.ui = self self.email_line_edit = self self.line_text = '' # pylint: disable=C0103 def setText(self, text): """Fake setText for Line edit.""" self.line_text = text # pylint: enable=C0103 def text(self): """Fake text for line edit.""" return self.line_text class ResetPasswordTestCase(PageBaseTestCase): """Test the ResetPasswordPage code.""" ui_class = ResetPasswordPage ui_signals = ('passwordChanged',) ui_backend_siganls = ('PasswordChanged', 'PasswordChangeError') def test_password_line(self): """Check the initial state of ResetPassword.""" self.assertEqual(self.ui.ui.password_line_edit.receivers( QtCore.SIGNAL('textEdited(QString)')), 1) self.assertEqual(self.ui.ui.confirm_password_line_edit.receivers( QtCore.SIGNAL('textEdited(QString)')), 1) def test_initialize(self): """Check the Title and Subtitle.""" self.ui.initializePage() self.assert_title_correct(RESET_TITLE) self.assert_subtitle_correct(RESET_SUBTITLE) self.assertEqual(compat.text_type(self.ui.ui.password_label.text()), PASSWORD1_ENTRY) self.assertEqual( compat.text_type(self.ui.ui.confirm_password_label.text()), PASSWORD2_ENTRY) self.assertEqual(compat.text_type(self.ui.ui.reset_code.text()), RESET_CODE_ENTRY) def test_focus_changed_password_visibility(self): """Check visibility changes when focus_changed() is executed.""" self.ui.focus_changed(None, self.ui.ui.password_line_edit) self.assertTrue(self.ui.ui.password_assistance.isVisible()) def test_show_hide_event(self): """Check connections to focusChanged on show and hide event.""" self.assertEqual(QtGui.QApplication.instance().receivers( QtCore.SIGNAL("focusChanged(QWidget*, QWidget*)")), 1) self.ui.hide() self.assertEqual(QtGui.QApplication.instance().receivers( QtCore.SIGNAL("focusChanged(QWidget*, QWidget*)")), 0) # pylint: disable=W0212 def test_focus_changed_1(self): """Check functions execution when focus_changed() is executed.""" self.patch(common, 'password_default_assistance', self._set_called) self.assertFalse(self._called) self.ui.focus_changed(None, self.ui.ui.password_line_edit) self.assertTrue(self.ui.ui.password_assistance.isVisible()) self.assertTrue(self._called) def test_focus_changed_2(self): """Check functions execution when focus_changed() is executed.""" self.patch(common, 'password_check_match', self._set_called) self.assertFalse(self._called) self.ui.focus_changed(None, self.ui.ui.confirm_password_line_edit) self.assertTrue(self.ui.ui.password_assistance.isVisible()) self.assertTrue(self._called) # pylint: enable=W0212 def test_set_new_password(self): """Test set_new_password method.""" self.patch(self.ui, "hide_error", self._set_called) email = 'email@example.com' code = 'code' password = 'password' forgotten = FakeForgottenPage() forgotten.setText(email) self.patch(self.wizard, "forgotten", forgotten) self.ui.ui.reset_code_line_edit.setText(code) self.ui.ui.password_line_edit.setText(password) self.ui.set_new_password() self.assert_backend_called('set_new_password', self.app_name, email, code, password) expected = ((), {}) self.assertEqual(expected, self._called) ubuntu-sso-client-13.10/ubuntu_sso/qt/tests/show_gui.py0000664000202700020270000000541412151461656023547 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2011-2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Script that shows the qt gui.""" from __future__ import unicode_literals import sys # pylint: disable=E1101,F0401,E0611 if sys.platform != 'win32': from twisted.internet import gireactor gireactor.install() from dbus.mainloop.glib import DBusGMainLoop DBusGMainLoop(set_as_default=True) from twisted.internet import defer, reactor from ubuntu_sso.main import get_sso_client from ubuntu_sso.credentials import ( HELP_TEXT_KEY, PING_URL_KEY, POLICY_URL_KEY, TC_URL_KEY, ) @defer.inlineCallbacks def main(): """Perform a client request to be logged in.""" d = defer.Deferred() client = yield get_sso_client() def found(*args): """The result was received.""" d.callback(args) client.cred_manager.connect_to_signal('CredentialsFound', found) client.cred_manager.connect_to_signal('CredentialsNotFound', found) client.cred_manager.connect_to_signal('AuthorizationDenied', found) client.cred_manager.connect_to_signal('CredentialsError', found) yield client.cred_manager.login('Ubuntu Two', { HELP_TEXT_KEY: 'This is a test help text.', PING_URL_KEY: 'http://www.wikipedia.com/', POLICY_URL_KEY: 'http://one.ubuntu.com/', TC_URL_KEY: 'http://www.google.com/', }) yield d yield client.disconnect() reactor.stop() if __name__ == '__main__': main() reactor.run() ubuntu-sso-client-13.10/ubuntu_sso/qt/tests/test_email_verification.py0000664000202700020270000001434512151461656026616 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Tests for the Setup Account page Qt UI.""" from PyQt4 import QtGui, QtCore from ubuntu_sso.qt import email_verification_page from ubuntu_sso.qt.tests import ( PageBaseTestCase, FakePageUiStyle, ) # is ok to access private method/attrs in tests # pylint: disable=W0212 class EmailVerificationTestCase(PageBaseTestCase): """Test the SetupAccountPage code.""" ui_class = email_verification_page.EmailVerificationPage ui_signals = ('registrationSuccess',) ui_backend_signals = ('EmailValidated', 'EmailValidationError') def test_verification_code(self): """Test the verification value returned.""" self.ui.ui.verification_code_edit.setText('asd123') value = self.ui.verification_code self.assertEqual(value, 'asd123') self.assertTrue(isinstance(value, str)) def test_next_button(self): """Test the next button.""" value = self.ui.next_button self.assertEqual(value, self.ui.ui.next_button) self.assertTrue(isinstance(value, QtGui.QPushButton)) def test_connect_ui(self): """Test the connect ui method.""" self.ui._connect_ui() # We expect 2 values because _connect_ui is called in the init too. self.assertEqual(self.ui.ui.verification_code_edit.receivers( QtCore.SIGNAL("textChanged(const QString&)")), 2) self.assertEqual(self.ui.next_button.receivers( QtCore.SIGNAL("clicked()")), 2) def test_validate_form_not_valid(self): """Test validate method.""" button = FakePageUiStyle() self.patch(self.ui.ui, "next_button", button) self.ui.ui.verification_code_edit.setText(' ') self.ui.validate_form() self.assertFalse(button.isEnabled()) def test_validate_form_valid(self): """Test validate method.""" button = FakePageUiStyle() self.patch(self.ui.ui, "next_button", button) self.ui.ui.verification_code_edit.setText('asd123') self.ui.validate_form() self.assertTrue(button.isEnabled()) def test_set_titles(self): """Test the set_titles method.""" email = 'mail@example' self.ui.email = email self.ui.set_titles(email) self.assert_title_correct(email_verification_page.VERIFY_EMAIL_TITLE) expected = email_verification_page.VERIFY_EMAIL_CONTENT % \ {"app_name": self.app_name, "email": email, } self.assert_subtitle_correct(expected) def test_initialize_page(self): """Test the initialization method.""" button = FakePageUiStyle() self.patch(self.ui.ui, "next_button", button) self.ui.initializePage() self.assertTrue(button.properties['default']) self.assertFalse(button.isEnabled()) expected = [('setButtonLayout', (([QtGui.QWizard.Stretch],), {}))] self.assertEqual(self.wizard.called, expected) def test_on_email_validation_error(self): """Test the validate_email method.""" self.patch(self.ui, "show_error", self._set_called) error = {email_verification_page: 'error in email_verification_page'} self.ui.on_email_validation_error(self.app_name, error) expected = ((self.ui, ''), {}) self.assertTrue(expected, self._called) self.assertEqual(self._overlay_hide_counter, 1) def test_on_email_validated(self): """Test the on_email_validated method.""" email = 'email@example' self.ui.email = email self.assert_signal_emitted(self.ui.registrationSuccess, (email,), self.ui.on_email_validated, self.app_name, email) def test_validate_email_with_ping(self): """Test the login method.""" self.patch(self.ui, "hide_error", self._set_called) email = 'email@example.com' password = 'password' code = 'code' self.ui.email = email self.ui.password = password self.ui.ui.verification_code_edit.setText(code) self.ui.validate_email() self.assert_backend_called('validate_email_and_ping', self.app_name, email, password, code, self.ui.ping_url) expected = ((), {}) self.assertEqual(expected, self._called) self.assertEqual(self._overlay_show_counter, 1) def test_validate_email_without_ping(self): """Test the login method.""" self.patch(self.ui, "hide_error", self._set_called) self.ui.ping_url = '' email = 'email@example.com' password = 'password' code = 'code' self.ui.email = email self.ui.password = password self.ui.ui.verification_code_edit.setText(code) self.ui.validate_email() self.assert_backend_called('validate_email', self.app_name, email, password, code) expected = ((), {}) self.assertEqual(expected, self._called) self.assertEqual(self._overlay_show_counter, 1) ubuntu-sso-client-13.10/ubuntu_sso/qt/tests/test_success_page.py0000664000202700020270000000313712151461656025426 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Test the success page.""" from ubuntu_sso.qt.success_page import SuccessPage from ubuntu_sso.qt.tests import BaseTestCase class SuccessPageTestCase(BaseTestCase): """Test that the correct widgets are used.""" ui_class = SuccessPage ubuntu-sso-client-13.10/ubuntu_sso/qt/tests/__init__.py0000664000202700020270000004503312151461656023463 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2011-2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Test the Ui code.""" from PyQt4 import QtGui, QtCore from twisted.internet import defer from twisted.trial.unittest import TestCase from ubuntu_sso import main, NO_OP from ubuntu_sso.qt import ERROR_STYLE, maybe_elide_text, TITLE_STYLE from ubuntu_sso.tests import ( APP_NAME, HELP_TEXT, PING_URL, POLICY_URL, TC_URL, WINDOW_ID, ) from ubuntu_sso.utils import compat KWARGS = dict(app_name=APP_NAME, help_text=HELP_TEXT, ping_url=PING_URL, policy_url=POLICY_URL, tc_url=TC_URL, window_id=WINDOW_ID) # is ok to access private method/attrs in tests # pylint: disable=W0212 def build_string_for_pixels(label, width): """Return a random string that will be as big as 'width' in pixels.""" char = 'm' fm = QtGui.QFontMetrics(label.font()) pixel_width = fm.width(char) chars = int(width / pixel_width) result = char * chars assert pixel_width * chars <= width return result class FakedObject(object): """Fake an object, record every call.""" next_result = None exposed_methods = [] def __init__(self, *args, **kwargs): self._args = args self._kwargs = kwargs self._called = {} for i in self.exposed_methods: setattr(self, i, self._record_call(i)) def _record_call(self, func_name): """Store values when calling 'func_name'.""" def inner(*args, **kwargs): """Fake 'func_name'.""" self._called[func_name] = (args, kwargs) return self.next_result return inner class FakedSSOLoginBackend(FakedObject): """A faked sso_login backend.""" exposed_methods = [ 'connect_to_signal', 'generate_captcha', 'login', 'login_and_ping', 'register_user', 'request_password_reset_token', 'set_new_password', 'validate_email', 'validate_email_and_ping', ] class FakedBackend(object): """A faked backend.""" sso_login = FakedSSOLoginBackend() class FakePageUiStyle(object): """Fake the page.""" def __init__(self): self.ui = self self.properties = {} super(FakePageUiStyle, self).__init__() def wizard(self): """Use itself as a fake wizard, too.""" return self def text(self): """Return text.""" return self.properties.get('text', '') # setText, setEnabled are inherited # pylint: disable=C0103 def setText(self, text): """Save text.""" self.properties['text'] = text def setEnabled(self, value): """Fake setEnabled.""" self.properties['enabled'] = value def enabled(self): """Fake enabled.""" return self.properties.get('enabled', False) def isEnabled(self): """Fake isEnabled.""" return self.properties.get('enabled', False) def setProperty(self, key, val): """Fake setProperty to restyle some widget.""" self.properties[key] = val def property(self, key): """Fake property from widget style.""" return self.properties.get(key, False) def setDefault(self, val): """Fake button setDefault.""" self.properties['default'] = val def style(self): """Fake style.""" return self def unpolish(self, *args): """Fake unpolish.""" self.properties['unpolish'] = len(args) > 0 def polish(self, *args): """Fake polish.""" self.properties['polish'] = len(args) > 0 def setVisible(self, val): """Fake setVisible from Qt.""" self.properties['visible'] = val def isVisible(self): """Fake isVisible from Qt.""" return self.properties['visible'] class FakeOverlay(object): """A fake delay overlay.""" def __init__(self, *args, **kwargs): """Initialize.""" self.show_counter = 0 self.hide_counter = 0 self.args = (args, kwargs) def show(self): """Fake show.""" self.show_counter += 1 def hide(self): """Fake hide.""" self.hide_counter += 1 def resize(self, *args): """Fake resize.""" class FakeSignal(object): """A fake PyQt signal.""" def __init__(self, *args, **kwargs): """Initialize.""" self.target = None def connect(self, target): """Fake connect.""" self.target = target def disconnect(self, *args): """Fake disconnect.""" self.target = None def emit(self, *args): """Fake emit.""" if self.target: self.target(*args) class FakeOverlaySignal(FakeSignal): """Fake Signal for show and hide overlay.""" def __init__(self, target): super(FakeOverlaySignal, self).__init__() self.target = target def connect(self, target): """We ignore the target and just call the function from the init.""" class FakeWizardPage(object): """A fake wizard page.""" def __init__(self, *args, **kwargs): self.has_back_button = True # pylint: disable=C0103 def initializePage(self): """Fake initializePage.""" class FakeMainWindow(object): """A fake MainWindow.""" currentIdChanged = FakeSignal() loginSuccess = FakeSignal() registrationIncomplete = FakeSignal() registrationSuccess = FakeSignal() userCancellation = FakeSignal() shown = False SYNC_NOW_OR_LATER_PAGE = 4 CONGRATULATIONS_PAGE = 5 folders_page_id = 6 local_folders_page_id = 7 def __init__(self, close_callback=None): self.button_texts = [] self.button_layout = None self.options = [] self.overlay = FakeOverlay() self.local_folders_page = FakeWizardPage() self.folders_page = FakeWizardPage() self.app_name = APP_NAME def show(self): """Fake method.""" self.shown = True # pylint: disable=C0103 def setButtonText(self, button, text): """Fake setButtonText.""" self.button_texts.append((button, text)) def setButtonLayout(self, layout): """Fake setButtonText.""" self.button_layout = layout def button(self, button): """Fake button method to obtain the wizard buttons.""" return QtGui.QPushButton() def setOption(self, *args): """Fake setOption.""" self.options.append(args) def next(self): """Fake next.""" def reject(self): """Fake reject.""" class FakeController(object): """A fake controller for the tests.""" is_fake = True set_next_validation = lambda *a, **kw: None def __init__(self, *args, **kwargs): self.args = (args, kwargs) # pylint: disable=C0103 def setupUi(self, view): """Fake the setup.""" # pylint: enable=C0103 class FakeWizard(object): """Replace wizard() function on wizard pages.""" customButtonClicked = QtCore.QObject() sign_in_page_id = 1 setup_account_id = 2 current_user_id = 3 email_verification_id = 4 success_id = 5 error_id = 6 forgotten_id = 7 reset_password_id = 8 def __init__(self): self.overlay = FakeOverlay() self.called = [] self.buttons = {} self.buttons_text = {} self._next_id = -1 self.sign_in_page = object() self.setup_account = object() self.current_user = object() self.email_verification = object() self.success = object() self.error = object() self.forgotten = object() self.reset_password = object() self._pages = { self.sign_in_page: self.sign_in_page_id, self.setup_account: self.setup_account_id, self.current_user: self.current_user_id, self.email_verification: self.email_verification_id, self.success: self.success_id, self.error: self.error_id, self.forgotten: self.forgotten_id, self.reset_password: self.reset_password_id, } # Invalid name "setButtonLayout", "setOption" # pylint: disable=C0103 def setButtonText(self, key, value): """Fake setButtonText.""" self.buttons_text[key] = value def setButtonLayout(self, *args, **kwargs): """Fake the functionality of setButtonLayout on QWizard class.""" self.called.append(('setButtonLayout', (args, kwargs))) def setOption(self, *args, **kwargs): """Fake the functionality of setOption on QWizard class.""" self.called.append(('setOption', (args, kwargs))) # pylint: enable=C0103 def button(self, button_id): """Fake the functionality of button on QWizard class.""" return self.buttons.setdefault(button_id, QtGui.QPushButton()) def next(self): """Fake next.""" self.called.append('next') def page(self, p_id): """Fake page method.""" return self def set_titles(self, title): """Fake set_titles.""" self.called.append(('set_titles', title)) class FakeWizardButtonStyle(FakeWizard): """Fake Wizard with button style implementation.""" SIGN_IN_PAGE_ID = 1 # pylint: disable=C0103 def __init__(self): super(FakeWizardButtonStyle, self).__init__() self.data = {} self.customButtonClicked = self def setDefault(self, value): """Fake setDefault for button.""" self.data['default'] = value def isDefault(self): """Fake isDefault.""" return self.data['default'] # pylint: enable=C0103 def connect(self, func): """Fake customButtonClicked connect.""" self.data['connect'] = func def disconnect(self, func): """Fake customButtonClicked disconnect.""" self.data['disconnect'] = func def button(self, button_id): """Fake the functionality of button on QWizard class.""" return self def style(self): """Fake button style.""" return self def next(self): """Fake next for wizard.""" self.data['next'] = True class BaseTestCase(TestCase): """The base test case.""" kwargs = None ui_class = None ui_signals = () ui_backend_signals = () ui_wizard_class = FakeWizard @defer.inlineCallbacks def setUp(self): yield super(BaseTestCase, self).setUp() self._called = False backend = FakedBackend() self.sso_login_backend = backend.sso_login self.patch(main, 'get_sso_client', lambda *a: defer.succeed(backend)) self.app_name = APP_NAME self.ping_url = PING_URL self.signal_results = [] # self.ui_class is not callable # pylint: disable=E1102, C0103, W0212 self.ui = None self.wizard = None if self.ui_class is not None: kwargs = dict(KWARGS) if self.kwargs is None else self.kwargs self.ui = self.ui_class(**kwargs) for signal in self.ui_signals: self.patch(self.ui_class, signal, FakeSignal()) if self.ui_wizard_class is not None: self.wizard = self.ui_wizard_class() self.patch(self.ui, 'wizard', lambda: self.wizard) self.ui.show() self.addCleanup(self.ui.hide) def _set_called(self, *args, **kwargs): """Store 'args' and 'kwargs' for test assertions.""" self._called = (args, kwargs) def assert_backend_called(self, method, *args, **kwargs): """Check that 'method(*args, **kwargs)' was called in the backend.""" self.assertIn(method, self.ui.backend._called) call = self.ui.backend._called[method] self.assertEqual(call[0], args) reply_handler = call[1].pop('reply_handler') self.assertEqual(reply_handler, NO_OP) error_handler = call[1].pop('error_handler') self.assertEqual(error_handler.func, self.ui._handle_error) self.assertEqual(call[1], kwargs) def assert_signal_emitted(self, signal, signal_args, trigger, *args, **kwargs): """Check that 'trigger(*signal_args)' emits 'signal(*signal_args)'.""" signal.connect(lambda *a: self.signal_results.append(a)) trigger(*args, **kwargs) self.assertEqual(self.signal_results, [signal_args]) def assert_title_correct(self, title_label, expected, max_width): """Check that the label's text is equal to 'expected'.""" label = QtGui.QLabel() maybe_elide_text(label, expected, max_width) self.assertEqual(TITLE_STYLE % compat.text_type(label.text()), compat.text_type(title_label.text())) self.assertEqual(compat.text_type(label.toolTip()), compat.text_type(title_label.toolTip())) self.assertTrue(title_label.isVisible()) def assert_subtitle_correct(self, subtitle_label, expected, max_width): """Check that the subtitle is equal to 'expected'.""" label = QtGui.QLabel() maybe_elide_text(label, expected, max_width) self.assertEqual(compat.text_type(label.text()), compat.text_type(subtitle_label.text())) self.assertEqual(compat.text_type(label.toolTip()), compat.text_type(subtitle_label.toolTip())) self.assertTrue(subtitle_label.isVisible()) def assert_error_correct(self, error_label, expected, max_width): """Check that the error 'error_label' displays 'expected' as text.""" label = QtGui.QLabel() maybe_elide_text(label, expected, max_width) self.assertEqual(ERROR_STYLE % compat.text_type(label.text()), compat.text_type(error_label.text())) self.assertEqual(compat.text_type(label.toolTip()), compat.text_type(error_label.toolTip())) self.assertTrue(error_label.isVisible()) def get_pixmap_data(self, pixmap): """Get the raw data of a QPixmap.""" byte_array = QtCore.QByteArray() array_buffer = QtCore.QBuffer(byte_array) pixmap.save(array_buffer, "PNG") return byte_array # Invalid name "assertEqualPixmap" # pylint: disable=C0103 def assertEqualPixmaps(self, pixmap1, pixmap2): """Compare two Qt pixmaps.""" d1 = self.get_pixmap_data(pixmap1) d2 = self.get_pixmap_data(pixmap2) self.assertEqual(d1, d2) # pylint: enable=C0103 @defer.inlineCallbacks def test_setup_page(self): """Test the backend signal connection.""" if self.ui is None or getattr(self.ui, 'setup_page', None) is None: return called = [] self.patch(self.ui, '_setup_signals', lambda *a: called.append('_setup_signals')) self.patch(self.ui, '_connect_ui', lambda *a: called.append('_connect_ui')) self.patch(self.ui, '_set_translated_strings', lambda *a: called.append('_set_translated_strings')) yield self.ui.setup_page() self.assertEqual(self.ui.backend, self.sso_login_backend) for signal in self.ui_backend_signals: self.assertIn(signal, self.ui._signals) self.assertTrue(callable(self.ui._signals[signal])) expected = ['_set_translated_strings', '_connect_ui', '_setup_signals'] self.assertEqual(expected, called) class PageBaseTestCase(BaseTestCase): """BaseTestCase with some specialization for the Wizard Pages.""" @defer.inlineCallbacks def setUp(self): yield super(PageBaseTestCase, self).setUp() self._overlay_show_counter = 0 self._overlay_hide_counter = 0 if self.ui is not None: fake_show_overlay_signal = FakeOverlaySignal( self._show_overlay_slot) fake_hide_overlay_signal = FakeOverlaySignal( self._hide_overlay_slot) self.patch(self.ui, "processingStarted", fake_show_overlay_signal) self.patch(self.ui, "processingFinished", fake_hide_overlay_signal) def _show_overlay_slot(self): """Fake show overlay slot.""" self._overlay_show_counter += 1 def _hide_overlay_slot(self): """Fake hide overlay slot.""" self._overlay_hide_counter += 1 def assert_signal_emitted(self, signal, signal_args, trigger, *args, **kwargs): """Check that 'trigger(*args, **kwargs)' emits 'signal(*signal_args)'. Also check that the _overlay_hide_counter was increased by one, and that the ui is enabled. """ super(PageBaseTestCase, self).assert_signal_emitted(signal, signal_args, trigger, *args, **kwargs) self.assertEqual(self._overlay_hide_counter, 1) self.assertTrue(self.ui.isEnabled()) # pylint: disable=W0221 def assert_title_correct(self, expected): """Check that the title is equal to 'expected'.""" check = super(PageBaseTestCase, self).assert_title_correct check(self.ui.header.title_label, expected, self.ui.header.max_title_width) def assert_subtitle_correct(self, expected): """Check that the subtitle is equal to 'expected'.""" check = super(PageBaseTestCase, self).assert_subtitle_correct check(self.ui.header.subtitle_label, expected, self.ui.header.max_subtitle_width) # pylint: enable=W0221 ubuntu-sso-client-13.10/ubuntu_sso/qt/tests/test_enchanced_line_edit.py0000664000202700020270000001074512151461656026711 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # Author: Diego Sarmentero # # Copyright 2011-2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Test the EnhancedLineEdit.""" import collections from PyQt4 import QtGui, QtCore from twisted.trial.unittest import TestCase from ubuntu_sso.qt.sso_wizard_page import EnhancedLineEdit class EnhancedLineEditTestCase(TestCase): """Tests EnhancedLineEdit for valid and invalid states.""" def get_pixmap_data(self, pixmap): """Get the raw data of a QPixmap.""" byte_array = QtCore.QByteArray() array_buffer = QtCore.QBuffer(byte_array) pixmap.save(array_buffer, "PNG") return byte_array # pylint: disable=C0103 def assertEqualPixmaps(self, pixmap1, pixmap2): """Compare two Qt pixmaps.""" d1 = self.get_pixmap_data(pixmap1) d2 = self.get_pixmap_data(pixmap2) self.assertEqual(d1, d2) # pylint: enable=C0103 def test_enhanced_line_edit_init(self): """Tests the initial state of the enchanced line edit.""" line_edit = QtGui.QLineEdit() line_edit.show() enhanced = EnhancedLineEdit(line_edit) self.assertIsInstance(enhanced.valid_cb, collections.Callable) self.assertTrue(enhanced.clear_label.property("lineEditWarning")) self.assertFalse(enhanced.clear_label.isVisible()) self.assertEqual(enhanced.clear_label.cursor().shape(), QtCore.Qt.ArrowCursor) self.assertFalse(enhanced.clear_label.isVisible()) self.assertEqual(enhanced.clear_label.pixmap(), None) def test_enhanced_line_edit_init_with_icon(self): """Tests the initial state of the enchanced line edit.""" line_edit = QtGui.QLineEdit() line_edit.show() enhanced = EnhancedLineEdit(line_edit, warning_sign=True) self.assertIsInstance(enhanced.valid_cb, collections.Callable) edit_property = enhanced.clear_label.property("lineEditWarning") self.assertTrue(edit_property) self.assertFalse(enhanced.clear_label.isVisible()) self.assertEqual(enhanced.clear_label.cursor().shape(), QtCore.Qt.ArrowCursor) self.assertFalse(enhanced.clear_label.isVisible()) icon = QtGui.QApplication.style().standardIcon( QtGui.QStyle.SP_MessageBoxWarning) self.assertEqualPixmaps(enhanced.clear_label.pixmap(), icon.pixmap(16, 16)) def test_enhanced_line_edit_function_show_true(self): """Tests the EnchancedLineEdit show method with validation = True.""" line_edit = QtGui.QLineEdit() line_edit.show() func = lambda x: False enhanced = EnhancedLineEdit(line_edit, valid_cb=func, warning_sign=True) line_edit.setText("testing") self.assertTrue(enhanced.clear_label.isVisible()) def test_enhanced_line_edit_function_show_false(self): """Tests the EnchancedLineEdit show method with validation = False.""" line_edit = QtGui.QLineEdit() line_edit.show() func = lambda x: True enhanced = EnhancedLineEdit(line_edit, valid_cb=func) line_edit.setText("testing") self.assertFalse(enhanced.clear_label.isVisible()) ubuntu-sso-client-13.10/ubuntu_sso/qt/tests/test_sso_wizard_page.py0000664000202700020270000001361312151461656026142 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2011-2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Test the SSOWizardPage and related.""" from ubuntu_sso.qt import PREFERED_UI_SIZE, sso_wizard_page as gui from ubuntu_sso.qt.tests import ( APP_NAME, BaseTestCase, build_string_for_pixels, PageBaseTestCase, ) MAX_WIDTH = 100 class WizardHeaderTestCase(BaseTestCase): """Tests for injected Header in each Wizard Page.""" kwargs = dict(max_width=MAX_WIDTH) ui_class = gui.WizardHeader ui_wizard_class = None def test_label_state(self): """Check the title and subtitle properties.""" self.assertTrue(self.ui.title_label.wordWrap()) self.assertTrue(self.ui.subtitle_label.wordWrap()) self.assertFalse(self.ui.title_label.isVisible()) self.assertFalse(self.ui.subtitle_label.isVisible()) def test_set_title(self): """Check if set_title works ok, showing the widget if necessary.""" max_width = self.ui.max_title_width text = build_string_for_pixels(self.ui.title_label, max_width) self.ui.set_title(text) self.assert_title_correct(self.ui.title_label, text, max_width) def test_set_elided_title(self): """Check if set_title adds the ellipsis when necessary.""" # add an extra letter so we ensure this needs to be trimmed max_width = self.ui.max_title_width text = build_string_for_pixels(self.ui.title_label, max_width + 10) self.ui.set_title(text) self.assert_title_correct(self.ui.title_label, text, max_width) def test_set_empty_title(self): """Check if the widget is hidden for empty title.""" self.ui.set_title('') self.assertEqual(self.ui.title_label.toolTip(), '') self.assertFalse(self.ui.title_label.isVisible()) def test_set_subtitle(self): """Check if set_subtitle works ok, showing the widget if necessary.""" max_width = self.ui.max_subtitle_width text = build_string_for_pixels(self.ui.subtitle_label, max_width) self.ui.set_subtitle(text) self.assert_subtitle_correct(self.ui.subtitle_label, text, max_width) def test_set_elided_subtitle(self): """Check if set_subtitle adds the ellipsis when necessary.""" max_width = self.ui.max_subtitle_width text = build_string_for_pixels(self.ui.subtitle_label, max_width + 10) self.ui.set_subtitle(text) self.assert_subtitle_correct(self.ui.subtitle_label, text, max_width) def test_set_empty_subtitle(self): """Check if the widget is hidden for empty subtitle.""" self.ui.set_subtitle('') self.assertEqual(self.ui.subtitle_label.toolTip(), '') self.assertFalse(self.ui.subtitle_label.isVisible()) class BaseWizardPageTestCase(PageBaseTestCase): """Tests for SSOWizardPage.""" kwargs = {} ui_class = gui.BaseWizardPage def test_max_width(self): """The max_width is correct.""" self.assertEqual(self.ui.max_width, 0) class SSOWizardPageTestCase(BaseWizardPageTestCase): """Tests for SSOWizardPage.""" kwargs = dict(app_name=APP_NAME) ui_class = gui.SSOWizardPage def test_max_width(self): """The max_width is correct.""" self.assertEqual(self.ui.max_width, PREFERED_UI_SIZE['width']) def test_show_error(self): """Test show_error with a normal length string.""" message = 'error-message' self.ui.show_error(message) self.assert_error_correct(self.ui.form_errors_label, message, self.ui.header.max_title_width) def test_show_error_long_text(self): """Test show_error with a long length string.""" message = build_string_for_pixels(self.ui.form_errors_label, self.ui.header.max_title_width + 10) self.ui.show_error(message) self.assert_error_correct(self.ui.form_errors_label, message, self.ui.header.max_title_width) def test_hide_error(self): """Test show_error with a long length string.""" self.ui.hide_error() self.assertEqual(self.ui.form_errors_label.text(), ' ') def test_setup_page_with_failing_backend(self): """Test how the ui react with an invalid backend.""" self.patch(gui.main, "get_sso_client", lambda: None) self.patch(self.ui, "show_error", self._set_called) self.ui.setup_page() reason = 'There was a problem trying to setup the page %r' % self.ui expected = ((reason,), {}) self.assertEqual(expected, self._called) self.assertFalse(self.ui.isEnabled()) ubuntu-sso-client-13.10/ubuntu_sso/qt/tests/test_forgotten_password.py0000664000202700020270000001257412151461656026720 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Tests for the Setup Account page Qt UI.""" from PyQt4 import QtCore from ubuntu_sso.utils import compat from ubuntu_sso.qt import forgotten_password_page as gui from ubuntu_sso.qt.tests import ( PageBaseTestCase, FakePageUiStyle, ) # is ok to access private method/attrs in tests # pylint: disable=W0212, E1101 class ForgottenPasswordTestCase(PageBaseTestCase): """Test the SetupAccountPage code.""" ui_class = gui.ForgottenPasswordPage ui_siganls = ('passwordResetTokenSent',) ui_backend_siganls = ('PasswordResetTokenSent', 'PasswordResetError') def test_request_new_password(self): """Test the request_new_password function.""" email = 'email@example.com' self.ui.ui.email_line_edit.setText(email) self.ui.request_new_password() self.assertEqual(self._overlay_show_counter, 1) self.assertFalse(self.ui.isEnabled()) self.assert_backend_called('request_password_reset_token', self.app_name, email) def test_email_address(self): """Test the email_address property.""" value = self.ui.email_address self.assertEqual(value, compat.text_type(self.ui.ui.email_line_edit.text())) self.assertTrue(isinstance(value, compat.text_type)) def test_send_button_clicked(self): """Test the send_button property.""" self.patch(self.ui, "hide_error", self._set_called) self.ui.ui.send_button.clicked.emit(True) self.assert_backend_called('request_password_reset_token', self.app_name, '') expected = ((), {}) self.assertEqual(expected, self._called) def test_initialize_page_with_email(self): """Test the initialization method.""" self.ui.ui.email_line_edit.setText('mail@example') button = FakePageUiStyle() self.patch(self.ui.ui, "send_button", button) self.ui.initializePage() self.assertTrue(button.properties['default']) self.assertTrue(button.isEnabled()) def test_set_translated_strings(self): """Test the translated string method.""" self.assert_title_correct(gui.FORGOTTEN_PASSWORD_TITLE) subtitle = gui.FORGOTTEN_PASSWORD_SUBTITLE self.assert_subtitle_correct(subtitle.format(app_name=self.app_name)) self.assertEqual( compat.text_type(self.ui.ui.email_address_label.text()), gui.EMAIL_LABEL) self.assertEqual(compat.text_type(self.ui.ui.send_button.text()), gui.RESET_PASSWORD) def test_connect_ui(self): """Test the connect ui method.""" self.assertEqual(self.ui.ui.email_line_edit.receivers( QtCore.SIGNAL("textChanged(const QString&)")), 2) self.assertEqual(self.ui.ui.send_button.receivers( QtCore.SIGNAL("clicked()")), 1) def test_validate_not_valid(self): """Test validate method.""" self.ui.ui.email_line_edit.setText('') button = FakePageUiStyle() self.patch(self.ui.ui, "send_button", button) self.ui._validate() self.assertFalse(button.isEnabled()) def test_validate_valid(self): """Test validate method.""" self.ui.ui.email_line_edit.setText('mail@example') button = FakePageUiStyle() self.patch(self.ui.ui, "send_button", button) self.ui._validate() self.assertTrue(button.isEnabled()) def test_on_password_reset_token_sent(self): """Test on_password_reset_token_sent method.""" email = 'foo@ubuntu.com' self.assert_signal_emitted(self.ui.passwordResetTokenSent, (email,), self.ui.on_password_reset_token_sent, self.app_name, email) def test_on_password_reset_error(self): """Test on_password_reset_error method.""" self.patch(self.ui, "show_error", self._set_called) error = {'errtype': 'FooBarBaz'} self.ui.on_password_reset_error(self.app_name, error) expected = ((self.ui, gui.REQUEST_PASSWORD_TOKEN_WRONG_EMAIL), {}) self.assertTrue(expected, self._called) ubuntu-sso-client-13.10/ubuntu_sso/qt/tests/test_enhanced_check_box.py0000664000202700020270000000604012151461656026530 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2011-2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Tests for the EnhancedCheckBox widget.""" from PyQt4 import QtGui, QtCore from ubuntu_sso.qt import enhanced_check_box from ubuntu_sso.qt.tests import BaseTestCase class EnhancedCheckBoxTestCase(BaseTestCase): """Test the EnhancedCheckBox code.""" def test_init(self): """Check the initial state of EnhancedCheckBox.""" check = enhanced_check_box.EnhancedCheckBox("text") self.assertEqual(check.text(), "text") self.assertTrue(check.text_label.openExternalLinks()) self.assertEqual(check.receivers( QtCore.SIGNAL('stateChanged(int)')), 1) def test_set_text(self): """Check if override setText and text methods works properly.""" check = enhanced_check_box.EnhancedCheckBox() self.assertEqual(check.text_label.text(), "") check.setText("text") self.assertEqual(check.text(), "text") self.assertEqual(check.text(), check.text_label.text()) def test_enhanced_check_size_adjust_with_small_height(self): """Check if the size of the EnhancedCheckBox is adjusted correctly.""" text = 't' * 200 height = 10 widget = QtGui.QWidget() widget.setFixedSize(200, height) check = enhanced_check_box.EnhancedCheckBox(text, widget) self.assertTrue(check.height() > height) def test_enhanced_check_size_adjust_with_big_height(self): """Check if the size of the EnhancedCheckBox is adjusted correctly.""" text = 't' * 20 height = 200 widget = QtGui.QWidget() widget.setFixedSize(200, height) check = enhanced_check_box.EnhancedCheckBox(text, widget) self.assertTrue(check.height() < height) ubuntu-sso-client-13.10/ubuntu_sso/qt/tests/test_proxy_dialog.py0000664000202700020270000003721612151461656025467 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Test the proxy UI.""" import qt4reactor from PyQt4.QtCore import QObject, pyqtSignal from twisted.internet import defer, reactor from twisted.trial.unittest import TestCase from ubuntu_sso.qt import proxy_dialog # pylint: disable=E1101,W0212, class FakeSignal(object): """A fake qt signal.""" def __init__(self): """Create a new instance.""" self.called = [] def connect(self, cb): """Connect signals.""" self.called.append(('connect', cb)) class FakeWidget(object): """A fake widget that contains text.""" def __init__(self, object_name, called, text=''): """Create a new instance.""" self.object_name = object_name self.called = called self.internal_text = text self.clicked = FakeSignal() # pylint: disable=C0103 def setText(self, text): """Set the text of the widget.""" self.internal_text = text if not self.object_name in self.called: self.called[self.object_name] = [('setText', text)] else: self.called[self.object_name].append(('setText', text)) def text(self): """Return the text.""" if not self.object_name in self.called: self.called[self.object_name] = [('text',)] else: self.called[self.object_name].append(('text',)) return self.internal_text def setPixmap(self, pixmap): """Set a pixmap.""" if not self.object_name in self.called: self.called[self.object_name] = [('setPixmap', pixmap)] else: self.called[self.object_name].append(('setPixmap', pixmap)) def setVisible(self, visible): """Set the ui element visible.""" if not self.object_name in self.called: self.called[self.object_name] = [('setVisible', visible)] else: self.called[self.object_name].append(('setVisible', visible)) # pylint: enable=C0103 class FakeUIProxyCredsDialog(object): """The fake .ui for the creds dialog.""" ui_labels = ('title_label', 'explanation_label', 'connection_label', 'error_label', 'username_label', 'password_label', 'domain_label', 'logo_label') ui_buttons = ('help_button', 'cancel_button', 'save_button') ui_entries = ('username_entry', 'password_entry') def __init__(self): """Create a new instance.""" self.called = {} for name in self.ui_labels + self.ui_buttons + self.ui_entries: setattr(self, name, FakeWidget(name, self.called)) # pylint: disable=C0103 def setupUi(self, dialog): """Set the ui.""" self.called['FakeUIProxyCredsDialog'] = ('setupUi', dialog) # pylint: enable=C0103 class FakeQIcon(object): """QIcon class.""" def __init__(self): """Create a new instance.""" self.called = [] # pylint: disable=C0103 def fromTheme(self, icon_id): """Return the icon with the given id.""" self.called.append(('fromTheme', icon_id)) return self # pylint: enable=C0103 # pylint: disable=C0103 def pixmap(self, h, w): """Get the pixmap with the given size.""" self.called.append(('pixmap', h, w)) return self # pylint: disable=C0103 class ProxyCredsDialogTest(TestCase): """Test the proxy creds dialog.""" @defer.inlineCallbacks def setUp(self): """Set tests.""" yield super(ProxyCredsDialogTest, self).setUp() self.patch(proxy_dialog, 'Ui_ProxyCredsDialog', FakeUIProxyCredsDialog) self.icon = FakeQIcon() self.patch(proxy_dialog, 'QIcon', self.icon) def test_set_labels(self): """Ensure the correct labels are used.""" dialog = proxy_dialog.ProxyCredsDialog() for label in dialog.ui.ui_labels: self.assertIn(label, dialog.ui.called, label) def test_set_buttons(self): """Ensure that buttons are set.""" dialog = proxy_dialog.ProxyCredsDialog() for label in dialog.ui.ui_buttons: self.assertIn(label, dialog.ui.called) # assert that the clicked was set self.assertIn(('connect', dialog._on_save_clicked), dialog.ui.save_button.clicked.called) self.assertIn(('connect', dialog._on_cancel_clicked), dialog.ui.cancel_button.clicked.called) def test_domain_empty(self): """Test that if the domain is not passed we set ''""" dialog = proxy_dialog.ProxyCredsDialog() self.assertIn('domain_label', dialog.ui.called) self.assertIn(('setText', ''), dialog.ui.called['domain_label']) def test_domain_not_empty(self): """Test that we do set the domain.""" domain = '192.168.1.100' dialog = proxy_dialog.ProxyCredsDialog(domain=domain) self.assertIn('domain_label', dialog.ui.called) self.assertIn(('setText', domain), dialog.ui.called['domain_label']) @defer.inlineCallbacks def test_retry_present_creds(self): """Test that we do set the error label correctly.""" creds = dict(username='username', password='password') called = [] dialog = proxy_dialog.ProxyCredsDialog(retry=True) def fake_get_credentials(app_name): """Fake the get creds.""" called.append(('get_credentials', app_name)) return defer.succeed(creds) self.patch(dialog.keyring, 'get_credentials', fake_get_credentials) yield dialog._load_creds() self.assertIn('get_credentials', called[0]) self.assertIn('error_label', dialog.ui.called) self.assertIn(('setVisible', True), dialog.ui.called['error_label']) self.assertIn(('setText', creds['username']), dialog.ui.called['username_entry']) self.assertIn(('setText', creds['password']), dialog.ui.called['password_entry']) @defer.inlineCallbacks def test_retry_none_creds(self): """Test that we do set the error label correctly.""" called = [] dialog = proxy_dialog.ProxyCredsDialog(retry=True) def fake_get_credentials(app_name): """Fake the get creds.""" called.append(('get_credentials', app_name)) return defer.succeed(None) self.patch(dialog.keyring, 'get_credentials', fake_get_credentials) yield dialog._load_creds() self.assertIn('get_credentials', called[0]) self.assertIn('error_label', dialog.ui.called) self.assertIn(('setVisible', True), dialog.ui.called['error_label']) self.assertNotIn('username_entry', dialog.ui.called) self.assertNotIn('password_entry', dialog.ui.called) @defer.inlineCallbacks def test_retry_exception_creds(self): """Test that we do set the error label correctly.""" called = [] dialog = proxy_dialog.ProxyCredsDialog(retry=True) def fake_get_credentials(app_name): """Fake the get creds.""" called.append(('get_credentials', app_name)) return defer.fail(Exception('Fail test')) self.patch(dialog.keyring, 'get_credentials', fake_get_credentials) yield dialog._load_creds() self.assertIn('get_credentials', called[0]) self.assertIn('error_label', dialog.ui.called) self.assertIn(('setVisible', True), dialog.ui.called['error_label']) self.assertNotIn('username_entry', dialog.ui.called) self.assertNotIn('password_entry', dialog.ui.called) def test_is_not_retry(self): """Test that we do set the error label correctly.""" dialog = proxy_dialog.ProxyCredsDialog(retry=False) self.assertIn('error_label', dialog.ui.called) self.assertIn(('setVisible', False), dialog.ui.called['error_label']) def test_icon(self): """Test that we correctly set the icon.""" dialog = proxy_dialog.ProxyCredsDialog() self.assertIn(('fromTheme', 'gtk-dialog-authentication'), self.icon.called) self.assertIn(('pixmap', 48, 48), self.icon.called) self.assertIn(('setPixmap', self.icon), dialog.ui.called['logo_label']) def test_on_cancel_clicked(self): """Test the on cancel clicked event.""" dialog = proxy_dialog.ProxyCredsDialog() called = [] def fake_done(result): """Fake the done method.""" called.append(('done', result)) self.patch(dialog, 'done', fake_done) dialog._on_cancel_clicked() self.assertIn(('done', proxy_dialog.USER_CANCELLATION), called) def assert_save_button(self, set_creds_callback, result_number): """Test the save button execution.""" dialog = proxy_dialog.ProxyCredsDialog() called = [] def fake_done(result): """Fake the done method.""" called.append(('done', result)) self.patch(dialog, 'done', fake_done) def fake_set_credentials(app_name, creds): """Fake an error.""" called.append(('set_credentials', app_name, creds)) return set_creds_callback() self.patch(dialog.keyring, 'set_credentials', fake_set_credentials) dialog._on_save_clicked() self.assertIn(('done', result_number), called) def test_on_save_clicked_exception(self): """Test that the exception is handled correctly.""" set_creds_cb = lambda: defer.fail(Exception()) result_number = proxy_dialog.EXCEPTION_RAISED self.assert_save_button(set_creds_cb, result_number) def test_on_save_clicked_correct(self): """Test that we do save the creds.""" set_creds_cb = lambda: defer.succeed(True) result_number = proxy_dialog.USER_SUCCESS self.assert_save_button(set_creds_cb, result_number) class FakeArgs(object): """Some fake args.""" def __init__(self, domain='', retry=False): """Create a new instance.""" self.domain = domain self.retry = retry class FakeCredsDialog(QObject): """A fake dialog.""" finished = pyqtSignal(int) def __init__(self, called, code): """Create a new instance.""" super(FakeCredsDialog, self).__init__() self.domain = None self.retry = None self.called = called self.return_code = code def __call__(self, domain, retry): """Fake init.""" self.domain = domain self.retry = retry return self def show(self): """Show the dialog.""" self.called.append(('show',)) def exec_(self): """Show the dialog.""" self.called.append(('exec_',)) return self.return_code class FakeQApplication(object): """A fake QApplication.""" test_instance = None def __init__(self, called): """Create a new instance.""" self.called = called self.args = None self.code = None FakeQApplication.test_instance = self def __call__(self, args): """Fake construntor.""" self.args = args @classmethod def instance(cls): """Return the instance.""" return FakeQApplication.test_instance def exit(self, code): """Exit the app.""" self.called.append(('exit', code)) self.code = code class MainTest(TestCase): """Test the main method.""" @defer.inlineCallbacks def setUp(self): """Set the different tests.""" yield super(MainTest, self).setUp() self.called = [] self.return_code = 0 self.dialog = FakeCredsDialog(self.called, self.return_code) self.patch(proxy_dialog, 'ProxyCredsDialog', self.dialog) self.args = FakeArgs(domain='domain', retry=False) self.patch(proxy_dialog, 'parse_args', lambda: self.args) self.exit_code = None self.app = FakeQApplication(self.called) self.patch(proxy_dialog, 'QApplication', self.app) def _set_old_platform(self, platform): """Set back the platform.""" proxy_dialog.sys.platform = platform def _assert_basic_start(self): """Assert the common code is actually ran.""" self.assertEqual(self.args.domain, self.dialog.domain) self.assertEqual(self.args.retry, self.dialog.retry) def test_linux_main(self): """Test the main method on linux.""" old_platform = proxy_dialog.sys.platform proxy_dialog.sys.platform = 'linux' self.addCleanup(self._set_old_platform, old_platform) def fake_exit(code): """Fake sys exit.""" self.called.append(('exit', code)) self.patch(proxy_dialog.sys, 'exit', fake_exit) proxy_dialog.main() self._assert_basic_start() self.assertIn(('exec_',), self.called) self.assertIn(('exit', self.return_code), self.called) def test_windows_main(self): """Test the main method on windows.""" old_platform = proxy_dialog.sys.platform proxy_dialog.sys.platform = 'win32' self.addCleanup(self._set_old_platform, old_platform) def fake_install(): """Fake the reactor installation.""" self.called.append(('install',)) self.patch(qt4reactor, 'install', fake_install) def fake_start(): """Fake reactor.start.""" self.called.append(('run',)) self.patch(reactor, 'run', fake_start) def fake_exit(code): """Fake the exit method.""" self.called.append(('exit_code', code)) self.patch(proxy_dialog, 'exit_code', fake_exit) proxy_dialog.main() self._assert_basic_start() self.assertIn(('show',), self.called) self.assertIn(('run',), self.called) self.dialog.finished.emit(self.return_code) self.assertIn(('exit_code', self.return_code), self.called) def test_exit_code_windows(self): """"Test the exit code function.""" old_platform = proxy_dialog.sys.platform proxy_dialog.sys.platform = 'win32' self.addCleanup(self._set_old_platform, old_platform) def fake_stop(): """Fake reactor.start.""" self.called.append(('stop',)) self.patch(reactor, 'stop', fake_stop) proxy_dialog.exit_code(self.return_code) self.assertIn(('stop',), self.called) self.assertIn(('exit', self.return_code), self.called) ubuntu-sso-client-13.10/ubuntu_sso/qt/tests/test_expander.py0000664000202700020270000001162512151461656024571 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Tests for the expander widget.""" from PyQt4.QtGui import QLabel from twisted.internet import defer from twisted.trial.unittest import TestCase from ubuntu_sso.qt.arrow import QArrow from ubuntu_sso.qt.expander import QExpanderLabel, QExpander # pylint: disable=C0103, W0201, W0212 class QExpanderLabelTestCase(TestCase): """Test the expander labe.""" @defer.inlineCallbacks def setUp(self): """Set tests.""" yield super(QExpanderLabelTestCase, self).setUp() self.label_content = 'test' self.label = QExpanderLabel(self.label_content) def test_mouse_press_event_arrow_right(self): """Test the actions taken when we press the mouse.""" self.label.arrow.direction = QArrow.RIGHT self.label.mousePressEvent(None) self.assertEqual(QArrow.DOWN, self.label.arrow.direction) def test_mouse_press_event_arrow_down(self): """Test the actions taken when we press the mouse.""" self.label.arrow.direction = QArrow.DOWN self.label.mousePressEvent(None) self.assertEqual(QArrow.RIGHT, self.label.arrow.direction) def test_text(self): """Test getting the text.""" self.assertEqual(self.label.label.text(), self.label.text()) def test_set_text(self): """Test setting the text.""" new_label = 'new' self.label.setText(new_label) self.assertEqual(self.label.label.text(), new_label) class QExpanderTestCase(TestCase): """Test the QExpander widget.""" @defer.inlineCallbacks def setUp(self): """Set up tests.""" yield super(QExpanderTestCase, self).setUp() self.label_content = 'test' self.expander = QExpander(self.label_content) def test_init(self): """Test the constructor.""" def test_add_widget(self): """Test adding a widget.""" widget = QLabel('test') widget.setObjectName('test') self.expander.addWidget(widget) self.assertEqual(widget, self.expander.content) self.assertEqual(1, self.expander.layout.indexOf(widget)) def test_add_widget_present(self): """Test adding a widge when one is already present.""" old_widget = QLabel('old') widget = QLabel('test') self.expander.addWidget(old_widget) self.expander.addWidget(widget) self.assertEqual(-1, self.expander.layout.indexOf(old_widget)) self.assertEqual(1, self.expander.layout.indexOf(widget)) def test_add_widget_expanded(self): """Test adding a widget when we are expanded.""" widget = QLabel('test') self.expander._expanded = True self.expander.addWidget(widget) self.assertEqual(1, self.expander.layout.indexOf(widget)) def test_add_widget_collapsed(self): """Test adding a widget when we are collapsed.""" widget = QLabel('test') self.expander._expanded = False self.expander.addWidget(widget) self.assertEqual(1, self.expander.layout.indexOf(widget)) self.assertFalse(widget.isVisible()) def test_text(self): """Test getting the text.""" self.assertEqual(self.expander.text(), self.expander.label.text()) def test_set_text(self): """Test setting the text.""" label_content = 'content' self.expander.setText(label_content) self.assertEqual(label_content, self.expander.label.text()) def test_expanded(self): """Test getting expanded.""" self.expander._expanded = True self.assertEqual(self.expander.expanded(), self.expander._expanded) ubuntu-sso-client-13.10/ubuntu_sso/qt/tests/test_arrow.py0000664000202700020270000000726712151461656024124 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """QArrow tests.""" from PyQt4.QtGui import QStyle from twisted.internet import defer from twisted.trial.unittest import TestCase from ubuntu_sso.qt.arrow import QArrow # pylint: disable=W0212,C0103 class FakeStyle(object): """Fake a Qt style.""" def __init__(self): """Create instance.""" self.called = [] def __call__(self, *args, **kwargs): """Instance callable.""" return self def drawPrimitive(self, primitive, opt, painter, widget): """Fake a draw primitive.""" self.called.append(('drawPrimitive', primitive, opt, painter, widget)) class QArrowTestCase(TestCase): """Test the QArrow class.""" @defer.inlineCallbacks def setUp(self): """Set the tests.""" yield super(QArrowTestCase, self).setUp() self.valid_dirs = (QArrow.UP, QArrow.DOWN, QArrow.LEFT, QArrow.RIGHT) self.style = FakeStyle() def test_correct_init(self): """Test the init using the correct direction.""" for direction in self.valid_dirs: arrow = QArrow(direction) self.assertEqual(direction, arrow.direction) def test_wrong_init(self): """Test the init using the wrong direction.""" self.assertRaises(ValueError, QArrow, 'test') def test_set_direction_correct(self): """Test the set direction with the correct value.""" arrow = QArrow(QArrow.RIGHT) for direction in self.valid_dirs: arrow.direction = direction self.assertEqual(direction, arrow.direction) def test_set_direction_wrong(self): """Test set direction wrong.""" arrow = QArrow(QArrow.RIGHT) self.assertRaises(ValueError, setattr, arrow, 'direction', 'wrong') def test_paint_event(self): """Test the paint event.""" directions_map = {QArrow.UP: QStyle.PE_IndicatorArrowUp, QArrow.DOWN: QStyle.PE_IndicatorArrowDown, QArrow.LEFT: QStyle.PE_IndicatorArrowLeft, QArrow.RIGHT: QStyle.PE_IndicatorArrowRight} arrow = QArrow(QArrow.RIGHT) self.patch(arrow, 'style', self.style) for key, value in directions_map.items(): self.style.called = [] arrow.direction = key arrow.paintEvent(None) self.assertIn(value, self.style.called[0]) ubuntu-sso-client-13.10/ubuntu_sso/qt/tests/test_loadingoverlay.py0000664000202700020270000000355112151461656026001 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Tests for the Loading Overlay.""" from ubuntu_sso.qt.loadingoverlay import LoadingOverlay from ubuntu_sso.qt.tests import BaseTestCase class LoadingOverlayTestCase(BaseTestCase): """Test the qt control panel.""" kwargs = {} ui_class = LoadingOverlay ui_wizard_class = None def test_status_correct(self): """Test if the necessary variables for the animation exists""" self.assertTrue(self.ui.counter is not None) self.assertTrue(self.ui.orientation is not None) ubuntu-sso-client-13.10/ubuntu_sso/qt/tests/test_ssl_dialog.py0000664000202700020270000002034312151461656025100 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Test the ssl dialog.""" from PyQt4.QtGui import QStyle from twisted.internet import defer from twisted.trial.unittest import TestCase from ubuntu_sso import USER_CANCELLATION, USER_SUCCESS from ubuntu_sso.qt import ssl_dialog from ubuntu_sso.utils import compat from ubuntu_sso.utils.ui import ( CANCEL_BUTTON, SSL_APPNAME_HELP, SSL_DETAILS_HELP, SSL_DESCRIPTION, SSL_DOMAIN_HELP, SSL_HEADER, SSL_EXPLANATION, SSL_FIRST_REASON, SSL_SECOND_REASON, SSL_THIRD_REASON, SSL_CERT_DETAILS, SSL_NOT_SURE, SSL_REMEMBER_DECISION, SSL_HELP_BUTTON, SSL_CONNECT_BUTTON, ) # pylint: disable=W0212, C0103, class SSLDialogTestCase(TestCase): """Test the ssl dialog.""" @defer.inlineCallbacks def setUp(self): """Set the tests.""" yield super(SSLDialogTestCase, self).setUp() self.domain = 'test-domain' self.details = 'SSL details' self.appname = 'test' self.dialog = ssl_dialog.SSLDialog(self.appname, domain=self.domain, details=self.details) self.return_code = None def fake_done(code): """Fake done for the dialog.""" self.return_code = code self.patch(self.dialog, 'done', fake_done) def test_init_none_domain(self): """Test the init method when the domain is none.""" dialog = ssl_dialog.SSLDialog(self.appname, domain=None, details=self.details) self.assertEqual(self.details, dialog.details) self.assertEqual('', dialog.domain) def test_init_none_details(self): """Test the init method when the details are none.""" dialog = ssl_dialog.SSLDialog(self.appname, domain=self.domain, details=None) self.assertEqual('', dialog.details) self.assertEqual(self.domain, dialog.domain) def test_set_labels(self): """Test that the labels contain the correct info.""" self.assertEqual(SSL_HEADER, compat.text_type(self.dialog.ui.title_label.text())) explanation = SSL_EXPLANATION % dict(domain=self.domain) intro = ssl_dialog.REASONS_TEMPLATE % dict(explanation=explanation, first_reason=SSL_FIRST_REASON, second_reason=SSL_SECOND_REASON, third_reason=SSL_THIRD_REASON) self.assertEqual(intro, compat.text_type(self.dialog.ui.intro_label.text())) self.assertEqual(SSL_NOT_SURE % dict(app_name=self.appname), compat.text_type(self.dialog.ui.not_sure_label.text())) self.assertEqual(SSL_REMEMBER_DECISION, compat.text_type(self.dialog.ui.remember_checkbox.text())) def test_on_cancel_clicked(self): """Test the cancelation action.""" self.dialog._on_cancel_clicked() self.assertEqual(USER_CANCELLATION, self.return_code) def test_on_connect_clicked(self): """Test the connect action.""" self.dialog._on_connect_clicked() self.assertEqual(USER_SUCCESS, self.return_code) def test_set_buttons(self): """Test that the buttons are correctly set up.""" # assert that the buttons have been correctly connected called = [] def fake_on_connect_clicked(event): """Fake the on connect clicked method.""" called.append('_on_connect_clicked') self.patch(ssl_dialog.SSLDialog, '_on_connect_clicked', fake_on_connect_clicked) def fake_on_cancel_clicked(event): """Fake the on cancle clicked.""" called.append('_on_cancel_clicked') self.patch(ssl_dialog.SSLDialog, '_on_cancel_clicked', fake_on_cancel_clicked) dialog = ssl_dialog.SSLDialog(self.appname, domain=None, details=self.details) dialog.ui.connect_button.clicked.emit(True) self.assertIn('_on_connect_clicked', called) dialog.ui.cancel_button.clicked.emit(True) self.assertIn('_on_cancel_clicked', called) self.assertEqual(CANCEL_BUTTON, compat.text_type(dialog.ui.cancel_button.text())) self.assertEqual(SSL_CONNECT_BUTTON, compat.text_type(dialog.ui.connect_button.text())) self.assertEqual(SSL_HELP_BUTTON, compat.text_type(dialog.ui.help_button.text())) def test_set_expander(self): """Test that the expander is correctly set.""" self.assertEqual(SSL_CERT_DETAILS, compat.text_type(self.dialog.expander.text())) self.assertNotEqual(None, self.dialog.expander.content) self.assertEqual(2, self.dialog.ui.expander_layout.indexOf( self.dialog.expander)) def test_set_icon(self): """Test that the icon is correctly set.""" self.assertNotEqual(None, self.dialog.ui.logo_label.pixmap()) icon = self.dialog.style().standardIcon(QStyle.SP_MessageBoxWarning) self.assertEqual(icon.pixmap(48, 48).toImage(), self.dialog.ui.logo_label.pixmap().toImage()) self.assertEqual('', self.dialog.ui.logo_label.text()) class FakeArgumentParser(object): """Fake args parse.""" def __init__(self): """Create an instance.""" self.called = [] def __call__(self, description=''): """Instance callable.""" self.called.append(('__init__', description)) return self # pylint: disable=W0622 def add_argument(self, name, required=False, help=''): """Add an argument.""" self.called.append(('add_argument', name, required, help)) # pylint: enable=W0622 def parse_args(self): """Parse the args.""" self.called.append(('parse_args',)) return self class ParseArgTestCase(TestCase): """Test the parse of the args.""" def test_parse_args(self): """Set tests.""" argparse = FakeArgumentParser() self.patch(ssl_dialog.argparse, 'ArgumentParser', argparse) args = ssl_dialog.parse_args() self.assertEqual(argparse, args) self.assertIn(('__init__', SSL_DESCRIPTION), argparse.called) self.assertIn(('add_argument', '--domain', True, SSL_DOMAIN_HELP), argparse.called) self.assertIn(('add_argument', '--details', True, SSL_DETAILS_HELP), argparse.called) self.assertIn(('add_argument', '--appname', True, SSL_APPNAME_HELP), argparse.called) self.assertIn(('parse_args',), argparse.called) ubuntu-sso-client-13.10/ubuntu_sso/qt/tests/test_current_user_sign_in_page.py0000664000202700020270000002162612151461656030207 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Tests for the Setup Account page Qt UI.""" from __future__ import unicode_literals from PyQt4 import QtGui, QtCore from ubuntu_sso.utils import compat from ubuntu_sso.qt import current_user_sign_in_page as gui from ubuntu_sso.qt.tests import ( PageBaseTestCase, FakePageUiStyle, FakeWizardButtonStyle, ) from ubuntu_sso.tests import EMAIL # pylint: disable=W0212 class CurrentUserSignInTestCase(PageBaseTestCase): """Test the SetupAccountPage code.""" ui_class = gui.CurrentUserSignInPage ui_signals = ('userLoggedIn', 'passwordForgotten', 'userNotValidated', 'createAccount') ui_backend_signals = ('LoggedIn', 'LoginError', 'UserNotValidated') def test_initialize_page(self): """Test the initialization method.""" wizard = FakeWizardButtonStyle() button = FakePageUiStyle() self.patch(self.ui, "wizard", lambda: wizard) self.patch(self.ui.ui, "sign_in_button", button) self.patch(self.ui, "setButtonText", wizard.setButtonText) self.ui.initializePage() self.assertEqual(wizard.buttons_text[QtGui.QWizard.CancelButton], "Cancel") self.assertIn(('setButtonLayout', (([],), {})), wizard.called) self.assertTrue(button.properties['default']) self.assertFalse(button.isEnabled()) def test_unicode_in_forgotten_password_link(self): """Ensure that this label supports unicode.""" forgot_fr = "J'ai oublié mon mot de passe" self.patch(gui, "FORGOTTEN_PASSWORD_BUTTON", forgot_fr) forgotten_text = gui.LINK_STYLE.format(link_url='#', link_text=forgot_fr) self.ui._set_translated_strings() self.assertEqual( compat.text_type(self.ui.ui.forgot_password_label.text()), forgotten_text) def test_set_translated_strings(self): """Test the translated string method.""" expected = gui.LOGIN_TITLE.format(app_name=self.app_name) self.assertTrue(self.app_name in expected) self.assert_title_correct(expected) expected = gui.LOGIN_SUBTITLE % dict(app_name=self.app_name) self.assertTrue(self.app_name in expected) self.assert_subtitle_correct(expected) self.assertEqual(compat.text_type(self.ui.ui.email_label.text()), gui.EMAIL_LABEL) link_text = gui.CREATE_ACCOUNT_LABEL.format(app_name=self.app_name) expected = gui.LINK_STYLE.format(link_url='#', link_text=link_text) self.assertTrue(self.app_name in expected) self.assertEqual(compat.text_type( self.ui.ui.create_account_label.text()), expected) self.assertEqual(compat.text_type(self.ui.ui.password_label.text()), gui.LOGIN_PASSWORD_LABEL) text = gui.LINK_STYLE.format(link_url='#', link_text=gui.FORGOTTEN_PASSWORD_BUTTON) self.assertEqual( compat.text_type(self.ui.ui.forgot_password_label.text()), text) self.assertEqual( compat.text_type(self.ui.ui.sign_in_button.text()), gui.SIGN_IN_BUTTON) def test_connect_ui(self): """Test the connect ui method.""" self.assertEqual(self.ui.ui.forgot_password_label.receivers( QtCore.SIGNAL("linkActivated(const QString&)")), 1) self.assertEqual(self.ui.ui.email_edit.receivers( QtCore.SIGNAL("textChanged(const QString&)")), 1) self.assertEqual(self.ui.ui.password_edit.receivers( QtCore.SIGNAL("textChanged(const QString&)")), 1) self.assertEqual(self.ui.ui.sign_in_button.receivers( QtCore.SIGNAL("clicked()")), 1) self.assertEqual(self.ui.ui.create_account_label.receivers( QtCore.SIGNAL("linkActivated(const QString&)")), 1) def test_validate_not_valid(self): """Test validate method.""" button = FakePageUiStyle() self.patch(self.ui.ui, "sign_in_button", button) self.ui.ui.email_edit.setText('not-valid-email') self.ui.ui.password_edit.setText('123456') self.ui._validate() self.assertFalse(button.isEnabled()) def test_validate_valid(self): """Test validate method.""" button = FakePageUiStyle() self.patch(self.ui.ui, "sign_in_button", button) self.ui.ui.email_edit.setText('valid@email') self.ui.ui.password_edit.setText('123456') self.ui._validate() self.assertTrue(button.isEnabled()) def test_login_with_ping(self): """Test the login method.""" self.patch(self.ui, "hide_error", self._set_called) email = 'valid@email' password = '123456' self.ui.ui.email_edit.setText(email) self.ui.ui.password_edit.setText(password) self.ui.login() self.assertEqual(self._overlay_show_counter, 1) self.assertFalse(self.ui.isEnabled()) self.assert_backend_called('login_and_ping', self.app_name, email, password, self.ui.ping_url) expected = ((), {}) self.assertEqual(expected, self._called) def test_login_without_ping(self): """Test the login method.""" self.patch(self.ui, "hide_error", self._set_called) self.ui.ping_url = '' email = 'valid@email' password = '123456' self.ui.ui.email_edit.setText(email) self.ui.ui.password_edit.setText(password) self.ui.login() self.assertEqual(self._overlay_show_counter, 1) self.assertFalse(self.ui.isEnabled()) self.assert_backend_called('login', self.app_name, email, password) expected = ((), {}) self.assertEqual(expected, self._called) def test_on_login_error(self): """Test the on_login_error method.""" self.patch(self.ui, "show_error", self._set_called) error = {'errtype': 'UserNotValidated'} self.ui.on_login_error(self.app_name, error) self.assertEqual(self._overlay_hide_counter, 0) self.assertTrue(self.ui.isEnabled()) expected = ((self.ui, self.app_name, ''), {}) self.assertTrue(expected, self._called) def test_on_logged_in(self): """Test the on_login_in method.""" self.ui.ui.email_edit.setText(EMAIL) self.assert_signal_emitted(self.ui.userLoggedIn, (EMAIL,), self.ui.on_logged_in, self.app_name, EMAIL) self.assertTrue(self.ui.isEnabled()) def test_on_user_not_validated(self): """Test the navigation flow on user not validated.""" self.ui.ui.email_edit.setText(EMAIL) self.assert_signal_emitted(self.ui.userNotValidated, (EMAIL,), self.ui.on_user_not_validated, self.app_name, EMAIL) def test_on_forgotten_password(self): """Test the on_forgotten_password method.""" self.assert_signal_emitted(self.ui.passwordForgotten, (), self.ui.on_forgotten_password) def test_on_forgotten_password_link_clicked(self): """Forgotten passsword clicked emits passwordForgotten signal.""" self.assert_signal_emitted(self.ui.passwordForgotten, (), self.ui.ui.forgot_password_label.linkActivated.emit, "link") def test_on_create_account(self): """Test the on_create_account method.""" self.assert_signal_emitted(self.ui.createAccount, (), self.ui.on_create_account) def test_on_create_account_link_clicked(self): """Create account clicked emits createAccount signal.""" self.assert_signal_emitted(self.ui.createAccount, (), self.ui.ui.create_account_label.linkActivated.emit, "link") ubuntu-sso-client-13.10/ubuntu_sso/qt/tests/test_ubuntu_sso_wizard.py0000664000202700020270000002103512151461656026545 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Test Ubunto SSO Wizard.""" from PyQt4 import QtGui from twisted.internet import defer from ubuntu_sso.tests import ( APP_NAME, EMAIL, PASSWORD, ) from ubuntu_sso.qt import PREFERED_UI_SIZE, ubuntu_sso_wizard from ubuntu_sso.qt.tests import ( BaseTestCase, FakeOverlay, ) from ubuntu_sso.utils import compat # is ok to access private method/attrs in tests # pylint: disable=W0212 class UbuntuSSOClientGUITestCase(BaseTestCase): """Test the UbuntuSSOClientGUI class.""" ui_class = ubuntu_sso_wizard.UbuntuSSOClientGUI ui_wizard_class = None @defer.inlineCallbacks def setUp(self): self.patch(ubuntu_sso_wizard.networkstate, 'is_machine_connected', lambda: True) yield super(UbuntuSSOClientGUITestCase, self).setUp() self.patch(ubuntu_sso_wizard.sys, 'exit', self._set_called) def test_closing_main_window(self): """When closing the main window, USER_CANCELLATION is returned.""" self.ui.close() self.assertEqual(self._called, ((ubuntu_sso_wizard.USER_CANCELLATION,), {})) def test_close_main_window_reaching_success_page(self): """Closing the window in success page, USER_SUCCESS is returned.""" self.ui.wizard._move_to_success_page() self.ui.close() self.assertEqual(self._called, ((ubuntu_sso_wizard.USER_SUCCESS,), {})) def test_closing_wizard_no_parent(self): """When closing the wizard, USER_CANCELLATION is returned.""" self.ui.wizard.setParent(None) self.ui.wizard.close() self.assertEqual(self._called, ((ubuntu_sso_wizard.USER_CANCELLATION,), {})) def test_close_wizard_no_parent_reaching_success_page(self): """Closing the wizard in success page, USER_SUCCESS is returned.""" self.ui.wizard.setParent(None) self.ui.wizard._move_to_success_page() self.ui.wizard.close() self.assertEqual(self._called, ((ubuntu_sso_wizard.USER_SUCCESS,), {})) def test_on_wizard_finish_done_called(self): """Test that the wizard actually close the window on finish.""" self.ui.wizard._move_to_success_page() finish_button = self.ui.wizard.button(QtGui.QWizard.FinishButton) self.patch(self.ui.wizard, 'done', self._set_called) finish_button.clicked.emit(True) self.assertEqual(self._called, ((1,), {})) def test_on_wizard_finish_close_called_on_done(self): """Test that the wizard actually close the window on finish.""" self.ui.wizard._move_to_success_page() finish_button = self.ui.wizard.button(QtGui.QWizard.FinishButton) self.patch(self.ui.wizard, 'closeEvent', self._set_called) finish_button.clicked.emit(True) self.assertEqual(self._called, ((None,), {})) def test_window_title(self): """Check the window title for the application.""" title = compat.text_type(self.ui.windowTitle()) self.assertEqual(title, ubuntu_sso_wizard.WINDOW_TITLE) class UbuntuSSOWizardTestCase(BaseTestCase): """Test case for UbuntuSSOWizard class.""" ui_class = ubuntu_sso_wizard.UbuntuSSOWizard ui_signals = ('recoverableError', 'loginSuccess', 'registrationSuccess') ui_wizard_class = None @defer.inlineCallbacks def setUp(self): self.patch(ubuntu_sso_wizard.networkstate, 'is_machine_connected', lambda: True) self.patch(ubuntu_sso_wizard, 'LoadingOverlay', FakeOverlay) yield super(UbuntuSSOWizardTestCase, self).setUp() def test_window_size(self): """check the window size.""" size = self.ui.size() self.assertTrue(size.height() >= PREFERED_UI_SIZE['height']) self.assertTrue(size.width() >= PREFERED_UI_SIZE['width']) def test_move_to_success_page_state(self): """Test _move_to_success_page method.""" self.patch(self.ui, 'setButtonLayout', self._set_called) self.ui._move_to_success_page() self.assertEqual(self.ui._next_id, -1) self.assertEqual(self.ui._next_id, -1) self.assertEqual(self._called, (([QtGui.QWizard.Stretch, QtGui.QWizard.FinishButton],), {})) self.assertTrue(self.ui.button(QtGui.QWizard.FinishButton).isEnabled()) self.assertEqual(self.ui.exit_code, ubuntu_sso_wizard.USER_SUCCESS) def test_overlay_shows(self): """Test if the signals call the overlay.show properly.""" # reset the counter self.ui.overlay.show_counter = 0 for page in self.ui._pages: page.show_overlay() self.assertEqual(self.ui.overlay.show_counter, len(self.ui._pages)) def test_overlay_hides(self): """Test if the signals call the overlay.show properly.""" # reset the counter self.ui.overlay.show_counter = 0 for page in self.ui._pages: page.hide_overlay() # We do +1 because a hide action is executed on the wizard init. self.assertEqual(self.ui.overlay.hide_counter, len(self.ui._pages) + 1) def test_go_back_to_current_user_sign_in(self): """Move the wizard back to the current user sign in page.""" self.patch(self.ui, '_go_back_to_page', self._set_called) self.ui._next_id = self.ui.current_user_page_id self.ui.next() self.ui._move_to_reset_password_page() self.ui.reset_password.passwordChanged.emit('') expected = ((self.ui.current_user,), {}) self.assertEqual(expected, self._called) def test_email_verification_page_params_from_current_user(self): """Tests that email_verification_page receives the proper params.""" self.ui._next_id = self.ui.current_user_page_id self.ui.next() self.ui.current_user.ui.email_edit.setText(EMAIL) self.ui.current_user.ui.password_edit.setText(PASSWORD) self.ui.current_user.on_user_not_validated(APP_NAME, EMAIL) self.assertEqual(EMAIL, self.ui.email_verification.email) self.assertEqual(PASSWORD, self.ui.email_verification.password) def test_email_verification_page_params_from_setup(self): """Tests that email_verification_page receives the proper params.""" self.ui._next_id = self.ui.setup_account_page_id self.ui.next() self.ui.setup_account.ui.email_edit.setText(EMAIL) self.ui.setup_account.ui.password_edit.setText(PASSWORD) self.ui.setup_account.on_user_registered(APP_NAME, {}) self.assertEqual(EMAIL, self.ui.email_verification.email) self.assertEqual(PASSWORD, self.ui.email_verification.password) def test_check_network_connection(self): """Test that _connection_detected is executed with connection.""" self.patch(self.ui, "_connection_detected", self._set_called) self.ui.check_network_connection() self.assertEqual(self._called, ((), {})) def test_check_network_connection_without_connection(self): """Test that _connection_detected is executed without connection.""" self.patch(self.ui, "_connection_detected", self._set_called) self.patch(ubuntu_sso_wizard.networkstate, 'is_machine_connected', lambda: False) self.ui.check_network_connection() self.assertFalse(self._called) ubuntu-sso-client-13.10/ubuntu_sso/qt/tests/test_error_page.py0000664000202700020270000000312512151461656025104 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Test the error page.""" from ubuntu_sso.qt.error_page import ErrorPage from ubuntu_sso.qt.tests import BaseTestCase class ErrorPageTestCase(BaseTestCase): """Test that the correct widgets are used.""" ui_class = ErrorPage ubuntu-sso-client-13.10/ubuntu_sso/qt/tests/test_common.py0000664000202700020270000003203512151461656024251 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # Author: Diego Sarmentero # # Copyright 2011-2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Test the common functions.""" from __future__ import unicode_literals from PyQt4 import QtGui from twisted.internet import defer from twisted.trial.unittest import TestCase from ubuntu_sso.utils import compat from ubuntu_sso.qt import ( build_general_error_message, maybe_elide_text, GENERIC_BACKEND_ERROR, ) from ubuntu_sso.qt.common import ( check_as_invalid, check_as_valid, password_assistance, password_check_match, BAD, GOOD, NORMAL, PASSWORD_DIGIT, PASSWORD_LENGTH, PASSWORD_MATCH, PASSWORD_UPPER, ) from ubuntu_sso.qt.tests import build_string_for_pixels class PasswordTestCase(TestCase): """Test passwords conditions.""" @defer.inlineCallbacks def setUp(self): """Setup tests.""" yield super(PasswordTestCase, self).setUp() self.line_edit = QtGui.QLineEdit() self.line_edit_confirm = QtGui.QLineEdit() self.label_assistance = QtGui.QLabel() def test_short_password(self): """Status with short password. * Password assistance contains the right message. """ self.line_edit.setText("foobar") password_assistance(self.line_edit, self.label_assistance) self.assertIn( BAD % PASSWORD_LENGTH, compat.text_type(self.label_assistance.text()), ) def test_long_password(self): """Status with long password. * Password assistance contains the right message. """ self.line_edit.setText("foobarbaz") password_assistance(self.line_edit, self.label_assistance) self.assertIn( GOOD % PASSWORD_LENGTH, compat.text_type(self.label_assistance.text()), ) def test_no_number_password(self): """Status with password without a number. * Password assistance contains the right message. """ self.line_edit.setText("foobarbaz") password_assistance(self.line_edit, self.label_assistance) self.assertIn( BAD % PASSWORD_DIGIT, compat.text_type(self.label_assistance.text()), ) def test_number_password(self): """Status with password with a number. * Password assistance contains the right message. """ self.line_edit.setText("foobarba7") password_assistance(self.line_edit, self.label_assistance) self.assertIn( GOOD % PASSWORD_DIGIT, compat.text_type(self.label_assistance.text()), ) def test_no_uppercase_password(self): """Status with password without uppercase letters. * Password assistance contains the right message. """ self.line_edit.setText("foobarbaz") password_assistance(self.line_edit, self.label_assistance) self.assertIn( BAD % PASSWORD_UPPER, compat.text_type(self.label_assistance.text()), ) def test_upper_password(self): """Status with password with uppercase letters. * Password assistance contains the right message. """ self.line_edit.setText("Foobarba7") password_assistance(self.line_edit, self.label_assistance) self.assertIn( GOOD % PASSWORD_UPPER, compat.text_type(self.label_assistance.text()), ) def test_matching_passwords(self): """Status when the passwords match. * Password assistance doesn't contain the message. """ self.line_edit.setText("Foobarba7") self.line_edit_confirm.setText("Foobarba7") password_check_match(self.line_edit, self.line_edit_confirm, self.label_assistance) self.assertNotIn( BAD % PASSWORD_MATCH, compat.text_type(self.label_assistance.text())) def test_not_matching_passwords(self): """Status when the passwords not match. * Password assistance contains the right message. """ self.line_edit.setText("Foobarba7") self.line_edit_confirm.setText("BazBarFo0") password_check_match(self.line_edit, self.line_edit_confirm, self.label_assistance) self.assertIn( BAD % PASSWORD_MATCH, compat.text_type(self.label_assistance.text()), ) def test_password_assistance_in_focus_length_correct(self): """Check the QLineEdit for password when the length is correct.""" self.line_edit.setText("aaaaaaaaa") self.line_edit_confirm.setText("") password_assistance(self.line_edit, self.label_assistance, NORMAL) self.assertIn( GOOD % PASSWORD_LENGTH, compat.text_type(self.label_assistance.text()), ) self.assertIn( NORMAL % PASSWORD_UPPER, compat.text_type(self.label_assistance.text()), ) self.assertIn( NORMAL % PASSWORD_DIGIT, compat.text_type(self.label_assistance.text()), ) def test_password_assistance_in_focus_with_upper(self): """Check the QLineEdit for password when it has an upper case char.""" self.line_edit.setText("AAa") self.line_edit_confirm.setText("") password_assistance(self.line_edit, self.label_assistance, NORMAL) self.assertIn( NORMAL % PASSWORD_LENGTH, compat.text_type(self.label_assistance.text()), ) self.assertIn( GOOD % PASSWORD_UPPER, compat.text_type(self.label_assistance.text()), ) self.assertIn( NORMAL % PASSWORD_DIGIT, compat.text_type(self.label_assistance.text()), ) def test_password_assistance_in_focus_with_number(self): """Check the QLineEdit for password when it contains numbers.""" self.line_edit.setText("a123") self.line_edit_confirm.setText("") password_assistance(self.line_edit, self.label_assistance, NORMAL) self.assertIn( NORMAL % PASSWORD_LENGTH, compat.text_type(self.label_assistance.text()), ) self.assertIn( NORMAL % PASSWORD_UPPER, compat.text_type(self.label_assistance.text()), ) self.assertIn( GOOD % PASSWORD_DIGIT, compat.text_type(self.label_assistance.text()), ) def test_password_assistance_in_focus_all_ok(self): """Check the QLineEdit for password when all the condition are ok.""" self.line_edit.setText("T3st3rqw") self.line_edit_confirm.setText("T3st3rqw") password_assistance(self.line_edit, self.label_assistance, NORMAL) self.assertIn( GOOD % PASSWORD_LENGTH, compat.text_type(self.label_assistance.text()), ) self.assertIn( GOOD % PASSWORD_UPPER, compat.text_type(self.label_assistance.text()), ) self.assertIn( GOOD % PASSWORD_DIGIT, compat.text_type(self.label_assistance.text()), ) self.assertNotIn( NORMAL % PASSWORD_MATCH, compat.text_type(self.label_assistance.text()), ) class LineEditStyleTestCase(TestCase): """Test QLineEdit styles for errors.""" def test_check_valid(self): """Check the propery value of a QLineEdit marked as valid.""" line_edit = QtGui.QLineEdit() check_as_valid(line_edit) self.assertFalse(line_edit.property("formError").toBool()) def test_check_invalid(self): """Check the propery value of a QLineEdit marked as invalid.""" line_edit = QtGui.QLineEdit() check_as_invalid(line_edit) self.assertTrue(line_edit.property("formError").toBool()) class ElidedTextTestCase(TestCase): """The test case for the maybe_elide_text function.""" max_width = 100 @defer.inlineCallbacks def setUp(self): """Setup tests.""" yield super(ElidedTextTestCase, self).setUp() self.ui = QtGui.QLabel() def test_text_not_elided_if_too_short(self): """If text is shorter than max_width, do not elide.""" text = build_string_for_pixels(self.ui, self.max_width - 10) maybe_elide_text(self.ui, text, self.max_width) self.assertEqual(self.ui.toolTip(), '') self.assertEqual(self.ui.text(), text) self.assertNotIn('\u2026', self.ui.text()) def test_text_not_elided_if_equals_max_width(self): """If text is equal than max_width, do not elide.""" text = build_string_for_pixels(self.ui, self.max_width) maybe_elide_text(self.ui, text, self.max_width) self.assertEqual(self.ui.toolTip(), '') self.assertEqual(self.ui.text(), text) self.assertNotIn('\u2026', self.ui.text()) def test_text_elided_if_bigger_than_max_width(self): """If text is equal than max_width, do not elide.""" text = build_string_for_pixels(self.ui, self.max_width * 2) maybe_elide_text(self.ui, text, self.max_width) self.assertEqual(self.ui.toolTip(), text) expected = compat.text_type(self.ui.text()) self.assertTrue(expected.endswith('\u2026')) self.assertTrue(text.startswith(expected[:-1])) class BuildGeneralErrorMessageTestCase(TestCase): """Test passwords conditions.""" def test_with_message(self): """Test build_general_error_message with 'message' key.""" error = "error message" err_dict = {'message': error} result = build_general_error_message(err_dict) self.assertEqual(result, error) def test_with_all(self): """Test build_general_error_message with 'all' key.""" error = "error message" err_dict = {'__all__': error} result = build_general_error_message(err_dict) self.assertEqual(result, error) def test_with_message_and_all(self): """Test build_general_error_message with 'all' and 'message' key.""" error = "error message" error2 = "error message2" err_dict = {'__all__': error, 'message': error2} result = build_general_error_message(err_dict) expected = '\n'.join((error, error2)) self.assertEqual(result, expected) def test_with_all_and_error_message(self): """Test for 'all' and 'error_message' key.""" error = "error message" error2 = "error message2" err_dict = {'__all__': error, 'error_message': error2} result = build_general_error_message(err_dict) expected = '\n'.join((error, error2)) self.assertEqual(result, expected) def test_with_random_keys(self): """Test build_general_error_message with random keys.""" error = "error message" error2 = "error message2" err_dict = {'my_bad': error, 'odd_error': error2} result = build_general_error_message(err_dict) expected = '\n'.join( [('%s: %s' % (k, v)) for k, v in err_dict.items()]) self.assertEqual(result, expected) def test_with_random_keys_with_errtype(self): """Test build_general_error_message with random keys and errtype.""" error = "error message" error2 = "error message2" err_dict = {'my_bad': error, 'odd_error': error2, 'errtype': 'Danger'} result = build_general_error_message(err_dict) expected = '\n'.join( [('%s: %s' % (k, v)) for k, v in {'my_bad': error, 'odd_error': error2}.items()]) self.assertEqual(result, expected) def test_with_not_dict(self): """Test build_general_error_message with argument not dict.""" error = "error message" err_dict = Exception(error) result = build_general_error_message(err_dict) expected = GENERIC_BACKEND_ERROR self.assertEqual(result, expected) ubuntu-sso-client-13.10/ubuntu_sso/qt/tests/login_u_p.py0000664000202700020270000000565712151461656023707 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2011-2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Script that shows the qt gui.""" import sys # pylint: disable=E1101,F0401,E0611 if sys.platform != 'win32': from twisted.internet import gireactor gireactor.install() from dbus.mainloop.glib import DBusGMainLoop DBusGMainLoop(set_as_default=True) from twisted.internet import defer, reactor from ubuntu_sso.main import get_sso_client @defer.inlineCallbacks def main(): """Perform a client request to be logged in.""" d = defer.Deferred() client = yield get_sso_client() def found(*args): """The result was received.""" d.callback(args) client.cred_manager.connect_to_signal('CredentialsFound', found) client.cred_manager.connect_to_signal('CredentialsNotFound', found) client.cred_manager.connect_to_signal('AuthorizationDenied', found) client.cred_manager.connect_to_signal('CredentialsError', found) # use the following to trigger a CredentialsError (AuthenticationError) args = dict(email='xyz@canonical.com', password='ABC') # use the following to trigger a CredentialsError (UserNotValidated) args = dict(email='a@example.com', password='1234567U') # remove prior credentials cleared = defer.Deferred() client.cred_manager.connect_to_signal('CredentialsCleared', cleared.callback) yield client.cred_manager.clear_credentials('SUPER', {}) yield cleared yield client.cred_manager.login_email_password('SUPER', args) yield d yield client.disconnect() reactor.stop() if __name__ == '__main__': main() reactor.run() ubuntu-sso-client-13.10/ubuntu_sso/main/0000755000202700020270000000000012225013301020457 5ustar dobeydobey00000000000000ubuntu-sso-client-13.10/ubuntu_sso/main/windows.py0000664000202700020270000001107512151461656022553 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2011-2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Main module implementation specific for windows. This module should never import from the multiplatform one (main/__init__.py), but the other way around. Likewise, this module should *not* have any logic regarding error processing or decision making about when to send a given signal. Also, most of the logging is being made in the main module to avoid duplication between the different platform implementations. """ # pylint: disable=F0401 import win32process import win32security # pylint: enable=F0401 from twisted.internet import defer from ubuntu_sso import BACKEND_EXECUTABLE from ubuntu_sso.logger import setup_logging from ubuntu_sso.utils import get_bin_cmd from ubuntu_sso.utils.ipc import BaseClient from ubuntu_sso.main.perspective_broker import ( SSO_SERVICE_NAME, SSOLoginClient, CredentialsManagementClient, UbuntuSSOProxyBase, ) logger = setup_logging("ubuntu_sso.main.windows") U1_REG_PATH = r'Software\Ubuntu One' SSO_INSTALL_PATH = 'SSOInstallPath' SSO_BASE_PB_PORT = 50000 SSO_RESERVED_PORTS = 3000 SSO_PORT_ALLOCATION_STEP = 3 # contiguous ports for sso, u1client, and u1cp def get_user_id(): """Compute the user id of the currently running process.""" process_handle = win32process.GetCurrentProcess() token_handle = win32security.OpenProcessToken(process_handle, win32security.TOKEN_ALL_ACCESS) user_sid = win32security.GetTokenInformation(token_handle, win32security.TokenUser)[0] sid_parts = str(user_sid).split("-") return int(sid_parts[-1]) def get_sso_pb_port(): """Compute the port the SSO service should run on per-user.""" uid_modulo = get_user_id() % SSO_RESERVED_PORTS return SSO_BASE_PB_PORT + uid_modulo * SSO_PORT_ALLOCATION_STEP class DescriptionFactory(object): """Factory that provides the server and client descriptions.""" client_description_pattern = 'tcp:host=127.0.0.1:port=%s' server_description_pattern = 'tcp:%s:interface=127.0.0.1' def __init__(self): """Create a new instance.""" self.port = get_sso_pb_port() self.server = self.server_description_pattern % self.port self.client = self.client_description_pattern % self.port class UbuntuSSOProxy(UbuntuSSOProxyBase): """Object that exposes the diff referenceable objects.""" name = SSO_SERVICE_NAME @property def description(self): """Get the description on which the SSO pb is running.""" return DescriptionFactory() @property def cmdline(self): """Get the command line to activate an executable.""" return get_bin_cmd(BACKEND_EXECUTABLE) class UbuntuSSOClient(BaseClient): """Base client that provides remote access to the sso API.""" name = SSO_SERVICE_NAME clients = { 'sso_login': SSOLoginClient, 'cred_manager': CredentialsManagementClient, } service_name = UbuntuSSOProxy.name service_description = UbuntuSSOProxy.description service_cmdline = UbuntuSSOProxy.cmdline @defer.inlineCallbacks def get_sso_client(): """Get a client to access the SSO service.""" result = UbuntuSSOClient() yield result.connect() defer.returnValue(result) ubuntu-sso-client-13.10/ubuntu_sso/main/qt.py0000664000202700020270000000533412151461656021506 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2012-2013 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Qt main loop runner.""" # pylint: disable=E0611,F0401 import sys # pylint: disable=W0621 import dbus.mainloop.qt # pylint: enable=W0621 from PyQt4 import QtCore from ubuntu_sso.utils.locale import fix_turkish_locale TIMERS = set() def timeout_func(interval, callback, *a, **kw): """Delay import of dynamic bindings to avoid crashes.""" # QTimers don't support priorities kw.pop("priority", None) timer = QtCore.QTimer() TIMERS.add(timer) def _callback(): """Call the real callback, with arguments, until it returns False.""" if timer in TIMERS: result = callback(*a, **kw) if not result: timer.stop() TIMERS.remove(timer) # Probably overkill timer.deleteLater() timer.timeout.connect(_callback) timer.start(interval) def shutdown_func(*a, **kw): """Delay import of dynamic bindings to avoid crashes.""" QtCore.QCoreApplication.instance().exit() def start_setup(): """Setup the env to run the service.""" fix_turkish_locale() # this has to be created before calling dbus.mainloop.qt.DBusQtMainLoop loop = QtCore.QCoreApplication(sys.argv) dbus.mainloop.qt.DBusQtMainLoop(set_as_default=True) return loop def run_func(loop): """Delay import of dynamic bindings to avoid crashes.""" loop.exec_() ubuntu-sso-client-13.10/ubuntu_sso/main/__init__.py0000664000202700020270000005022612151461656022621 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2011-2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Single Sign On client main module. Provides a utility which accepts requests to the Ubuntu Single Sign On service. The OAuth process is handled, including adding the OAuth access token to the local keyring. """ import sys from twisted.internet import defer from ubuntu_sso import utils from ubuntu_sso.account import Account from ubuntu_sso.credentials import ( Credentials, HELP_TEXT_KEY, PING_URL_KEY, POLICY_URL_KEY, TC_URL_KEY, UI_EXECUTABLE_KEY, UserCancellationError, WINDOW_ID_KEY, ) from ubuntu_sso.keyring import get_token_name, Keyring from ubuntu_sso.logger import setup_logging, log_call from ubuntu_sso.utils import compat logger = setup_logging("ubuntu_sso.main") TIMEOUT_INTERVAL = 10000 # 10 seconds # pylint: disable=C0103, W0703, W0621 if sys.platform == 'win32': from ubuntu_sso.main import windows as source from ubuntu_sso.main.perspective_broker import ( finish_setup, main as main_func, timeout_func, shutdown_func, start_setup, ) source.finish_setup = finish_setup source.timeout_func = timeout_func source.shutdown_func = shutdown_func source.start_setup = start_setup source.main = main_func TIMEOUT_INTERVAL = 10000000000 # forever (hack) elif sys.platform == 'darwin': from ubuntu_sso.main import darwin as source from ubuntu_sso.main.perspective_broker import ( finish_setup, main as main_func, timeout_func, shutdown_func, start_setup, ) source.finish_setup = finish_setup source.timeout_func = timeout_func source.shutdown_func = shutdown_func source.start_setup = start_setup source.main = main_func else: from ubuntu_sso.main import linux as source UbuntuSSOClient = source.UbuntuSSOClient UbuntuSSOProxy = source.UbuntuSSOProxy get_sso_client = source.get_sso_client def except_to_errdict(e): """Turn an exception into a dictionary to return thru IPC.""" result = { "errtype": e.__class__.__name__, } if len(e.args) == 0: result["message"] = e.__class__.__doc__ elif isinstance(e.args[0], dict): result.update(e.args[0]) elif isinstance(e.args[0], compat.basestring): result["message"] = e.args[0] return result class SSOLogin(object): """Login thru the Single Sign On service.""" def __init__(self, proxy): """Initiate the Login object.""" self.processor = Account() self.proxy = proxy @defer.inlineCallbacks def _process_new_token(self, app_name, email, credentials, ping_url): """Process a new set of credentials for 'email'.""" if ping_url: yield utils.ping_url(ping_url, email, credentials) logger.info('Url %r successfully opened!', ping_url) yield Keyring().set_credentials(app_name, credentials) @log_call(logger.debug) def CaptchaGenerated(self, app_name, result): """Signal thrown after the captcha is generated.""" self.proxy.CaptchaGenerated(app_name, result) @log_call(logger.debug) def CaptchaGenerationError(self, app_name, error): """Signal thrown when there's a problem generating the captcha.""" error_dict = except_to_errdict(error) self.proxy.CaptchaGenerationError(app_name, error_dict) @defer.inlineCallbacks def generate_captcha(self, app_name, filename): """Call the matching method in the processor.""" try: result = yield self.processor.generate_captcha(filename) self.CaptchaGenerated(app_name, result) except Exception as e: self.CaptchaGenerationError(app_name, e) @log_call(logger.debug) def UserRegistered(self, app_name, result): """Signal thrown when the user is registered.""" self.proxy.UserRegistered(app_name, result) @log_call(logger.debug) def UserRegistrationError(self, app_name, error): """Signal thrown when there's a problem registering the user.""" error_dict = except_to_errdict(error) self.proxy.UserRegistrationError(app_name, error_dict) @defer.inlineCallbacks def register_user(self, app_name, email, password, name, captcha_id, captcha_solution): """Call the matching method in the processor.""" try: result = yield self.processor.register_user(email, password, name, captcha_id, captcha_solution) self.UserRegistered(app_name, result) except Exception as e: self.UserRegistrationError(app_name, e) @log_call(logger.debug) def LoggedIn(self, app_name, result): """Signal thrown when the user is logged in.""" self.proxy.LoggedIn(app_name, result) @log_call(logger.debug) def LoginError(self, app_name, error): """Signal thrown when there is a problem in the login.""" error_dict = except_to_errdict(error) self.proxy.LoginError(app_name, error_dict) @log_call(logger.debug) def UserNotValidated(self, app_name, email): """Signal thrown when the user is not validated.""" self.proxy.UserNotValidated(app_name, email) @defer.inlineCallbacks def login(self, app_name, email, password, ping_url=None): """Call the matching method in the processor.""" try: token_name = get_token_name(app_name) logger.debug('login: token_name %r, email %r, password .', token_name, email) credentials = yield self.processor.login(email, password, token_name) logger.debug('login returned not None credentials? %r.', credentials is not None) is_validated = yield self.processor.is_validated(credentials) logger.debug('user is validated? %r.', is_validated) if is_validated: yield self._process_new_token(app_name, email, credentials, ping_url) self.LoggedIn(app_name, email) else: self.UserNotValidated(app_name, email) except Exception as e: self.LoginError(app_name, e) @log_call(logger.debug) def EmailValidated(self, app_name, result): """Signal thrown after the email is validated.""" self.proxy.EmailValidated(app_name, result) @log_call(logger.debug) def EmailValidationError(self, app_name, error): """Signal thrown when there's a problem validating the email.""" error_dict = except_to_errdict(error) self.proxy.EmailValidationError(app_name, error_dict) @defer.inlineCallbacks def validate_email(self, app_name, email, password, email_token, ping_url=None): """Call the matching method in the processor.""" try: token_name = get_token_name(app_name) credentials = yield self.processor.validate_email(email, password, email_token, token_name) yield self._process_new_token(app_name, email, credentials, ping_url) self.EmailValidated(app_name, email) except Exception as e: self.EmailValidationError(app_name, e) @log_call(logger.debug) def PasswordResetTokenSent(self, app_name, result): """Signal thrown when the token is succesfully sent.""" self.proxy.PasswordResetTokenSent(app_name, result) @log_call(logger.debug) def PasswordResetError(self, app_name, error): """Signal thrown when there's a problem sending the token.""" error_dict = except_to_errdict(error) self.proxy.PasswordResetError(app_name, error_dict) @defer.inlineCallbacks def request_password_reset_token(self, app_name, email): """Call the matching method in the processor.""" try: result = yield self.processor.request_password_reset_token(email) self.PasswordResetTokenSent(app_name, result) except Exception as e: self.PasswordResetError(app_name, e) @log_call(logger.debug) def PasswordChanged(self, app_name, result): """Signal thrown when the token is succesfully sent.""" self.proxy.PasswordChanged(app_name, result) @log_call(logger.debug) def PasswordChangeError(self, app_name, error): """Signal thrown when there's a problem sending the token.""" error_dict = except_to_errdict(error) self.proxy.PasswordChangeError(app_name, error_dict) @defer.inlineCallbacks def set_new_password(self, app_name, email, token, new_password): """Call the matching method in the processor.""" try: result = yield self.processor.set_new_password(email, token, new_password) self.PasswordChanged(app_name, result) except Exception as e: self.PasswordChangeError(app_name, e) class CredentialsManagement(object): """Object that manages credentials. Every exposed method in this class requires one mandatory argument: - 'app_name': the name of the application. Will be displayed in the GUI header, plus it will be used to find/build/clear tokens. And accepts another parameter named 'args', which is a dictionary that can contain the following: - 'help_text': an explanatory text for the end-users, will be shown below the header. This is an optional free text field. - 'ping_url': the url to open after successful token retrieval. If defined, the email will be attached to the url and will be pinged with a OAuth-signed request. - 'tc_url': the link to the Terms and Conditions page. If defined, the checkbox to agree to the terms will link to it. - 'window_id': the id of the window which will be set as a parent of the GUI. If not defined, no parent will be set. """ def __init__(self, timeout_func, shutdown_func, proxy): super(CredentialsManagement, self).__init__() self._ref_count = 0 self.timeout_func = timeout_func self.shutdown_func = shutdown_func self.proxy = proxy def _get_ref_count(self): """Get value of ref_count.""" return self._ref_count def _set_ref_count(self, new_value): """Set a new value to ref_count.""" logger.debug('ref_count is %r, changing value to %r.', self._ref_count, new_value) if new_value < 0: self._ref_count = 0 msg = 'Attempting to decrease ref_count to a negative value (%r).' logger.warning(msg, new_value) else: self._ref_count = new_value if self._ref_count == 0: logger.debug('Setting up timer with %r (%r, %r).', self.timeout_func, TIMEOUT_INTERVAL, self.shutdown) self.timeout_func(TIMEOUT_INTERVAL, self.shutdown) ref_count = property(fget=_get_ref_count, fset=_set_ref_count) def shutdown(self): """If no ongoing requests, call self.shutdown_func.""" logger.debug('shutdown!, ref_count is %r.', self._ref_count) if self._ref_count == 0: logger.info('Shutting down, calling %r.', self.shutdown_func) self.shutdown_func() valid_keys = (HELP_TEXT_KEY, PING_URL_KEY, POLICY_URL_KEY, TC_URL_KEY, UI_EXECUTABLE_KEY, WINDOW_ID_KEY) def _parse_args(self, args): """Retrieve values from the generic param 'args'.""" result = dict(i for i in args.items() if i[0] in self.valid_keys) result[WINDOW_ID_KEY] = int(args.get(WINDOW_ID_KEY, 0)) return result @log_call(logger.info) def AuthorizationDenied(self, app_name): """Signal thrown when the user denies the authorization.""" self.ref_count -= 1 self.proxy.AuthorizationDenied(app_name) # do not use log_call decorator since we should not log credentials def CredentialsFound(self, app_name, credentials): """Signal thrown when the credentials are found.""" self.ref_count -= 1 logger.info('%s: emitting CredentialsFound with app_name %r.', self.__class__.__name__, app_name) self.proxy.CredentialsFound(app_name, credentials) @log_call(logger.info) def CredentialsNotFound(self, app_name): """Signal thrown when the credentials are not found.""" self.ref_count -= 1 self.proxy.CredentialsNotFound(app_name) @log_call(logger.info) def CredentialsCleared(self, app_name): """Signal thrown when the credentials were cleared.""" self.ref_count -= 1 self.proxy.CredentialsCleared(app_name) @log_call(logger.info) def CredentialsStored(self, app_name): """Signal thrown when the credentials were cleared.""" self.ref_count -= 1 self.proxy.CredentialsStored(app_name) @log_call(logger.error) def CredentialsError(self, app_name, error): """Signal thrown when there is a problem getting the credentials.""" self.ref_count -= 1 if isinstance(error, dict): error_dict = error else: error_dict = except_to_errdict(error) self.proxy.CredentialsError(app_name, error_dict) def find_credentials(self, app_name, args, success_cb=None, error_cb=None): """Look for the credentials for an application. - 'app_name': the name of the application which credentials are going to be removed. - 'args' is a dictionary, currently not used. - 'success_cb', if not None, will be executed if the operation was a success. - 'error_cb', if not None, will be executed if the operation had an error. """ def _analize_creds(credentials): """Find credentials and notify using signals.""" if credentials is not None and len(credentials) > 0: self.CredentialsFound(app_name, credentials) else: self.CredentialsNotFound(app_name) def _tweaked_success_cb(creds): """Decrease ref counter and call 'success_cb'.""" self.ref_count -= 1 success_cb(creds) if success_cb is None: _success_cb = _analize_creds else: _success_cb = _tweaked_success_cb def _tweaked_error_cb(error, app): """Decrease ref counter and call 'error_cb', modifying the dict.""" self.ref_count -= 1 error_cb(except_to_errdict(error.value)) if error_cb is None: _error_cb = lambda f, _: self.CredentialsError(app_name, f.value) else: _error_cb = _tweaked_error_cb self.ref_count += 1 obj = Credentials(app_name) d = obj.find_credentials() d.addCallback(_success_cb) d.addErrback(_error_cb, app_name) def _process_failures(self, failure, app_name): """Process failure returned by the Credentials module.""" if failure.check(UserCancellationError): self.AuthorizationDenied(app_name) else: self.CredentialsError(app_name, failure.value) def clear_credentials(self, app_name, args): """Clear the credentials for an application. - 'app_name': the name of the application which credentials are going to be removed. - 'args' is a dictionary, currently not used. """ self.ref_count += 1 obj = Credentials(app_name) d = obj.clear_credentials() d.addCallback(lambda _: self.CredentialsCleared(app_name)) d.addErrback(lambda f: self.CredentialsError(app_name, f.value)) def store_credentials(self, app_name, args): """Store the token for an application. - 'app_name': the name of the application which credentials are going to be stored. - 'args' is the dictionary holding the credentials. Needs to provide the following mandatory keys: 'token', 'token_key', 'consumer_key', 'consumer_secret'. """ self.ref_count += 1 obj = Credentials(app_name) d = obj.store_credentials(args) d.addCallback(lambda _: self.CredentialsStored(app_name)) d.addErrback(lambda f: self.CredentialsError(app_name, f.value)) def register(self, app_name, args): """Get credentials if found else prompt GUI to register.""" self.ref_count += 1 obj = Credentials(app_name, **self._parse_args(args)) d = obj.register() d.addCallback(lambda creds: self.CredentialsFound(app_name, creds)) d.addErrback(self._process_failures, app_name) def login(self, app_name, args): """Get credentials if found else prompt GUI to login.""" self.ref_count += 1 obj = Credentials(app_name, **self._parse_args(args)) d = obj.login() d.addCallback(lambda creds: self.CredentialsFound(app_name, creds)) d.addErrback(self._process_failures, app_name) def login_email_password(self, app_name, args): """Get credentials if found else try to login. Login will be done by inspecting 'args' and expecting to find two keys: 'email' and 'password'. """ self.ref_count += 1 email = args.pop('email') password = args.pop('password') obj = Credentials(app_name, **self._parse_args(args)) d = obj.login(email=email, password=password) d.addCallback(lambda creds: self.CredentialsFound(app_name, creds)) d.addErrback(self._process_failures, app_name) # pylint: enable=C0103 class UbuntuSSOService(object): """Manager that exposes the diff referenceable objects.""" def __init__(self): self.proxy = UbuntuSSOProxy(self) self.sso_login = None self.cred_manager = None @defer.inlineCallbacks def start(self): """Start the service.""" logger.debug('Starting up Ubuntu SSO service...') try: yield self.proxy.start() except: logger.exception('Can not start Ubuntu SSO service:') raise else: logger.info('Ubuntu SSO service started.') self.sso_login = SSOLogin(proxy=self.proxy.sso_login) self.cred_manager = CredentialsManagement( timeout_func=source.timeout_func, shutdown_func=source.shutdown_func, proxy=self.proxy.cred_manager) def shutdown(self): """Shutdown the service.""" return self.proxy.shutdown() def main(): """Run the backend service.""" logger.info('Setting up Ubuntu SSO service.') loop = source.start_setup() service = UbuntuSSOService() d = service.start() d.addBoth(source.finish_setup, loop) source.main() ubuntu-sso-client-13.10/ubuntu_sso/main/perspective_broker.py0000664000202700020270000002575012151461656024763 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . """Generic SSO client using Twisted Perspective Broker. This module should never import from the multiplatform one (main/__init__.py), but the other way around. Likewise, this module should *not* have any logic regarding error processing or decision making about when to send a given signal. Also, most of the logging is being made in the main module to avoid duplication between the different platform implementations. """ from twisted.internet.task import LoopingCall from twisted.python.failure import Failure from ubuntu_sso.logger import setup_logging from ubuntu_sso.utils.ipc import ( BaseService, RemoteClient, RemoteService, signal, ) logger = setup_logging("ubuntu_sso.main.perspective_broker") SSO_SERVICE_NAME = "ubuntu-sso-client" # Invalid name for signals that are CamelCase # pylint: disable=C0103 class SSOLoginProxy(RemoteService): """Login thru the Single Sign On service.""" remote_calls = [ 'generate_captcha', 'register_user', 'login', 'login_and_ping', 'validate_email', 'validate_email_and_ping', 'request_password_reset_token', 'set_new_password', ] def __init__(self, root, *args, **kwargs): super(SSOLoginProxy, self).__init__(*args, **kwargs) self.root = root # generate_capcha signals @signal def CaptchaGenerated(self, app_name, result): """Signal thrown after the captcha is generated.""" @signal def CaptchaGenerationError(self, app_name, error): """Signal thrown when there's a problem generating the captcha.""" def generate_captcha(self, app_name, filename): """Call the matching method in the processor.""" self.root.sso_login.generate_captcha(app_name, filename) # register_user signals @signal def UserRegistered(self, app_name, result): """Signal thrown when the user is registered.""" @signal def UserRegistrationError(self, app_name, error): """Signal thrown when there's a problem registering the user.""" def register_user(self, app_name, email, password, name, captcha_id, captcha_solution): """Call the matching method in the processor.""" self.root.sso_login.register_user(app_name, email, password, name, captcha_id, captcha_solution) # login signals @signal def LoggedIn(self, app_name, result): """Signal thrown when the user is logged in.""" @signal def LoginError(self, app_name, error): """Signal thrown when there is a problem in the login.""" @signal def UserNotValidated(self, app_name, result): """Signal thrown when the user is not validated.""" def login(self, app_name, email, password, ping_url=None): """Call the matching method in the processor.""" self.root.sso_login.login(app_name, email, password, ping_url) login_and_ping = login # validate_email signals @signal def EmailValidated(self, app_name, result): """Signal thrown after the email is validated.""" @signal def EmailValidationError(self, app_name, error): """Signal thrown when there's a problem validating the email.""" def validate_email(self, app_name, email, password, email_token, ping_url=None): """Call the matching method in the processor.""" self.root.sso_login.validate_email(app_name, email, password, email_token, ping_url) validate_email_and_ping = validate_email # request_password_reset_token signals @signal def PasswordResetTokenSent(self, app_name, result): """Signal thrown when the token is succesfully sent.""" @signal def PasswordResetError(self, app_name, error): """Signal thrown when there's a problem sending the token.""" def request_password_reset_token(self, app_name, email): """Call the matching method in the processor.""" self.root.sso_login.request_password_reset_token(app_name, email) # set_new_password signals @signal def PasswordChanged(self, app_name, result): """Signal thrown when the token is succesfully sent.""" @signal def PasswordChangeError(self, app_name, error): """Signal thrown when there's a problem sending the token.""" def set_new_password(self, app_name, email, token, new_password): """Call the matching method in the processor.""" self.root.sso_login.set_new_password(app_name, email, token, new_password) class CredentialsManagementProxy(RemoteService): """Object that manages credentials. Every exposed method in this class requires one mandatory argument: - 'app_name': the name of the application. Will be displayed in the GUI header, plus it will be used to find/build/clear tokens. And accepts another parameter named 'args', which is a dictionary that can contain the following: - 'help_text': an explanatory text for the end-users, will be shown below the header. This is an optional free text field. - 'ping_url': the url to open after successful token retrieval. If defined, the email will be attached to the url and will be pinged with a OAuth-signed request. - 'tc_url': the link to the Terms and Conditions page. If defined, the checkbox to agree to the terms will link to it. - 'window_id': the id of the window which will be set as a parent of the GUI. If not defined, no parent will be set. """ remote_calls = [ 'find_credentials', 'clear_credentials', 'store_credentials', 'register', 'login', 'login_email_password', ] def __init__(self, root, *args, **kwargs): super(CredentialsManagementProxy, self).__init__(*args, **kwargs) self.root = root @signal def AuthorizationDenied(self, app_name): """Signal thrown when the user denies the authorization.""" @signal def CredentialsFound(self, app_name, credentials): """Signal thrown when the credentials are found.""" @signal def CredentialsNotFound(self, app_name): """Signal thrown when the credentials are not found.""" @signal def CredentialsCleared(self, app_name): """Signal thrown when the credentials were cleared.""" @signal def CredentialsStored(self, app_name): """Signal thrown when the credentials were cleared.""" @signal def CredentialsError(self, app_name, error_dict): """Signal thrown when there is a problem getting the credentials.""" def find_credentials(self, app_name, args): """Look for the credentials for an application. - 'app_name': the name of the application which credentials are going to be removed. - 'args' is a dictionary, currently not used. """ self.root.cred_manager.find_credentials(app_name, args) def clear_credentials(self, app_name, args): """Clear the credentials for an application. - 'app_name': the name of the application which credentials are going to be removed. - 'args' is a dictionary, currently not used. """ self.root.cred_manager.clear_credentials(app_name, args) def store_credentials(self, app_name, args): """Store the token for an application. - 'app_name': the name of the application which credentials are going to be stored. - 'args' is the dictionary holding the credentials. Needs to provide the following mandatory keys: 'token', 'token_key', 'consumer_key', 'consumer_secret'. """ self.root.cred_manager.store_credentials(app_name, args) def register(self, app_name, args): """Get credentials if found else prompt GUI to register.""" self.root.cred_manager.register(app_name, args) def login(self, app_name, args): """Get credentials if found else prompt GUI to login.""" self.root.cred_manager.login(app_name, args) def login_email_password(self, app_name, args): """Get credentials if found, else login using email and password. - 'args' should contain at least the follwing keys: 'email' and 'password'. Those will be used to issue a new SSO token, which will be returned trough the CredentialsFound signal. """ self.root.cred_manager.login_email_password(app_name, args) class UbuntuSSOProxyBase(BaseService): """Object that exposes the diff referenceable objects.""" services = { 'sso_login': SSOLoginProxy, 'cred_manager': CredentialsManagementProxy, } name = SSO_SERVICE_NAME # ============================== client classes ============================== class SSOLoginClient(RemoteClient): """Client that can perform calls to the remote SSOLogin object.""" call_remote_functions = SSOLoginProxy.remote_calls signal_handlers = [ 'CaptchaGenerated', 'CaptchaGenerationError', 'UserRegistered', 'UserRegistrationError', 'LoggedIn', 'LoginError', 'UserNotValidated', 'EmailValidated', 'EmailValidationError', 'PasswordResetTokenSent', 'PasswordResetError', 'PasswordChanged', 'PasswordChangeError', ] class CredentialsManagementClient(RemoteClient): """Client that can perform calls to the remote CredManagement object.""" call_remote_functions = CredentialsManagementProxy.remote_calls signal_handlers = [ 'AuthorizationDenied', 'CredentialsFound', 'CredentialsNotFound', 'CredentialsCleared', 'CredentialsStored', 'CredentialsError', ] def add_timeout(interval, callback, *args, **kwargs): """Add a timeout callback as a task.""" time_out_task = LoopingCall(callback, *args, **kwargs) time_out_task.start(interval / 1000, now=False) timeout_func = add_timeout start_setup = lambda *a, **kw: None # the reactor does have run and stop methods # pylint: disable=E1101 def shutdown_func(): """Stop the reactor.""" from twisted.internet import reactor reactor.stop() def finish_setup(result, loop): """Stop the reactor if a failure ocurred.""" if isinstance(result, Failure): shutdown_func() def main(): """Run the specific mainloop.""" from twisted.internet import reactor reactor.run() # pylint: enable=E1101 ubuntu-sso-client-13.10/ubuntu_sso/main/linux.py0000664000202700020270000004473712151461656022233 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2009-2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Main module implementation specific for linux. This module should never import from the multiplatform one (main/__init__.py), but the other way around. Likewise, this module should *not* have any logic regarding error processing or decision making about when to send a given signal. Also, most of the logging is being made in the main module to avoid duplication between the different platform implementations. """ import signal import dbus import dbus.service from twisted.internet import defer from ubuntu_sso import ( DBUS_ACCOUNT_PATH, DBUS_BUS_NAME, DBUS_CREDENTIALS_IFACE, DBUS_CREDENTIALS_PATH, DBUS_IFACE_USER_NAME, NO_OP, ) from ubuntu_sso.logger import setup_logging # Disable the invalid name warning, as we have a lot of DBus style names # pylint: disable=C0103 logger = setup_logging("ubuntu_sso.main.linux") class SSOLoginProxy(dbus.service.Object): """Login thru the Single Sign On service.""" # Use of super on an old style class # pylint: disable=E1002 def __init__(self, root, *args, **kwargs): """Initiate the Login object.""" # pylint: disable=E1002 super(SSOLoginProxy, self).__init__(*args, **kwargs) self.root = root # Operator not preceded by a space (fails with dbus decorators) # pylint: disable=C0322 # generate_capcha signals @dbus.service.signal(DBUS_IFACE_USER_NAME, signature="ss") def CaptchaGenerated(self, app_name, result): """Signal thrown after the captcha is generated.""" @dbus.service.signal(DBUS_IFACE_USER_NAME, signature="sa{ss}") def CaptchaGenerationError(self, app_name, error): """Signal thrown when there's a problem generating the captcha.""" @dbus.service.method(dbus_interface=DBUS_IFACE_USER_NAME, in_signature='ss') def generate_captcha(self, app_name, filename): """Call the matching method in the processor.""" self.root.sso_login.generate_captcha(app_name, filename) # register_user signals @dbus.service.signal(DBUS_IFACE_USER_NAME, signature="ss") def UserRegistered(self, app_name, result): """Signal thrown when the user is registered.""" @dbus.service.signal(DBUS_IFACE_USER_NAME, signature="sa{ss}") def UserRegistrationError(self, app_name, error): """Signal thrown when there's a problem registering the user.""" @dbus.service.method(dbus_interface=DBUS_IFACE_USER_NAME, in_signature='ssssss') def register_user(self, app_name, email, password, name, captcha_id, captcha_solution): """Call the matching method in the processor.""" self.root.sso_login.register_user(app_name, email, password, name, captcha_id, captcha_solution) # login signals @dbus.service.signal(DBUS_IFACE_USER_NAME, signature="ss") def LoggedIn(self, app_name, result): """Signal thrown when the user is logged in.""" @dbus.service.signal(DBUS_IFACE_USER_NAME, signature="sa{ss}") def LoginError(self, app_name, error): """Signal thrown when there is a problem in the login.""" @dbus.service.signal(DBUS_IFACE_USER_NAME, signature="ss") def UserNotValidated(self, app_name, result): """Signal thrown when the user is not validated.""" @dbus.service.method(dbus_interface=DBUS_IFACE_USER_NAME, in_signature='sss') def login(self, app_name, email, password): """Call the matching method in the processor.""" self.root.sso_login.login(app_name, email, password, ping_url=None) @dbus.service.method(dbus_interface=DBUS_IFACE_USER_NAME, in_signature='ssss') def login_and_ping(self, app_name, email, password, ping_url): """Call the matching method in the processor.""" self.root.sso_login.login(app_name, email, password, ping_url) # validate_email signals @dbus.service.signal(DBUS_IFACE_USER_NAME, signature="ss") def EmailValidated(self, app_name, result): """Signal thrown after the email is validated.""" @dbus.service.signal(DBUS_IFACE_USER_NAME, signature="sa{ss}") def EmailValidationError(self, app_name, error): """Signal thrown when there's a problem validating the email.""" @dbus.service.method(dbus_interface=DBUS_IFACE_USER_NAME, in_signature='ssss') def validate_email(self, app_name, email, password, email_token): """Call the matching method in the processor.""" self.root.sso_login.validate_email(app_name, email, password, email_token, ping_url=None) @dbus.service.method(dbus_interface=DBUS_IFACE_USER_NAME, in_signature='sssss') def validate_email_and_ping(self, app_name, email, password, email_token, ping_url): """Call the matching method in the processor.""" self.root.sso_login.validate_email(app_name, email, password, email_token, ping_url) # request_password_reset_token signals @dbus.service.signal(DBUS_IFACE_USER_NAME, signature="ss") def PasswordResetTokenSent(self, app_name, result): """Signal thrown when the token is succesfully sent.""" @dbus.service.signal(DBUS_IFACE_USER_NAME, signature="sa{ss}") def PasswordResetError(self, app_name, error): """Signal thrown when there's a problem sending the token.""" @dbus.service.method(dbus_interface=DBUS_IFACE_USER_NAME, in_signature='ss') def request_password_reset_token(self, app_name, email): """Call the matching method in the processor.""" self.root.sso_login.request_password_reset_token(app_name, email) # set_new_password signals @dbus.service.signal(DBUS_IFACE_USER_NAME, signature="ss") def PasswordChanged(self, app_name, result): """Signal thrown when the token is succesfully sent.""" @dbus.service.signal(DBUS_IFACE_USER_NAME, signature="sa{ss}") def PasswordChangeError(self, app_name, error): """Signal thrown when there's a problem sending the token.""" @dbus.service.method(dbus_interface=DBUS_IFACE_USER_NAME, in_signature='ssss') def set_new_password(self, app_name, email, token, new_password): """Call the matching method in the processor.""" self.root.sso_login.set_new_password(app_name, email, token, new_password) class CredentialsManagementProxy(dbus.service.Object): """Object that manages credentials. Every exposed method in this class requires one mandatory argument: - 'app_name': the name of the application. Will be displayed in the GUI header, plus it will be used to find/build/clear tokens. And accepts another parameter named 'args', which is a dictionary that can contain the following: - 'help_text': an explanatory text for the end-users, will be shown below the header. This is an optional free text field. - 'ping_url': the url to open after successful token retrieval. If defined, the email will be attached to the url and will be pinged with a OAuth-signed request. - 'tc_url': the link to the Terms and Conditions page. If defined, the checkbox to agree to the terms will link to it. - 'window_id': the id of the window which will be set as a parent of the GUI. If not defined, no parent will be set. """ # Use of super on an old style class # pylint: disable=E1002 def __init__(self, root, *args, **kwargs): # pylint: disable=E1002 super(CredentialsManagementProxy, self).__init__(*args, **kwargs) self.root = root # Operator not preceded by a space (fails with dbus decorators) # pylint: disable=C0322 @dbus.service.signal(DBUS_CREDENTIALS_IFACE, signature='s') def AuthorizationDenied(self, app_name): """Signal thrown when the user denies the authorization.""" @dbus.service.signal(DBUS_CREDENTIALS_IFACE, signature='sa{ss}') def CredentialsFound(self, app_name, credentials): """Signal thrown when the credentials are found.""" @dbus.service.signal(DBUS_CREDENTIALS_IFACE, signature='s') def CredentialsNotFound(self, app_name): """Signal thrown when the credentials are not found.""" @dbus.service.signal(DBUS_CREDENTIALS_IFACE, signature='s') def CredentialsCleared(self, app_name): """Signal thrown when the credentials were cleared.""" @dbus.service.signal(DBUS_CREDENTIALS_IFACE, signature='s') def CredentialsStored(self, app_name): """Signal thrown when the credentials were cleared.""" @dbus.service.signal(DBUS_CREDENTIALS_IFACE, signature='sa{ss}') def CredentialsError(self, app_name, error_dict): """Signal thrown when there is a problem getting the credentials.""" @dbus.service.method(dbus_interface=DBUS_CREDENTIALS_IFACE, in_signature='sa{ss}', out_signature='') def find_credentials(self, app_name, args): """Look for the credentials for an application. - 'app_name': the name of the application which credentials are going to be removed. - 'args' is a dictionary, currently not used. """ self.root.cred_manager.find_credentials(app_name, args) @dbus.service.method(dbus_interface=DBUS_CREDENTIALS_IFACE, in_signature="sa{ss}", out_signature="a{ss}", async_callbacks=("reply_handler", "error_handler")) def find_credentials_sync(self, app_name, args, reply_handler=NO_OP, error_handler=NO_OP): """Get the credentials from the keyring or {} if not there. This method SHOULD NOT be used, is here only for compatibilty issues. """ def _drop_dict(error_dict): """Call 'error_handler' properly.""" error_handler(dbus.service.DBusException(error_dict['errtype'])) self.root.cred_manager.find_credentials(app_name, args, success_cb=reply_handler, error_cb=_drop_dict) @dbus.service.method(dbus_interface=DBUS_CREDENTIALS_IFACE, in_signature='sa{ss}', out_signature='') def clear_credentials(self, app_name, args): """Clear the credentials for an application. - 'app_name': the name of the application which credentials are going to be removed. - 'args' is a dictionary, currently not used. """ self.root.cred_manager.clear_credentials(app_name, args) @dbus.service.method(dbus_interface=DBUS_CREDENTIALS_IFACE, in_signature='sa{ss}', out_signature='') def store_credentials(self, app_name, args): """Store the token for an application. - 'app_name': the name of the application which credentials are going to be stored. - 'args' is the dictionary holding the credentials. Needs to provide the following mandatory keys: 'token', 'token_key', 'consumer_key', 'consumer_secret'. """ self.root.cred_manager.store_credentials(app_name, args) @dbus.service.method(dbus_interface=DBUS_CREDENTIALS_IFACE, in_signature='sa{ss}', out_signature='') def register(self, app_name, args): """Get credentials if found else prompt GUI to register.""" self.root.cred_manager.register(app_name, args) @dbus.service.method(dbus_interface=DBUS_CREDENTIALS_IFACE, in_signature='sa{ss}', out_signature='') def login(self, app_name, args): """Get credentials if found else prompt GUI to login.""" self.root.cred_manager.login(app_name, args) @dbus.service.method(dbus_interface=DBUS_CREDENTIALS_IFACE, in_signature='sa{ss}', out_signature='') def login_email_password(self, app_name, args): """Get credentials if found, else login using email and password. - 'args' should contain at least the follwing keys: 'email' and 'password'. Those will be used to issue a new SSO token, which will be returned trough the CredentialsFound signal. """ self.root.cred_manager.login_email_password(app_name, args) class UbuntuSSOProxy(object): """Object that exposes the diff referenceable objects.""" def __init__(self, root): self.root = root self.sso_login = None self.cred_manager = None try: self.bus = dbus.SessionBus() except dbus.service.DBusException as e: logger.exception(e) shutdown_func() def start(self): """Start listening, nothing async to be done in this platform.""" # Register DBus service for making sure we run only one instance name = self.bus.request_name(DBUS_BUS_NAME, dbus.bus.NAME_FLAG_DO_NOT_QUEUE) if name == dbus.bus.REQUEST_NAME_REPLY_EXISTS: raise AlreadyStartedError() bus_name = dbus.service.BusName(DBUS_BUS_NAME, bus=self.bus) self.sso_login = SSOLoginProxy(self.root, bus_name=bus_name, object_path=DBUS_ACCOUNT_PATH) self.cred_manager = CredentialsManagementProxy(self.root, bus_name=bus_name, object_path=DBUS_CREDENTIALS_PATH) return defer.succeed(None) def shutdown(self): """Shutdown the service.""" self.sso_login.remove_from_connection() self.cred_manager.remove_from_connection() self.bus.release_name(DBUS_BUS_NAME) return defer.succeed(None) # ============================== client classes ============================== class RemoteClient(object): """Client that can perform calls to remote DBus object.""" bus_name = None path = None interface = None def __init__(self): self.bus = dbus.SessionBus() obj = self.bus.get_object(bus_name=self.bus_name, object_path=self.path, follow_name_owner_changes=True) self.dbus_iface = dbus.Interface(obj, dbus_interface=self.interface) self.dbus_iface.call_method = self.call_method self.dbus_iface.disconnect_from_signal = lambda _, sig: sig.remove() def call_method(self, method_name, *args, **kwargs): """Call asynchronously 'method_name(*args)'. Return a deferred that will be fired when the call finishes. """ d = defer.Deferred() reply_handler = kwargs.get('reply_handler', None) if reply_handler is not None: d.addCallback(lambda a: reply_handler(*a)) error_handler = kwargs.get('error_handler', None) if error_handler is not None: d.addErrback(lambda f: error_handler(f.value)) self.bus.call_async( bus_name=self.bus_name, object_path=self.path, dbus_interface=self.interface, method=method_name, signature=None, args=args, reply_handler=lambda *a: d.callback(a), error_handler=d.errback) return d class SSOLoginClient(RemoteClient): """Access the UserManagement DBus interface.""" bus_name = DBUS_BUS_NAME path = DBUS_ACCOUNT_PATH interface = DBUS_IFACE_USER_NAME class CredentialsManagementClient(RemoteClient): """Access the CredentialsManagement DBus interface.""" bus_name = DBUS_BUS_NAME path = DBUS_CREDENTIALS_PATH interface = DBUS_CREDENTIALS_IFACE class UbuntuSSOClient(object): """Base client that provides remote access to the sso API.""" def __init__(self): self.sso_login = SSOLoginClient().dbus_iface self.cred_manager = CredentialsManagementClient().dbus_iface def connect(self): """No need to connect DBus proxy objects.""" return defer.succeed(None) def disconnect(self): """No need to disconnect DBus proxy objects.""" return defer.succeed(None) def get_sso_client(): """Get a client to access the SSO service.""" result = UbuntuSSOClient() return defer.succeed(result) try: from ubuntu_sso.main import qt source = qt except ImportError: # no PyQt4.QtCore in the system from ubuntu_sso.main import glib source = glib timeout_func = source.timeout_func shutdown_func = source.shutdown_func start_setup = source.start_setup def sighup_handler(*a, **kw): """Stop the service.""" # This handler may be called in any thread, so is not thread safe. # See the link below for info: # www.listware.net/201004/gtk-devel-list/115067-unix-signals-in-glib.html logger.info("Stoping Ubuntu SSO service since SIGHUP was received.") shutdown_func() class AlreadyStartedError(Exception): """The backend service has already been started.""" def finish_setup(result, loop): """Run the specific mainloop only if no failure ocurred.""" if result is None: # no failure ocurred, start the service logger.debug("Hooking up SIGHUP with handler %r.", sighup_handler) signal.signal(signal.SIGHUP, sighup_handler) source.run_func(loop) def main(): """Run the specific mainloop.""" ubuntu-sso-client-13.10/ubuntu_sso/main/darwin.py0000664000202700020270000000627012151461656022346 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2009-2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . """Main module implementation specific for darwin (OS X). This module should never import from the multiplatform one (main/__init__.py), but the other way around. Likewise, this module should *not* have any logic regarding error processing or decision making about when to send a given signal. Also, most of the logging is being made in the main module to avoid duplication between the different platform implementations. """ import os import os.path from dirspec import basedir from twisted.internet import defer from ubuntu_sso import BACKEND_EXECUTABLE from ubuntu_sso.logger import setup_logging from ubuntu_sso.utils import get_bin_cmd from ubuntu_sso.utils.ipc import BaseClient from ubuntu_sso.main.perspective_broker import ( SSO_SERVICE_NAME, SSOLoginClient, CredentialsManagementClient, UbuntuSSOProxyBase, ) # Invalid name for signals that are CamelCase # pylint: disable=C0103 logger = setup_logging("ubuntu_sso.main.darwin") SSO_INSTALL_PATH = 'SSOInstallPath' def get_sso_domain_socket(): """Compute the domain socket for the sso ipc.""" path = os.path.join(basedir.xdg_cache_home, 'sso', 'ipc') return path class DescriptionFactory(object): """Factory that provides the server and client descriptions.""" client_description_pattern = 'unix:path=%s' server_description_pattern = 'unix:%s' def __init__(self): """Create a new instance.""" self.domain = get_sso_domain_socket() self.server = self.server_description_pattern % self.domain self.client = self.client_description_pattern % self.domain class UbuntuSSOProxy(UbuntuSSOProxyBase): """Object that exposes the diff referenceable objects.""" name = SSO_SERVICE_NAME @property def description(self): """Get the description on which the SSO pb is running.""" return DescriptionFactory() @property def cmdline(self): """Get the command line to activate an executable.""" return get_bin_cmd(BACKEND_EXECUTABLE) class UbuntuSSOClient(BaseClient): """Base client that provides remote access to the sso API.""" name = SSO_SERVICE_NAME clients = { 'sso_login': SSOLoginClient, 'cred_manager': CredentialsManagementClient, } service_name = UbuntuSSOProxy.name service_description = UbuntuSSOProxy.description service_cmdline = UbuntuSSOProxy.cmdline @defer.inlineCallbacks def get_sso_client(): """Get a client to access the SSO service.""" result = UbuntuSSOClient() yield result.connect() defer.returnValue(result) ubuntu-sso-client-13.10/ubuntu_sso/main/tests/0000755000202700020270000000000012225013301021621 5ustar dobeydobey00000000000000ubuntu-sso-client-13.10/ubuntu_sso/main/tests/windows.py0000664000202700020270000000356612151461656023723 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . """Utility classes for testing main on windows.""" from twisted.internet import defer from ubuntu_sso import main from ubuntu_sso.utils.tests.test_ipc import BaseIPCTestCase class BaseTestCase(BaseIPCTestCase): """The base test case with platform specific support.""" client_class = main.UbuntuSSOClient service_class = lambda *a: main.UbuntuSSOProxy(None) @defer.inlineCallbacks def setUp(self): self.sso_service = None def service_factory(*args): """Returns the service class.""" self.sso_service = main.UbuntuSSOService() return main.UbuntuSSOProxy(self.sso_service) self.service_class = service_factory yield super(BaseTestCase, self).setUp() # set the proxy to be the service started by the parent test class self.sso_service.proxy = self.service # patch the start of the proxy since the parent setup started it self.patch(self.sso_service.proxy, 'start', lambda: defer.succeed(None)) # start the service which will perform all the required operations # except the proxy start yield self.sso_service.start() self.sso_client = self.client ubuntu-sso-client-13.10/ubuntu_sso/main/tests/test_qt.py0000664000202700020270000000761112151461656023707 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2012-2013 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Qt specific tests for the main module.""" # pylint: disable=F0401 from PyQt4 import QtCore from twisted.internet import defer from ubuntu_sso.main import qt from ubuntu_sso.tests import TestCase class MiscTestCase(TestCase): """Tests for module level misc functions.""" def clean_timers(self): """Remove all timers.""" for timer in qt.TIMERS: timer.stop() qt.TIMERS = set() @defer.inlineCallbacks def setUp(self): yield super(MiscTestCase, self).setUp() self.addCleanup(self.clean_timers) def test_timeout_func_ignores_priority(self): """Should not pass priority as argument.""" qt.timeout_func(0, self._set_called, priority="crazy") QtCore.QCoreApplication.instance().processEvents() self.assertEqual(self._called, ((), {})) def test_timeout_func_keeps_reference(self): """Should keep a reference to the timer created.""" self.assertEqual(len(qt.TIMERS), 0) qt.timeout_func(0, self._set_called, priority="crazy") self.assertEqual(len(qt.TIMERS), 1) def test_timeout_func_removes_reference(self): """Remove reference to timer when callback returns False.""" self.assertEqual(len(qt.TIMERS), 0) qt.timeout_func(0, self._set_called, priority="crazy") self.assertEqual(len(qt.TIMERS), 1) QtCore.QCoreApplication.instance().processEvents() self.assertEqual(len(qt.TIMERS), 0) def test_timeout_func_timer_activation(self): """The timer should be activated with the right period.""" self.assertEqual(len(qt.TIMERS), 0) qt.timeout_func(1337, self._set_called, priority="crazy") self.assertEqual(len(qt.TIMERS), 1) self.assertEqual(list(qt.TIMERS)[0].interval(), 1337) def test_timeout_func_argument_passing(self): """The right arguments should be passed to the callback.""" qt.timeout_func(0, self._set_called, 1, name="a") QtCore.QCoreApplication.instance().processEvents() self.assertEqual(self._called, ((1,), {"name": "a"})) def test_start_setup_calls_turkish_fix(self): """The start_setup function calls the turkish fix function.""" self.patch(qt.QtCore, "QCoreApplication", lambda *args, **kwargs: object()) self.patch(qt.dbus.mainloop.qt, "DBusQtMainLoop", lambda **kwargs: None) called = [] self.patch(qt, "fix_turkish_locale", lambda: called.append(1)) qt.start_setup() self.assertEqual(called, [1]) ubuntu-sso-client-13.10/ubuntu_sso/main/tests/ubuntuone.reg0000664000202700020270000000211212151461656024364 0ustar dobeydobey00000000000000ÿþWindows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Ubuntu One] "path-ubuntu-sso-client"="e:\\ubuntu-sso-client\\use-tcp-activation\\dist\\windows-ubuntu-sso-client.exe" "path-ubuntuone-syncdaemon"="e:\\ubuntuone-client\\build-right\\dist\\ubuntuone-syncdaemon.exe" [HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Ubuntu One] "path-ubuntu-sso-client"="e:\\ubuntu-sso-client\\use-tcp-activation\\dist\\windows-ubuntu-sso-client.exe" "path-ubuntuone-syncdaemon"="e:\\ubuntuone-client\\build-right\\dist\\ubuntuone-syncdaemon.exe" ubuntu-sso-client-13.10/ubuntu_sso/main/tests/__init__.py0000664000202700020270000000462512151461656023765 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # Author: Manuel de la Pena # # Copyright 2011-2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Test the different main implementations.""" import sys from twisted.internet import defer from ubuntu_sso.tests import TOKEN # Invalid name "BaseTestCase" # pylint: disable=C0103 if sys.platform == 'win32': from ubuntu_sso.main.tests import windows BaseTestCase = windows.BaseTestCase else: from ubuntu_sso.main.tests import linux BaseTestCase = linux.BaseTestCase # pylint: enable=C0103 class FakedCredentials(object): """A very dummy Credentials object.""" def find_credentials(self, *a, **kw): """Retrieve credentials.""" return defer.succeed(TOKEN) def clear_credentials(self, *a, **kw): """Clear credentials.""" return defer.succeed(None) def store_credentials(self, *a, **kw): """Store credentials.""" return defer.succeed(None) def register(self, *a, **kw): """Register.""" return defer.succeed(TOKEN) def login(self, *a, **kw): """Login.""" return defer.succeed(TOKEN) ubuntu-sso-client-13.10/ubuntu_sso/main/tests/test_linux.py0000664000202700020270000000452312151461656024421 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Tests for the main SSO Linux client code.""" # pylint: disable=C0103 do_tests = False try: import dbus import dbus.service from ubuntu_sso.main import linux as main do_tests = True except ImportError: do_tests = False # pylint enable=C0103 from ubuntuone.devtools.testcases import BaseTestCase, skipIf @skipIf(not do_tests, 'Tests only work with DBus and linux imports.') class LinuxProxyTestCase(BaseTestCase): """Test some Linux specific cases.""" def test_dbus_missing_exists_clean(self): """Test that dbus-daemon not being available gives us a clean exit.""" def patched(*args, **kwargs): """Method to patch in for testing.""" raise dbus.service.DBusException( 'org.freedesktop.DBus.Error.NoServer') self.patch(dbus, "SessionBus", patched) self.patch(main, "shutdown_func", patched) self.assertRaises(dbus.service.DBusException, main.UbuntuSSOProxy, None) ubuntu-sso-client-13.10/ubuntu_sso/main/tests/linux.py0000664000202700020270000000237612151461656023366 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . """Utility classes used for testing main on linux.""" from twisted.internet import defer from ubuntu_sso import main from ubuntuone.devtools.testcases.dbus import DBusTestCase class BaseTestCase(DBusTestCase): """The base test case with platform specific support.""" @defer.inlineCallbacks def setUp(self): yield super(BaseTestCase, self).setUp() self.sso_service = main.UbuntuSSOService() yield self.sso_service.start() self.addCleanup(self.sso_service.shutdown) self.sso_client = yield main.get_sso_client() self.addCleanup(self.sso_client.disconnect) ubuntu-sso-client-13.10/ubuntu_sso/main/tests/test_darwin.py0000664000202700020270000000421412151461656024543 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . """Darwin specific tests for the main module.""" import os from dirspec import basedir from twisted.internet import defer from ubuntu_sso.main import darwin from ubuntu_sso.tests import TestCase # because we are using twisted we have java like names C0103 # pylint: disable=C0103 class DarwinTestCase(TestCase): """Tests for module level misc functions""" def test_get_sso_pb_port(self): """Test the get_sso_pb_port function, by patching os.getuid""" expected = os.path.join(basedir.xdg_cache_home, 'sso', 'ipc') self.assertEqual(darwin.get_sso_domain_socket(), expected) class DescriptionFactoryTestcase(TestCase): """Test the factory.""" @defer.inlineCallbacks def setUp(self): """Set the tests.""" yield super(DescriptionFactoryTestcase, self).setUp() self.domain = '/path/to/domain' self.patch(darwin, 'get_sso_domain_socket', lambda: self.domain) def test_server_description(self): """Test getting the description info.""" expected = darwin.DescriptionFactory.server_description_pattern % \ self.domain factory = darwin.DescriptionFactory() self.assertEqual(expected, factory.server) def test_client_description(self): """Test getting the description info.""" expected = darwin.DescriptionFactory.client_description_pattern % \ self.domain factory = darwin.DescriptionFactory() self.assertEqual(expected, factory.client) ubuntu-sso-client-13.10/ubuntu_sso/main/tests/test_common.py0000664000202700020270000012025412151461656024552 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2009-2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Tests for the main SSO client code.""" from __future__ import unicode_literals import logging from functools import partial from twisted.internet import defer from ubuntuone.devtools.handlers import MementoHandler from ubuntu_sso import main from ubuntu_sso.main import ( CredentialsManagement, except_to_errdict, SSOLogin, TIMEOUT_INTERVAL, UbuntuSSOService, ) from ubuntu_sso.main import ( HELP_TEXT_KEY, PING_URL_KEY, POLICY_URL_KEY, TC_URL_KEY, UI_EXECUTABLE_KEY, WINDOW_ID_KEY, ) from ubuntu_sso.main.tests import FakedCredentials from ubuntu_sso.tests import ( APP_NAME, CAPTCHA_ID, CAPTCHA_SOLUTION, EMAIL, EMAIL_TOKEN, HELP_TEXT, NAME, PASSWORD, PING_URL, POLICY_URL, Recorder, TC_URL, TestCase, TOKEN, WINDOW_ID, ) # Access to a protected member 'yyy' of a client class # pylint: disable=W0212 class SampleException(Exception): """A sample exception.""" class FakedProxy(Recorder): """A faked multiplatform proxy.""" class FakedAccount(Recorder): """A faked Account processor.""" class FakedCredentialsFactory(Recorder): """A very dummy Credentials object.""" credentials = FakedCredentials() # pylint: disable=C0103 def Credentials(self, *a, **kw): """Return always the same Credentials instance.""" return self.credentials # pylint: enable=C0103 class TestExceptToErrdictException(Exception): """A dummy exception for the following testcase.""" class ExceptToErrdictTestCase(TestCase): """Tests for the except_to_errdict function.""" def test_first_arg_is_dict(self): """If the first arg is a dict, use it as the base dict.""" sample_dict = { "errorcode1": "error message 1", "errorcode2": "error message 2", "errorcode3": "error message 3", } e = TestExceptToErrdictException(sample_dict) result = except_to_errdict(e) self.assertEqual(result["errtype"], e.__class__.__name__) for k in sample_dict.keys(): self.assertIn(k, result) self.assertEqual(result[k], sample_dict[k]) def test_first_arg_is_str(self): """If the first arg is a str, use it as the message.""" sample_string = "a sample string" e = TestExceptToErrdictException(sample_string) result = except_to_errdict(e) self.assertEqual(result["errtype"], e.__class__.__name__) self.assertEqual(result["message"], sample_string) def test_first_arg_is_exception(self): """If the first arg is an Exception, use it's message attribute'.""" class MyException(Exception): """Custom Exception.""" message = 'My custom error for ♥ Ubuntu' my_exc = MyException(message) result = except_to_errdict(my_exc) self.assertEqual(result["errtype"], my_exc.__class__.__name__) self.assertEqual(result["message"], message) def test_first_arg_is_unicode(self): """If the first arg is a unicode, use it as the message.""" sample_string = "a sample string" e = TestExceptToErrdictException(sample_string) result = except_to_errdict(e) self.assertEqual(result["errtype"], e.__class__.__name__) self.assertEqual(result["message"], sample_string) def test_no_args_at_all(self): """If there are no args, use the class docstring.""" e = TestExceptToErrdictException() result = except_to_errdict(e) self.assertEqual(result["errtype"], e.__class__.__name__) self.assertEqual(result["message"], e.__class__.__doc__) def test_some_other_thing_as_first_arg(self): """If first arg is not basestring nor dict, then repr all args.""" sample_args = (None, "unicode2\ufffd", "errorcode3") e = TestExceptToErrdictException(*sample_args) result = except_to_errdict(e) self.assertEqual(result["errtype"], e.__class__.__name__) class BaseTestCase(TestCase): """Base test case.""" timeout = 2 @defer.inlineCallbacks def setUp(self): yield super(BaseTestCase, self).setUp() self.proxy = FakedProxy() self.deferred = defer.Deferred() def assert_recorder_called(self, fake, method, *args, **kwargs): """Check that 'fake.method(*args, **kwargs)' was called.""" self.assertEqual(fake._called[method], [(args, kwargs)]) def callback_deferred(self, *a): """Callback self.deferred with a as result.""" self.deferred.callback(a) def errback_deferred(self, signal_name, *a): """Errback self.deferred with an AssertionError as error.""" msg = 'Received unexpected signal %r with params %r.' self.deferred.errback(AssertionError(msg % (signal_name, a))) class SSOLoginBaseTestCase(BaseTestCase): """Base test case for testing the SSOLogin class.""" @defer.inlineCallbacks def setUp(self): yield super(SSOLoginBaseTestCase, self).setUp() def ksc(keyring, k, val): """Assert over token and app_name.""" self.assertEqual(k, APP_NAME) self.assertEqual(val, TOKEN) self.keyring_was_set = True return defer.succeed(None) self.patch(main.Keyring, "set_credentials", ksc) self.patch(main, 'Account', FakedAccount) self.keyring_was_set = False self.obj = SSOLogin(self.proxy) def test_creation(self): """Test that the object creation is successful.""" self.assertIsInstance(self.obj.processor, main.Account) self.assertTrue(self.obj.proxy is self.proxy) class SSOLoginTestCase(SSOLoginBaseTestCase): """Test the SSOLogin class.""" @defer.inlineCallbacks def test_generate_captcha(self): """Test that the captcha method works ok.""" filename = "sample filename" expected_result = "expected result" self.patch(self.obj, "CaptchaGenerated", self.callback_deferred) self.patch(self.obj, "CaptchaGenerationError", partial(self.errback_deferred, "CaptchaGenerationError")) self.obj.processor._next_result = defer.succeed(expected_result) self.obj.generate_captcha(APP_NAME, filename) app_name, result = yield self.deferred self.assertEqual(result, expected_result) self.assertEqual(app_name, APP_NAME) self.assert_recorder_called(self.obj.processor, 'generate_captcha', filename) @defer.inlineCallbacks def test_register_user(self): """Test that the register_user method works ok.""" expected_result = "expected result" self.patch(self.obj, "UserRegistered", self.callback_deferred) self.patch(self.obj, "UserRegistrationError", partial(self.errback_deferred, "UserRegistrationError")) self.obj.processor._next_result = defer.succeed(expected_result) self.obj.register_user(APP_NAME, EMAIL, PASSWORD, NAME, CAPTCHA_ID, CAPTCHA_SOLUTION) app_name, result = yield self.deferred self.assertEqual(result, expected_result) self.assertEqual(app_name, APP_NAME) self.assert_recorder_called(self.obj.processor, 'register_user', EMAIL, PASSWORD, NAME, CAPTCHA_ID, CAPTCHA_SOLUTION) @defer.inlineCallbacks def test_login(self): """Test that the login method works ok when used is validated.""" self.patch(self.obj, "LoggedIn", self.callback_deferred) self.patch(self.obj, "LoginError", partial(self.errback_deferred, "LoginError")) self.patch(self.obj, "UserNotValidated", partial(self.errback_deferred, "UserNotValidated")) self.patch(self.obj.processor, 'is_validated', lambda _: True) self.obj.processor._next_result = TOKEN self.obj.login(APP_NAME, EMAIL, PASSWORD) app_name, result = yield self.deferred self.assertEqual(result, EMAIL) self.assertEqual(app_name, APP_NAME) self.assertTrue(self.keyring_was_set, "The keyring should be set") self.assert_recorder_called(self.obj.processor, 'login', EMAIL, PASSWORD, main.get_token_name(APP_NAME)) self.assert_recorder_called(self.obj.processor, 'is_validated', TOKEN) @defer.inlineCallbacks def test_login_is_not_validated(self): """Test that the login method works ok when user is not validated.""" self.patch(self.obj, "LoggedIn", partial(self.errback_deferred, "LoggedIn")) self.patch(self.obj, "LoginError", partial(self.errback_deferred, "LoginError")) self.patch(self.obj, "UserNotValidated", self.callback_deferred) self.patch(self.obj.processor, 'is_validated', lambda _: False) self.obj.processor._next_result = TOKEN self.obj.login(APP_NAME, EMAIL, PASSWORD) app_name, result = yield self.deferred self.assertEqual(result, EMAIL) self.assertEqual(app_name, APP_NAME) self.assertFalse(self.keyring_was_set, "The keyring should not be set") self.assert_recorder_called(self.obj.processor, 'login', EMAIL, PASSWORD, main.get_token_name(APP_NAME)) self.assert_recorder_called(self.obj.processor, 'is_validated', TOKEN) @defer.inlineCallbacks def test_validate_email(self): """Test that the validate_email method works ok.""" self.patch(self.obj, "EmailValidated", self.callback_deferred) self.patch(self.obj, "EmailValidationError", partial(self.errback_deferred, "EmailValidationError")) self.obj.processor._next_result = TOKEN self.obj.validate_email(APP_NAME, EMAIL, PASSWORD, EMAIL_TOKEN) app_name, result = yield self.deferred self.assertEqual(result, EMAIL) self.assertEqual(app_name, APP_NAME) self.assertTrue(self.keyring_was_set, "The keyring should be set") self.assert_recorder_called(self.obj.processor, 'validate_email', EMAIL, PASSWORD, EMAIL_TOKEN, main.get_token_name(APP_NAME)) @defer.inlineCallbacks def test_request_password_reset_token(self): """Test that the request_password_reset_token method works ok.""" self.patch(self.obj, "PasswordResetTokenSent", self.callback_deferred) self.patch(self.obj, "PasswordResetError", partial(self.errback_deferred, "PasswordResetError")) self.obj.processor._next_result = EMAIL self.obj.request_password_reset_token(APP_NAME, EMAIL) app_name, result = yield self.deferred self.assertEqual(result, EMAIL) self.assertEqual(app_name, APP_NAME) self.assert_recorder_called(self.obj.processor, 'request_password_reset_token', EMAIL) @defer.inlineCallbacks def test_set_new_password(self): """Test that the set_new_password method works ok.""" self.patch(self.obj, "PasswordChanged", self.callback_deferred) self.patch(self.obj, "PasswordChangeError", partial(self.errback_deferred, "PasswordChangeError")) self.obj.processor._next_result = EMAIL self.obj.set_new_password(APP_NAME, EMAIL, EMAIL_TOKEN, PASSWORD) app_name, result = yield self.deferred self.assertEqual(result, EMAIL) self.assertEqual(app_name, APP_NAME) self.assert_recorder_called(self.obj.processor, 'set_new_password', EMAIL, EMAIL_TOKEN, PASSWORD) class SSOLoginWithErrorTestCase(SSOLoginTestCase): """Test the SSOLogin class.""" def sample_fail(self, *args): """Fail predictably.""" raise SampleException("Sample message") @defer.inlineCallbacks def test_generate_captcha(self): """Test that the captcha method fails as expected.""" filename = "sample filename" self.patch(self.obj, "CaptchaGenerated", partial(self.errback_deferred, "CaptchaGenerated")) self.patch(self.obj, "CaptchaGenerationError", self.callback_deferred) self.patch(self.obj.processor, "generate_captcha", self.sample_fail) self.obj.generate_captcha(APP_NAME, filename) app_name, error = yield self.deferred self.assertTrue(isinstance(error, SampleException)) self.assertEqual(app_name, APP_NAME) @defer.inlineCallbacks def test_register_user(self): """Test that the register_user method fails as expected.""" self.patch(self.obj, "UserRegistered", partial(self.errback_deferred, "UserRegistered")) self.patch(self.obj, "UserRegistrationError", self.callback_deferred) self.patch(self.obj.processor, "register_user", self.sample_fail) self.obj.register_user(APP_NAME, EMAIL, PASSWORD, NAME, CAPTCHA_ID, CAPTCHA_SOLUTION) app_name, error = yield self.deferred self.assertTrue(isinstance(error, SampleException)) self.assertEqual(app_name, APP_NAME) @defer.inlineCallbacks def test_login(self): """Test that the login method works ok.""" def fake_gtn(*args): """A fake get_token_name that fails.""" raise SampleException() self.patch(main, "get_token_name", fake_gtn) self.patch(self.obj, "LoggedIn", partial(self.errback_deferred, "LoggedIn")) self.patch(self.obj, "LoginError", self.callback_deferred) self.patch(self.obj, "UserNotValidated", partial(self.errback_deferred, "UserNotValidated")) self.obj.login(APP_NAME, EMAIL, PASSWORD) app_name, error = yield self.deferred self.assertEqual(app_name, APP_NAME) self.assertTrue(isinstance(error, SampleException)) self.assertFalse(self.keyring_was_set, "Keyring should not be set") @defer.inlineCallbacks def test_login_is_not_validated(self): """Test that the login method works ok.""" def fake_validate(*args): """A fake get_token_name that fails.""" raise SampleException() self.patch(self.obj, "LoggedIn", partial(self.errback_deferred, "LoggedIn")) self.patch(self.obj, "LoginError", self.callback_deferred) self.patch(self.obj, "UserNotValidated", partial(self.errback_deferred, "UserNotValidated")) self.patch(self.obj.processor, 'is_validated', fake_validate) self.obj.login(APP_NAME, EMAIL, PASSWORD) app_name, error = yield self.deferred self.assertEqual(app_name, APP_NAME) self.assertTrue(isinstance(error, SampleException)) self.assertFalse(self.keyring_was_set, "Keyring should not be set") @defer.inlineCallbacks def test_login_set_credentials(self): """The login method fails as expected when set_credentials fails.""" def fake_set_creds(*args): """A fake Keyring.set_credentials that fails.""" return defer.fail(SampleException()) self.patch(main.Keyring, "set_credentials", fake_set_creds) self.patch(self.obj, "LoggedIn", partial(self.errback_deferred, "LoggedIn")) self.patch(self.obj, "LoginError", self.callback_deferred) self.patch(self.obj, "UserNotValidated", partial(self.errback_deferred, "UserNotValidated")) self.patch(self.obj.processor, "login", lambda *args: defer.succeed(None)) self.patch(self.obj.processor, "is_validated", lambda *args: defer.succeed(True)) self.obj.login(APP_NAME, EMAIL, PASSWORD) app_name, error = yield self.deferred self.assertEqual(app_name, APP_NAME) self.assertTrue(isinstance(error, SampleException)) self.assertFalse(self.keyring_was_set, "Keyring should not be set") @defer.inlineCallbacks def test_validate_email(self): """Test that the validate_email method fails as expected.""" def fake_gtn(*args): """A fake get_token_name that fails.""" raise SampleException() self.patch(main, "get_token_name", fake_gtn) self.patch(self.obj, "EmailValidated", partial(self.errback_deferred, "EmailValidated")) self.patch(self.obj, "EmailValidationError", self.callback_deferred) self.obj.validate_email(APP_NAME, EMAIL, PASSWORD, EMAIL_TOKEN) app_name, error = yield self.deferred self.assertEqual(app_name, APP_NAME) self.assertTrue(isinstance(error, SampleException)) self.assertFalse(self.keyring_was_set, "Keyring should not be set") @defer.inlineCallbacks def test_request_password_reset_token(self): """Test the request_password_reset_token method fails as expected.""" self.patch(self.obj, "PasswordResetTokenSent", partial(self.errback_deferred, "PasswordResetTokenSent")) self.patch(self.obj, "PasswordResetError", self.callback_deferred) self.patch(self.obj.processor, "request_password_reset_token", lambda _: defer.fail(SampleException())) self.obj.request_password_reset_token(APP_NAME, EMAIL) app_name, error = yield self.deferred self.assertTrue(isinstance(error, SampleException)) self.assertEqual(app_name, APP_NAME) @defer.inlineCallbacks def test_set_new_password(self): """Test that the set_new_password method fails as expected.""" self.patch(self.obj, "PasswordChanged", partial(self.errback_deferred, "PasswordChanged")) self.patch(self.obj, "PasswordChangeError", self.callback_deferred) self.patch(self.obj.processor, "set_new_password", lambda *args: defer.fail(SampleException())) self.obj.set_new_password(APP_NAME, EMAIL, EMAIL_TOKEN, PASSWORD) app_name, error = yield self.deferred self.assertTrue(isinstance(error, SampleException)) self.assertEqual(app_name, APP_NAME) class PingUrlOnNewToken(SSOLoginBaseTestCase): """The test case for the operations that pings a given url.""" method = 'login' args = (APP_NAME, EMAIL, PASSWORD, PING_URL) success_signal = 'LoggedIn' error_signal = 'LoginError' unexpected_signals = ('UserNotValidated',) @defer.inlineCallbacks def setUp(self): yield super(PingUrlOnNewToken, self).setUp() self.patch(main.utils, 'ping_url', self.my_ping) self.patch(self.obj.processor, 'is_validated', lambda _: True) self.obj.processor._next_result = TOKEN self._next_ping_result = defer.succeed('foo') for i in self.unexpected_signals: self.patch(self.obj, i, partial(self.errback_deferred, i)) def my_ping(self, *a): """Fake the ping_url method.""" self._called = a return self._next_ping_result @defer.inlineCallbacks def test_url_is_pinged(self): """The method calls self.success_signal when ping was completed.""" self.patch(self.obj, self.success_signal, self.callback_deferred) self.patch(self.obj, self.error_signal, partial(self.errback_deferred, self.error_signal)) getattr(self.obj, self.method)(*self.args) app_name, result = yield self.deferred # url was pinged with the utils.ping_url method self.assertEqual(self._called, (PING_URL, EMAIL, TOKEN)) # token was stored in the keyring self.assertTrue(self.keyring_was_set, "The keyring should be set") self.assertEqual(app_name, APP_NAME) self.assertEqual(result, EMAIL) @defer.inlineCallbacks def test_ping_url_raises_exception(self): """Exception is handled if ping fails.""" self.patch(self.obj, self.error_signal, self.callback_deferred) self.patch(self.obj, self.success_signal, partial(self.errback_deferred, self.success_signal)) error = 'Blu' self._next_ping_result = defer.fail(ValueError(error)) getattr(self.obj, self.method)(*self.args) app_name, error = yield self.deferred # token was not stored in the keyring self.assertFalse(self.keyring_was_set, "The keyring should not be set") self.assertEqual(app_name, APP_NAME) self.assertIsInstance(error, ValueError) self.assertIn('Blu', error.message) class PingUrlOnNewTokenEmailValidated(PingUrlOnNewToken): """The test case for the operations that pings a given url.""" method = 'validate_email' args = (APP_NAME, EMAIL, PASSWORD, EMAIL_TOKEN, PING_URL) success_signal = 'EmailValidated' error_signal = 'EmailValidationError' unexpected_signals = () class CredentialsManagementTestCase(BaseTestCase): """Tests for the CredentialsManagement DBus interface.""" base_args = { HELP_TEXT_KEY: HELP_TEXT, PING_URL_KEY: PING_URL, POLICY_URL_KEY: POLICY_URL, TC_URL_KEY: TC_URL, WINDOW_ID_KEY: WINDOW_ID, UI_EXECUTABLE_KEY: 'super-ui', } @defer.inlineCallbacks def setUp(self): yield super(CredentialsManagementTestCase, self).setUp() self.factory = FakedCredentialsFactory() self.patch(main, 'Credentials', self.factory.Credentials) self.obj = CredentialsManagement(timeout_func=lambda *a: None, shutdown_func=lambda *a: None, proxy=self.proxy) self.args = {} self.cred_args = {} self.memento = MementoHandler() self.memento.setLevel(logging.DEBUG) main.logger.addHandler(self.memento) self.addCleanup(main.logger.removeHandler, self.memento) class CredentialsManagementRefCountingTestCase(CredentialsManagementTestCase): """Tests for the CredentialsManagement ref counting.""" @defer.inlineCallbacks def assert_refcounter_increased(self, method_name, signal_name=None): """Assert that calling 'method_name' increases the ref counter.""" if signal_name is not None: d = defer.Deferred() self.patch(self.obj, signal_name, lambda *a: d.callback(a)) else: d = defer.succeed(None) getattr(self.obj, method_name)(APP_NAME, self.args) yield d self.assertEqual(self.obj.ref_count, 1) def assert_refcounter_decreased(self, signal_name, *a, **kw): """Assert that calling 'signal_name' decreases the ref counter.""" self.obj.ref_count = 3 getattr(self.obj, signal_name)(*a, **kw) self.assertEqual(self.obj.ref_count, 2) def assert_refcounter_negative(self, signal_name, *a, **kw): """Assert that calling 'signal_name' decreases the ref counter. If decreased value is negative, assert that a warning log was made. """ self.obj._ref_count = -3 # overwrite internal to force a negative getattr(self.obj, signal_name)(*a, **kw) self.assertEqual(self.obj.ref_count, 0) msg = 'Attempting to decrease ref_count to a negative value (-4).' self.assertTrue(self.memento.check_warning(msg)) def test_ref_counting(self): """Ref counting is in place.""" self.assertEqual(self.obj.ref_count, 0) @defer.inlineCallbacks def test_find_credentials(self): """Keep proper track of ongoing requests.""" yield self.assert_refcounter_increased('find_credentials', 'CredentialsFound') @defer.inlineCallbacks def test_find_credentials_with_success_cb(self): """Keep proper track of ongoing requests.""" d = defer.Deferred() counter = [] def in_the_middle(): """Store the ref_count value.""" counter.append(self.obj.ref_count) return defer.succeed(TOKEN) self.patch(self.factory.credentials, 'find_credentials', in_the_middle) self.obj.find_credentials(APP_NAME, self.args, success_cb=d.callback, error_cb=d.errback) yield d self.assertEqual(counter, [1]) self.assertEqual(self.obj.ref_count, 0) @defer.inlineCallbacks def test_find_credentials_with_error_cb(self): """Keep proper track of ongoing requests.""" d = defer.Deferred() counter = [] def in_the_middle(): """Store the ref_count value.""" counter.append(self.obj.ref_count) return defer.fail(SampleException('foo')) self.patch(self.factory.credentials, 'find_credentials', in_the_middle) self.obj.find_credentials(APP_NAME, self.args, success_cb=d.errback, error_cb=d.callback) yield d self.assertEqual(counter, [1]) self.assertEqual(self.obj.ref_count, 0) @defer.inlineCallbacks def test_clear_credentials(self): """Keep proper track of ongoing requests.""" yield self.assert_refcounter_increased('clear_credentials', 'CredentialsCleared') @defer.inlineCallbacks def test_store_credentials(self): """Keep proper track of ongoing requests.""" yield self.assert_refcounter_increased('store_credentials', 'CredentialsStored') def test_register(self): """Keep proper track of ongoing requests.""" yield self.assert_refcounter_increased('register', 'CredentialsFound') def test_login(self): """Keep proper track of ongoing requests.""" yield self.assert_refcounter_increased('login', 'CredentialsFound') def test_several_requests(self): """Requests can be nested.""" # by patching the CredentialsFound signal, the counter is not decreased self.patch(self.obj, 'CredentialsFound', lambda *a: None) self.obj.login(APP_NAME, self.args) self.obj.register(APP_NAME, self.args) self.obj.login(APP_NAME, self.args) self.obj.register(APP_NAME, self.args) self.obj.register(APP_NAME, self.args) self.assertEqual(self.obj.ref_count, 5) def test_credentials_found(self): """Ref counter is decreased when a signal is sent.""" self.assert_refcounter_decreased('CredentialsFound', APP_NAME, TOKEN) def test_credentials_not_found(self): """Ref counter is decreased when a signal is sent.""" self.assert_refcounter_decreased('CredentialsNotFound', APP_NAME) def test_credentials_cleared(self): """Ref counter is decreased when a signal is sent.""" self.assert_refcounter_decreased('CredentialsCleared', APP_NAME) def test_credentials_stored(self): """Ref counter is decreased when a signal is sent.""" self.assert_refcounter_decreased('CredentialsStored', APP_NAME) def test_credentials_error(self): """Ref counter is decreased when a signal is sent.""" self.assert_refcounter_decreased('CredentialsError', APP_NAME, SampleException('test')) def test_authorization_denied(self): """Ref counter is decreased when a signal is sent.""" self.assert_refcounter_decreased('AuthorizationDenied', APP_NAME) def test_credentials_found_when_ref_count_is_not_positive(self): """Ref counter is decreased when a signal is sent.""" self.assert_refcounter_negative('CredentialsFound', APP_NAME, TOKEN) def test_credentials_not_found_when_ref_count_is_not_positive(self): """Ref counter is decreased when a signal is sent.""" self.assert_refcounter_negative('CredentialsNotFound', APP_NAME) def test_credentials_cleared_when_ref_count_is_not_positive(self): """Ref counter is decreased when a signal is sent.""" self.assert_refcounter_negative('CredentialsCleared', APP_NAME) def test_credentials_stored_when_ref_count_is_not_positive(self): """Ref counter is decreased when a signal is sent.""" self.assert_refcounter_negative('CredentialsStored', APP_NAME) def test_credentials_error_when_ref_count_is_not_positive(self): """Ref counter is decreased when a signal is sent.""" self.assert_refcounter_negative('CredentialsError', APP_NAME, SampleException('test')) def test_autorization_denied_when_ref_count_is_not_positive(self): """Ref counter is decreased when a signal is sent.""" self.assert_refcounter_negative('AuthorizationDenied', APP_NAME) def test_on_zero_ref_count_shutdown(self): """When ref count reaches 0, queue shutdown op.""" self.patch(self.obj, 'timeout_func', self._set_called) self.obj.login(APP_NAME, self.args) self.assertEqual(self._called, ((TIMEOUT_INTERVAL, self.obj.shutdown), {})) def test_on_non_zero_ref_count_do_not_shutdown(self): """If ref count is not 0, do not queue shutdown op.""" self.patch(self.obj, 'timeout_func', self._set_called) # by patching the CredentialsFound signal, the counter is not decreased self.patch(self.obj, 'CredentialsFound', lambda *a: None) self.obj.login(APP_NAME, self.args) self.assertEqual(self._called, False) def test_on_non_zero_ref_count_after_zero_do_not_shutdown(self): """If the shutdown was queued, do not quit if counter is not zero.""" def fake_timeout_func(interval, func): """Start a new request when the timer is started.""" # the counter is not decreased self.patch(self.obj, 'CredentialsFound', lambda *a: None) self.obj.register(APP_NAME, self.args) assert self.obj.ref_count > 0 func() self.patch(self.obj, 'timeout_func', fake_timeout_func) self.patch(self.obj, 'shutdown_func', self._set_called) self.obj.login(APP_NAME, self.args) # counter reached 0, timeout_func was called and register was called self.assertEqual(self._called, False, 'shutdown_func was not called') def test_zero_ref_count_after_zero_do_shutdown(self): """If the shutdown was queued, do quit if counter is zero.""" def fake_timeout_func(interval, func): """Start a new request when the timer is started.""" assert self.obj.ref_count == 0 func() self.patch(self.obj, 'timeout_func', fake_timeout_func) self.patch(self.obj, 'shutdown_func', self._set_called) self.obj.login(APP_NAME, self.args) # counter reached 0, timeout_func was called self.assertEqual(self._called, ((), {}), 'shutdown_func was called') class CredentialsManagementClearTestCase(CredentialsManagementTestCase): """Tests for the CredentialsManagement clear method.""" method = 'clear_credentials' success_signal = 'CredentialsCleared' success_result = (APP_NAME,) others_should_errback = [] @defer.inlineCallbacks def setUp(self): yield super(CredentialsManagementClearTestCase, self).setUp() self.call_method = getattr(self.obj, self.method) def test_backend_called(self): """The credentials backend is properly called.""" self.call_method(APP_NAME, self.args) self.assert_recorder_called(self.factory, 'Credentials', APP_NAME) @defer.inlineCallbacks def test_does_not_block(self): """Calling 'method' does not block but return thru signals.""" self.patch(self.obj, self.success_signal, self.callback_deferred) self.patch(self.obj, 'CredentialsError', partial(self.errback_deferred, 'CredentialsError')) for signal in self.others_should_errback: self.patch(self.obj, signal, partial(self.errback_deferred, signal)) self.call_method(APP_NAME, self.args) result = yield self.deferred self.assertEqual(result, self.success_result) @defer.inlineCallbacks def test_handles_error(self): """If calling the backend fails, CredentialsError is sent.""" self.patch(self.obj, self.success_signal, partial(self.errback_deferred, self.success_signal)) self.patch(self.obj, 'CredentialsError', self.callback_deferred) exc = SampleException('baz') self.patch(self.factory.credentials, self.method, lambda *a: defer.fail(exc)) self.call_method(APP_NAME, self.args) app_name, error = yield self.deferred self.assertEqual(error, exc) self.assertEqual(app_name, APP_NAME) class CredentialsManagementStoreTestCase(CredentialsManagementClearTestCase): """Tests for the CredentialsManagement store method.""" method = 'store_credentials' success_signal = 'CredentialsStored' class CredentialsManagementFindTestCase(CredentialsManagementClearTestCase): """Tests for the CredentialsManagement find method.""" method = 'find_credentials' success_signal = 'CredentialsFound' success_result = (APP_NAME, TOKEN) others_should_errback = ['CredentialsNotFound'] @defer.inlineCallbacks def test_find_credentials_with_success_cb(self): """The credentials are asked and returned in a thread_execute call.""" d = defer.Deferred() self.obj.find_credentials(APP_NAME, self.args, success_cb=d.callback, error_cb=d.errback) creds = yield d expected = yield self.factory.credentials.find_credentials() self.assertEqual(creds, expected) self.assert_recorder_called(self.factory, 'Credentials', APP_NAME) @defer.inlineCallbacks def test_find_credentials_with_error_cb(self): """If find_credentials fails, error_cb is called.""" d = defer.Deferred() self.patch(self.factory.credentials, 'find_credentials', lambda *a: defer.fail(SampleException('baz'))) self.obj.find_credentials(APP_NAME, self.args, success_cb=d.errback, error_cb=d.callback) errdict = yield d self.assertEqual(errdict["errtype"], "SampleException") self.assert_recorder_called(self.factory, 'Credentials', APP_NAME) class CredentialsManagementNotFindTestCase(CredentialsManagementFindTestCase): """Tests for the CredentialsManagement find method.""" success_signal = 'CredentialsNotFound' success_result = (APP_NAME,) others_should_errback = ['CredentialsFound'] @defer.inlineCallbacks def setUp(self): yield super(CredentialsManagementNotFindTestCase, self).setUp() self.call_method = getattr(self.obj, self.method) self.patch(self.factory.credentials, self.method, lambda: defer.succeed({})) class CredentialsManagementOpsTestCase(CredentialsManagementTestCase): """Tests for the CredentialsManagement login/register methods.""" @defer.inlineCallbacks def setUp(self): yield super(CredentialsManagementOpsTestCase, self).setUp() self.args = dict(self.base_args) self.args[WINDOW_ID_KEY] = str(self.args[WINDOW_ID_KEY]) self.cred_args = self.base_args.copy() def test_register(self): """The registration is correct.""" self.obj.register(APP_NAME, self.args) self.assert_recorder_called(self.factory, 'Credentials', APP_NAME, **self.cred_args) def test_login(self): """The login is correct.""" self.obj.login(APP_NAME, self.args) self.assert_recorder_called(self.factory, 'Credentials', APP_NAME, **self.cred_args) def test_login_email_password(self): """The login_email_password is correct.""" self.args['email'] = EMAIL self.args['password'] = PASSWORD self.obj.login_email_password(APP_NAME, self.args) self.assert_recorder_called(self.factory, 'Credentials', APP_NAME, **self.cred_args) class CredentialsManagementParamsTestCase(CredentialsManagementOpsTestCase): """Tests for the CredentialsManagement extra parameters handling.""" @defer.inlineCallbacks def setUp(self): yield super(CredentialsManagementParamsTestCase, self).setUp() self.args['dummy'] = 'nothing useful' class CredentialsManagementSignalsTestCase(CredentialsManagementTestCase): """Tests for the CredentialsManagement DBus signals.""" def assert_signal_logged(self, signal, *args): """Check that signal info was properly logged.""" signal(APP_NAME, *args) msgs = [self.obj.__class__.__name__, signal.__name__, repr(APP_NAME)] self.assertTrue(self.memento.check_info(*msgs)) def test_credentials_found(self): """The CredentialsFound signal.""" self.assert_signal_logged(self.obj.CredentialsFound, TOKEN) msg = 'credentials must not be logged (found %r in log).' for val in TOKEN.itervalues(): self.assertFalse(self.memento.check_info(val), msg % val) def test_credentials_not_found(self): """The CredentialsNotFound signal.""" self.assert_signal_logged(self.obj.CredentialsNotFound) def test_credentials_cleared(self): """The CredentialsCleared signal.""" self.assert_signal_logged(self.obj.CredentialsCleared) def test_credentials_stored(self): """The CredentialsStored signal.""" self.assert_signal_logged(self.obj.CredentialsStored) def test_credentials_error(self): """The CredentialsError signal.""" error = {'error_message': 'failed!', 'detailed error': 'yadda yadda'} self.obj.CredentialsError(APP_NAME, error) msgs = (self.obj.__class__.__name__, self.obj.CredentialsError.__name__, repr(APP_NAME), repr(error)) self.assertTrue(self.memento.check_error(*msgs)) def test_authorization_denied(self): """The AuthorizationDenied signal.""" self.assert_signal_logged(self.obj.AuthorizationDenied) class UbuntuSSOServiceTestCase(BaseTestCase): """Test suite for the UbuntuSSOService class.""" @defer.inlineCallbacks def setUp(self): yield super(UbuntuSSOServiceTestCase, self).setUp() self.proxy.sso_login = object() self.proxy.cred_manager = object() self.params = [] self.patch(main, 'UbuntuSSOProxy', lambda _: self.params.append(_) or self.proxy) self.obj = UbuntuSSOService() yield self.obj.start() def test_creation(self): """Creation paremeter is properly used.""" self.assertEqual(self.params, [self.obj]) def test_sso_login(self): """Attributes has the expected value.""" self.assertIsInstance(self.obj.sso_login, SSOLogin) self.assertTrue(self.obj.sso_login.proxy is self.proxy.sso_login) def test_cred_manager(self): """Attributes has the expected value.""" self.assertIsInstance(self.obj.cred_manager, CredentialsManagement) self.assertTrue(self.obj.cred_manager.proxy is self.proxy.cred_manager) ubuntu-sso-client-13.10/ubuntu_sso/main/tests/test_windows.py0000664000202700020270000001137712151461656024761 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2011-2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Windows specific tests for the main module.""" from twisted.internet import defer from ubuntu_sso.main import windows from ubuntu_sso.tests import TestCase # because we are using twisted we have java like names C0103 # pylint: disable=C0103 class MockWin32APIs(object): """Some mock win32apis.""" process_handle = object() TOKEN_ALL_ACCESS = object() TokenUser = object() def __init__(self, sample_token): """Initialize this mock instance.""" self.sample_token = sample_token self.token_handle = object() def GetCurrentProcess(self): """Returns a fake process_handle.""" return self.process_handle def OpenProcessToken(self, process_handle, access): """Open the process token.""" assert process_handle is self.process_handle assert access is self.TOKEN_ALL_ACCESS return self.token_handle def GetTokenInformation(self, token_handle, info): """Get the information for this token.""" assert token_handle == self.token_handle assert info == self.TokenUser return (self.sample_token, 0) # pylint: enable=C0103 class MiscTestCase(TestCase): """Tests for module level misc functions.""" def test_get_userid(self): """The returned user id is parsed ok.""" expected_id = 1001 sample_token = "abc-123-1001" win32apis = MockWin32APIs(sample_token) self.patch(windows, "win32process", win32apis) self.patch(windows, "win32security", win32apis) userid = windows.get_user_id() self.assertEqual(userid, expected_id) def _test_port_assignation(self, uid, expected_port): """Test a given uid/expected port combo.""" self.patch(windows, "get_user_id", lambda: uid) self.assertEqual(windows.get_sso_pb_port(), expected_port) def test_get_sso_pb_port(self): """Test the get_sso_pb_port function.""" uid = 1001 uid_modulo = uid % windows.SSO_RESERVED_PORTS expected_port = (windows.SSO_BASE_PB_PORT + uid_modulo * windows.SSO_PORT_ALLOCATION_STEP) self._test_port_assignation(uid, expected_port) def test_get_sso_pb_port_alt(self): """Test the get_sso_pb_port function.""" uid = 2011 + windows.SSO_RESERVED_PORTS uid_modulo = uid % windows.SSO_RESERVED_PORTS expected_port = (windows.SSO_BASE_PB_PORT + uid_modulo * windows.SSO_PORT_ALLOCATION_STEP) self._test_port_assignation(uid, expected_port) class DescriptionFactoryTestcase(TestCase): """Test the factory.""" @defer.inlineCallbacks def setUp(self): """Set the tests.""" yield super(DescriptionFactoryTestcase, self).setUp() self.port = 55555 self.patch(windows, 'get_sso_pb_port', lambda: self.port) def test_server_description(self): """Test getting the description info.""" expected = windows.DescriptionFactory.server_description_pattern % \ self.port factory = windows.DescriptionFactory() self.assertEqual(expected, factory.server) def test_client_description(self): """Test getting the description info.""" expected = windows.DescriptionFactory.client_description_pattern % \ self.port factory = windows.DescriptionFactory() self.assertEqual(expected, factory.client) ubuntu-sso-client-13.10/ubuntu_sso/main/tests/test_clients.py0000664000202700020270000003062612151461656024726 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Tests for the main SSO client code.""" from twisted.internet import defer from ubuntuone.devtools.testcases import skipIfOS from ubuntu_sso import main from ubuntu_sso.tests import ( APP_NAME, CAPTCHA_ID, CAPTCHA_SOLUTION, EMAIL, EMAIL_TOKEN, NAME, PASSWORD, TOKEN, ) from ubuntu_sso.main.tests import BaseTestCase, FakedCredentials FILENAME = 'sample filename' class FakedKeyring(object): """A faked Keyring object.""" _keys = {} def get_credentials(self, app_name): """Return the credentials for app_name.""" return defer.succeed(self._keys.get(app_name, {})) def delete_credentials(self, app_name): """Delete the credentials for app_name.""" self._keys.pop(app_name, None) return defer.succeed(None) def set_credentials(self, app_name, token): """Store the credentials for app_name.""" self._keys[app_name] = token return defer.succeed(None) class AbstractTestCase(BaseTestCase): """The base test case with platform specific support.""" timeout = 2 method = None backend_method = method params = () success_signal = None backend_result = None success_result = None error_signal = None @defer.inlineCallbacks def setUp(self): # avoid putting stuff in the mainloops this MUST be done # before the parent setUp is called because it will register # the callbacks self.patch(main.source, 'timeout_func', lambda *a: None) self.patch(main.source, 'shutdown_func', lambda *a: None) yield super(AbstractTestCase, self).setUp() self.keyring = FakedKeyring() self.patch(main, 'Keyring', lambda: self.keyring) self.test_client = self.patchable_backend = None if self.backend_method is None: self.backend_method = self.method def _backend_succeed(self, *args, **kwargs): """Make self.patchable_backend return self.backend_result.""" return self.backend_result def _backend_fail(self, *args, **kwargs): """Make self.patchable_backend raise an exception.""" raise ValueError((args, kwargs)) @defer.inlineCallbacks def assert_method_correct(self, success_signal, error_signal, patched_backend_method, expected_result=None): """Calling 'self.method' works ok. Check that 'success_signal' is emitted, and make the test fail if error_signal is received. The self.patchable_backend will be patched with 'patched_backend_method'. """ if self.method is None: defer.returnValue(None) d = defer.Deferred() cb = lambda *a: d.callback(a) match = self.test_client.connect_to_signal(success_signal, cb) self.addCleanup(self.test_client.disconnect_from_signal, success_signal, match) eb = lambda *a: d.errback(AssertionError(a)) match = self.test_client.connect_to_signal(error_signal, eb) self.addCleanup(self.test_client.disconnect_from_signal, error_signal, match) self.patch(self.patchable_backend, self.backend_method, patched_backend_method) yield self.test_client.call_method(self.method, *self.params) result = yield d self.assertEqual(expected_result, result) def test_success(self): """Test that the 'method' works ok.""" success_signal = self.success_signal error_signal = self.error_signal patched_backend_method = self._backend_succeed expected_result = self.success_result return self.assert_method_correct(success_signal, error_signal, patched_backend_method, expected_result) def test_error(self): """Test that the 'method' fails as expected.""" success_signal = self.error_signal error_signal = self.success_signal patched_backend_method = self._backend_fail expected_result = (APP_NAME, dict(errtype='ValueError')) return self.assert_method_correct(success_signal, error_signal, patched_backend_method, expected_result) class SSOLoginProxyTestCase(AbstractTestCase): """Test the SSOLoginProxy interface.""" @defer.inlineCallbacks def setUp(self): yield super(SSOLoginProxyTestCase, self).setUp() self.test_client = self.sso_client.sso_login self.patchable_backend = self.sso_service.sso_login.processor class GenerateCaptchaTestCase(SSOLoginProxyTestCase): """Test the generate_captcha method.""" method = 'generate_captcha' params = (APP_NAME, FILENAME) success_signal = 'CaptchaGenerated' error_signal = 'CaptchaGenerationError' backend_result = 'a captcha id' success_result = (APP_NAME, backend_result) class RegisterUserTestCase(SSOLoginProxyTestCase): """Test the register_user method.""" method = 'register_user' params = (APP_NAME, EMAIL, PASSWORD, NAME, CAPTCHA_ID, CAPTCHA_SOLUTION) success_signal = 'UserRegistered' error_signal = 'UserRegistrationError' backend_result = EMAIL success_result = (APP_NAME, backend_result) class LoginTestCase(SSOLoginProxyTestCase): """Test the login method.""" method = 'login' params = (APP_NAME, EMAIL, PASSWORD) success_signal = 'LoggedIn' error_signal = 'LoginError' backend_result = TOKEN success_result = (APP_NAME, EMAIL) @defer.inlineCallbacks def test_success(self): """Test that the 'method' works ok when the user is validated.""" self.patch(self.patchable_backend, 'is_validated', lambda _: True) yield super(LoginTestCase, self).test_success() expected_credentials = yield self.keyring.get_credentials(APP_NAME) self.assertEqual(expected_credentials, TOKEN) def test_not_validated(self): """Test that the 'method' works ok when the user is not validated.""" self.patch(self.patchable_backend, 'is_validated', lambda _: False) self.patch(self, 'success_signal', 'UserNotValidated') return super(LoginTestCase, self).test_success() def test_error_when_setting_credentials(self): """The 'error_signal' is emitted when credentials can't be set.""" self.patch(self.patchable_backend, 'is_validated', lambda _: True) exc = TypeError('foo') self.patch(self.keyring, 'set_credentials', lambda *a: defer.fail(exc)) patched_backend_method = lambda *a, **kw: self.backend_result expected_result = (APP_NAME, dict(errtype='TypeError', message='foo')) return self.assert_method_correct('LoginError', 'LoggedIn', patched_backend_method, expected_result) class ValidateEmailTestCase(SSOLoginProxyTestCase): """Test the validate_email method.""" method = 'validate_email' params = (APP_NAME, EMAIL, PASSWORD, EMAIL_TOKEN) success_signal = 'EmailValidated' error_signal = 'EmailValidationError' backend_result = TOKEN success_result = (APP_NAME, EMAIL) class RequestPasswordResetTokenTestCase(SSOLoginProxyTestCase): """Test the request_password_reset_token method.""" method = 'request_password_reset_token' params = (APP_NAME, EMAIL) success_signal = 'PasswordResetTokenSent' error_signal = 'PasswordResetError' backend_result = EMAIL success_result = (APP_NAME, backend_result) class SetNewPasswordTestCase(SSOLoginProxyTestCase): """Test the set_new_password method.""" method = 'set_new_password' params = (APP_NAME, EMAIL, EMAIL_TOKEN, PASSWORD) success_signal = 'PasswordChanged' error_signal = 'PasswordChangeError' backend_result = EMAIL success_result = (APP_NAME, backend_result) class CredentialsManagementProxyTestCase(AbstractTestCase): """Tests for the CredentialsManagementProxy DBus interface.""" args = dict(foo='bar', fuh='baz') params = (APP_NAME, args) success_signal = 'CredentialsFound' error_signal = 'CredentialsError' backend_result = TOKEN success_result = (APP_NAME, backend_result) @defer.inlineCallbacks def setUp(self): yield super(CredentialsManagementProxyTestCase, self).setUp() self.credentials = FakedCredentials() self.patch(main, 'Credentials', lambda *a, **kw: self.credentials) self.test_client = self.sso_client.cred_manager self.patchable_backend = self.credentials def _backend_succeed(self, *args, **kwargs): """Make self.patchable_backend return self.backend_result.""" return defer.succeed(self.backend_result) def _backend_fail(self, *args, **kwargs): """Make self.patchable_backend return a failed deferred.""" return defer.fail(ValueError((args, kwargs))) class FindCredentialsTestCase(CredentialsManagementProxyTestCase): """Test the find_credentials method.""" method = 'find_credentials' @skipIfOS('win32', 'find_credentials_sync is only provided in Linux ' 'due to compatibility issues with old clients.') @defer.inlineCallbacks def test_find_credentials_sync(self): """The credentials are asked and returned in a sync call.""" d = defer.Deferred() self.test_client.call_method('find_credentials_sync', APP_NAME, self.args, reply_handler=d.callback, error_handler=d.errback) creds = yield d self.assertEqual(creds, TOKEN) @skipIfOS('win32', 'find_credentials_sync is only provided in Linux ' 'due to compatibility issues with old clients.') @defer.inlineCallbacks def test_find_credentials_sync_error(self): """If find_credentials_sync fails, error_handler is called.""" self.patch(self.credentials, 'find_credentials', self._backend_fail) d = defer.Deferred() self.test_client.call_method('find_credentials_sync', APP_NAME, self.args, reply_handler=d.errback, error_handler=d.callback) error = yield d error = error.args[0] self.assertEqual(error, 'ValueError') class ClearCredentialsTestCase(CredentialsManagementProxyTestCase): """Test the clear_credentials method.""" method = 'clear_credentials' success_signal = 'CredentialsCleared' success_result = (APP_NAME,) class StoreCredentialsTestCase(CredentialsManagementProxyTestCase): """Test the store_credentials method.""" method = 'store_credentials' success_signal = 'CredentialsStored' success_result = (APP_NAME,) class RegisterTestCase(CredentialsManagementProxyTestCase): """Test the register method.""" method = 'register' class LoginOnlyTestCase(CredentialsManagementProxyTestCase): """Test the login method.""" method = 'login' class LoginEmailPasswordTestCase(CredentialsManagementProxyTestCase): """Test the login method.""" method = 'login_email_password' backend_method = 'login' args = dict(email=EMAIL, password=PASSWORD) params = (APP_NAME, args) ubuntu-sso-client-13.10/ubuntu_sso/main/glib.py0000664000202700020270000000407612151461656022001 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """GLib main loop runner.""" # pylint: disable=E0611,F0401 from dbus.mainloop.glib import DBusGMainLoop from gi.repository import GLib GLIB_MAINLOOP = None # global def timeout_func(*a, **kw): """Delay import of dynamic bindings to avoid crashes.""" return GLib.timeout_add(*a, **kw) def shutdown_func(*a, **kw): """Delay import of dynamic bindings to avoid crashes.""" GLIB_MAINLOOP.quit() def run_func(loop): """Delay import of dynamic bindings to avoid crashes.""" loop.run() def start_setup(): """Setup the env to run the service.""" DBusGMainLoop(set_as_default=True) global GLIB_MAINLOOP # pylint: disable=W0603 GLIB_MAINLOOP = loop = GLib.MainLoop() return loop ubuntu-sso-client-13.10/ubuntu_sso/logger.py0000664000202700020270000000762312151461656021420 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # ubuntu_sso.logger - logging miscellany # # Author: Stuart Langridge # Author: Natalia B. Bidart # # Copyright 2009-2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Miscellaneous logging functions.""" import logging import os import sys from dirspec.basedir import xdg_cache_home from dirspec.utils import unicode_path from functools import wraps from logging.handlers import RotatingFileHandler LOGFOLDER = os.path.join(xdg_cache_home, 'sso') # create log folder if it doesn't exists if not os.path.exists(unicode_path(LOGFOLDER)): os.makedirs(unicode_path(LOGFOLDER)) if os.environ.get('U1_DEBUG'): LOG_LEVEL = logging.DEBUG else: # Only log this level and above LOG_LEVEL = logging.INFO LOG_PATH = os.path.join(LOGFOLDER, 'sso-client.log') FMT = "%(asctime)s:%(msecs)s - %(name)s - %(levelname)s - %(message)s" MAIN_HANDLER = RotatingFileHandler(unicode_path(LOG_PATH), maxBytes=1048576, backupCount=5) MAIN_HANDLER.setLevel(LOG_LEVEL) MAIN_HANDLER.setFormatter(logging.Formatter(fmt=FMT)) GUI_LOG_PATH = os.path.join(LOGFOLDER, 'sso-client-gui.log') GUI_HANDLER = RotatingFileHandler(unicode_path(GUI_LOG_PATH), maxBytes=1048576, backupCount=5) GUI_HANDLER.setLevel(LOG_LEVEL) GUI_HANDLER.setFormatter(logging.Formatter(fmt=FMT)) def setup_logging(log_domain, handler=None): """Create basic logger to set filename.""" if handler is None: handler = MAIN_HANDLER logger = logging.getLogger(log_domain) logger.propagate = False logger.setLevel(LOG_LEVEL) logger.addHandler(handler) if os.environ.get('U1_DEBUG'): debug_handler = logging.StreamHandler(sys.stderr) debug_handler.setFormatter(logging.Formatter(fmt=FMT)) logger.addHandler(debug_handler) return logger def setup_gui_logging(log_domain): """Create basic logger to set filename.""" return setup_logging(log_domain, GUI_HANDLER) def log_call(log_func): """Decorator to log, using 'log_func', calls to functions.""" def middle(f): """Return a function that will act as 'f' but will log the call.""" @wraps(f) def inner(instance, *a, **kw): """Call 'f(*a, **kw)' and return its result. Log that call.""" log_func('%r: emitting %r with args %r and kwargs %r', instance.__class__.__name__, f.__name__, a, kw) result = f(instance, *a, **kw) return result return inner return middle ubuntu-sso-client-13.10/ubuntu_sso/utils/0000755000202700020270000000000012225013301020673 5ustar dobeydobey00000000000000ubuntu-sso-client-13.10/ubuntu_sso/utils/tcpactivation.py0000664000202700020270000001433112151461656024143 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2011-2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """tcpactivation: start a process if nothing listening in a given port.""" import subprocess from twisted.internet import defer, error, protocol from twisted.internet.endpoints import clientFromString LOCALHOST = "127.0.0.1" DELAY_BETWEEN_CHECKS = 0.1 NUMBER_OF_CHECKS = 600 # twisted uses a different coding convention # pylint: disable=C0103,W0232 def async_sleep(delay): """Fire the returned deferred after some specified delay.""" from twisted.internet import reactor d = defer.Deferred() # pylint: disable=E1101 reactor.callLater(delay, d.callback, None) return d class AlreadyStartedError(Exception): """The instance was already started.""" class ActivationTimeoutError(Exception): """Timeout while trying to start the instance.""" class NullProtocol(protocol.Protocol): """A protocol that drops the connection.""" def connectionMade(self): """Just drop the connection.""" self.transport.loseConnection() class PortDetectFactory(protocol.ClientFactory): """Will detect if something is listening in a given port.""" protocol = NullProtocol def __init__(self): """Initialize this instance.""" self.d = defer.Deferred() def is_listening(self): """A deferred that will become True if something is listening.""" return self.d def buildProtocol(self, addr): """Connected.""" p = protocol.ClientFactory.buildProtocol(self, addr) if not self.d.called: self.d.callback(True) return p def clientConnectionLost(self, connector, reason): """The connection was lost.""" protocol.ClientFactory.clientConnectionLost(self, connector, reason) if not self.d.called: self.d.callback(False) def clientConnectionFailed(self, connector, reason): """The connection failed.""" protocol.ClientFactory.clientConnectionFailed(self, connector, reason) if not self.d.called: self.d.callback(False) class ActivationConfig(object): """The configuration for tcp activation.""" def __init__(self, service_name, command_line, description): """Initialize this instance.""" self.service_name = service_name self.command_line = command_line self.description = description class ActivationDetector(object): """Base class to detect if the service is running.""" def __init__(self, config): """Initialize this instance.""" self.config = config @defer.inlineCallbacks def is_already_running(self): """Check if the instance is already running.""" from twisted.internet import reactor factory = PortDetectFactory() client = clientFromString(reactor, self.config.description.client) try: yield client.connect(factory) except error.ConnectError: defer.returnValue(False) result = yield factory.is_listening() defer.returnValue(result) class ActivationClient(ActivationDetector): """A client for tcp activation.""" # a classwide lock, so the server is started only once lock = defer.DeferredLock() @defer.inlineCallbacks def _wait_server_active(self): """Wait till the server is active.""" for _ in range(NUMBER_OF_CHECKS): is_running = yield self.is_already_running() if is_running: defer.returnValue(None) yield async_sleep(DELAY_BETWEEN_CHECKS) raise ActivationTimeoutError() def _spawn_server(self): """Start running the server process.""" # Without using close_fds=True, strange things happen # with logging on windows. More information at # http://bugs.python.org/issue4749 subprocess.Popen(self.config.command_line, close_fds=True) @defer.inlineCallbacks def _do_get_active_description(self): """Get the details for the running instance, starting it if needed.""" is_running = yield self.is_already_running() if not is_running: self._spawn_server() yield self._wait_server_active() defer.returnValue(self.config.description.client) @defer.inlineCallbacks def get_active_client_description(self): """Serialize the requests to _do_get_active_description.""" yield self.lock.acquire() try: result = yield self._do_get_active_description() defer.returnValue(result) finally: self.lock.release() class ActivationInstance(ActivationDetector): """A tcp activation server instance.""" @defer.inlineCallbacks def get_server_description(self): """Get the port to run this service or fail if already started.""" is_running = yield self.is_already_running() if is_running: raise AlreadyStartedError() defer.returnValue(self.config.description.server) ubuntu-sso-client-13.10/ubuntu_sso/utils/__init__.py0000664000202700020270000001647612151461736023045 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2010-2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Utility modules that may find use outside ubuntu_sso.""" from __future__ import unicode_literals import os import sys from dirspec.basedir import load_config_paths from dirspec.utils import get_program_path from twisted.internet import defer from twisted.python import procutils from ubuntu_sso import (BACKEND_EXECUTABLE, UI_EXECUTABLE_QT, UI_PROXY_CREDS_DIALOG, UI_SSL_DIALOG) from ubuntu_sso.logger import setup_logging from ubuntu_sso.utils import compat, webclient logger = setup_logging("ubuntu_sso.utils") BIN_SUFFIX = 'bin' DATA_SUFFIX = 'data' QSS_MAP = dict(win32=':/windows.qss', darwin=':/darwin.qss', linux=':/linux.qss') # Setting linux as default if we don't find the # platform as a key in the dictionary PLATFORM_QSS = QSS_MAP.get(sys.platform, ":/linux.qss") DARWIN_APP_NAMES = {BACKEND_EXECUTABLE: 'Ubuntu SSO Helper.app', UI_EXECUTABLE_QT: 'Ubuntu Single Sign-On.app', UI_SSL_DIALOG: 'Ubuntu SSO SSL Certificate.app', UI_PROXY_CREDS_DIALOG: 'Ubuntu SSO Proxy Credentials.app' } def _get_dir(dir_name, dir_constant): """Return the absolute path to this project's 'dir_name' dir. Support symlinks, and priorize local (relative) 'dir_name' dir. If not found, return the value of the 'dir_constant'. """ module = os.path.dirname(__file__) result = os.path.abspath(os.path.join(module, os.path.pardir, os.path.pardir, dir_name)) logger.debug('_get_dir: trying use dir at %r (exists? %s)', result, os.path.exists(result)) if os.path.exists(result): logger.info('_get_dir: returning dir located at %r.', result) return result # otherwise, try to load 'dir_constant' from installation path try: __import__('ubuntu_sso.constants', None, None, ['']) module = sys.modules.get('ubuntu_sso.constants') return getattr(module, dir_constant) except (ImportError, AttributeError): msg = '_get_dir: can not build a valid path. Giving up. ' \ '__file__ is %r, constants module not available.' logger.error(msg, __file__) def get_project_dir(): """Return the absolute path to this project's data/ dir. Support symlinks, and priorize local (relative) data/ dir. If not found, return the value of the PROJECT_DIR. """ result = _get_dir(dir_name=DATA_SUFFIX, dir_constant='PROJECT_DIR') assert result is not None, '%r dir can not be None.' % DATA_SUFFIX return result def get_data_file(*args): """Return the absolute path to 'args' within project data dir.""" return os.path.join(get_project_dir(), *args) def get_bin_dir(): """Return the absolute path to this project's bin/ dir. Support symlinks, and priorize local (relative) bin/ dir. If not found, return the value of the BIN_DIR. """ result = _get_dir(dir_name=BIN_SUFFIX, dir_constant='BIN_DIR') assert result is not None, '%r dir can not be None.' % BIN_SUFFIX logger.info('get_bin_dir: returning dir located at %r.', result) return result def get_bin_cmd(program_name): """Return a list of arguments to launch the given executable.""" path = get_program_path(program_name, fallback_dirs=[get_bin_dir()], app_names=DARWIN_APP_NAMES) cmd_args = [path] # adjust cmd for platforms using buildout-generated python # wrappers if getattr(sys, 'frozen', None) is None: if sys.platform in ('darwin'): cmd_args.insert(0, 'python') elif sys.platform in ('win32'): cmd_args.insert(0, procutils.which("python.exe")[0]) logger.debug('get_bin_cmd: returning %r', cmd_args) return cmd_args def get_cert_dir(): """Return directory containing certificate files.""" if getattr(sys, "frozen", None) is not None: if sys.platform == "win32": ssl_cert_location = list(load_config_paths( "ubuntuone"))[1] elif sys.platform == "darwin": main_app_dir = "".join(__file__.partition(".app")[:-1]) main_app_resources_dir = os.path.join(main_app_dir, "Contents", "Resources") ssl_cert_location = main_app_resources_dir elif any(plat in sys.platform for plat in ("win32", "darwin")): pkg_dir = os.path.dirname(__file__) src_tree_path = os.path.dirname(os.path.dirname(pkg_dir)) ssl_cert_location = os.path.join(src_tree_path, "data") else: ssl_cert_location = '/etc/ssl/certs' return ssl_cert_location @defer.inlineCallbacks def ping_url(url, email, credentials): """Ping the 'url' with the 'email' attached to it. Sign the request with 'credentials'. The url must not be None. """ logger.info('Pinging server using url: %r, email: %r.', url, email) assert isinstance(url, compat.text_type), 'Url %r must be unicode' % url target_url = url try: target_url = url.format(email=email) except IndexError: # tuple index out of range target_url = url.format(email) # format the first substitution if target_url == url: logger.debug('Original url (%r) could not be formatted, ' 'appending email (%r).', url, email) assert url.endswith('/'), 'Url %r must end with /.' % url target_url = url + email wc = webclient.webclient_factory() try: logger.debug('Opening the url %r with webclient.request.', url) response = yield wc.request(target_url, oauth_credentials=credentials) logger.debug('Url %r opened. Response content: %r.', url, response.content) defer.returnValue(response) finally: wc.shutdown() ubuntu-sso-client-13.10/ubuntu_sso/utils/translation.py0000664000202700020270000000712012151461656023627 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Platform-specific translation functions.""" import gettext import os import sys from ubuntu_sso.logger import setup_logging logger = setup_logging('ubuntu_sso.utils.translation') def _get_languages(): """list of langs ordered by preference, or None for gettext defaults.""" if sys.platform == 'darwin': from Cocoa import NSUserDefaults su = NSUserDefaults.standardUserDefaults() return su['AppleLanguages'] else: if sys.platform == 'win32': return None return None def _get_translations_data_path(fallback_path=None): """path to compiled translation files, or None for gettext defaults""" if getattr(sys, 'frozen', None) is not None: if sys.platform == 'darwin': main_app_dir = ''.join(__file__.partition('.app')[:-1]) path = os.path.join(main_app_dir, 'Contents', 'Resources', 'translations') return path elif sys.platform == 'win32': return None # TODO exists = (os.path.exists(fallback_path) if fallback_path else False) logger.debug("Using fallback translation path %r " "which does %s exist." % (fallback_path, "" if exists else "**NOT**")) return fallback_path def get_gettext(translation_domain, fallback_path=None): """Get proper gettext translation function for platform and py version.""" languages = _get_languages() translations_path = _get_translations_data_path(fallback_path) if languages is None or translations_path is None or languages[0] == 'en': logger.debug('Using default gettext translation search paths') translation = gettext.translation(translation_domain, fallback=True) else: translation = gettext.translation(translation_domain, translations_path, languages=languages[:1], fallback=True) if isinstance(translation, gettext.NullTranslations): logger.warn('Translations not found, using null translator.') if sys.version_info < (3,): return translation.ugettext else: return translation.gettext ubuntu-sso-client-13.10/ubuntu_sso/utils/webclient/0000755000202700020270000000000012225013301022647 5ustar dobeydobey00000000000000ubuntu-sso-client-13.10/ubuntu_sso/utils/webclient/restful.py0000664000202700020270000000723512165077671024745 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2011-2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """A proxy-enabled restful client.""" import json try: # pylint: disable=E0611,F0401 from urllib.parse import urlencode # pylint: enable=E0611,F0401 except ImportError: from urllib import urlencode from twisted.internet import defer from ubuntu_sso.logger import setup_logging from ubuntu_sso.utils import webclient logger = setup_logging("ubuntu_sso.utils.webclient.restful") POST_HEADERS = { "content-type": "application/x-www-form-urlencoded", } class RestfulClient(object): """A proxy-enabled restful client.""" def __init__(self, service_iri, username=None, password=None, oauth_credentials=None): """Initialize this instance.""" assert service_iri.endswith("/") self.service_iri = service_iri self.webclient = webclient.webclient_factory(username=username, password=password, oauth_sign_plain=True) self.oauth_credentials = oauth_credentials @defer.inlineCallbacks def restcall(self, method, **kwargs): """Make a restful call.""" assert isinstance(method, unicode) params = {} for key, value in kwargs.items(): if isinstance(value, basestring): assert isinstance(value, unicode) params[key] = json.dumps(value) namespace, operation = method.split(".") params["ws.op"] = operation encoded_args = urlencode(params) iri = self.service_iri + namespace creds = self.oauth_credentials logger.debug('Performing REST call to %r.', iri) result = yield self.webclient.request(iri, method="POST", oauth_credentials=creds, post_content=encoded_args, extra_headers=POST_HEADERS) try: response = json.loads(result.content) except: logger.exception('Can not load json from REST request response ' '(content is %r).', result.content) raise else: defer.returnValue(response) def shutdown(self): """Stop the webclient used by this class.""" self.webclient.shutdown() ubuntu-sso-client-13.10/ubuntu_sso/utils/webclient/__init__.py0000664000202700020270000000474412151461656025015 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2011-2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """A common webclient that can use a QtNetwork or libsoup backend.""" import sys def is_qt4reactor_installed(): """Check if the qt4reactor is installed.""" result = False if not 'PyQt4' in sys.modules: return result try: from PyQt4.QtCore import QCoreApplication from PyQt4.QtGui import QApplication # we could be running a process with or without ui, and those are diff # apps. result = (QCoreApplication.instance() is not None or QApplication.instance() is not None) except ImportError: pass return result def webclient_module(): """Choose the module of the web client.""" if is_qt4reactor_installed(): from ubuntu_sso.utils.webclient import qtnetwork return qtnetwork else: from ubuntu_sso.utils.webclient import libsoup #from ubuntu_sso.utils.webclient import txweb as web_module return libsoup def webclient_factory(*args, **kwargs): """Choose the type of the web client dynamically.""" web_module = webclient_module() return web_module.WebClient(*args, **kwargs) ubuntu-sso-client-13.10/ubuntu_sso/utils/webclient/qtnetwork.py0000664000202700020270000002656112151461736025314 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2011-2013 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """A webclient backend that uses QtNetwork.""" from __future__ import unicode_literals import glob import os import sys from io import StringIO # pylint: disable=E0611 from PyQt4.QtCore import ( QBuffer, QCoreApplication, QUrl, ) # pylint: enable=E0611 from PyQt4.QtNetwork import ( QNetworkAccessManager, QNetworkProxy, QNetworkProxyFactory, QNetworkReply, QNetworkRequest, QSslCertificate, QSslConfiguration, ) from twisted.internet import defer from ubuntu_sso.logger import setup_logging from ubuntu_sso.utils import get_cert_dir from ubuntu_sso.utils.webclient.common import ( BaseWebClient, HeaderDict, ProxyUnauthorizedError, Response, UnauthorizedError, WebClientError, ) from ubuntu_sso.utils.webclient import gsettings logger = setup_logging("ubuntu_sso.utils.webclient.qtnetwork") def build_proxy(settings_groups): """Create a QNetworkProxy from these settings.""" proxy_groups = [ ("socks", QNetworkProxy.Socks5Proxy), ("https", QNetworkProxy.HttpProxy), ("http", QNetworkProxy.HttpProxy), ] for group, proxy_type in proxy_groups: if group not in settings_groups: continue settings = settings_groups[group] if "host" in settings and "port" in settings: return QNetworkProxy(proxy_type, hostName=settings.get("host", ""), port=settings.get("port", 0), user=settings.get("username", ""), password=settings.get("password", "")) logger.error("No proxy correctly configured.") return QNetworkProxy(QNetworkProxy.DefaultProxy) class WebClient(BaseWebClient): """A webclient with a qtnetwork backend.""" proxy_instance = None def __init__(self, *args, **kwargs): """Initialize this instance.""" super(WebClient, self).__init__(*args, **kwargs) self.nam = QNetworkAccessManager(QCoreApplication.instance()) self.nam.finished.connect(self._handle_finished) self.nam.authenticationRequired.connect(self._handle_authentication) self.nam.proxyAuthenticationRequired.connect(self.handle_proxy_auth) self.nam.sslErrors.connect(self._handle_ssl_errors) self.replies = {} self.proxy_retry = False self.setup_proxy() # Apply our local certificates as the SSL configuration to be used # for all QNetworkRequest calls. self.ssl_config = QSslConfiguration.defaultConfiguration() ca_certs = self.ssl_config.caCertificates() try: for path in glob.glob(os.path.join(get_cert_dir(), "UbuntuOne*.pem")): with open(path) as f: cert = QSslCertificate(f.read()) if cert.isValid(): ca_certs.append(cert) else: logger.error("invalid certificate: {}".format(path)) except (IndexError, IOError) as err: raise WebClientError( "Unable to configure SSL certificates: {}".format(err)) self.ssl_config.setCaCertificates(ca_certs) def _set_proxy(self, proxy): """Set the proxy to be used.""" QNetworkProxy.setApplicationProxy(proxy) self.nam.setProxy(proxy) def setup_proxy(self): """Setup the proxy settings if needed.""" # QtNetwork knows how to use the system settings on both Win and Mac if sys.platform.startswith("linux"): settings = gsettings.get_proxy_settings() enabled = len(settings) > 0 if enabled and WebClient.proxy_instance is None: proxy = build_proxy(settings) self._set_proxy(proxy) WebClient.proxy_instance = proxy elif enabled and WebClient.proxy_instance: logger.info("Proxy already in use.") else: logger.info("Proxy is disabled.") else: if WebClient.proxy_instance is None: logger.info("Querying OS for proxy.") QNetworkProxyFactory.setUseSystemConfiguration(True) def handle_proxy_auth(self, proxy, authenticator): """Proxy authentication is required.""" logger.info("auth_required %r, %r", self.proxy_username, proxy.hostName()) if (self.proxy_username is not None and self.proxy_username != str(authenticator.user())): authenticator.setUser(self.proxy_username) WebClient.proxy_instance.setUser(self.proxy_username) if (self.proxy_password is not None and self.proxy_password != str(authenticator.password())): authenticator.setPassword(self.proxy_password) WebClient.proxy_instance.setPassword(self.proxy_password) def _perform_request(self, request, method, post_buffer): """Return a deferred that will be fired with a Response object.""" d = defer.Deferred() if method == "GET": reply = self.nam.get(request) elif method == "HEAD": reply = self.nam.head(request) else: reply = self.nam.sendCustomRequest(request, method, post_buffer) self.replies[reply] = d return d @defer.inlineCallbacks def request(self, iri, method="GET", extra_headers=None, oauth_credentials=None, post_content=None): """Return a deferred that will be fired with a Response object.""" uri = self.iri_to_uri(iri) request = QNetworkRequest(QUrl(uri)) request.setSslConfiguration(self.ssl_config) headers = yield self.build_request_headers(uri, method, extra_headers, oauth_credentials) for key, value in headers.items(): request.setRawHeader(key, value) post_buffer = QBuffer() post_buffer.setData(post_content) try: result = yield self._perform_request(request, method, post_buffer) except ProxyUnauthorizedError as e: app_proxy = QNetworkProxy.applicationProxy() proxy_host = app_proxy.hostName() if app_proxy else "proxy server" got_creds = yield self.request_proxy_auth_credentials( proxy_host, self.proxy_retry) if got_creds: self.proxy_retry = True result = yield self.request(iri, method, extra_headers, oauth_credentials, post_content) else: excp = WebClientError('Proxy creds needed.', e) defer.returnValue(excp) defer.returnValue(result) def _handle_authentication(self, reply, authenticator): """The reply needs authentication.""" if authenticator.user() != self.username: authenticator.setUser(self.username) if authenticator.password() != self.password: authenticator.setPassword(self.password) def _handle_finished(self, reply): """The reply has finished processing.""" assert reply in self.replies d = self.replies.pop(reply) error = reply.error() content = reply.readAll() if not error: headers = HeaderDict() for key, value in reply.rawHeaderPairs(): headers[str(key)].append(str(value)) response = Response(bytes(content), headers) d.callback(response) else: content = unicode(content) error_string = unicode(reply.errorString()) logger.debug('_handle_finished error (%s,%s).', error, error_string) if error == QNetworkReply.AuthenticationRequiredError: exception = UnauthorizedError(error_string, content) elif error == QNetworkReply.ProxyAuthenticationRequiredError: # we are going thru a proxy and we did not auth exception = ProxyUnauthorizedError(error_string, content) else: exception = WebClientError(error_string, content) d.errback(exception) def _get_certificate_details(self, cert): """Return an string with the details of the certificate.""" detail_titles = {QSslCertificate.Organization: 'organization', QSslCertificate.CommonName: 'common_name', QSslCertificate.LocalityName: 'locality_name', QSslCertificate.OrganizationalUnitName: 'unit', QSslCertificate.CountryName: 'country_name', QSslCertificate.StateOrProvinceName: 'state_name'} details = {} for info, title in detail_titles.items(): details[title] = str(cert.issuerInfo(info)) return self.format_ssl_details(details) def _get_certificate_host(self, cert): """Return the host of the cert.""" return str(cert.issuerInfo(QSslCertificate.CommonName)) def _handle_ssl_errors(self, reply, errors): """Handle the case in which we got an ssl error.""" msg = StringIO() msg.write('SSL errors found; url: %s\n' % reply.request().url().toString()) for error in errors: msg.write('========Error=============\n%s (%s)\n' % (error.errorString(), error.error())) msg.write('--------Cert Details------\n%s\n' % self._get_certificate_details(error.certificate())) msg.write('==========================\n') logger.error(msg.getvalue()) def force_use_proxy(self, https_settings): """Setup this webclient to use the given proxy settings.""" settings = {"https": https_settings} proxy = build_proxy(settings) self._set_proxy(proxy) WebClient.proxy_instance = proxy def shutdown(self): """Shut down all pending requests (if possible).""" self.nam.deleteLater() ubuntu-sso-client-13.10/ubuntu_sso/utils/webclient/timestamp.py0000664000202700020270000000756112151461656025261 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2011-2013 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Timestamp synchronization with the server.""" import time from twisted.internet import defer from ubuntu_sso import SSO_UONE_BASE_URL from ubuntu_sso.logger import setup_logging logger = setup_logging("ubuntu_sso.utils.webclient.timestamp") NOCACHE_HEADERS = {"Cache-Control": "no-cache"} class TimestampChecker(object): """A timestamp that's regularly checked with a server.""" CHECKING_INTERVAL = 60 * 60 # in seconds ERROR_INTERVAL = 30 # in seconds SERVER_IRI = u"%s/api/time" % SSO_UONE_BASE_URL def __init__(self, webclient_class): """Initialize this instance.""" self.next_check = time.time() self.skew = 0 self.webclient_class = webclient_class @defer.inlineCallbacks def get_server_date_header(self, server_iri): """Get the server date using twisted webclient.""" webclient = self.webclient_class() try: response = yield webclient.request(server_iri, method="HEAD", extra_headers=NOCACHE_HEADERS) defer.returnValue(response.headers["Date"][0]) finally: webclient.shutdown() @defer.inlineCallbacks def get_server_time(self): """Get the time at the server.""" date_string = yield self.get_server_date_header(self.SERVER_IRI) # delay import, otherwise a default reactor gets installed from twisted.web import http timestamp = http.stringToDatetime(date_string) defer.returnValue(timestamp) @defer.inlineCallbacks def get_faithful_time(self): """Get an accurate timestamp.""" local_time = time.time() if local_time >= self.next_check: try: server_time = yield self.get_server_time() self.next_check = local_time + self.CHECKING_INTERVAL self.skew = server_time - local_time logger.debug("Calculated server time skew: %r", self.skew) # We just log all exceptions while trying to get the server time # pylint: disable=W0703 except Exception as e: logger.debug("Error while verifying server time skew: %r", e) self.next_check = local_time + self.ERROR_INTERVAL # delay import, otherwise a default reactor gets installed from twisted.web import http logger.debug("Using corrected timestamp: %r", http.datetimeToString(local_time + self.skew)) defer.returnValue(int(local_time + self.skew)) ubuntu-sso-client-13.10/ubuntu_sso/utils/webclient/gsettings.py0000664000202700020270000001023412151461656025254 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2011-2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Retrieve the proxy configuration from Gnome.""" import subprocess from ubuntu_sso.logger import setup_logging logger = setup_logging("ubuntu_sso.utils.webclient.gsettings") GSETTINGS_CMDLINE = "gsettings list-recursively org.gnome.system.proxy" CANNOT_PARSE_WARNING = "Cannot parse gsettings value: %r" def parse_proxy_host(hostname): """Parse the host to get username and password.""" username = None password = None if "@" in hostname: username, hostname = hostname.rsplit("@", 1) if ":" in username: username, password = username.split(":", 1) return hostname, username, password def parse_manual_proxy_settings(scheme, gsettings): """Parse the settings for a given scheme.""" host, username, pwd = parse_proxy_host(gsettings[scheme + ".host"]) # if the user did not set a proxy for a type (http/https/ftp) we should # return None to ensure that it is not used if host == '': return None settings = { "host": host, "port": gsettings[scheme + ".port"], } if scheme == "http" and gsettings["http.use-authentication"]: username = gsettings["http.authentication-user"] pwd = gsettings["http.authentication-password"] if username is not None and pwd is not None: settings.update({ "username": username, "password": pwd, }) return settings def get_proxy_settings(): """Parse the proxy settings as returned by the gsettings executable.""" output = subprocess.check_output(GSETTINGS_CMDLINE.split()) gsettings = {} base_len = len("org.gnome.system.proxy.") # pylint: disable=E1103 for line in output.split("\n"): try: path, key, value = line.split(" ", 2) except ValueError: continue if value.startswith("'"): parsed_value = value[1:-1] elif value.startswith(('[', '@')): parsed_value = value elif value in ('true', 'false'): parsed_value = (value == 'true') elif value.isdigit(): parsed_value = int(value) else: logger.warning(CANNOT_PARSE_WARNING, value) parsed_value = value relative_key = (path + "." + key)[base_len:] gsettings[relative_key] = parsed_value mode = gsettings["mode"] if mode == "none": settings = {} elif mode == "manual": settings = {} for scheme in ["http", "https"]: scheme_settings = parse_manual_proxy_settings(scheme, gsettings) if scheme_settings is not None: settings[scheme] = scheme_settings else: # If mode is automatic the PAC javascript should be interpreted # on each request. That is out of scope so it's ignored for now settings = {} return settings ubuntu-sso-client-13.10/ubuntu_sso/utils/webclient/common.py0000664000202700020270000002604012151461656024537 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2011-2013 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """The common bits of a webclient.""" import collections from httplib2 import iri2uri from oauthlib.oauth1 import ( Client, SIGNATURE_HMAC, SIGNATURE_PLAINTEXT, SIGNATURE_TYPE_AUTH_HEADER, SIGNATURE_TYPE_QUERY) from twisted.internet import defer from ubuntu_sso import (USER_SUCCESS, UI_PROXY_CREDS_DIALOG, UI_SSL_DIALOG) from ubuntu_sso.logger import setup_logging from ubuntu_sso.utils.runner import spawn_program from ubuntu_sso.utils.ui import SSL_DETAILS_TEMPLATE from ubuntu_sso.utils.webclient.timestamp import TimestampChecker logger = setup_logging("ubuntu_sso.utils.webclient.common") class WebClientError(Exception): """An http error happened while calling the webservice.""" class UnauthorizedError(WebClientError): """The request ended with bad_request, unauthorized or forbidden.""" class ProxyUnauthorizedError(WebClientError): """Failure raised when there is an issue with the proxy auth.""" class Response(object): """A response object.""" def __init__(self, content, headers=None): """Initialize this instance.""" self.content = content self.headers = headers class HeaderDict(collections.defaultdict): """A case insensitive dict for headers.""" # pylint: disable=E1002 def __init__(self, *args, **kwargs): """Handle case-insensitive keys.""" super(HeaderDict, self).__init__(list, *args, **kwargs) # pylint: disable=E1101 for key, value in self.items(): super(HeaderDict, self).__delitem__(key) self[key] = value def __setitem__(self, key, value): """Set the value with a case-insensitive key.""" super(HeaderDict, self).__setitem__(key.lower(), value) def __getitem__(self, key): """Get the value with a case-insensitive key.""" return super(HeaderDict, self).__getitem__(key.lower()) def __delitem__(self, key): """Delete the item with the case-insensitive key.""" super(HeaderDict, self).__delitem__(key.lower()) def __contains__(self, key): """Check the containment with a case-insensitive key.""" return super(HeaderDict, self).__contains__(key.lower()) class BaseWebClient(object): """The webclient base class, to be extended by backends.""" timestamp_checker = None def __init__(self, appname='', username=None, password=None, oauth_sign_plain=False): """Initialize this instance.""" self.appname = appname self.username = username self.password = password self.proxy_username = None self.proxy_password = None self.oauth_sign_plain = oauth_sign_plain def request(self, iri, method="GET", extra_headers=None, oauth_credentials=None, post_content=None): """Return a deferred that will be fired with a Response object.""" raise NotImplementedError @classmethod def get_timestamp_checker(cls): """Get the timestamp checker for this class of webclient.""" if cls.timestamp_checker is None: cls.timestamp_checker = TimestampChecker(cls) return cls.timestamp_checker def get_timestamp(self): """Get a timestamp synchronized with the server.""" return self.get_timestamp_checker().get_faithful_time() def force_use_proxy(self, settings): """Setup this webclient to use the given proxy settings.""" raise NotImplementedError def iri_to_uri(self, iri): """Transform a unicode iri into a ascii uri.""" if not isinstance(iri, unicode): raise TypeError('iri %r should be unicode.' % iri) return bytes(iri2uri(iri)) def build_oauth_request(self, method, uri, credentials, timestamp, parameters=None, as_query=True): """Build an oauth request given some credentials.""" # oauthlib is requiring the timestamp to be a string, because # it tries to escape all the parameters. oauth_client = Client(credentials['consumer_key'], credentials['consumer_secret'], credentials['token'], credentials['token_secret'], signature_method=(SIGNATURE_PLAINTEXT if self.oauth_sign_plain else SIGNATURE_HMAC), signature_type=(SIGNATURE_TYPE_QUERY if as_query else SIGNATURE_TYPE_AUTH_HEADER), timestamp=str(timestamp)) try: url, signed_headers, body = oauth_client.sign( uri, method, parameters if parameters is not None else {}, {'Content-Type': 'application/x-www-form-urlencoded'}) except ValueError: url, signed_headers, body = oauth_client.sign(uri, method) return url, signed_headers, body @defer.inlineCallbacks def build_request_headers(self, uri, method="GET", extra_headers=None, oauth_credentials=None): """Build the headers for a request.""" if extra_headers: headers = dict(extra_headers) else: headers = {} if oauth_credentials: timestamp = yield self.get_timestamp() url, signed_headers, body = self.build_oauth_request( method, uri, oauth_credentials, timestamp, as_query=False) headers.update(signed_headers) defer.returnValue(headers) @defer.inlineCallbacks def build_signed_iri(self, iri, credentials, parameters=None): """Build a new iri signing 'iri' with 'credentials'.""" uri = self.iri_to_uri(iri) timestamp = yield self.get_timestamp() url, signed_headers, body = self.build_oauth_request( method='GET', uri=uri, credentials=credentials, timestamp=timestamp, parameters=parameters) defer.returnValue(url) def shutdown(self): """Shut down all pending requests (if possible).""" @defer.inlineCallbacks def _load_proxy_creds_from_keyring(self, domain): """Load the proxy creds from the keyring.""" from ubuntu_sso.keyring import Keyring keyring = Keyring() try: creds = yield keyring.get_credentials(str(domain)) logger.debug('Got credentials from keyring.') except Exception as e: logger.error('Error when retrieving the creds.') raise WebClientError('Error when retrieving the creds.', e) if creds is not None: # if we are loading the same creds it means that we got the wrong # ones if (self.proxy_username == creds['username'] and self.proxy_password == creds['password']): defer.returnValue(False) else: self.proxy_username = creds['username'] self.proxy_password = creds['password'] defer.returnValue(True) logger.debug('Proxy creds not in keyring.') defer.returnValue(False) def _launch_proxy_creds_dialog(self, domain, retry): """Launch the dialog used to get the creds.""" from ubuntu_sso.utils import get_bin_cmd args = get_bin_cmd(UI_PROXY_CREDS_DIALOG) args += ['--domain', domain] if retry: args += ['--retry'] return spawn_program(args) @defer.inlineCallbacks def request_proxy_auth_credentials(self, domain, retry): """Request the auth creds to the user.""" if not retry: if (self.proxy_username is not None and self.proxy_password is not None): logger.debug('Not retry and credentials are present.') defer.returnValue(True) else: creds_loaded = yield self._load_proxy_creds_from_keyring( domain) if creds_loaded: defer.returnValue(True) try: return_code = yield self._launch_proxy_creds_dialog(domain, retry) except Exception as e: logger.error('Error when running external ui process.') raise WebClientError('Error when running external ui process.', e) if return_code == USER_SUCCESS: creds_loaded = yield self._load_proxy_creds_from_keyring(domain) defer.returnValue(creds_loaded) else: logger.debug('Could not retrieve the credentials. Return code: %r', return_code) defer.returnValue(False) def format_ssl_details(self, details): """Return a formatted string with the details.""" return SSL_DETAILS_TEMPLATE % details def _launch_ssl_dialog(self, domain, details): """Launch a dialog used to approve the ssl cert.""" from ubuntu_sso.utils import get_bin_cmd args = get_bin_cmd(UI_SSL_DIALOG) args += ['--domain', domain, '--details', details, '--appname', self.appname] return spawn_program(args) def _was_ssl_accepted(self, cert_details): """Return if the cert was already accepted.""" # TODO: Ensure that we look at pinned certs in a following branch return False @defer.inlineCallbacks def request_ssl_cert_approval(self, domain, details): """Request the user for ssl approval.""" if self._was_ssl_accepted(details): defer.returnValue(True) return_code = yield self._launch_ssl_dialog(domain, details) defer.returnValue(return_code == USER_SUCCESS) ubuntu-sso-client-13.10/ubuntu_sso/utils/webclient/libsoup.py0000664000202700020270000001565312151461656024734 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2011-2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """A webclient backend that uses libsoup.""" import httplib from twisted.internet import defer from ubuntu_sso.logger import setup_logging from ubuntu_sso.utils.webclient.common import ( BaseWebClient, HeaderDict, Response, ProxyUnauthorizedError, UnauthorizedError, WebClientError, ) URI_ANONYMOUS_TEMPLATE = "http://{host}:{port}/" URI_USERNAME_TEMPLATE = "http://{username}:{password}@{host}:{port}/" logger = setup_logging("ubuntu_sso.utils.webclient.libsoup") class WebClient(BaseWebClient): """A webclient with a libsoup backend.""" def __init__(self, *args, **kwargs): """Initialize this instance.""" super(WebClient, self).__init__(*args, **kwargs) # pylint: disable=E0611,F0401 from gi.repository import Soup, SoupGNOME self.soup = Soup self.session = Soup.SessionAsync() self.session.add_feature(SoupGNOME.ProxyResolverGNOME()) self.session.connect("authenticate", self._on_authenticate) def _on_message(self, session, message, d): """Handle the result of an http message.""" logger.debug('_on_message status code is %s', message.status_code) if message.status_code == httplib.OK: headers = HeaderDict() response_headers = message.get_property("response-headers") add_header = lambda key, value, _: headers[key].append(value) response_headers.foreach(add_header, None) content = message.response_body.flatten().get_data() response = Response(content, headers) d.callback(response) elif message.status_code == httplib.UNAUTHORIZED: e = UnauthorizedError(message.reason_phrase) d.errback(e) elif message.status_code == httplib.PROXY_AUTHENTICATION_REQUIRED: e = ProxyUnauthorizedError(message.reason_phrase) d.errback(e) else: e = WebClientError(message.reason_phrase) d.errback(e) @defer.inlineCallbacks def _on_authenticate(self, session, message, auth, retrying, data=None): """Handle the "authenticate" signal.""" self.session.pause_message(message) try: logger.debug('_on_authenticate: message status code is %s', message.status_code) if not retrying and self.username and self.password: auth.authenticate(self.username, self.password) if auth.is_for_proxy(): logger.debug('_on_authenticate auth is for proxy.') got_creds = yield self.request_proxy_auth_credentials( self.session.props.proxy_uri.host, retrying) if got_creds: logger.debug('Got proxy credentials from user.') auth.authenticate(self.proxy_username, self.proxy_password) finally: self.session.unpause_message(message) @defer.inlineCallbacks def _on_proxy_authenticate(self, failure, iri, method="GET", extra_headers=None, oauth_credentials=None, post_content=None): """Deal with wrong settings.""" failure.trap(ProxyUnauthorizedError) logger.debug('Proxy settings are wrong.') got_creds = yield self.request_proxy_auth_credentials( self.session.props.proxy_uri.host, True) if got_creds: settings = dict(host=self.session.props.proxy_uri.host, port=self.session.props.proxy_uri.port, username=self.proxy_username, password=self.proxy_password) self.force_use_proxy(settings) response = yield self.request(iri, method, extra_headers, oauth_credentials, post_content) defer.returnValue(response) @defer.inlineCallbacks def request(self, iri, method="GET", extra_headers=None, oauth_credentials=None, post_content=None): """Return a deferred that will be fired with a Response object.""" uri = self.iri_to_uri(iri) headers = yield self.build_request_headers(uri, method, extra_headers, oauth_credentials) d = defer.Deferred() message = self.soup.Message.new(method, uri) for key, value in headers.items(): message.request_headers.append(key, value) if post_content: message.request_body.append(post_content) self.session.queue_message(message, self._on_message, d) d.addErrback(self._on_proxy_authenticate, iri, method, extra_headers, oauth_credentials, post_content) response = yield d defer.returnValue(response) def force_use_proxy(self, settings): """Setup this webclient to use the given proxy settings.""" # pylint: disable=W0511 proxy_uri = self.get_proxy_uri(settings) self.session.set_property("proxy-uri", proxy_uri) def get_proxy_uri(self, settings): """Get a Soup.URI for the proxy, or None if disabled.""" if "host" in settings and "port" in settings: template = URI_ANONYMOUS_TEMPLATE if "username" in settings and "password" in settings: template = URI_USERNAME_TEMPLATE uri = template.format(**settings) return self.soup.URI.new(uri) else: # If the proxy host is not set, use no proxy return None def shutdown(self): """End the soup session for this webclient.""" self.session.abort() ubuntu-sso-client-13.10/ubuntu_sso/utils/webclient/tests/0000755000202700020270000000000012225013301024011 5ustar dobeydobey00000000000000ubuntu-sso-client-13.10/ubuntu_sso/utils/webclient/tests/__init__.py0000664000202700020270000000476712151461656026164 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2011-2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Tests for the proxy-aware webclient.""" TEMPLATE_GSETTINGS_OUTPUT = """\ org.gnome.system.proxy autoconfig-url '{autoconfig_url}' org.gnome.system.proxy ignore-hosts {ignore_hosts:s} org.gnome.system.proxy mode '{mode}' org.gnome.system.proxy.ftp host '{ftp_host}' org.gnome.system.proxy.ftp port {ftp_port} org.gnome.system.proxy.http authentication-password '{auth_password}' org.gnome.system.proxy.http authentication-user '{auth_user}' org.gnome.system.proxy.http host '{http_host}' org.gnome.system.proxy.http port {http_port} org.gnome.system.proxy.http use-authentication {http_use_auth} org.gnome.system.proxy.https host '{https_host}' org.gnome.system.proxy.https port {https_port} org.gnome.system.proxy.socks host '{socks_host}' org.gnome.system.proxy.socks port {socks_port} """ BASE_GSETTINGS_VALUES = { "autoconfig_url": "", "ignore_hosts": ["localhost", "127.0.0.0/8"], "mode": "none", "ftp_host": "", "ftp_port": 0, "auth_password": "", "auth_user": "", "http_host": "", "http_port": 0, "http_use_auth": "false", "https_host": "", "https_port": 0, "socks_host": "", "socks_port": 0, } ubuntu-sso-client-13.10/ubuntu_sso/utils/webclient/tests/test_webclient.py0000664000202700020270000013017412151461656027430 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2011-2013 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT AN WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Integration tests for the proxy-enabled webclient.""" import logging import os import shutil import sys try: # pylint: disable=E0611,F0401 from urllib.parse import (urlencode, unquote, urlparse, urljoin, parse_qsl) # pylint: enable=E0611,F0401 except ImportError: from urllib import urlencode, unquote from urlparse import urlparse, urljoin, parse_qsl from OpenSSL import crypto from socket import gethostname from twisted.cred import checkers, portal from twisted.internet import defer from twisted.web import guard, http, resource from ubuntuone.devtools.handlers import MementoHandler from ubuntuone.devtools.testcases import TestCase, skipIfOS from ubuntuone.devtools.testcases.squid import SquidTestCase from ubuntuone.devtools.testing.txwebserver import ( HTTPWebServer, HTTPSWebServer, ) from ubuntu_sso import ( keyring, EXCEPTION_RAISED, USER_SUCCESS, USER_CANCELLATION, ) from ubuntu_sso.utils import webclient from ubuntu_sso.utils.ui import SSL_DETAILS_TEMPLATE from ubuntu_sso.utils.webclient import gsettings, txweb from ubuntu_sso.utils.webclient.common import ( BaseWebClient, HeaderDict, UnauthorizedError, WebClientError, ) ANY_VALUE = object() SAMPLE_KEY = "result" SAMPLE_VALUE = "sample result" SAMPLE_RESOURCE = '{"%s": "%s"}' % (SAMPLE_KEY, SAMPLE_VALUE) SAMPLE_USERNAME = "peddro" SAMPLE_PASSWORD = "cantropus" SAMPLE_CREDENTIALS = dict( consumer_key="consumer key", consumer_secret="consumer secret", token="the real token", token_secret="the token secret", ) SAMPLE_HEADERS = {SAMPLE_KEY: SAMPLE_VALUE} SAMPLE_POST_PARAMS = {"param1": "value1", "param2": "value2"} SAMPLE_JPEG_HEADER = '\xff\xd8\xff\xe0\x00\x10JFIF' SIMPLERESOURCE = "simpleresource" BYTEZERORESOURCE = "bytezeroresource" POSTABLERESOURCE = "postableresource" THROWERROR = "throwerror" UNAUTHORIZED = "unauthorized" HEADONLY = "headonly" VERIFYHEADERS = "verifyheaders" VERIFYPOSTPARAMS = "verifypostparams" GUARDED = "guarded" OAUTHRESOURCE = "oauthresource" WEBCLIENT_MODULE_NAME = webclient.webclient_module().__name__ def sample_get_credentials(): """Will return the sample credentials right now.""" return defer.succeed(SAMPLE_CREDENTIALS) # pylint: disable=C0103 # t.w.resource methods have freeform cased names class SimpleResource(resource.Resource): """A simple web resource.""" def render_GET(self, request): """Make a bit of html out of these resource's content.""" return SAMPLE_RESOURCE class ByteZeroResource(resource.Resource): """A resource that has a nul byte in the middle of it.""" def render_GET(self, request): """Return the content of this resource.""" return SAMPLE_JPEG_HEADER class PostableResource(resource.Resource): """A resource that only answers to POST requests.""" def render_POST(self, request): """Make a bit of html out of these resource's content.""" return SAMPLE_RESOURCE class HeadOnlyResource(resource.Resource): """A resource that fails if called with a method other than HEAD.""" def render_HEAD(self, request): """Return a bit of html.""" return "OK" class VerifyHeadersResource(resource.Resource): """A resource that verifies the headers received.""" def render_GET(self, request): """Make a bit of html out of these resource's content.""" headers = request.requestHeaders.getRawHeaders(SAMPLE_KEY) if headers != [SAMPLE_VALUE]: request.setResponseCode(http.BAD_REQUEST) return "ERROR: Expected header not present." request.setHeader(SAMPLE_KEY, SAMPLE_VALUE) return SAMPLE_RESOURCE class VerifyPostParameters(resource.Resource): """A resource that answers to POST requests with some parameters.""" def fetch_post_args_only(self, request): """Fetch only the POST arguments, not the args in the url.""" request.process = lambda: None request.requestReceived(request.method, request.path, request.clientproto) return request.args def render_POST(self, request): """Verify the parameters that we've been called with.""" post_params = self.fetch_post_args_only(request) expected = dict((key, [val]) for key, val in SAMPLE_POST_PARAMS.items()) if post_params != expected: request.setResponseCode(http.BAD_REQUEST) return "ERROR: Expected arguments not present, %r != %r" % ( post_params, expected) return SAMPLE_RESOURCE class SimpleRealm(object): """The same simple resource for all users.""" def requestAvatar(self, avatarId, mind, *interfaces): """The avatar for this user.""" if resource.IResource in interfaces: return (resource.IResource, SimpleResource(), lambda: None) raise NotImplementedError() class OAuthCheckerResource(resource.Resource): """A resource that verifies the request was oauth signed.""" def render_GET(self, request): """Make a bit of html out of these resource's content.""" header = request.requestHeaders.getRawHeaders("Authorization")[0] if header.startswith("OAuth "): return SAMPLE_RESOURCE request.setResponseCode(http.BAD_REQUEST) return "ERROR: Expected OAuth header not present." def get_root_resource(): """Get the root resource with all the children.""" root = resource.Resource() root.putChild(SIMPLERESOURCE, SimpleResource()) root.putChild(BYTEZERORESOURCE, ByteZeroResource()) root.putChild(POSTABLERESOURCE, PostableResource()) root.putChild(THROWERROR, resource.NoResource()) unauthorized_resource = resource.ErrorPage(http.UNAUTHORIZED, "Unauthorized", "Unauthorized") root.putChild(UNAUTHORIZED, unauthorized_resource) root.putChild(HEADONLY, HeadOnlyResource()) root.putChild(VERIFYHEADERS, VerifyHeadersResource()) root.putChild(VERIFYPOSTPARAMS, VerifyPostParameters()) root.putChild(OAUTHRESOURCE, OAuthCheckerResource()) db = checkers.InMemoryUsernamePasswordDatabaseDontUse() db.addUser(SAMPLE_USERNAME, SAMPLE_PASSWORD) test_portal = portal.Portal(SimpleRealm(), [db]) cred_factory = guard.BasicCredentialFactory("example.org") guarded_resource = guard.HTTPAuthSessionWrapper(test_portal, [cred_factory]) root.putChild(GUARDED, guarded_resource) return root class HTTPMockWebServer(HTTPWebServer): """A mock webserver for the webclient tests.""" def __init__(self): """Create a new instance.""" root = get_root_resource() super(HTTPMockWebServer, self).__init__(root) class HTTPSMockWebServer(HTTPSWebServer): """A mock webserver for the webclient tests.""" def __init__(self, ssl_settings): """Create a new instance.""" root = get_root_resource() super(HTTPSMockWebServer, self).__init__(root, ssl_settings) class ModuleSelectionTestCase(TestCase): """Test the functions to choose the qtnet or libsoup backend.""" def test_is_qt4reactor_installed_not_installed(self): """When the qt4reactor is not installed, it returns false.""" self.patch(sys, "modules", {}) self.assertFalse(webclient.is_qt4reactor_installed()) def test_is_qt4reactor_installed_installed_core(self): """When the qt4reactor is installed, it returns true.""" self.assertTrue(webclient.is_qt4reactor_installed()) def assert_module_name(self, module, expected_name): """Check the name of a given module.""" module_filename = os.path.basename(module.__file__) module_name = os.path.splitext(module_filename)[0] self.assertEqual(module_name, expected_name) def test_webclient_module_qtnetwork(self): """Test the module name for the qtnetwork case.""" self.patch(webclient, "is_qt4reactor_installed", lambda: True) module = webclient.webclient_module() self.assert_module_name(module, "qtnetwork") def test_webclient_module_libsoup(self): """Test the module name for the libsoup case.""" self.patch(webclient, "is_qt4reactor_installed", lambda: False) module = webclient.webclient_module() self.assert_module_name(module, "libsoup") class WebClientTestCase(TestCase): """Test for the webclient.""" timeout = 1 webclient_factory = webclient.webclient_factory @defer.inlineCallbacks def setUp(self): yield super(WebClientTestCase, self).setUp() self.wc = self.webclient_factory() self.addCleanup(self.wc.shutdown) self.ws = HTTPMockWebServer() self.ws.start() self.addCleanup(self.ws.stop) self.base_iri = self.ws.get_iri() @defer.inlineCallbacks def test_request_takes_an_iri(self): """Passing a non-unicode iri fails.""" d = self.wc.request(bytes(self.base_iri + SIMPLERESOURCE)) yield self.assertFailure(d, TypeError) @defer.inlineCallbacks def test_get_iri(self): """Passing in a unicode iri works fine.""" result = yield self.wc.request(self.base_iri + SIMPLERESOURCE) self.assertEqual(SAMPLE_RESOURCE, result.content) @defer.inlineCallbacks def test_get_iri_error(self): """The errback is called when there's some error.""" yield self.assertFailure(self.wc.request(self.base_iri + THROWERROR), WebClientError) @defer.inlineCallbacks def test_zero_byte_in_content(self): """Test a reply with a nul byte in the middle of it.""" result = yield self.wc.request(self.base_iri + BYTEZERORESOURCE) self.assertEqual(SAMPLE_JPEG_HEADER, result.content) @defer.inlineCallbacks def test_post(self): """Test a post request.""" result = yield self.wc.request(self.base_iri + POSTABLERESOURCE, method="POST") self.assertEqual(SAMPLE_RESOURCE, result.content) @defer.inlineCallbacks def test_post_with_args(self): """Test a post request with arguments.""" args = urlencode(SAMPLE_POST_PARAMS) iri = self.base_iri + VERIFYPOSTPARAMS + "?" + args headers = { "content-type": "application/x-www-form-urlencoded", } result = yield self.wc.request(iri, method="POST", extra_headers=headers, post_content=args) self.assertEqual(SAMPLE_RESOURCE, result.content) @defer.inlineCallbacks def test_unauthorized(self): """Detect when a request failed with the UNAUTHORIZED http code.""" yield self.assertFailure(self.wc.request(self.base_iri + UNAUTHORIZED), UnauthorizedError) @defer.inlineCallbacks def test_method_head(self): """The HTTP method is used.""" result = yield self.wc.request(self.base_iri + HEADONLY, method="HEAD") self.assertEqual("", result.content) @defer.inlineCallbacks def test_send_extra_headers(self): """The extra_headers are sent to the server.""" result = yield self.wc.request(self.base_iri + VERIFYHEADERS, extra_headers=SAMPLE_HEADERS) self.assertIn(SAMPLE_KEY, result.headers) self.assertEqual(result.headers[SAMPLE_KEY], [SAMPLE_VALUE]) @defer.inlineCallbacks def test_send_basic_auth(self): """The basic authentication headers are sent.""" other_wc = self.webclient_factory(username=SAMPLE_USERNAME, password=SAMPLE_PASSWORD) self.addCleanup(other_wc.shutdown) result = yield other_wc.request(self.base_iri + GUARDED) self.assertEqual(SAMPLE_RESOURCE, result.content) @defer.inlineCallbacks def test_send_basic_auth_wrong_credentials(self): """Wrong credentials returns a webclient error.""" other_wc = self.webclient_factory(username=SAMPLE_USERNAME, password="wrong password!") self.addCleanup(other_wc.shutdown) yield self.assertFailure(other_wc.request(self.base_iri + GUARDED), UnauthorizedError) @defer.inlineCallbacks def test_request_is_oauth_signed(self): """The request is oauth signed.""" tsc = self.wc.get_timestamp_checker() self.patch(tsc, "get_faithful_time", lambda: defer.succeed('1')) result = yield self.wc.request(self.base_iri + OAUTHRESOURCE, oauth_credentials=SAMPLE_CREDENTIALS) self.assertEqual(SAMPLE_RESOURCE, result.content) @defer.inlineCallbacks def test_oauth_signing_uses_timestamp(self): """OAuth signing uses the timestamp.""" called = [] def fake_get_faithful_time(): """A fake get_timestamp""" called.append(True) return defer.succeed('1') tsc = self.wc.get_timestamp_checker() self.patch(tsc, "get_faithful_time", fake_get_faithful_time) yield self.wc.request(self.base_iri + OAUTHRESOURCE, oauth_credentials=SAMPLE_CREDENTIALS) self.assertTrue(called, "The timestamp must be retrieved.") @defer.inlineCallbacks def test_returned_content_are_bytes(self): """The returned content are bytes.""" tsc = self.wc.get_timestamp_checker() self.patch(tsc, "get_faithful_time", lambda: defer.succeed('1')) result = yield self.wc.request(self.base_iri + OAUTHRESOURCE, oauth_credentials=SAMPLE_CREDENTIALS) self.assertTrue(isinstance(result.content, bytes), "The type of %r must be bytes" % result.content) @defer.inlineCallbacks def test_webclienterror_not_string(self): """The returned exception contains unicode data.""" deferred = self.wc.request(self.base_iri + THROWERROR) failure = yield self.assertFailure(deferred, WebClientError) for error in failure.args: self.assertTrue(isinstance(error, basestring)) class FakeSavingReactor(object): """A fake reactor that saves connection attempts.""" def __init__(self): """Initialize this fake instance.""" self.connections = [] def connectTCP(self, host, port, factory, *args): """Fake the connection.""" self.connections.append((host, port, args)) factory.response_headers = {} factory.deferred = defer.succeed("response content") def connectSSL(self, host, port, factory, *args): """Fake the connection.""" self.connections.append((host, port, args)) factory.response_headers = {} factory.deferred = defer.succeed("response content") class TxWebClientTestCase(WebClientTestCase): """Test case for txweb.""" webclient_factory = txweb.WebClient @defer.inlineCallbacks def setUp(self): """Set the diff tests.""" # delay import, otherwise a default reactor gets installed from twisted.web import client self.factory = client.HTTPClientFactory # set the factory to be used # Hook the server's buildProtocol to make the protocol instance # accessible to tests and ensure that the reactor is clean! build_protocol = self.factory.buildProtocol self.serverProtocol = None def remember_protocol_instance(my_self, addr): """Remember the protocol used in the test.""" protocol = build_protocol(my_self, addr) self.serverProtocol = protocol on_connection_lost = defer.Deferred() connection_lost = protocol.connectionLost def defer_connection_lost(protocol, *a): """Lost connection.""" if not on_connection_lost.called: on_connection_lost.callback(None) connection_lost(protocol, *a) self.patch(protocol, 'connectionLost', defer_connection_lost) def cleanup(): """Clean the connection.""" if self.serverProtocol.transport is not None: self.serverProtocol.transport.loseConnection() return on_connection_lost self.addCleanup(cleanup) return protocol self.factory.buildProtocol = remember_protocol_instance self.addCleanup(self.set_build_protocol, build_protocol) txweb.WebClient.client_factory = self.factory yield super(TxWebClientTestCase, self).setUp() def set_build_protocol(self, method): """Set the method back.""" self.factory.buildProtocol = method class TxWebClientReactorReplaceableTestCase(TestCase): """In the txweb client the reactor is replaceable.""" timeout = 3 FAKE_HOST = u"fake" FAKE_IRI_TEMPLATE = u"%%s://%s/fake_page" % FAKE_HOST @defer.inlineCallbacks def _test_replaceable_reactor(self, iri): """The reactor can be replaced with the tunnel client.""" fake_reactor = FakeSavingReactor() wc = txweb.WebClient(fake_reactor) _response = yield wc.request(iri) assert(_response) host, _port, _args = fake_reactor.connections[0] self.assertEqual(host, self.FAKE_HOST) def test_replaceable_reactor_http(self): """Test the replaceable reactor with an http iri.""" return self._test_replaceable_reactor(self.FAKE_IRI_TEMPLATE % "http") def test_replaceable_reactor_https(self): """Test the replaceable reactor with an https iri.""" return self._test_replaceable_reactor(self.FAKE_IRI_TEMPLATE % "https") class TimestampCheckerTestCase(TestCase): """Tests for the timestampchecker classmethod.""" @defer.inlineCallbacks def setUp(self): """Initialize this testcase.""" yield super(TimestampCheckerTestCase, self).setUp() self.wc = webclient.webclient_factory() self.patch(self.wc.__class__, "timestamp_checker", None) def test_timestamp_checker_has_the_same_class_as_the_creator(self): """The TimestampChecker has the same class.""" tsc = self.wc.get_timestamp_checker() self.assertEqual(tsc.webclient_class, self.wc.__class__) def test_timestamp_checker_is_the_same_for_all_webclients(self): """The TimestampChecker is the same for all webclients.""" tsc1 = self.wc.get_timestamp_checker() wc2 = webclient.webclient_factory() tsc2 = wc2.get_timestamp_checker() # pylint: disable=E1101 self.assertIs(tsc1, tsc2) class BasicProxyTestCase(SquidTestCase): """Test that the proxy works at all.""" timeout = 3 @defer.inlineCallbacks def setUp(self): yield super(BasicProxyTestCase, self).setUp() self.ws = HTTPMockWebServer() self.ws.start() self.addCleanup(self.ws.stop) self.base_iri = self.ws.get_iri() self.wc = webclient.webclient_factory() self.addCleanup(self.wc.shutdown) def assert_header_contains(self, headers, expected): """One of the headers matching key must contain a given value.""" self.assertTrue(any(expected in value for value in headers)) @defer.inlineCallbacks def test_anonymous_proxy_is_used(self): """The anonymous proxy is used by the webclient.""" settings = self.get_nonauth_proxy_settings() self.wc.force_use_proxy(settings) result = yield self.wc.request(self.base_iri + SIMPLERESOURCE) self.assert_header_contains(result.headers["Via"], "squid") @skipIfOS('linux2', 'LP: #1111880 - ncsa_auth crashing for auth proxy tests.') @defer.inlineCallbacks def test_authenticated_proxy_is_used(self): """The authenticated proxy is used by the webclient.""" settings = self.get_auth_proxy_settings() self.wc.force_use_proxy(settings) result = yield self.wc.request(self.base_iri + SIMPLERESOURCE) self.assert_header_contains(result.headers["Via"], "squid") @skipIfOS('linux2', 'LP: #1111880 - ncsa_auth crashing for auth proxy tests.') @defer.inlineCallbacks def test_auth_proxy_is_used_creds_requested(self): """The authenticated proxy is used by the webclient.""" settings = self.get_auth_proxy_settings() partial_settings = dict(host=settings['host'], port=settings['port']) def fake_creds_request(domain, retry): """Fake user interaction.""" self.wc.proxy_username = settings['username'] self.wc.proxy_password = settings['password'] return defer.succeed(True) self.patch(self.wc, 'request_proxy_auth_credentials', fake_creds_request) self.wc.force_use_proxy(partial_settings) result = yield self.wc.request(self.base_iri + SIMPLERESOURCE) self.assert_header_contains(result.headers["Via"], "squid") @skipIfOS('linux2', 'LP: #1111880 - ncsa_auth crashing for auth proxy tests.') @defer.inlineCallbacks def test_auth_proxy_is_requested_creds_bad_details(self): """Test using wrong credentials with the proxy.""" settings = self.get_auth_proxy_settings() wrong_settings = dict(host=settings['host'], port=settings['port'], username=settings['password'], password=settings['username']) def fake_creds_request(domain, retry): """Fake user interaction.""" self.wc.proxy_username = settings['username'] self.wc.proxy_password = settings['password'] return defer.succeed(True) self.patch(self.wc, 'request_proxy_auth_credentials', fake_creds_request) self.wc.force_use_proxy(wrong_settings) result = yield self.wc.request(self.base_iri + SIMPLERESOURCE) self.assert_header_contains(result.headers["Via"], "squid") @skipIfOS('linux2', 'LP: #1111880 - ncsa_auth crashing for auth proxy tests.') @defer.inlineCallbacks def test_auth_proxy_is_requested_creds_bad_details_user(self): """Test using no creds and user providing the wrong ones.""" settings = self.get_auth_proxy_settings() partial_settings = dict(host=settings['host'], port=settings['port']) def fake_creds_request(domain, retry): """Fake user interaction.""" if retry: self.wc.proxy_username = settings['username'] self.wc.proxy_password = settings['password'] else: self.wc.proxy_username = settings['password'] self.wc.proxy_password = settings['username'] return defer.succeed(True) self.patch(self.wc, 'request_proxy_auth_credentials', fake_creds_request) self.wc.force_use_proxy(partial_settings) result = yield self.wc.request(self.base_iri + SIMPLERESOURCE) self.assert_header_contains(result.headers["Via"], "squid") @skipIfOS('linux2', 'LP: #1111880 - ncsa_auth crashing for auth proxy tests.') @defer.inlineCallbacks def test_auth_proxy_is_requested_creds_bad_details_everywhere(self): """Test when we pass the wrong settings and get the wrong settings.""" settings = self.get_auth_proxy_settings() wrong_settings = dict(host=settings['host'], port=settings['port'], username=settings['password'], password=settings['username']) def fake_creds_request(domain, retry): """Fake user interaction.""" if retry: self.wc.proxy_username = settings['username'] self.wc.proxy_password = settings['password'] else: self.wc.proxy_username = settings['password'] self.wc.proxy_password = settings['username'] return defer.succeed(True) self.patch(self.wc, 'request_proxy_auth_credentials', fake_creds_request) self.wc.force_use_proxy(wrong_settings) result = yield self.wc.request(self.base_iri + SIMPLERESOURCE) self.assert_header_contains(result.headers["Via"], "squid") @skipIfOS('linux2', 'LP: #1111880 - ncsa_auth crashing for auth proxy tests.') def test_auth_proxy_is_requested_user_cancels(self): """Test when the user cancels the creds dialog.""" settings = self.get_auth_proxy_settings() partial_settings = dict(host=settings['host'], port=settings['port']) def fake_creds_request(domain, retry): """Fake user interaction.""" return defer.succeed(False) self.patch(self.wc, 'request_proxy_auth_credentials', fake_creds_request) self.wc.force_use_proxy(partial_settings) self.failUnlessFailure(self.wc.request(self.base_iri + SIMPLERESOURCE), WebClientError) if WEBCLIENT_MODULE_NAME.endswith(".txweb"): reason = "txweb does not support proxies." test_anonymous_proxy_is_used.skip = reason test_authenticated_proxy_is_used.kip = reason test_auth_proxy_is_used_creds_requested.skip = reason test_auth_proxy_is_requested_creds_bad_details.skip = reason test_auth_proxy_is_requested_creds_bad_details_user.skip = reason test_auth_proxy_is_requested_creds_bad_details_everywhere.skip = reason test_auth_proxy_is_requested_user_cancels.skip = reason class HeaderDictTestCase(TestCase): """Tests for the case insensitive header dictionary.""" def test_constructor_handles_keys(self): """The constructor handles case-insensitive keys.""" hd = HeaderDict({"ClAvE": "value"}) self.assertIn("clave", hd) def test_can_set_get_items(self): """The item is set/getted.""" hd = HeaderDict() hd["key"] = "value" hd["KEY"] = "value2" self.assertEqual(hd["key"], "value2") def test_can_test_presence(self): """The presence of an item is found.""" hd = HeaderDict() self.assertNotIn("cLaVe", hd) hd["CLAVE"] = "value1" self.assertIn("cLaVe", hd) del(hd["cLAVe"]) self.assertNotIn("cLaVe", hd) class OAuthPlainTextTestCase(TestCase): """Test for the oauth signing code using PLAINTEXT.""" oauth_sign = "PLAINTEXT" sample_method = "GET" sample_url = "http://one.ubuntu.com/" sample_params = {'next': 'yadda-yadda-yo', 'foo': 'naranja fanta'} timestamp = '1' expected_params = { "oauth_timestamp": str(timestamp), "oauth_consumer_key": SAMPLE_CREDENTIALS["consumer_key"], "oauth_token": SAMPLE_CREDENTIALS["token"], "oauth_nonce": ANY_VALUE, "oauth_signature": ANY_VALUE, } @defer.inlineCallbacks def setUp(self): yield super(OAuthPlainTextTestCase, self).setUp() self.expected_params["oauth_signature_method"] = self.oauth_sign oauth_sign_plain = self.oauth_sign == "PLAINTEXT" self.wc = BaseWebClient(oauth_sign_plain=oauth_sign_plain) def parse_oauth_header(self, header): """Parse an oauth header into a tuple of (method, params_dict).""" params = {} method, params_string = header.split(" ", 1) for p in params_string.split(","): k, v = p.strip().split("=") params[k] = unquote(v[1:-1]) return method, params def assert_headers_correct(self, headers): """Check that 'headers' match expected_params.""" method, params = self.parse_oauth_header(headers["Authorization"]) self.assertEqual(method, "OAuth") for k, expected_value in self.expected_params.items(): self.assertIn(k, params) if expected_value is not ANY_VALUE: self.assertEqual(params[k], expected_value) @defer.inlineCallbacks def test_build_oauth_headers(self): """Check that the oauth headers are properly built.""" def get_timestamp(): """Return the timestamp.""" return defer.succeed(self.timestamp) self.patch(self.wc, 'get_timestamp', get_timestamp) headers = yield self.wc.build_request_headers(self.sample_url, method=self.sample_method, oauth_credentials=SAMPLE_CREDENTIALS) self.assert_headers_correct(headers) def test_build_oauth_request(self, params=None): """Check that the oauth request are properly built.""" url, signed_headers, body = self.wc.build_oauth_request( self.sample_method, self.sample_url, SAMPLE_CREDENTIALS, self.timestamp, parameters=params, as_query=False) self.assert_headers_correct(signed_headers) self.assertEqual(url, self.sample_url) @defer.inlineCallbacks def test_build_signed_iri(self, params=None): """Check that the oauth signed iri is properly built.""" self.patch(self.wc, 'get_timestamp', lambda: self.timestamp) iri = u'http://foo.bar.baz/ñandú' uri = self.wc.iri_to_uri(iri) # request will be a 3-tuple of the url, signed headers, and body. url, signed_headers, body = self.wc.build_oauth_request( self.sample_method, uri, SAMPLE_CREDENTIALS, self.timestamp, parameters=params) scheme, netloc, path, params, query, _ = urlparse(url) expected = dict(parse_qsl(query)) result = yield self.wc.build_signed_iri( iri, SAMPLE_CREDENTIALS, parameters=params) scheme, netloc, path, params, query, _ = urlparse(result) self.assertEqual(urljoin(scheme + '://' + netloc, path), uri) actual = dict(parse_qsl(query)) for i in ('oauth_nonce', 'oauth_signature'): expected.pop(i) actual.pop(i) self.assertEqual(expected, actual) def test_build_signed_iri_with_params(self, params=None): """Check that the oauth signed iri is properly built with params.""" return self.test_build_signed_iri(params=self.sample_params) def patch_staticmethod(self, src, attr_name, replacement): """Alternate patch because self.patch fails restoring staticmethods.""" original = getattr(src, attr_name) setattr(src, attr_name, staticmethod(replacement)) self.addCleanup(setattr, src, attr_name, staticmethod(original)) class OAuthHmacSha1TestCase(OAuthPlainTextTestCase): """Test for the oauth signing code using HMAC-SHA1.""" oauth_sign = "HMAC-SHA1" class FakeKeyring(object): """A fake keyring.""" def __init__(self, creds): """A fake keyring.""" self.creds = creds def __call__(self): """Fake instance callable.""" return self def get_credentials(self, domain): """A fake get_credentials.""" if isinstance(self.creds, Exception): return defer.fail(self.creds) return defer.succeed(self.creds) class RequestProxyAuthTestCase(TestCase): """Test the spawn of the creds dialog.""" @defer.inlineCallbacks def setUp(self): """Set the different tests.""" yield super(RequestProxyAuthTestCase, self).setUp() self.wc = webclient.webclient_factory() self.addCleanup(self.wc.shutdown) self.domain = 'domain' self.retry = False self.creds = dict(username='username', password='password') self.keyring = FakeKeyring(self.creds) self.patch(keyring, 'Keyring', self.keyring) self.spawn_return_code = USER_SUCCESS def fake_spawn_process(args): """Fake spawning a process.""" if isinstance(self.spawn_return_code, Exception): return defer.fail(self.spawn_return_code) return defer.succeed(self.spawn_return_code) self.patch(webclient.common, 'spawn_program', fake_spawn_process) def test_spawn_error(self): """Test the case when we cannot spawn the process.""" self.spawn_return_code = Exception() self.failUnlessFailure(self.wc.request_proxy_auth_credentials( self.domain, True), WebClientError) @defer.inlineCallbacks def test_creds_acquired(self): """Test the case in which we do get the creds.""" got_creds = yield self.wc.request_proxy_auth_credentials( self.domain, self.retry) self.assertTrue(got_creds, 'Return true when creds are present.') self.assertEqual(self.wc.proxy_username, self.creds['username']) self.assertEqual(self.wc.proxy_password, self.creds['password']) def test_creds_acquired_keyring_error(self): """Test the case in which we cannot access the keyring.""" self.keyring.creds = Exception() self.failUnlessFailure(self.wc.request_proxy_auth_credentials( self.domain, self.retry), WebClientError) @defer.inlineCallbacks def test_creds_none(self): """Test the case in which we got None from the keyring.""" self.keyring.creds = None got_creds = yield self.wc.request_proxy_auth_credentials(self.domain, self.retry) self.assertFalse(got_creds, 'Return false when creds are not present.') def test_user_cancelation(self): """Test the case in which the user cancels.""" self.spawn_return_code = USER_CANCELLATION got_creds = yield self.wc.request_proxy_auth_credentials(self.domain, self.retry) self.assertFalse(got_creds, 'Return true when user cancels.') def test_exception_error(self): """Test the case in which something bad happened.""" self.spawn_return_code = EXCEPTION_RAISED got_creds = yield self.wc.request_proxy_auth_credentials(self.domain, self.retry) self.assertFalse(got_creds, 'Return true when user cancels.') class BaseSSLTestCase(SquidTestCase): """Base test that allows to use ssl connections.""" @defer.inlineCallbacks def setUp(self): """Set the diff tests.""" yield super(BaseSSLTestCase, self).setUp() self.cert_dir = os.path.join(self.tmpdir, 'cert') self.cert_details = dict(organization='Canonical', common_name=gethostname(), locality_name='London', unit='Ubuntu One', country_name='UK', state_name='London',) self.ssl_settings = self._generate_self_signed_certificate( self.cert_dir, self.cert_details) self.addCleanup(self._clean_ssl_certificate_files) self.ws = HTTPSMockWebServer(self.ssl_settings) self.ws.start() self.addCleanup(self.ws.stop) self.base_iri = self.ws.get_iri() def _clean_ssl_certificate_files(self): """Remove the certificate files.""" if os.path.exists(self.cert_dir): shutil.rmtree(self.cert_dir) def _generate_self_signed_certificate(self, cert_dir, cert_details): """Generate the required SSL certificates.""" if not os.path.exists(cert_dir): os.makedirs(cert_dir) cert_path = os.path.join(cert_dir, 'cert.crt') key_path = os.path.join(cert_dir, 'cert.key') if os.path.exists(cert_path): os.unlink(cert_path) if os.path.exists(key_path): os.unlink(key_path) # create a key pair key = crypto.PKey() key.generate_key(crypto.TYPE_RSA, 1024) # create a self-signed cert cert = crypto.X509() cert.get_subject().C = cert_details['country_name'] cert.get_subject().ST = cert_details['state_name'] cert.get_subject().L = cert_details['locality_name'] cert.get_subject().O = cert_details['organization'] cert.get_subject().OU = cert_details['unit'] cert.get_subject().CN = cert_details['common_name'] cert.set_serial_number(1000) cert.gmtime_adj_notBefore(0) cert.gmtime_adj_notAfter(10 * 365 * 24 * 60 * 60) cert.set_issuer(cert.get_subject()) cert.set_pubkey(key) cert.sign(key, 'sha1') with open(cert_path, 'wt') as fd: fd.write(crypto.dump_certificate(crypto.FILETYPE_PEM, cert)) with open(key_path, 'wt') as fd: fd.write(crypto.dump_privatekey(crypto.FILETYPE_PEM, key)) return dict(key=key_path, cert=cert_path) class CorrectProxyTestCase(BaseSSLTestCase): """Test the interaction with a SSL enabled proxy.""" @defer.inlineCallbacks def setUp(self): """Set the tests.""" yield super(CorrectProxyTestCase, self).setUp() # fake the gsettings to have diff settings for https and http http_settings = self.get_auth_proxy_settings() #remember so that we can use them in the creds request proxy_username = http_settings['username'] proxy_password = http_settings['password'] # delete the username and password so that we get a 407 for testing del http_settings['username'] del http_settings['password'] https_settings = self.get_nonauth_proxy_settings() proxy_settings = dict(http=http_settings, https=https_settings) self.patch(gsettings, "get_proxy_settings", lambda: proxy_settings) self.wc = webclient.webclient_factory() self.addCleanup(self.wc.shutdown) self.called = [] def fake_creds_request(domain, retry): """Fake user interaction.""" self.called.append('request_proxy_auth_credentials') self.wc.proxy_username = proxy_username self.wc.proxy_password = proxy_password return defer.succeed(True) self.patch(self.wc, 'request_proxy_auth_credentials', fake_creds_request) def assert_header_contains(self, headers, expected): """One of the headers matching key must contain a given value.""" self.assertTrue(any(expected in value for value in headers)) @defer.inlineCallbacks def test_https_request(self): """Test using the correct proxy for the ssl request. In order to assert that the correct proxy is used we expect not to call the auth dialog since we set the https proxy not to use the auth proxy and to fail because we are reaching a https page with bad self-signed certs. """ # we fail due to the fake ssl cert yield self.failUnlessFailure(self.wc.request( self.base_iri + SIMPLERESOURCE), WebClientError) # https requests do not use the auth proxy therefore called should be # empty. This asserts that we are using the correct settings for the # request. self.assertEqual([], self.called) @defer.inlineCallbacks def test_http_request(self): """Test using the correct proxy for the plain request. This tests does the opposite to the https tests. We did set the auth proxy for the http request therefore we expect the proxy dialog to be used and not to get an error since we are not visiting a https with bad self-signed certs. """ # we do not fail since we are not going to the https page result = yield self.wc.request(self.base_iri + SIMPLERESOURCE) self.assert_header_contains(result.headers["Via"], "squid") # assert that we did go through the auth proxy self.assertIn('request_proxy_auth_credentials', self.called) if WEBCLIENT_MODULE_NAME.endswith(".txweb"): reason = 'Multiple proxy settings is not supported.' test_https_request.skip = reason test_http_request.skip = reason if WEBCLIENT_MODULE_NAME.endswith(".libsoup"): reason = 'Hard to test since we need to fully mock gsettings.' test_https_request.skip = reason test_http_request.skip = reason if WEBCLIENT_MODULE_NAME.endswith(".qtnetwork"): reason = ('Updating proxy settings is not well support due to bug' ' QTBUG-14850: https://bugreports.qt-project.org/' 'browse/QTBUG-14850') test_https_request.skip = reason test_http_request.skip = reason class SSLTestCase(BaseSSLTestCase): """Test error handling when dealing with ssl.""" @defer.inlineCallbacks def setUp(self): """Set the diff tests.""" yield super(SSLTestCase, self).setUp() self.memento = MementoHandler() self.memento.setLevel(logging.DEBUG) logger = webclient.webclient_module().logger logger.addHandler(self.memento) self.addCleanup(logger.removeHandler, self.memento) self.wc = webclient.webclient_factory() self.addCleanup(self.wc.shutdown) self.return_code = USER_CANCELLATION self.called = [] def fake_launch_ssl_dialog(client, domain, details): """Fake the ssl dialog.""" self.called.append(('_launch_ssl_dialog', domain, details)) return defer.succeed(self.return_code) self.patch(BaseWebClient, '_launch_ssl_dialog', fake_launch_ssl_dialog) @defer.inlineCallbacks def _assert_ssl_fail_user_accepts(self, proxy_settings=None): """Assert the dialog is shown in an ssl fail.""" self.return_code = USER_SUCCESS if proxy_settings: self.wc.force_use_proxy(proxy_settings) yield self.wc.request(self.base_iri + SIMPLERESOURCE) details = SSL_DETAILS_TEMPLATE % self.cert_details self.assertIn(('_launch_ssl_dialog', gethostname(), details), self.called) def test_ssl_fail_dialog_user_accepts(self): """Test showing the dialog and accepting.""" self._assert_ssl_fail_user_accepts() def test_ssl_fail_dialog_user_accepts_via_proxy(self): """Test showing the dialog and accepting when using a proxy.""" self._assert_ssl_fail_user_accepts(self.get_nonauth_proxy_settings()) def test_ssl_fail(self): """Test showing the dialog and rejecting.""" self.failUnlessFailure(self.wc.request( self.base_iri + SIMPLERESOURCE), WebClientError) self.assertNotEqual(None, self.memento.check_error('SSL errors')) def test_format_ssl_details(self): """Assert that details are correctly formatted""" details = SSL_DETAILS_TEMPLATE % self.cert_details self.assertEqual(details, self.wc.format_ssl_details(self.cert_details)) if (WEBCLIENT_MODULE_NAME.endswith(".txweb") or WEBCLIENT_MODULE_NAME.endswith(".libsoup")): reason = 'SSL support has not yet been implemented.' test_ssl_fail_dialog_user_accepts.skip = reason test_ssl_fail_dialog_user_accepts_via_proxy.skip = reason test_ssl_fail.skip = reason ubuntu-sso-client-13.10/ubuntu_sso/utils/webclient/tests/test_gsettings.py0000664000202700020270000002723112151461656027462 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2011-2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Test the gsettings parser.""" import logging from twisted.trial.unittest import TestCase from ubuntuone.devtools.handlers import MementoHandler from ubuntu_sso.utils.webclient import gsettings from ubuntu_sso.utils.webclient.tests import ( BASE_GSETTINGS_VALUES, TEMPLATE_GSETTINGS_OUTPUT, ) class ProxySettingsTestCase(TestCase): """Test the getting of the proxy settings.""" def test_gsettings_cmdline_correct(self): """The command line used to get the proxy settings is the right one.""" expected = "gsettings list-recursively org.gnome.system.proxy".split() called = [] def append_output(args): """Append the output and return some settings.""" called.append(args) return TEMPLATE_GSETTINGS_OUTPUT.format(**BASE_GSETTINGS_VALUES) self.patch(gsettings.subprocess, "check_output", append_output) gsettings.get_proxy_settings() self.assertEqual(called[0], expected) def test_gsettings_parser_none(self): """Test a parser of gsettings.""" expected = {} fake_output = TEMPLATE_GSETTINGS_OUTPUT.format(**BASE_GSETTINGS_VALUES) self.patch(gsettings.subprocess, "check_output", lambda _: fake_output) ps = gsettings.get_proxy_settings() self.assertEqual(ps, expected) def _assert_parser_anonymous(self, scheme): """Assert the parsing of anonymous settings.""" template_values = dict(BASE_GSETTINGS_VALUES) expected_host = "expected_host" expected_port = 54321 expected = { "host": expected_host, "port": expected_port, } template_values.update({ "mode": "manual", scheme + "_host": expected_host, scheme + "_port": expected_port, }) fake_output = TEMPLATE_GSETTINGS_OUTPUT.format(**template_values) self.patch(gsettings.subprocess, "check_output", lambda _: fake_output) ps = gsettings.get_proxy_settings() self.assertEqual(ps[scheme], expected) def test_gsettings_parser_http_anonymous(self): """Test a parser of gsettings.""" self._assert_parser_anonymous('http') def test_gsettings_parser_https_anonymus(self): """Test a parser of gsettings.""" self._assert_parser_anonymous('https') def test_gsettings_empty_ignore_hosts(self): """Missing values in the ignore hosts.""" troublesome_value = "@as []" template_values = dict(BASE_GSETTINGS_VALUES) template_values["ignore_hosts"] = troublesome_value fake_output = TEMPLATE_GSETTINGS_OUTPUT.format(**template_values) self.patch(gsettings.subprocess, "check_output", lambda _: fake_output) ps = gsettings.get_proxy_settings() self.assertEqual(ps, {}) def test_gsettings_cannot_parse(self): """Some weird setting that cannot be parsed is logged with warning.""" memento = MementoHandler() memento.setLevel(logging.DEBUG) gsettings.logger.addHandler(memento) self.addCleanup(gsettings.logger.removeHandler, memento) troublesome_value = "#bang" template_values = dict(BASE_GSETTINGS_VALUES) template_values["ignore_hosts"] = troublesome_value fake_output = TEMPLATE_GSETTINGS_OUTPUT.format(**template_values) self.patch(gsettings.subprocess, "check_output", lambda _: fake_output) ps = gsettings.get_proxy_settings() self.assertTrue(memento.check_warning(gsettings.CANNOT_PARSE_WARNING % troublesome_value)) self.assertEqual(ps, {}) def test_gsettings_parser_http_authenticated(self): """Test a parser of gsettings.""" template_values = dict(BASE_GSETTINGS_VALUES) expected_host = "expected_host" expected_port = 54321 expected_user = "carlitos" expected_password = "very secret password" expected = { "host": expected_host, "port": expected_port, "username": expected_user, "password": expected_password, } template_values.update({ "mode": "manual", "http_host": expected_host, "http_port": expected_port, "auth_user": expected_user, "auth_password": expected_password, "http_use_auth": "true", }) fake_output = TEMPLATE_GSETTINGS_OUTPUT.format(**template_values) self.patch(gsettings.subprocess, "check_output", lambda _: fake_output) ps = gsettings.get_proxy_settings() self.assertEqual(ps["http"], expected) def _assert_parser_authenticated_url(self, scheme): """Test a parser of gsettings with creds in the url.""" template_values = dict(BASE_GSETTINGS_VALUES) expected_host = "expected_host" expected_port = 54321 expected_user = "carlitos" expected_password = "very secret password" composed_url = '%s:%s@%s' % (expected_user, expected_password, expected_host) expected = { "host": expected_host, "port": expected_port, "username": expected_user, "password": expected_password, } template_values.update({ "mode": "manual", scheme + "_host": composed_url, scheme + "_port": expected_port, "http_use_auth": "false", }) fake_output = TEMPLATE_GSETTINGS_OUTPUT.format(**template_values) self.patch(gsettings.subprocess, "check_output", lambda _: fake_output) ps = gsettings.get_proxy_settings() self.assertEqual(ps[scheme], expected) def test_gsettings_parser_http_authenticated_url(self): """Test a parser of gsettings with creds in the url.""" self._assert_parser_authenticated_url('http') def test_gsettings_parser_https_authenticated_url(self): """Test a parser of gsettings with creds in the url.""" self._assert_parser_authenticated_url('https') def test_gsettings_auth_over_url(self): """Test that the settings are more important that the url.""" template_values = dict(BASE_GSETTINGS_VALUES) expected_host = "expected_host" expected_port = 54321 expected_user = "carlitos" expected_password = "very secret password" composed_url = '%s:%s@%s' % ('user', 'random', expected_host) http_expected = { "host": expected_host, "port": expected_port, "username": expected_user, "password": expected_password, } template_values.update({ "mode": "manual", "http_host": composed_url, "http_port": expected_port, "auth_user": expected_user, "auth_password": expected_password, "http_use_auth": "true", }) fake_output = TEMPLATE_GSETTINGS_OUTPUT.format(**template_values) self.patch(gsettings.subprocess, "check_output", lambda _: fake_output) ps = gsettings.get_proxy_settings() self.assertEqual(ps["http"], http_expected) def _assert_parser_empty_url(self, scheme): """Assert the parsing of an empty url.""" template_values = dict(BASE_GSETTINGS_VALUES) template_values.update({ "mode": "manual", scheme + "_host": '', scheme + "_port": 0, "http_use_auth": "false", }) fake_output = TEMPLATE_GSETTINGS_OUTPUT.format(**template_values) self.patch(gsettings.subprocess, "check_output", lambda _: fake_output) ps = gsettings.get_proxy_settings() self.assertNotIn(scheme, ps) def test_gsettings_parser_empty_http_url(self): """Test when there is no http proxy set.""" self._assert_parser_empty_url('http') def test_gsettings_parser_empty_https_url(self): """Test when there is no https proxy set.""" self._assert_parser_empty_url('https') class ParseProxyHostTestCase(TestCase): """Test the parsing of the domain.""" def test_onlyhost(self): """Parse a host with no username or password.""" sample = "hostname" hostname, username, password = gsettings.parse_proxy_host(sample) self.assertEqual(username, None) self.assertEqual(password, None) self.assertEqual(hostname, "hostname") def test_user_and_host(self): """Parse host just with the username.""" sample = "username@hostname" hostname, username, password = gsettings.parse_proxy_host(sample) self.assertEqual(username, "username") self.assertEqual(password, None) self.assertEqual(hostname, "hostname") def test_user_pass_and_host(self): """Test parsing a host with a username and password.""" sample = "username:password@hostname" hostname, username, password = gsettings.parse_proxy_host(sample) self.assertEqual(username, "username") self.assertEqual(password, "password") self.assertEqual(hostname, "hostname") def test_username_with_at(self): """Test parsing the host with a username with @.""" sample = "username@company.com:password@hostname" hostname, username, password = gsettings.parse_proxy_host(sample) self.assertEqual(username, "username@company.com") self.assertEqual(password, "password") self.assertEqual(hostname, "hostname") def test_username_with_at_nopass(self): """Test parsing the host without a password.""" sample = "username@company.com@hostname" hostname, username, password = gsettings.parse_proxy_host(sample) self.assertEqual(username, "username@company.com") self.assertEqual(password, None) self.assertEqual(hostname, "hostname") def test_user_pass_with_colon_and_host(self): """Test parsing the host with a password that contains :.""" sample = "username:pass:word@hostname" hostname, username, password = gsettings.parse_proxy_host(sample) self.assertEqual(username, "username") self.assertEqual(password, "pass:word") self.assertEqual(hostname, "hostname") ubuntu-sso-client-13.10/ubuntu_sso/utils/webclient/tests/test_timestamp.py0000664000202700020270000001254112151461656027454 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2011-2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Tests for the timestamp sync classes.""" from twisted.internet import defer from twisted.trial.unittest import TestCase from twisted.web import resource from ubuntuone.devtools.testing.txwebserver import HTTPWebServer from ubuntu_sso.utils.webclient import timestamp, webclient_module class FakedError(Exception): """Stub to replace Request.error.""" class RootResource(resource.Resource): """A root resource that logs the number of calls.""" isLeaf = True def __init__(self, *args, **kwargs): """Initialize this fake instance.""" resource.Resource.__init__(self, *args, **kwargs) self.count = 0 self.request_headers = [] # pylint: disable=C0103 def render_HEAD(self, request): """Increase the counter on each render.""" self.request_headers.append(request.requestHeaders) self.count += 1 return "" class MockWebServer(HTTPWebServer): """A mock webserver for testing.""" def __init__(self): """Create a new server.""" super(MockWebServer, self).__init__(RootResource()) class TimestampCheckerTestCase(TestCase): """Tests for the timestamp checker.""" timeout = 5 @defer.inlineCallbacks def setUp(self): yield super(TimestampCheckerTestCase, self).setUp() self.ws = MockWebServer() self.ws.start() self.addCleanup(self.ws.stop) self.webclient_class = webclient_module().WebClient self.patch(timestamp.TimestampChecker, "SERVER_IRI", self.ws.get_iri()) @defer.inlineCallbacks def test_returned_value_is_int(self): """The returned value is an integer.""" checker = timestamp.TimestampChecker(self.webclient_class) result = yield checker.get_faithful_time() self.assertEqual(type(result), int) @defer.inlineCallbacks def test_first_call_does_head(self): """The first call gets the clock from our web.""" checker = timestamp.TimestampChecker(self.webclient_class) yield checker.get_faithful_time() self.assertEqual(self.ws.root.count, 1) @defer.inlineCallbacks def test_second_call_is_cached(self): """For the second call, the time is cached.""" checker = timestamp.TimestampChecker(self.webclient_class) yield checker.get_faithful_time() yield checker.get_faithful_time() self.assertEqual(self.ws.root.count, 1) @defer.inlineCallbacks def test_after_timeout_cache_expires(self): """After some time, the cache expires.""" fake_timestamp = 1 self.patch(timestamp.time, "time", lambda: fake_timestamp) checker = timestamp.TimestampChecker(self.webclient_class) yield checker.get_faithful_time() fake_timestamp += timestamp.TimestampChecker.CHECKING_INTERVAL yield checker.get_faithful_time() self.assertEqual(self.ws.root.count, 2) @defer.inlineCallbacks def test_server_error_means_skew_not_updated(self): """When server can't be reached, the skew is not updated.""" fake_timestamp = 1 self.patch(timestamp.time, "time", lambda: fake_timestamp) checker = timestamp.TimestampChecker(self.webclient_class) failing_get_server_time = lambda _: defer.fail(FakedError()) self.patch(checker, "get_server_time", failing_get_server_time) yield checker.get_faithful_time() self.assertEqual(checker.skew, 0) self.assertEqual(checker.next_check, fake_timestamp + timestamp.TimestampChecker.ERROR_INTERVAL) @defer.inlineCallbacks def test_server_date_sends_nocache_headers(self): """Getting the server date sends the no-cache headers.""" checker = timestamp.TimestampChecker(self.webclient_class) yield checker.get_server_date_header(self.ws.get_iri()) self.assertEqual(len(self.ws.root.request_headers), 1) headers = self.ws.root.request_headers[0] result = headers.getRawHeaders("Cache-Control") self.assertEqual(result, ["no-cache"]) ubuntu-sso-client-13.10/ubuntu_sso/utils/webclient/tests/test_restful.py0000664000202700020270000002150512151461656027135 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2011-2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT AN WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Tests for the proxy-enabled restful client.""" import logging try: # pylint: disable=E0611,F0401 from urllib.parse import urlparse, parse_qs, parse_qsl # pylint: enable=E0611,F0401 except ImportError: from urlparse import urlparse, parse_qs, parse_qsl from twisted.internet import defer from ubuntuone.devtools.handlers import MementoHandler from ubuntuone.devtools.testcases import TestCase from ubuntu_sso.utils.webclient import restful from ubuntu_sso.utils.webclient.common import Response SAMPLE_SERVICE_IRI = u"http://localhost/" SAMPLE_NAMESPACE = u"sample_namespace" SAMPLE_METHOD = u"sample_method" SAMPLE_OPERATION = SAMPLE_NAMESPACE + u"." + SAMPLE_METHOD SAMPLE_ARGS = dict(uno=1, dos=u"2", tres=u"ñandú") SAMPLE_RESPONSE = restful.json.dumps(SAMPLE_ARGS) SAMPLE_USERNAME = "joeuser@example.com" SAMPLE_PASSWORD = "clavesecreta" SAMPLE_OAUTH_CREDS = dict(token="1234", etc="456") class FakeWebClient(object): """A fake web client.""" def __init__(self, **kwargs): """Initialize this faker.""" self.return_value = SAMPLE_RESPONSE self.called = [] self.init_kwargs = kwargs self.running = True def request(self, iri, *args, **kwargs): """Return a deferred that will be fired with a Response object.""" self.called.append((iri, args, kwargs)) return defer.succeed(Response(self.return_value)) def shutdown(self): """Stop this fake webclient.""" self.running = False class BaseTestCase(TestCase): """The base for the Restful Client testcases.""" @defer.inlineCallbacks def setUp(self): """Initialize this test case.""" yield super(BaseTestCase, self).setUp() self.wc = None self.patch(restful.webclient, "webclient_factory", self.webclient_factory) def webclient_factory(self, **kwargs): """A factory that saves the webclient created.""" self.wc = FakeWebClient(**kwargs) return self.wc class RestfulClientTestCase(BaseTestCase): """Tests for the proxy-enabled Restful Client.""" @defer.inlineCallbacks def setUp(self): """Initialize this testcase.""" yield super(RestfulClientTestCase, self).setUp() self.rc = restful.RestfulClient(SAMPLE_SERVICE_IRI) self.addCleanup(self.rc.shutdown) def test_has_a_webclient(self): """The RC has a webclient.""" self.assertEqual(self.rc.webclient, self.wc) def test_shutsdown_the_webclient(self): """Calling shutdown on the restful shuts down the webclient too.""" self.rc.shutdown() # pylint: disable=E1101 self.assertFalse(self.rc.webclient.running, "The webclient is stopped") @defer.inlineCallbacks def test_can_make_calls(self): """The RC can make webcalls.""" yield self.rc.restcall(SAMPLE_OPERATION, **SAMPLE_ARGS) self.assertEqual(len(self.wc.called), 1) @defer.inlineCallbacks def test_restful_namespace_added_to_url(self): """The restful namespace is added to the url.""" yield self.rc.restcall(SAMPLE_OPERATION, **SAMPLE_ARGS) iri, _, _ = self.wc.called[0] uri = iri.encode("ascii") url = urlparse(uri) # pylint: disable=E1101,E1103 self.assertTrue(url.path.endswith(SAMPLE_NAMESPACE), "The namespace is included in url") @defer.inlineCallbacks def test_restful_method_added_to_params(self): """The restful method is added to the params.""" yield self.rc.restcall(SAMPLE_OPERATION, **SAMPLE_ARGS) _, _, webcall_kwargs = self.wc.called[0] wc_params = parse_qs(webcall_kwargs["post_content"]) self.assertEqual(wc_params["ws.op"][0], SAMPLE_METHOD) @defer.inlineCallbacks def test_arguments_added_as_json_to_webcall(self): """The keyword arguments are used as json in the webcall.""" yield self.rc.restcall(SAMPLE_OPERATION, **SAMPLE_ARGS) _, _, webcall_kwargs = self.wc.called[0] params = parse_qsl(webcall_kwargs["post_content"]) result = {} for key, value in params: if key == "ws.op": continue result[key] = restful.json.loads(value) self.assertEqual(result, SAMPLE_ARGS) @defer.inlineCallbacks def test_post_header_sent(self): """A header is sent specifying the contents of the post.""" yield self.rc.restcall(SAMPLE_OPERATION, **SAMPLE_ARGS) _, _, webcall_kwargs = self.wc.called[0] self.assertEqual(restful.POST_HEADERS, webcall_kwargs["extra_headers"]) @defer.inlineCallbacks def test_post_method_set(self): """The method of the webcall is set to POST.""" yield self.rc.restcall(SAMPLE_OPERATION, **SAMPLE_ARGS) _, _, webcall_kwargs = self.wc.called[0] self.assertEqual("POST", webcall_kwargs["method"]) @defer.inlineCallbacks def test_return_value_json_parsed(self): """The result is json parsed before being returned.""" result = yield self.rc.restcall(SAMPLE_OPERATION) self.assertEqual(result, SAMPLE_ARGS) class AuthenticationOptionsTestCase(BaseTestCase): """Tests for the authentication options.""" def test_passes_userpass_to_webclient_init(self): """The RestfulClient passes the user and pass to the webclient.""" params = dict(username=SAMPLE_USERNAME, password=SAMPLE_PASSWORD) restful.RestfulClient(SAMPLE_SERVICE_IRI, **params) expected = dict(params) expected["oauth_sign_plain"] = True self.assertEqual(self.wc.init_kwargs, expected) @defer.inlineCallbacks def test_passes_oauth_creds_to_request(self): """The RestfulClient passes the credentials in each request.""" kwargs = dict(oauth_credentials=SAMPLE_OAUTH_CREDS) rc = restful.RestfulClient(SAMPLE_SERVICE_IRI, **kwargs) yield rc.restcall(SAMPLE_OPERATION, **SAMPLE_ARGS) _, _, kwargs = self.wc.called[0] self.assertEqual(kwargs["oauth_credentials"], SAMPLE_OAUTH_CREDS) class LogginTestCase(BaseTestCase): """Ensure that proper debug logging is done.""" @defer.inlineCallbacks def setUp(self): """Initialize this testcase.""" yield super(LogginTestCase, self).setUp() self.memento = MementoHandler() restful.logger.addHandler(self.memento) restful.logger.setLevel(logging.DEBUG) self.addCleanup(restful.logger.removeHandler, self.memento) self.rc = restful.RestfulClient(SAMPLE_SERVICE_IRI) self.addCleanup(self.rc.shutdown) @defer.inlineCallbacks def test_log_rest_call(self): """Check that proper DEBUG is made for every REST call.""" yield self.rc.restcall(SAMPLE_OPERATION, **SAMPLE_ARGS) expected_msgs = ( SAMPLE_SERVICE_IRI + SAMPLE_NAMESPACE, ) self.assertTrue(self.memento.check_debug(*expected_msgs)) @defer.inlineCallbacks def test_log_json_loads_exception(self): """Check that json load errors are properly logged.""" invalid_json = 'NOTAVALIDJSON' self.patch(self.wc, 'return_value', invalid_json) yield self.assertFailure(self.rc.restcall(SAMPLE_OPERATION), ValueError) self.memento.debug = True expected_msgs = ( ValueError, 'Can not load json from REST request response', invalid_json ) self.assertTrue(self.memento.check_exception(*expected_msgs)) ubuntu-sso-client-13.10/ubuntu_sso/utils/webclient/tests/test_qtnetwork.py0000664000202700020270000001242412151461736027506 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2011-2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT AN WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Specific tests for the qt implementation.""" from PyQt4.QtNetwork import QSslError from twisted.internet import defer from ubuntuone.devtools.testcases import TestCase from ubuntu_sso.utils.webclient import qtnetwork class SetupProxyTestCase(TestCase): """Test the proxy setup.""" @defer.inlineCallbacks def setUp(self): """Set the different tests.""" yield super(SetupProxyTestCase, self).setUp() self.called = [] self.settings = dict(https=dict(username='user', password='pasword')) self.patch(qtnetwork.gsettings, 'get_proxy_settings', lambda: self.settings) self.patch(qtnetwork, "get_cert_dir", lambda: "") self.patch(qtnetwork.glob, "glob", lambda dir: []) self.proxy = None self.real_build_proxy = qtnetwork.build_proxy def build_proxy(settings): """Log build_proxy calls.""" self.called.append(('build_proxy', settings)) self.proxy = self.real_build_proxy(settings) return self.proxy self.patch(qtnetwork, 'build_proxy', lambda s: build_proxy(s)) self.addCleanup(self._clean_webclient_instance) def _set_old_platform(self, platform): """Set back the platform.""" qtnetwork.sys.platform = platform def _clean_webclient_instance(self): """Set the webclient not to have a proxy.""" qtnetwork.WebClient.proxy_instance = None def test_setup_no_certs(self): # Ensure WebClient can start even if it finds no certs. # It may or may not end up working depending on the certs actually # being in the system, but not having them locally shouldn't prevent # startup. qtnetwork.WebClient() def test_setup_unreadable_cert(self): # If for some reason a cert of our own is found but can't be read, # make sure we raise WebClientError. # glob only returns paths that actually exist, but we fake this by # passing something that can't be opened. self.patch(qtnetwork.glob, "glob", lambda dir: ["asdfasdfasdf"]) self.assertRaises(qtnetwork.WebClientError, qtnetwork.WebClient) class SetupLinuxProxyTestCase(SetupProxyTestCase): """Test setting up the proxy.""" @defer.inlineCallbacks def setUp(self): """Set the different tests.""" yield super(SetupLinuxProxyTestCase, self).setUp() old_platform = qtnetwork.sys.platform qtnetwork.sys.platform = 'linux' self.addCleanup(self._set_old_platform, old_platform) def test_setup_proxy(self): """Test setting the proxy.""" qtnetwork.WebClient() self.assertEqual(self.proxy, qtnetwork.WebClient.proxy_instance) self.assertIn(('build_proxy', self.settings), self.called) def test_setup_instance_present(self): """Test when the instance is present.""" # set the instance and assert we did not reset it qtnetwork.WebClient.proxy_instance = 'other_proxy' qtnetwork.WebClient() self.assertNotEqual(self.proxy, qtnetwork.WebClient.proxy_instance) self.assertNotIn(('build_proxy', self.settings), self.called) class FakeQNetworkReply(object): """A fake QNetworkReply.""" def __init__(self): """Initialize this fake.""" url = qtnetwork.QUrl("http://fake_server") self._request = qtnetwork.QNetworkRequest(url) def request(self): """Return a test network request.""" return self._request class SSLErrorsTestCase(TestCase): """Tests for when SSL errors happen.""" def test_handle_ssl_errors(self): """Test the _handle_ssl_errors method.""" result = [] self.patch(qtnetwork.logger, "error", result.append) client = qtnetwork.WebClient() reply = FakeQNetworkReply() errors = [QSslError()] client._handle_ssl_errors(reply, errors) self.assertTrue(type(result[0]), unicode) ubuntu-sso-client-13.10/ubuntu_sso/utils/webclient/txweb.py0000664000202700020270000001523112151461656024400 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2011-2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """A webclient backend that uses twisted.web.client.""" import base64 try: # pylint: disable=E0611,F0401 from urllib.parse import urlparse # pylint: enable=E0611,F0401 except ImportError: from urlparse import urlparse from twisted.internet import defer from ubuntu_sso.logger import setup_logging from ubuntu_sso.utils.webclient.common import ( BaseWebClient, HeaderDict, Response, UnauthorizedError, WebClientError, ) logger = setup_logging("ubuntu_sso.utils.webclient.txweb") class RawResponse(object): """A raw response from the webcall.""" def __init__(self, headers, content, code=200, phrase="OK"): """Initialize this response.""" self.headers = headers self.content = content self.code = code self.phrase = phrase class WebClient(BaseWebClient): """A simple web client that does not support proxies, yet.""" client_factory = None def __init__(self, connector=None, context_factory=None, **kwargs): """Initialize this webclient.""" # delay import, otherwise a default reactor gets installed from twisted.web import client super(WebClient, self).__init__(**kwargs) if connector is None: from twisted.internet import reactor self.connector = reactor else: self.connector = connector if context_factory is None: from twisted.internet import ssl self.context_factory = ssl.ClientContextFactory() else: self.context_factory = context_factory # decide which client factory to use if WebClient.client_factory is None: self.client_factory = client.HTTPClientFactory else: self.client_factory = WebClient.client_factory @defer.inlineCallbacks def raw_request(self, method, uri, headers, postdata): """Make a raw http request.""" # Twisted wants headers as bytes, but because of oauthlib, they might # be unicodes. Assume utf-8 and revert the encodings. bytes_headers = {} for key, value in headers.items(): if isinstance(key, unicode): key = key.encode('utf-8') if isinstance(value, unicode): value = value.encode('utf-8') bytes_headers[key] = value headers = bytes_headers # delay import, otherwise a default reactor gets installed from twisted.web import error parsed_url = urlparse(uri) # pylint: disable=E1101,E1103 https = parsed_url.scheme == "https" host = parsed_url.netloc.split(":")[0] # pylint: enable=E1101,E1103 if parsed_url.port is None: port = 443 if https else 80 else: port = parsed_url.port factory = self.client_factory(uri, method=method, postdata=postdata, headers=headers, followRedirect=False) # pylint: disable=E1103 if https: self.connector.connectSSL(host, port, factory, self.context_factory) else: self.connector.connectTCP(host, port, factory) # pylint: enable=E1103 try: content = yield factory.deferred response = RawResponse(factory.response_headers, content) except error.Error as e: response = RawResponse(factory.response_headers, e.response, int(e.status), e.message) defer.returnValue(response) @defer.inlineCallbacks def request(self, iri, method="GET", extra_headers=None, oauth_credentials=None, post_content=None): """Get the page, or fail trying.""" # delay import, otherwise a default reactor gets installed from twisted.web import http uri = self.iri_to_uri(iri) headers = yield self.build_request_headers(uri, method, extra_headers, oauth_credentials) if self.username and self.password: auth = base64.b64encode(self.username + ":" + self.password) headers["Authorization"] = "Basic " + auth try: raw_response = yield self.raw_request(method, uri, headers=headers, postdata=post_content) response_headers = HeaderDict(raw_response.headers) if method.lower() != "head": response_content = raw_response.content else: response_content = "" if raw_response.code == http.OK: defer.returnValue(Response(response_content, response_headers)) if raw_response.code == http.UNAUTHORIZED: raise UnauthorizedError(raw_response.phrase, response_content) raise WebClientError(raw_response.phrase, response_content) except WebClientError: raise except Exception as e: raise WebClientError(e.message, e) def force_use_proxy(self, settings): """Setup this webclient to use the given proxy settings.""" # No direct proxy support in twisted.web.client ubuntu-sso-client-13.10/ubuntu_sso/utils/ui.py0000664000202700020270000003003212151461656021704 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2011-2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Utils to be used by the UI modules.""" import argparse import os import re from ubuntu_sso.logger import setup_logging from ubuntu_sso.utils.translation import get_gettext source_path = os.path.join(os.path.dirname(__file__), os.path.pardir, os.path.pardir, 'build', 'mo') _ = get_gettext('ubuntu-sso-client', fallback_path=os.path.abspath(source_path)) logger = setup_logging('ubuntu_sso.utils.ui') # Undefined variable '_', pylint: disable=E0602 # all the text that is used in the gui AGREE_TO_PRIVACY_POLICY = _('By signing up to {app_name} you agree to ' 'our {privacy_policy}') AGREE_TO_TERMS = _('By signing up to {app_name} you agree to ' 'our {terms_and_conditions}') AGREE_TO_TERMS_AND_PRIVACY_POLICY = AGREE_TO_TERMS + _(' and {privacy_policy}') CANCEL_BUTTON = _('Cancel') CAPTCHA_SOLUTION_ENTRY = _('Type the characters above') CAPTCHA_LOAD_ERROR = _('There was a problem getting the captcha, ' 'reloading...') CAPTCHA_RELOAD_MESSAGE = _('If you can\'t read this then %(reload_link)s ' 'this page') CAPTCHA_RELOAD_TEXT = _('refresh') CAPTCHA_RELOAD_TOOLTIP = _('Reload') CAPTCHA_REQUIRED_ERROR = _('The captcha is a required field') CLOSE_AND_SETUP_LATER = _('Close window and set up later') CONGRATULATIONS = _("Congratulations, {app_name} is installed!") CONNECT_HELP_LABEL = _('To connect this computer to %(app_name)s enter your ' 'details below.') CREATE_ACCOUNT_LABEL = _('Register with {app_name}.') EMAIL_LABEL = EMAIL1_ENTRY = _('Email address') EMAIL2_ENTRY = _('Re-type Email address') EMAIL_INVALID = _('The email must be a valid email address.') EMAIL_MISMATCH = _('The email addresses don\'t match, please double check ' 'and try entering them again.') EMAIL = _("Email") EMAIL_MATCH = _("The email addresses do not match") EMAIL_TOKEN_ENTRY = _('Enter code verification here') EMPTY_NAME = _("Please enter your name") ERROR = _('The process did not finish successfully.') ERROR_EMAIL_TOKEN = 'email_token' EXISTING_ACCOUNT_CHOICE_BUTTON = _('Sign me in with my existing account') FIELD_REQUIRED = _('This field is required.') FORGOTTEN_PASSWORD_BUTTON = _('I\'ve forgotten my password') FORGOTTEN_PASSWORD_TITLE = _('Reset password') FORGOTTEN_PASSWORD_SUBTITLE = _('To reset your {app_name} password, enter ' 'your registered email address below. We will send instructions to reset ' 'your password.') INVALID_EMAIL = _("Please enter a valid email address") GENERIC_BACKEND_ERROR = _('There was a problem accessing the Ubuntu' ' One backend.') JOIN_HEADER_LABEL = _('Create %(app_name)s account') LOADING = _('Loading...') LOADING_OVERLAY = _('Getting information, please wait...') LOGIN_BUTTON_LABEL = _('Already have an account? Click here to sign in') LOGIN_EMAIL_ENTRY = _('Email address') LOGIN_HEADER_LABEL = _('Connect to %(app_name)s') LOGIN_PASSWORD_ENTRY = _('Password') LOGIN_PASSWORD_LABEL = LOGIN_PASSWORD_ENTRY LOGIN_TITLE = _('Sign In to {app_name}') LOGIN_SUBTITLE = CONNECT_HELP_LABEL NAME_ENTRY = _('Name') NAME_INVALID = _('The name must not be empty.') NEXT = _('Next') NETWORK_DETECTION_TITLE = _('Network detection') NETWORK_DETECTION_WARNING = _('Are you online? We can\'t detect an internet ' 'connection - you will need to be connected to set up %(app_name)s') ONE_MOMENT_PLEASE = _('One moment please...') PASSWORD = _("Create a password") PASSWORD_CHANGED = _('Your password was successfully changed.') PASSWORD_DIGIT = _("At least one number") PASSWORD1_ENTRY = RESET_PASSWORD1_ENTRY = _('Password') PASSWORD2_ENTRY = RESET_PASSWORD2_ENTRY = _('Re-type Password') PASSWORD_HELP = _('The password must have a minimum of 8 characters and ' 'include one uppercase character and one number.') PASSWORD_LENGTH = _("At least 8 characters") PASSWORD_MATCH = _("Passwords don't match") PASSWORD_MISMATCH = _('The passwords don\'t match, please double check ' 'and try entering them again.') PASSWORD_MUST_CONTAIN = _("Your password must contain") PASSWORD_TOO_WEAK = _('The password is too weak.') PASSWORD_UPPER = _("At least one uppercase letter") PRIVACY_POLICY_TEXT = _("Privacy Policy") PROXY_CREDS_CONNECTION = _('Connecting to:') PROXY_CREDS_DIALOG_TITLE = _('Proxy Settings') PROXY_CREDS_ERROR = _('Incorrect login details. Please try again.') PROXY_CREDS_EXPLANATION = _('Please provide login details.') PROXY_CREDS_HEADER = _('You are connecting through a proxy.') PROXY_CREDS_HELP_BUTTON = _('Get Help With Proxies') PROXY_CREDS_PSWD_LABEL = _('Proxy password:') PROXY_CREDS_SAVE_BUTTON = _('Save and Connect') PROXY_CREDS_USER_LABEL = _('Proxy username:') RESET_TITLE = _("Reset password") RESET_SUBTITLE = _('A password reset code has been sent to your e-mail. ' 'Please enter the code below along with your new password.') RETYPE_EMAIL = _("Retype email") RETYPE_PASSWORD = _("Retype password") REQUEST_PASSWORD_TOKEN_LABEL = _('To reset your %(app_name)s password,' ' enter your email address below:') REQUEST_PASSWORD_TOKEN_TECH_ERROR = _('We are very Sorry! The service that' ' signs you on is not responding right now\nPlease try again or' ' come back in a few minutes.') REQUEST_PASSWORD_TOKEN_WRONG_EMAIL = _('Sorry we did not recognize the email' ' address.') RESET_CODE_ENTRY = _('Reset code') RESET_EMAIL_ENTRY = _('Email address') RESET_PASSWORD = RESET_TITLE SET_NEW_PASSWORD_LABEL = _('A password reset code has been sent to ' '%(email)s.\nPlease enter the code below along with your new password.') SET_UP_ACCOUNT_BUTTON = _('Set Up Account') SET_UP_ACCOUNT_CHOICE_BUTTON = _('I don\'t have an account yet - sign me up') SIGN_IN_BUTTON = _('Sign In') SIGN_IN_LABEL = _('Log-in with my existing account.') SSL_APPNAME_HELP = _('the appname whose ssl error we are going to show.') SSL_CERT_DETAILS = _('Certificate details') SSL_CONNECT_BUTTON = _('Connect') SSL_DETAILS_HELP = _('the details ssl certificate we are going to show.') SSL_DETAILS_TEMPLATE = ('Organization:\t%(organization)s\n' 'Common Name:\t%(common_name)s\n' 'Locality Name:\t%(locality_name)s\n' 'Unit:\t%(unit)s\n' 'Country:\t%(country_name)s\n' 'State or Province:\t%(state_name)s') SSL_DESCRIPTION = _('Open the SSL certificate UI.') SSL_DIALOG_TITLE = _('SSL Certificate Not Valid') SSL_DOMAIN_HELP = _('the domain whose ssl certificate we are going to show.') SSL_EXPLANATION = _('You are trying to connect to a proxy server on' ' %(domain)s. This server uses a secure connection, and the SSL ' 'certificate is not valid because:') SSL_FIRST_REASON = _('The certificate has not been verified') SSL_HEADER = _('Do you want to connect to this server?') SSL_HELP_BUTTON = _('Get Help With SSL') SSL_NOT_SURE = _('If you are not sure about this server, do not use it to' ' connect to %(app_name)s.') SSL_REMEMBER_DECISION = _('Remember my settings for this certificate.') SSL_SECOND_REASON = _('The name on the certificate isn\'t valid or doesn\'t' ' match the name of the site') SSL_THIRD_REASON = _('The certificate has expired') SUCCESS = _('You are now logged into %(app_name)s.') SURNAME_ENTRY = _('Surname') TERMS_TEXT = _("Terms of Service") TITLE = REGISTER_TITLE = _("Sign Up to {app_name}") TC_BUTTON = _('Show Terms & Conditions') TC_NOT_ACCEPTED = _('Agreeing to the %(app_name)s Terms & Conditions is ' 'required to subscribe.') TOS_LABEL = _("You can also find these terms at %(url)s") TRY_AGAIN_BUTTON = _('Try again') UNKNOWN_ERROR = _('There was an error when trying to complete the ' 'process. Please check the information and try again.') VERIFICATION_CODE = _('Verification code') VERIFY_EMAIL_CONTENT = _('Check %(email)s for an email from Ubuntu One. ' 'This message contains a verification code. Enter the code in ' 'the field below and click OK to complete creating your %(app_name)s ' 'account.') VERIFY_EMAIL_TITLE = _('Enter verification code') VERIFY_EMAIL_LABEL = ('%s\n\n' % VERIFY_EMAIL_TITLE + VERIFY_EMAIL_CONTENT) YES_TO_TC = _('I agree with the %(app_name)s terms and conditions') YES_TO_UPDATES = _('Yes! Email me %(app_name)s tips and updates.') # pylint: enable=E0602 def get_password_strength(password): """Return the strength of the password. This function returns the strength of the password so that ui elements can show the user how good his password is. The logic used is the following: * 1 extra point for 4 chars passwords * 1 extra point for 8 chars passwords * 1 extra point for more than 11 chars passwords. * 1 extra point for passwords with at least one number. * 1 extra point for passwords for lower and capital chars. * 1 extra point for passwords with a special char. A passwords starts with 0 and the extra points are added accordingly. """ score = 0 if len(password) < 1: return 0 if len(password) < 4: score = 1 if len(password) >= 8: score += 1 if len(password) >= 11: score += 1 if re.search('\d+', password): score += 1 if re.search('[a-z]', password) and re.search('[A-Z]', password): score += 1 if re.search('.[!,@,#,$,%,^,&,*,?,_,~,-,£,(,)]', password): score += 1 return score def is_min_required_password(password): """Return if the password meets the minimum requirements.""" if len(password) < 8 or \ re.search('[A-Z]', password) is None or \ re.search('\d+', password) is None: return False return True def is_correct_email(email_address): """Return if the email is correct.""" return '@' in email_address def parse_args(): """Parse sys.argv options.""" parser = argparse.ArgumentParser(description='Open the Ubuntu One UI.') parser.add_argument('--app_name', default='', help='the name of the application to retrieve credentials for') parser.add_argument('--ping_url', default='', help='a link to be used as the ping url (to notify about new tokens)') parser.add_argument('--policy_url', default='', help='a link to be used as Privacy Policy url') parser.add_argument('--tc_url', default='', help='a link to be used as Terms & Conditions url') parser.add_argument('--help_text', default='', help='extra text that will be shown below the headers') parser.add_argument('--window_id', type=int, default=0, help='the window id to be set transient for the Ubuntu One dialogs') parser.add_argument('--login_only', action='store_true', default=False, help='whether the Ubuntu One UI should only offer login or not') args = parser.parse_args() return args ubuntu-sso-client-13.10/ubuntu_sso/utils/ipc.py0000664000202700020270000003616012151461656022052 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2011-2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Perspective Broker IPC utils.""" from functools import wraps, partial from collections import defaultdict from twisted.internet import defer, endpoints from twisted.spread.pb import ( DeadReferenceError, NoSuchMethod, PBClientFactory, PBServerFactory, Referenceable, Root, ) from ubuntu_sso.logger import setup_logging from ubuntu_sso.utils.tcpactivation import ( ActivationClient, ActivationConfig, ActivationInstance, ) logger = setup_logging("ubuntu_sso.utils.ipc") LOCALHOST = '127.0.0.1' # pylint: disable=E1103 @defer.inlineCallbacks def server_listen(server_factory, service_name, activation_cmdline, description, reactor=None): """Connect the IPC server factory.""" config = ActivationConfig(service_name, activation_cmdline, description) ai = ActivationInstance(config) description = yield ai.get_server_description() if reactor is None: from twisted.internet import reactor server = endpoints.serverFromString(reactor, description) connector = yield server.listen(server_factory) defer.returnValue(connector) @defer.inlineCallbacks def client_connect(client_factory, service_name, activation_cmdline, description, reactor=None): """Connect the IPC client factory.""" config = ActivationConfig(service_name, activation_cmdline, description) ac = ActivationClient(config) description = yield ac.get_active_client_description() if reactor is None: from twisted.internet import reactor client = endpoints.clientFromString(reactor, description) port = yield client.connect(client_factory) defer.returnValue(port) # pylint: enable=E1103 # ============================== service helpers ============================== def signal(f): """Decorator to emit a signal.""" @wraps(f) def inner(self, *args, **kwargs): """Grab the signal name from the internal mapping and emit.""" f(self, *args, **kwargs) signal_name = f.__name__ self.emit_signal(signal_name, *args, **kwargs) return inner class SignalBroadcaster(object): """Object that allows to emit signals to clients over the IPC.""" MSG_NO_SIGNAL_HANDLER = "No signal handler for %r in %r" MSG_COULD_NOT_EMIT_SIGNAL = "Could not emit signal %r to %r due to %r" def __init__(self): """Create a new instance.""" super(SignalBroadcaster, self).__init__() self.clients_per_signal = defaultdict(set) def _ignore_no_such_method(self, failure, signal_name, current_client): """NoSuchMethod is not an error, ignore it.""" failure.trap(NoSuchMethod) logger.debug(self.MSG_NO_SIGNAL_HANDLER, signal_name, current_client) def _other_failure(self, failure, signal_name, current_client): """Log the issue when emitting a signal.""" logger.warning(self.MSG_COULD_NOT_EMIT_SIGNAL, signal_name, current_client, failure.value) logger.warning('Traceback is:\n%s', failure.printDetailedTraceback()) def remote_register_to_signals(self, client, signals): """Allow a client to register to some signals.""" for signal_name in signals: self.clients_per_signal[signal_name].add(client) def remote_unregister_to_signals(self, client): """Allow a client to unregister from the signal.""" for connected_clients in self.clients_per_signal.values(): if client in connected_clients: connected_clients.remove(client) def emit_signal(self, signal_name, *args, **kwargs): """Emit the given signal to the clients.""" logger.debug("emitting %r to all (%i) connected clients.", signal_name, len(self.clients_per_signal[signal_name])) result = [] dead_clients = set() for current_client in self.clients_per_signal[signal_name]: try: d = current_client.callRemote(signal_name, *args, **kwargs) d.addErrback(self._ignore_no_such_method, signal_name, current_client) d.addErrback(self._other_failure, signal_name, current_client) result.append(d) except DeadReferenceError: dead_clients.add(current_client) for client in dead_clients: logger.warn('emit_signal: Unregistering dead client %s.', client) self.remote_unregister_to_signals(client) class RemoteMeta(type): """Append remote_ to the remote methods. Remote has to be appended to the remote method to work over pb but this names cannot be used since the other platforms do not expect the remote prefix. This metaclass creates those prefixes so that the methods can be correctly called. """ def __new__(mcs, name, bases, attrs): remote_calls = attrs.get('remote_calls', []) for current in remote_calls: attrs['remote_' + current] = attrs[current] return super(RemoteMeta, mcs).__new__(mcs, name, bases, attrs) def meta_base(meta): """A function to return a metaclass which is called directly. This is safe for both Python 2 and 3.""" return meta("MetaBase", (object,), {}) class RemoteService(meta_base(RemoteMeta), Referenceable, SignalBroadcaster): """A remote service that provides the methods listed in remote_calls.""" remote_calls = [] class BaseService(object, Root): """Base PB service. Inherit from this class and define name, description and cmdline. If 'start' is called, 'shutdown' should be called when done. """ # a mapping of (service name, service class (an instance of RemoteService)) services = {} name = None description = None cmdline = None def __init__(self, *a, **kw): super(BaseService, self).__init__() self.factory = None self.listener = None for name, service_class in self.services.items(): service = service_class(*a, **kw) setattr(self, name, service) setattr(self, 'remote_get_%s' % name, partial(self._get_service, name)) def _get_service(self, name): """Return the instance of the service named 'name'.""" return getattr(self, name) @defer.inlineCallbacks def start(self): """Start listening in the proper description.""" self.factory = PBServerFactory(self) self.listener = yield server_listen(self.factory, self.name, self.cmdline, self.description) def shutdown(self): """Stop listening.""" self.listener.stopListening() # ============================== client helpers ============================== class RemoteClient(object, Referenceable): """Represent a client for remote calls.""" call_remote_functions = [] # methods that can be called on the remote obj signal_handlers = [] # signals that are of interest of this client def __init__(self, base_client, remote_object): """Create instance.""" super(RemoteClient, self).__init__() self._mapping = defaultdict(list) self.base_client = base_client self.remote = remote_object # for each function name in self.call_remote_functions, # set as instance attribute a function that will execute # self.remote.callRemote(function name, *a, **kw) for name in self.call_remote_functions: setattr(self, name, partial(self.call_method, name)) # for each signal name in self.signal_handlers, # set as instance attribute a function that will execute # all the callbacks registered with connect_to_signal, plus # the method self._cb(*a, **kw) if defined for name in self.signal_handlers: setattr(self, 'remote_' + name, self._emit_signal(name)) def _emit_signal(self, fname): """Return a function that will execute the 'fname' method.""" def callback_wrapper(*args, **kwargs): """Return the result of the callback if present.""" for callback in self._mapping[fname]: logger.info('Emitting remote signal for %s with callback %r.', fname, callback) callback(*args, **kwargs) # execute methods ending with _cb as signal handlers, # only for old compatibility old_name = ['on'] for i in fname: if i.isupper(): old_name.append('_' + i.lower()) else: old_name.append(i) old_name.append('_cb') callback = getattr(self, ''.join(old_name), None) if callback is not None: logger.info('Emitting remote signal for %s with callback %r.', fname, callback) callback(*args, **kwargs) return callback_wrapper @defer.inlineCallbacks def call_method(self, method_name, *args, **kwargs): """Call asynchronously 'method_name(*args)'. Return a deferred that will be fired when the call finishes. For now, **kwargs are ignored. """ logger.debug('Performing %r as a remote call (%r, %r).', method_name, args, kwargs) try: result = yield self.remote.callRemote(method_name, *args) except DeadReferenceError: yield self.base_client.reconnect() result = yield self.call_method(method_name, *args, **kwargs) defer.returnValue(result) @defer.inlineCallbacks def register_to_signals(self): """Register to the signals.""" try: result = yield self.remote.callRemote('register_to_signals', self, self.signal_handlers) except DeadReferenceError: yield self.base_client.reconnect() result = yield self.register_to_signals() defer.returnValue(result) def unregister_to_signals(self): """Register to the signals.""" return self.remote.callRemote('unregister_to_signals', self) def connect_to_signal(self, signal_name, callback): """Register 'callback' to be called when 'signal_name' is emitted.""" self._mapping[signal_name].append(callback) return callback def disconnect_from_signal(self, signal_name, match): """Unregister 'match' from 'signal_name'. 'match' is the object returned by 'connect_to_signal'. """ if match in self._mapping[signal_name]: self._mapping[signal_name].remove(match) class BaseClient(object): """Client that will connect to the service listening on the description. Inherit from this class and define service_name, service_description and service_cmdline so they return the proper values. The service_cmdline must be redefined so it returns the command line to execute to run the service, if it's not running. If 'connect' is called, 'disconnect' should be called when done. """ # a mapping of (client name, client class (an instance of RemoteClient)) clients = {} service_name = None service_description = None service_cmdline = None def __init__(self): self.factory = None self.client = None for client in self.clients: setattr(self, client, None) @defer.inlineCallbacks def _request_remote_objects(self, root): """Request all the diff remote objects used for the communication.""" logger.debug('Requesting remote objects (%r) for %s', self.clients.keys(), self.__class__.__name__) for name, client_class in self.clients.items(): remote = yield root.callRemote('get_%s' % name) setattr(self, name, client_class(self, remote)) @defer.inlineCallbacks def connect(self): """Connect to the remote service.""" self.factory = PBClientFactory() self.client = yield client_connect(self.factory, self.service_name, self.service_cmdline, self.service_description) root = yield self.factory.getRootObject() yield self._request_remote_objects(root) yield self.register_to_signals() @defer.inlineCallbacks def reconnect(self): """Reconnect with the server.""" self.factory = PBClientFactory() self.client = yield client_connect(self.factory, self.service_name, self.service_cmdline, self.service_description) root = yield self.factory.getRootObject() # loop over the already present remote clients and reset their remotes for name in self.clients: remote = yield root.callRemote('get_%s' % name) remote_client = getattr(self, name) remote_client.remote = remote yield self.register_to_signals() @defer.inlineCallbacks def register_to_signals(self): """Register all the clients to their signals.""" for name in self.clients: client = getattr(self, name) yield client.register_to_signals() @defer.inlineCallbacks def unregister_to_signals(self): """Unregister from the all the client's signals.""" for name in self.clients: client = getattr(self, name) yield client.unregister_to_signals() @defer.inlineCallbacks def disconnect(self): """Disconnect from the process.""" yield self.unregister_to_signals() if self.client: self.client.disconnect() ubuntu-sso-client-13.10/ubuntu_sso/utils/runner/0000755000202700020270000000000012225013301022204 5ustar dobeydobey00000000000000ubuntu-sso-client-13.10/ubuntu_sso/utils/runner/qt.py0000664000202700020270000000574212151461656023236 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Utility to spawn another program from a plain Qt mainloop.""" from PyQt4 import QtCore from ubuntu_sso.logger import setup_logging logger = setup_logging("ubuntu_sso.utils.runner.qt") # pylint: disable=C0103 # the set below is a workaround to hold to object references to avoid # garbage collection before the processes finish executing _processes = set() def spawn_program(args, reply_handler, error_handler): """Spawn the program specified by 'args' using the Qt mainloop. When the program finishes, 'reply_handler' will be called with a single argument that will be the porgram status code. If there is an error, error_handler will be called with an instance of SpawnError. """ process = QtCore.QProcess() _processes.add(process) def print_pid(): """Add a debug log message.""" pid = process.pid() logger.debug('Spawning the program %r with the qt mainloop ' '(returned pid is %r).', args, pid) def child_watch(status): """Handle child termination.""" reply_handler(status) _processes.remove(process) def handle_error(process_error): """Handle error when spawning the process.""" failed_to_start = (process_error == process.FailedToStart) msg = 'ProcessError is %r' % process_error error_handler(msg=msg, failed_to_start=failed_to_start) _processes.remove(process) process.started.connect(print_pid) process.finished.connect(child_watch) process.error.connect(handle_error) args = list(args) program = args[0] argv = args[1:] process.start(program, argv) ubuntu-sso-client-13.10/ubuntu_sso/utils/runner/__init__.py0000664000202700020270000000721512151461656024346 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Utility to spawn another program from a mainloop.""" import sys from twisted.internet import defer from ubuntu_sso.logger import setup_logging logger = setup_logging("ubuntu_sso.utils.runner") class SpawnError(Exception): """Generic error when spawning processes.""" class FailedToStartError(SpawnError): """The process could not be spawned.""" def is_qt4_main_loop_installed(): """Check if the Qt4 main loop is installed.""" result = False if not 'PyQt4' in sys.modules: return result try: from PyQt4.QtCore import QCoreApplication result = QCoreApplication.instance() is not None except ImportError: pass return result def spawn_program(args, use_reactor=False): """Spawn the program specified by 'args'. - 'args' should be a sequence of program arguments, the program to execute is normally the first item in 'args'. Return a deferred that will be fired when the execution of 'args' finishes, passing as the deferred result code the program return code. On error, the returned deferred will be errback'd. """ logger.debug('spawn_program: requested to spawn %r.', repr(args)) d = defer.Deferred() # HACK: The qt runner does have problem in mac os x and does not raise the # finish signal if use_reactor or sys.platform == 'darwin': from ubuntu_sso.utils.runner import tx source = tx elif is_qt4_main_loop_installed(): from ubuntu_sso.utils.runner import qt source = qt else: from ubuntu_sso.utils.runner import glib source = glib logger.debug('Spawn source is %r.', source) def reply_handler(status): """Callback the returned deferred.""" logger.debug('The program %r finished with status %r.', args, status) d.callback(status) def error_handler(msg, failed_to_start=False): """Errback the returned deferred.""" if failed_to_start: msg = 'Process %r could not be started (%r).' % (args, msg) exc = FailedToStartError(msg) else: exc = SpawnError('Unspecified error (%r).' % msg) logger.error('The program %r could not be run: %r', args, exc) d.errback(exc) source.spawn_program(args, reply_handler, error_handler) return d ubuntu-sso-client-13.10/ubuntu_sso/utils/runner/tx.py0000664000202700020270000000777012151461656023250 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Utility to spawn another program from a mainloop.""" import os import sys from twisted.internet import utils from ubuntu_sso.logger import setup_logging from ubuntu_sso.utils import compat logger = setup_logging("ubuntu_sso.utils.runner.tx") NO_SUCH_FILE_OR_DIR = 'OSError: [Errno 2]' EXE_EXT = '' if sys.platform == 'win32': EXE_EXT = '.exe' def spawn_program(args, reply_handler, error_handler): """Spawn the program specified by 'args' using the twisted reactor. When the program finishes, 'reply_handler' will be called with a single argument that will be the porgram status code. If there is an error, error_handler will be called with an instance of SpawnError. """ def child_watch(args): """Handle child termination.""" stdout, stderr, exit_code = args if stdout: logger.debug('Returned stdout is (exit code was %r): %r', exit_code, stdout) if stderr: logger.warning('Returned stderr is (exit code was %r): %r', exit_code, stderr) if OSError.__name__ in stderr: failed_to_start = NO_SUCH_FILE_OR_DIR in stderr error_handler(msg=stderr, failed_to_start=failed_to_start) else: reply_handler(exit_code) def handle_error(failure): """Handle error when spawning the process.""" error_handler(msg=failure.getErrorMessage()) args = list(args) program = args[0] argv = args[1:] bytes_args = [] for arg in argv: if isinstance(arg, compat.text_type): arg = arg.encode('utf-8') if not isinstance(arg, compat.basestring): arg = compat.binary_type(arg) bytes_args.append(arg) if program and not os.access(program, os.X_OK): # handle searching the executable in the PATH, since # twisted will not solve that for us :-/ paths = os.environ['PATH'].split(os.pathsep) for path in paths: target = os.path.join(path, program) if not target.endswith(EXE_EXT): target += EXE_EXT if os.access(target, os.X_OK): program = target break try: d = utils.getProcessOutputAndValue(program, bytes_args, env=os.environ) except OSError as e: error_handler(msg=e, failed_to_start=True) except Exception as e: error_handler(msg=e, failed_to_start=False) else: logger.debug('Spawning the program %r with the twisted reactor ' '(returned deferred is %r).', repr(args), d) d.addCallback(child_watch) d.addErrback(handle_error) ubuntu-sso-client-13.10/ubuntu_sso/utils/runner/tests/0000755000202700020270000000000012225013301023346 5ustar dobeydobey00000000000000ubuntu-sso-client-13.10/ubuntu_sso/utils/runner/tests/test_qt.py0000664000202700020270000001166412151461656025437 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Tests for the qt runner helper module.""" import subprocess from PyQt4 import QtCore from twisted.internet import defer from ubuntu_sso.utils import compat, runner from ubuntu_sso.utils.runner import qt from ubuntu_sso.utils.runner.tests.test_runner import SpawnProgramTestCase class FakedSignal(object): """Fake a Qt signal.""" def __init__(self, name): self.name = name self._handlers = [] def connect(self, handler): """Connect 'handler' with this signal.""" self._handlers.append(handler) def emit(self, *args, **kwargs): """Emit this signal.""" for handler in self._handlers: handler(*args, **kwargs) class FakedProcess(object): """Fake a Qt Process.""" _pid = 123456 _error = None _status_code = 0 FailedToStart = 0 def __init__(self): self.pid = lambda: self._pid self.started = FakedSignal('started') self.finished = FakedSignal('finished') self.error = FakedSignal('error') def start(self, program, arguments): """Start this process.""" if self._error is None: self.started.emit() args = (program,) + tuple(arguments) # subprocess expects bytes bytes_args = [] for arg in args: if isinstance(arg, compat.text_type): arg = arg.encode('utf-8') bytes_args.append(arg) try: subprocess.call(bytes_args) except OSError as e: if e.errno == 2: self.error.emit(self.FailedToStart) else: self.error.emit(e) except Exception as e: self.error.emit(e) else: self.finished.emit(self._status_code) else: self.error.emit(self._error) class QtSpawnProgramTestCase(SpawnProgramTestCase): """The test suite for the spawn_program method (using Qt).""" use_reactor = False @defer.inlineCallbacks def setUp(self): yield super(QtSpawnProgramTestCase, self).setUp() # Since we can't mix plan qt runner and the qt4reactor, we patch # QProcess and fake the conditions so the qt runner is chosen self.process = FakedProcess() self.patch(QtCore, 'QProcess', lambda: self.process) self.patch(runner, 'is_qt4_main_loop_installed', lambda: True) @defer.inlineCallbacks def test_dont_let_it_go_success(self): """The QProcess instance is stored (and removed) to avoid GC.""" # pylint: disable=W0212 d = defer.Deferred() def check(status): """Do the check.""" self.assertIn(self.process, qt._processes) d.callback(status) runner.qt.spawn_program(self.args, reply_handler=check, error_handler=lambda **kw: d.errback(kw)) yield d self.assertNotIn(self.process, qt._processes) @defer.inlineCallbacks def test_dont_let_it_go_error(self): """The QProcess instance is stored (and removed) to avoid GC.""" # pylint: disable=W0212 d = defer.Deferred() def check(msg, failed_to_start): """Do the check.""" self.assertIn(self.process, qt._processes) d.callback(msg) self.process._error = 42 # this will make the process emit 'error' runner.qt.spawn_program(self.args, reply_handler=lambda _: d.errback(AssertionError(_)), error_handler=check) yield d self.assertNotIn(self.process, qt._processes) ubuntu-sso-client-13.10/ubuntu_sso/utils/runner/tests/__init__.py0000664000202700020270000000261412151461656025506 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Tests for the program runner.""" ubuntu-sso-client-13.10/ubuntu_sso/utils/runner/tests/test_runner.py0000664000202700020270000000710212151461656026314 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Tests for the runner helper module.""" from __future__ import unicode_literals import os from twisted.internet import defer from ubuntu_sso.tests import TestCase from ubuntu_sso.utils import runner TEST_ME_DIR = 'test-me-more-♥' TEST_ME_DIR_BYTES = TEST_ME_DIR.encode('utf-8') class SpawnProgramTestCase(TestCase): """The test suite for the spawn_program method.""" args = ('python', '-c', 'import os; os.system("mkdir %s")' % TEST_ME_DIR) use_reactor = True timeout = 3 @defer.inlineCallbacks def setUp(self): yield super(SpawnProgramTestCase, self).setUp() assert not os.path.exists(TEST_ME_DIR_BYTES) self.addCleanup(lambda: os.path.exists(TEST_ME_DIR_BYTES) and os.rmdir(TEST_ME_DIR_BYTES)) def spawn_fn(self, args): """The target function to test.""" return runner.spawn_program(args, use_reactor=self.use_reactor) def assert_command_was_run(self): """The spawnned commnad was correctly run.""" self.assertTrue(os.path.exists(TEST_ME_DIR_BYTES)) self.assertTrue(os.path.isdir(TEST_ME_DIR_BYTES)) @defer.inlineCallbacks def test_program_is_spawned(self): """The program is actually spawned.""" yield self.spawn_fn(self.args) self.assert_command_was_run() @defer.inlineCallbacks def test_program_is_spawned_returned_code_non_zero(self): """The program is actually spawned.""" status = yield self.spawn_fn(self.args) self.assertEqual(status, 0) @defer.inlineCallbacks def test_failed_to_start(self): """FailedToStartError is raised if the program does not start.""" no_such_program = './myexecutablethatdoesnotexist' assert not os.path.exists(no_such_program) d = self.spawn_fn((no_such_program,)) exc = yield self.assertFailure(d, runner.FailedToStartError) self.assertIn(no_such_program, exc.message) @defer.inlineCallbacks def test_other_error(self): """SpawnError is raised if the program does not start.""" d = self.spawn_fn((None,)) exc = yield self.assertFailure(d, runner.SpawnError) self.assertIn('Unspecified error', exc.message) ubuntu-sso-client-13.10/ubuntu_sso/utils/runner/tests/test_glib.py0000664000202700020270000001113712151461656025723 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Tests for the glib runner helper module.""" import subprocess # pylint: disable=E0611 from gi.repository import GLib # pylint: enable=E0611 from twisted.internet import defer from ubuntu_sso.utils import runner from ubuntu_sso.utils.runner import glib from ubuntu_sso.utils.runner.tests.test_runner import SpawnProgramTestCase class FakedSignal(object): """Fake a glib signal.""" def __init__(self, name): self.name = name self._handlers = [] def connect(self, handler): """Connect 'handler' with this signal.""" self._handlers.append(handler) def emit(self, *args, **kwargs): """Emit this signal.""" for handler in self._handlers: handler(*args, **kwargs) class FakedProcess(object): """Fake a glib Process.""" _argv = _flags = None _pid = 123456 _pids = [] _status_code = 0 SpawnFlags = GLib.SpawnFlags GError = GLib.GError def __init__(self): self.pid = lambda: self._pid self.started = FakedSignal('started') self.finished = FakedSignal('finished') self.error = FakedSignal('error') def spawn_async(self, argv, flags): """Spwan a process.""" if 'None' in argv: exc = GLib.GError() exc.message = str('Can not handle None') exc.code = 24 raise exc self._argv = argv self._flags = flags try: subprocess.call(argv) except Exception as e: exc = GLib.GError() exc.message = str(e) exc.code = 42 raise exc self._pids.append(self._pid) return (self._pid, None, None, None) def child_watch_add(self, pid, child_watch): """Addd a child watch.""" if pid in self._pids: child_watch(pid, self._status_code) def spawn_close_pid(self, pid): """Close the 'pid'.""" self._pids.remove(pid) class GLibSpawnProgramTestCase(SpawnProgramTestCase): """The test suite for the spawn_program method (using GLib).""" use_reactor = False @defer.inlineCallbacks def setUp(self): yield super(GLibSpawnProgramTestCase, self).setUp() # Since we can't mix plan glib runner and the gireactor, we patch # GLib.spawn_async and fake the conditions so the glib runner is chosen self.process = FakedProcess() self.patch(glib, 'GLib', self.process) self.patch(runner, 'is_qt4_main_loop_installed', lambda: False) # Access to a protected member _flags, _argv of a client class # pylint: disable=W0212 @defer.inlineCallbacks def test_flags_are_correct(self): """The flags are the correct ones.""" yield self.spawn_fn(self.args) flags = GLib.SpawnFlags.DO_NOT_REAP_CHILD | \ GLib.SpawnFlags.SEARCH_PATH | \ GLib.SpawnFlags.STDOUT_TO_DEV_NULL | \ GLib.SpawnFlags.STDERR_TO_DEV_NULL self.assertEqual(self.process._flags, flags) @defer.inlineCallbacks def test_argv_is_bytes(self): """The argv parameter is converted to bytes.""" yield self.spawn_fn(self.args) bytes_args = [a.encode('utf-8') for a in self.args] self.assertEqual(self.process._argv, bytes_args) ubuntu-sso-client-13.10/ubuntu_sso/utils/runner/glib.py0000664000202700020270000000702612151461656023524 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Utility to spawn another program from a GLib mainloop.""" import os # pylint: disable=E0611,F0401 from gi.repository import GLib # pylint: enable=E0611,F0401 from ubuntu_sso.logger import setup_logging from ubuntu_sso.utils import compat logger = setup_logging("ubuntu_sso.utils.runner.glib") NO_SUCH_FILE_OR_DIR = '[Errno 2]' def spawn_program(args, reply_handler, error_handler): """Spawn the program specified by 'args' using the GLib mainloop. When the program finishes, 'reply_handler' will be called with a single argument that will be the porgram status code. If there is an error, error_handler will be called with an instance of SpawnError. """ def child_watch(pid, status): """Handle child termination.""" # pylint: disable=E1103 GLib.spawn_close_pid(pid) # pylint: enable=E1103 if os.WIFEXITED(status): status = os.WEXITSTATUS(status) reply_handler(status) else: msg = 'Child terminated abnormally, '\ 'status from waitpid is %r' % status error_handler(msg=msg, failed_to_start=False) def handle_error(gerror): """Handle error when spawning the process.""" failed_to_start = NO_SUCH_FILE_OR_DIR in gerror.message msg = 'GError is: code %r, message %r' % (gerror.code, gerror.message) error_handler(msg=msg, failed_to_start=failed_to_start) flags = GLib.SpawnFlags.DO_NOT_REAP_CHILD | \ GLib.SpawnFlags.SEARCH_PATH | \ GLib.SpawnFlags.STDOUT_TO_DEV_NULL | \ GLib.SpawnFlags.STDERR_TO_DEV_NULL pid = None bytes_args = [] for arg in args: if isinstance(arg, compat.text_type): arg = arg.encode('utf-8') if not isinstance(arg, compat.basestring): arg = compat.binary_type(arg) bytes_args.append(arg) try: pid, _, _, _ = GLib.spawn_async(argv=bytes_args, flags=flags) except GLib.GError as e: handle_error(e) else: logger.debug('Spawning the program %r with the glib mainloop ' '(returned pid is %r).', args, pid) GLib.child_watch_add(pid, child_watch) ubuntu-sso-client-13.10/ubuntu_sso/utils/qtwisted.py0000664000202700020270000000521612151461656023141 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2010-2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Platform specific constants and functions (for Qt/Twisted).""" from twisted.internet import defer from PyQt4.QtCore import QThread, QCoreApplication class DeferredThread(QThread): """A thread that runs a given function.""" def __init__(self, f, *args, **kwargs): """Initialize this thread.""" app = QCoreApplication.instance() super(DeferredThread, self).__init__(app) self.deferred = defer.Deferred() self.f = f self.args = args self.kwargs = kwargs self.succeeded = True self.result = None self.finished.connect(self.on_finished) def run(self): """This code runs inside the thread.""" try: self.result = self.f(*self.args, **self.kwargs) # pylint: disable=W0703 except Exception as e: self.succeeded = False self.result = e def on_finished(self): """The thread has completed.""" if self.succeeded: self.deferred.callback(self.result) else: self.deferred.errback(self.result) # pylint: disable=C0103 def qtDeferToThread(f, *args, **kwargs): """A Qt-based implementation of deferToThread.""" thread = DeferredThread(f, *args, **kwargs) thread.start() return thread.deferred ubuntu-sso-client-13.10/ubuntu_sso/utils/compat.py0000664000202700020270000000354112151461656022557 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Python 2 and 3 compatibility.""" from __future__ import unicode_literals # The following approach was outlined in Lennart Regebro's # "Porting to Python 3" book. # http://python3porting.com/noconv.html#more-bytes-strings-and-unicode import sys # Disable redefined builtin, invalid name warning # pylint: disable=W0622,C0103 if sys.version_info < (3,): text_type = unicode binary_type = str basestring = basestring else: text_type = str binary_type = bytes basestring = str ubuntu-sso-client-13.10/ubuntu_sso/utils/locale.py0000664000202700020270000000362612151461656022537 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2013 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Utility modules related to locale.""" import os # this locale is always installed in Ubuntu SAFE_LOCALE = "en_US.UTF-8" def is_turkish(locale_identifier): """Return whether the locale identifier is turkish.""" return locale_identifier.startswith("tr_") def fix_turkish_locale(): """Change the LC_CTYPE when the LANG is turkish. Fixes lp:997326""" lang = os.environ.get("LANG", "") ctype = os.environ.get("LC_CTYPE", "") if (is_turkish(lang) and ctype == "") or is_turkish(ctype): os.environ["LC_CTYPE"] = SAFE_LOCALE ubuntu-sso-client-13.10/ubuntu_sso/utils/tests/0000755000202700020270000000000012225013301022035 5ustar dobeydobey00000000000000ubuntu-sso-client-13.10/ubuntu_sso/utils/tests/test_tcpactivation.py0000664000202700020270000004234112151461656026346 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2011-2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Tests for the tcpactivation module.""" from __future__ import print_function import twisted.internet from twisted.internet import defer, protocol, task from twisted.trial.unittest import TestCase from ubuntuone.devtools.testcases.txsocketserver import ( ServerTestCase, TidyTCPServer, ) from ubuntu_sso.utils import tcpactivation from ubuntu_sso.utils.tcpactivation import ( ActivationClient, ActivationConfig, ActivationDetector, ActivationInstance, ActivationTimeoutError, AlreadyStartedError, NullProtocol, PortDetectFactory, ) SAMPLE_SERVICE = "test_service_name" SAMPLE_CMDLINE = ["python", __file__, "-server"] SAMPLE_SERVER_DESCRIPTION = 'tcp:55555:interface=127.0.0.1' SAMPLE_CLIENT_DESCRIPTION = 'tcp:host=127.0.0.1:port=55555' class FakeServerProtocol(protocol.Protocol): """A test protocol.""" def dataReceived(self, data): """Echo the data received.""" self.transport.write(data) class FakeServerFactory(protocol.ServerFactory): """A factory for the test server.""" protocol = FakeServerProtocol class FakeTransport(object): """A fake transport.""" connectionLost = False def loseConnection(self): """Remember that the connection was dropped.""" self.connectionLost = True class FakeDescriptionFactory(object): """A fake description factory.""" def __init__(self, server_description, client_description): """Create a new instace.""" self.server = server_description self.client = client_description class AsyncSleepTestCase(TestCase): """Tests for the async_sleep function.""" @defer.inlineCallbacks def setUp(self): """Initialize this test instance.""" yield super(AsyncSleepTestCase, self).setUp() self.test_timeout = 5.0 self.clock = task.Clock() self.patch(twisted.internet, "reactor", self.clock) self.d = tcpactivation.async_sleep(self.test_timeout) def test_async_sleep_not_fired_immediately(self): """The async_sleep deferred is not fired immediately.""" self.assertFalse(self.d.called, "Must not be fired immediately.") def test_async_sleep_not_fired_in_a_bit(self): """The async_sleep deferred is not fired before the right time.""" self.clock.advance(self.test_timeout / 2) self.assertFalse(self.d.called, "Must not be fired yet.") def test_async_sleep_fired_at_the_right_time(self): """The async_sleep deferred is fired at the right time.""" self.clock.advance(self.test_timeout) self.assertTrue(self.d.called, "Must be fired by now.") class NullProtocolTestCase(TestCase): """A test for the NullProtocol class.""" def test_drops_connection(self): """The protocol drops the connection.""" np = NullProtocol() np.transport = FakeTransport() np.connectionMade() self.assertTrue(np.transport.connectionLost, "the connection must be dropped.") class PortDetectFactoryTestCase(TestCase): """Tests for the PortDetectFactory.""" timeout = 2 @defer.inlineCallbacks def setUp(self): """Initialize this test instance.""" yield super(PortDetectFactoryTestCase, self).setUp() self.factory = PortDetectFactory() @defer.inlineCallbacks def test_is_listening(self): """Test that the deferred returns True when something is listening.""" addr = (tcpactivation.LOCALHOST, SAMPLE_CLIENT_DESCRIPTION) self.factory.buildProtocol(addr) is_listening = yield self.factory.is_listening() self.assertTrue(is_listening) @defer.inlineCallbacks def test_connection_lost(self): """Test that the deferred returns False when the connection is lost.""" self.factory.clientConnectionLost(None, "test reason") is_listening = yield self.factory.is_listening() self.assertFalse(is_listening) @defer.inlineCallbacks def test_connection_failed(self): """Test that the deferred returns False when the connection fails.""" self.factory.clientConnectionFailed(None, "test reason") is_listening = yield self.factory.is_listening() self.assertFalse(is_listening) @defer.inlineCallbacks def test_connection_failed_then_lost(self): """It's not an error if two events happen.""" self.factory.clientConnectionFailed(None, "test reason") self.factory.clientConnectionLost(None, "test reason") is_listening = yield self.factory.is_listening() self.assertFalse(is_listening) @defer.inlineCallbacks def test_connection_works_then_lost(self): """It's not an error if two events happen.""" addr = (tcpactivation.LOCALHOST, SAMPLE_CLIENT_DESCRIPTION) self.factory.buildProtocol(addr) d = self.factory.is_listening() self.factory.clientConnectionLost(None, "test reason") is_listening = yield d self.assertTrue(is_listening) class ActivationConfigTestCase(TestCase): """Tests for the ActivationConfig class.""" def test_initialization(self): """Test the constructor.""" config = ActivationConfig(SAMPLE_SERVICE, SAMPLE_CMDLINE, SAMPLE_CLIENT_DESCRIPTION) self.assertEqual(config.service_name, SAMPLE_SERVICE) self.assertEqual(config.command_line, SAMPLE_CMDLINE) self.assertEqual(config.description, SAMPLE_CLIENT_DESCRIPTION) class ActivationDetectorTestCase(TestCase): """Tests for the ActivationDetector class.""" timeoue = 3 client_description = 'tcp:host=127.0.0.1:port=55555' server_description = 'tcp:55555:interface=127.0.0.1' @defer.inlineCallbacks def setUp(self): """Initialize this test instance.""" yield super(ActivationDetectorTestCase, self).setUp() self.description_factory = FakeDescriptionFactory( self.server_description, self.client_description) self.config = ActivationConfig(SAMPLE_SERVICE, SAMPLE_CMDLINE, self.description_factory) def get_server(self): """Return the server to be used to run the tests.""" return TidyTCPServer() def test_initialization(self): """Test the constructor.""" self.config = ActivationConfig(SAMPLE_SERVICE, SAMPLE_CMDLINE, self.description_factory) ai = ActivationDetector(self.config) self.assertEqual(ai.config, self.config) @defer.inlineCallbacks def test_is_not_already_running(self): """Test the is_already_running method returns False.""" ad = ActivationDetector(self.config) result = yield ad.is_already_running() self.assertFalse(result, "It should not be already running.") @defer.inlineCallbacks def test_is_already_running(self): """The is_already_running method returns True if already started.""" server = self.get_server() self.addCleanup(server.clean_up) class TestConnect(object): """A fake connection object.""" @defer.inlineCallbacks def connect(my_self, factory): """A fake connection.""" connected_factory = yield server.connect_client( PortDetectFactory) self.patch(factory, 'is_listening', connected_factory.is_listening) defer.returnValue(connected_factory) self.patch(tcpactivation, 'clientFromString', lambda *args: TestConnect()) yield server.listen_server(protocol.ServerFactory) ad = ActivationDetector(self.config) result = yield ad.is_already_running() self.assertTrue(result, "It should be already running.") class ActivationClientTestCase(TestCase): """Tests for the ActivationClient class.""" timeout = 2 server_description = 'tcp:55555:interface=127.0.0.1' client_description = 'tcp:host=127.0.0.1:port=55555' @defer.inlineCallbacks def setUp(self): """Initialize this test instance.""" yield super(ActivationClientTestCase, self).setUp() self.description_factory = FakeDescriptionFactory( self.server_description, self.client_description) self.config = ActivationConfig(SAMPLE_SERVICE, SAMPLE_CMDLINE, self.description_factory) def test_initialization(self): """Test the constructor.""" ac = ActivationClient(self.config) self.assertEqual(ac.config, self.config) @defer.inlineCallbacks def test_do_get_active_description_running(self): """Test the _do_get_active_description method when is running.""" ac = ActivationClient(self.config) self.patch(ac, "is_already_running", lambda: defer.succeed(True)) result = yield ac._do_get_active_description() self.assertEqual(result, self.client_description) @defer.inlineCallbacks def test_do_get_active_description_not_running(self): """Test _do_get_active_description method when is not running.""" server_spawned = [] ac = ActivationClient(self.config) self.patch(ac, "_spawn_server", lambda *args: server_spawned.append(args)) self.patch(ac, "is_already_running", lambda: defer.succeed(False)) self.patch(ac, "_wait_server_active", lambda: defer.succeed(None)) result = yield ac._do_get_active_description() self.assertEqual(result, self.client_description) self.assertEqual(len(server_spawned), 1) def test_get_active_description_waits_classwide(self): """Test the get_active_description method locks classwide.""" d = defer.Deferred() ac1 = ActivationClient(self.config) ac2 = ActivationClient(self.config) self.patch(ac1, "_do_get_active_description", lambda: d) self.patch(ac2, "_do_get_active_description", lambda: defer.succeed(None)) ac1.get_active_client_description() d2 = ac2.get_active_client_description() self.assertFalse(d2.called, "The second must wait for the first.") d.callback(self.client_description) self.assertTrue(d2.called, "The second can fire after the first.") def test_wait_server_active(self): """Test the _wait_server_active method.""" ac = ActivationClient(self.config) clock = task.Clock() self.patch(twisted.internet, "reactor", clock) self.patch(ac, "is_already_running", lambda: defer.succeed(False)) d = ac._wait_server_active() self.assertFalse(d.called, "The deferred should not be fired yet.") clock.advance(tcpactivation.DELAY_BETWEEN_CHECKS) self.assertFalse(d.called, "The deferred should not be fired yet.") self.patch(ac, "is_already_running", lambda: defer.succeed(True)) clock.advance(tcpactivation.DELAY_BETWEEN_CHECKS) self.assertTrue(d.called, "The deferred should be fired by now.") def test_wait_server_timeouts(self): """If the server takes too long to start then timeout.""" ac = ActivationClient(self.config) clock = task.Clock() self.patch(twisted.internet, "reactor", clock) self.patch(ac, "is_already_running", lambda: defer.succeed(False)) d = ac._wait_server_active() clock.pump([tcpactivation.DELAY_BETWEEN_CHECKS] * tcpactivation.NUMBER_OF_CHECKS) return self.assertFailure(d, ActivationTimeoutError) def test_spawn_server(self): """Test the _spawn_server method.""" popen_calls = [] ac = ActivationClient(self.config) self.patch(tcpactivation.subprocess, "Popen", lambda *args, **kwargs: popen_calls.append((args, kwargs))) ac._spawn_server() self.assertEqual(len(popen_calls), 1) class ActivationInstanceTestCase(ServerTestCase): """Tests for the ActivationServer class.""" timeout = 2 server_description = 'tcp:55555:interface=127.0.0.1' client_description = 'tcp:host=127.0.0.1:port=55555' @defer.inlineCallbacks def setUp(self): """Initialize this test instance.""" yield super(ActivationInstanceTestCase, self).setUp() self.description_factory = FakeDescriptionFactory( self.server_description, self.client_description) self.config = ActivationConfig(SAMPLE_SERVICE, SAMPLE_CMDLINE, self.description_factory) def get_server(self): """Return the server to be used to run the tests.""" return TidyTCPServer() def test_initialization(self): """Test the constructor.""" ai = ActivationInstance(self.config) self.assertEqual(ai.config, self.config) @defer.inlineCallbacks def test_get_sever_description(self): """Test the get_description method.""" ai = ActivationInstance(self.config) self.patch(ai, 'is_already_running', lambda: False) description = yield ai.get_server_description() self.assertEqual(description, self.server_description) @defer.inlineCallbacks def test_get_description_fails_if_service_already_started(self): """The get_description method fails if service already started.""" server = self.get_server() self.addCleanup(server.clean_up) class TestConnect(object): """A fake connection object.""" @defer.inlineCallbacks def connect(my_self, factory): """A fake connection.""" connected_factory = yield server.connect_client( PortDetectFactory) self.patch(factory, 'is_listening', connected_factory.is_listening) defer.returnValue(connected_factory) self.patch(tcpactivation, 'clientFromString', lambda *args: TestConnect()) yield server.listen_server(protocol.ServerFactory) ai = ActivationInstance(self.config) yield self.assertFailure(ai.get_server_description(), AlreadyStartedError) def server_test(config): """An IRL test of the server.""" from twisted.internet import reactor def got_description(description): """The description was found.""" print("got server description:", description) # start listening f = FakeServerFactory() reactor.listenTCP(description, f) # try to get the description again get_description() def already_started(failure): """This instance was already started.""" print("already started!") reactor.callLater(3, reactor.stop) def get_description(): """Try to get the description number.""" get_description_d = ai.get_server_description() get_description_d.addCallback(got_description) get_description_d.addErrback(already_started) print("starting the server.") ai = ActivationInstance(config) get_description() reactor.run() def client_test(config): """An IRL test of the client.""" from twisted.internet import reactor print("starting the client.") ac = ActivationClient(config) d = ac.get_active_client_description() def got_description(description): """The description was found.""" print("client got server description:", description) reactor.stop() d.addCallback(got_description) reactor.run() def irl_test(): """Do an IRL test of the client and the server.""" import sys description_f = FakeDescriptionFactory(SAMPLE_SERVER_DESCRIPTION, SAMPLE_CLIENT_DESCRIPTION) config = ActivationConfig(SAMPLE_SERVICE, SAMPLE_CMDLINE, description_f) if "-server" in sys.argv[1:]: server_test(config) else: client_test(config) if __name__ == "__main__": irl_test() ubuntu-sso-client-13.10/ubuntu_sso/utils/tests/test_ui.py0000664000202700020270000001357512151461656024122 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # Author: Manuel de la Pena # # Copyright 2011-2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Test the ui functions.""" from unittest import TestCase from ubuntu_sso.utils.ui import (get_password_strength, is_min_required_password, is_correct_email) class GettextTestCase(TestCase): """Test that we don't override builtins with gettext.""" def test_import(self): """Test whether importing ui module defines _ as a builtin.""" # This module is already imported above, but just to make sure, since # top imports may change over time. import ubuntu_sso.utils.ui assert(ubuntu_sso.utils.ui) self.assertFalse('_' in __builtins__) class GetPasswordStrengTestCase(TestCase): """Test the function that returns the strength of a password.""" def test_too_small_password(self): """Test the points given to a very small password.""" password = 'abc' self.assertEqual(1, get_password_strength(password)) def test_small_password(self): """Test the points given to a small passwod 4 or more chars.""" password = 'testtwe' self.assertEqual(0, get_password_strength(password)) def test_eight_chars_password(self): """Test the points given to a normal 8 chars password.""" password = 'abcdabcd' self.assertEqual(1, get_password_strength(password)) def test_eight_chars_and_num(self): """Test the points given to a 8 chars password with a num.""" password = 'abcdabc8' self.assertEqual(2, get_password_strength(password)) def test_eight_chars_low_and_cap(self): """Test the points given to a 8 chars password with a capital.""" password = 'abcdabcD' self.assertEqual(2, get_password_strength(password)) def test_eight_chars_low_canp_num(self): """Test the points given to a 8 chars password with capitals & num.""" password = 'abcdab7D' self.assertEqual(3, get_password_strength(password)) def test_eiqgh_chars_and_special(self): """Test the points given to a 8 chars password with special chars.""" password = 'abcdabc*' self.assertEqual(2, get_password_strength(password)) def test_long_password(self): """Test the points goven to a long password.""" password = 'abcdabcdabcd' self.assertEqual(2, get_password_strength(password)) def test_eleven_chars_and_num(self): """Test the points of a loong password with a num.""" password = 'abcdabcdabcd99' self.assertEqual(3, get_password_strength(password)) def test_eleven_chars_low_cap(self): """Test the points of a long password with low and cap.""" password = 'abcdabcdabcdbABCD' self.assertEqual(3, get_password_strength(password)) def test_eleven_num_low_cap(self): """Test the points of a long password with num and diff cap.""" password = 'ABCDabcdacbd723' self.assertEqual(4, get_password_strength(password)) def test_eleven_num_special(self): """Test the point of a long password with a number and special char.""" password = 'abcdabcdabcd*9' self.assertEqual(4, get_password_strength(password)) class IsMinRequiredPasswordTestCase(TestCase): """Test the fnction that returns if the password is the min required.""" def test_no_enough_chars(self): """Test a password that does not have enough chars.""" password = 'Test8' self.assertFalse(is_min_required_password(password)) def test_no_uppercase(self): """Test a password that does not have an uppercase.""" password = 'longenoughtobeapassword8' self.assertFalse(is_min_required_password(password)) def test_no_number(self): """Test a password that does not have a number.""" password = 'longenoughtobeapassworD' self.assertFalse(is_min_required_password(password)) def test_correct_password(self): """Test a password that is correct.""" password = 'TodasLasPaswordPasan88' self.assertTrue(is_min_required_password(password)) class IsCorrectEmailAddress(TestCase): """Test the is_correct_email funtion.""" def test_is_correct_email_true(self): """Test when the email is correct.""" email = 'manuel@canonical.com' self.assertTrue(is_correct_email(email)) def test_is_correct_email_false(self): """Test when the email is not correct.""" email = 'manuelcanonical.com' self.assertFalse(is_correct_email(email)) ubuntu-sso-client-13.10/ubuntu_sso/utils/tests/test_ipc.py0000664000202700020270000005540712151461656024260 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2011-2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Perspective Broker IPC test cases.""" import logging from collections import namedtuple from twisted.internet import defer from twisted.spread.pb import ( DeadReferenceError, NoSuchMethod, ) from ubuntuone.devtools.handlers import MementoHandler from ubuntuone.devtools.testcases import skipIfOS from ubuntuone.devtools.testcases.txsocketserver import ( TidyUnixServer, TCPPbServerTestCase, ) from ubuntu_sso.tests import TestCase from ubuntu_sso.utils import ipc TEST_SERVICE = 'foo-service' TEST_CMDLINE = 'foo.bin' TEST_SERVER_DESCRIPTION = 'tcp:40404:interface=127.0.0.1' TEST_CLIENT_DESCRIPTION = 'tcp:host=127.0.0.1:port=40404' class RandomException(Exception): """A random exception.""" class FakeActivationClient(object): """A fake ActivationClient.""" def __init__(self, config): """Initialize this fake instance.""" self.config = config def get_active_client_description(self): """Return the description where the pb server is running.""" return defer.succeed(self.config.description.client) class FakeActivationInstance(object): """A fake ActivationInstance.""" def __init__(self, config): """Initialize the fake instance.""" self.config = config def get_server_description(self): """Return the description where the pb server is running.""" return defer.succeed(self.config.description.server) class FakeDescriptionFactory(object): """A fake description factory.""" def __init__(self, server_description, client_description): """Create a new instace.""" self.server = server_description self.client = client_description # Invalid name "callRemote", etc. # pylint: disable=C0102, C0103 class FakeReactor(object): """A fake reactor.""" def __init__(self): """Initialize this faker.""" self.connection_class = namedtuple("Connection", "host port factory backlog") self.connections = [] def connectTCP(self, host, port, factory, timeout=None, bindAddress=None): """Store the connected factory.""" connection = self.connection_class(host, port, factory, None) self.connections.append(connection) def listenTCP(self, port, factory, interface=None, backlog=None): """Store the listenning factory.""" connection = self.connection_class(interface, port, factory, backlog) self.connections.append(connection) class FakeTCP4ClientEndpoint(object): """A fake tcp4 client.""" def __init__(self, protocol): """Create a new instance.""" self.protocol = protocol def connect(self, *args, **kwargs): """Return the client.""" return defer.succeed(self.protocol) class FakeRemoteClient(object): """A fake RemoteClient.""" missing_signal = "missing" failing_signal = "failing" dead_remote = False random_exception = RandomException() def __init__(self, dead_remote=False): self.called = False self.dead_remote = dead_remote def callRemote(self, signal_name, *a, **kw): """Fake a call to a given remote method.""" if self.dead_remote: raise DeadReferenceError("Calling Stale Broker") if signal_name == self.missing_signal: return defer.fail(NoSuchMethod()) if signal_name == self.failing_signal: return defer.fail(self.random_exception) self.called = (a, kw) return defer.succeed(None) class DummyRemoteService(ipc.RemoteService): """Represent a dummy IPC object.""" remote_calls = ['foo', 'bar'] next_result = None def foo(self): """Dummy foo.""" self.Success(self.next_result) def bar(self, error): """Dummy bar.""" self.NotSuccess(error) @ipc.signal def Success(self, param): """Fire a signal to notify a success.""" @ipc.signal def NotSuccess(self, error): """Fire a signal to notify a not-success.""" @ipc.signal def NoArgs(self): """Get no args passed.""" @ipc.signal def JustArgs(self, *args): """Just get args.""" @ipc.signal def JustKwargs(self, **kwargs): """Just get kwargs.""" @ipc.signal def BothArgsAndKwargs(self, *args, **kwargs): """Both args and kwargs.""" # pylint: enable=C0102, C0103 class DummyService(ipc.BaseService): """Represent a dummy root service.""" services = {'dummy': DummyRemoteService} name = 'Dummy Service' description = TEST_CLIENT_DESCRIPTION cmdline = 'yadda yo' class DummyRemoteClient(ipc.RemoteClient): """Represent a dummy remote client.""" call_remote_functions = DummyRemoteService.remote_calls signal_handlers = ['Success', 'NotSuccess'] class DummyClient(ipc.BaseClient): """Represent a dummy base client.""" clients = {'dummy': DummyRemoteClient} service_name = DummyService.name service_port = TEST_SERVER_DESCRIPTION service_cmdline = DummyService.cmdline class DummyDescription(object): """Return the descriptions accordingly.""" def __init__(self, client, server): """Create a new instance.""" self.client = client self.server = server class BaseIPCTestCase(TCPPbServerTestCase, TestCase): """Set the ipc to a random port for this instance.""" timeout = 5 client_class = None # the BaseClient instance service_class = None # the BaseService instance remote_client_name = None # the name of the remote client in the client remote_service_name = None # the name of the remote service in the service method_mapping = [] signal_mapping = [] @defer.inlineCallbacks def setUp(self): # pylint complains about callables # pylint: disable=E1102 yield super(BaseIPCTestCase, self).setUp() self.service = None self.client = None if self.service_class is not None: self.service = self.service_class() self.client = self.client_class() # patch server connection and client connection to ensure that # we have clean connections @defer.inlineCallbacks def server_listen(server_factory, service_name, activation_cmd, description, reactor=None): """Connect to the local running service.""" yield self.listen_server(self.service) defer.returnValue(self.listener) self.patch(ipc, 'server_listen', server_listen) @defer.inlineCallbacks def client_connect(client_factory, service_name, activation_cmdline, description, reactor=None): """Connect the local running client.""" yield self.connect_client() self.client.factory = self.client_factory defer.returnValue(self.connector) self.patch(ipc, 'client_connect', client_connect) # pylint: disable=E1102 yield self.service.start() yield self.client.connect() # pylint: enable=E1102 @property def remote_service(self): """Get the service named 'service_name'.""" return getattr(self.service, self.remote_service_name) @property def remote_client(self): """Get the client named 'remote_client_name'.""" return getattr(self.client, self.remote_client_name) @defer.inlineCallbacks def assert_method_called(self, service, method, result, *args, **kwargs): """Check that calling 'method(*args, **kwargs)' should query 'service'. The returned result from calling 'method(*args, **kwargs)' should be equal to the given parameter 'result'. If 'result' is a deferred, its result attribute will be used as expected result (ergo the deferred should be already called). """ client = self.remote_client # hack to handle service methods returning a deferred with result if isinstance(result, defer.Deferred): real_result = result.result else: real_result = result self.patch(service, method, lambda *a, **kw: result) actual = yield client.call_method(method, *args, **kwargs) self.assertEqual(real_result, actual) self.assertEqual(service.called, {method: [(args, kwargs)]}) def assert_remote_method(self, method_name, *args, **kwargs): """Assert that 'method_name' is a remote method. The parameters args and kwargs will be passed as such to the method itself, to exercise it. """ self.assertIn(method_name, self.remote_service.remote_calls) method = getattr(self.remote_service, method_name) method(*args, **kwargs) def assert_remote_signal(self, signal_name, *args, **kwargs): """Assert that 'signal' is a remote signal. The parameters args and kwargs will be passed as such to the signal itself, to exercise it. """ self.patch(self.remote_service, 'emit_signal', self._set_called) signal = getattr(self.remote_service, signal_name) signal(*args, **kwargs) expected = (signal_name,) + args self.assertEqual(self._called, (expected, kwargs)) def test_remote_methods(self): """Check every method defined in self.method_mapping. Assert that every method is a remote method and that it has the expected signature. """ for method, args, kwargs in self.method_mapping: self.assert_remote_method(method, *args, **kwargs) def test_remote_signals(self): """Check every signal defined in self.signal_mapping. Assert that every signal is a remote signal and that it has the expected signature. """ for signal_name, args, kwargs in self.signal_mapping: self.assert_remote_signal(signal_name, *args, **kwargs) # pylint: enable=E1102 class TCPListenConnectTestCase(BaseIPCTestCase): """Test suite for the server_listen and client_connect methods.""" @defer.inlineCallbacks def setUp(self): yield super(TCPListenConnectTestCase, self).setUp() self.fake_reactor = FakeReactor() @defer.inlineCallbacks def test_server_listen(self): """Test the server_listen function.""" self.patch(ipc, "ActivationInstance", FakeActivationInstance) description_factory = FakeDescriptionFactory(TEST_SERVER_DESCRIPTION, TEST_CLIENT_DESCRIPTION) fake_factory = object() yield ipc.server_listen(fake_factory, TEST_SERVICE, TEST_CMDLINE, description_factory, reactor=self.fake_reactor) self.assertEqual(len(self.fake_reactor.connections), 1) conn = self.fake_reactor.connections[0] self.assertEqual(conn.factory, fake_factory) self.assertEqual(conn.host, ipc.LOCALHOST) @defer.inlineCallbacks def test_client_connect(self): """Test the client_connect function.""" called = [] self.patch(ipc, "ActivationClient", FakeActivationClient) protocol = 'protocol' client = FakeTCP4ClientEndpoint(protocol) def client_from_string(reactor, description): """Create a client from the given string.""" called.append(('clientFromString', reactor, description)) return client self.patch(ipc.endpoints, 'clientFromString', client_from_string) description_factory = FakeDescriptionFactory(TEST_SERVER_DESCRIPTION, TEST_CLIENT_DESCRIPTION) fake_factory = object() returned_protocol = yield ipc.client_connect(fake_factory, TEST_SERVICE, TEST_CMDLINE, description_factory, reactor=self.fake_reactor) self.assertIn(('clientFromString', self.fake_reactor, description_factory.client), called) self.assertEqual(protocol, returned_protocol) @skipIfOS('win32', 'Unix domain sockets not supported on windows.') class DomainListenConnectTestCase(TCPListenConnectTestCase): """Test suite for the server_listen and client_connect methods.""" def get_server(self): """Return the server to be used to run the tests.""" return TidyUnixServer() class TCPDummyClientTestCase(BaseIPCTestCase): """Test the status client class.""" client_class = DummyClient service_class = DummyService remote_client_name = remote_service_name = 'dummy' method_mapping = [ ('foo', (), {}), ('bar', (object(),), {}), ] signal_mapping = [ ('Success', ('test',), {}), ('NotSuccess', ('yadda',), {}), ('NoArgs', (), {}), ('JustArgs', (object(), 'foo'), {}), ('JustKwargs', (), {'foo': 'bar'}), ('BothArgsAndKwargs', ('zaraza', 8), {'foo': -42}), ] @defer.inlineCallbacks def test_deprecated_siganl_is_also_sent(self): """Old-style, deprecated signals handler are also called.""" d1 = defer.Deferred() d2 = defer.Deferred() self.remote_service.next_result = 'yadda' # old, deprecated way self.remote_client.connect_to_signal('Success', d1.callback) self.remote_client.on_success_cb = d2.callback self.remote_client.foo() result = yield defer.gatherResults([d1, d2]) self.assertEqual(result, ['yadda', 'yadda']) @defer.inlineCallbacks def test_register_to_signals(self): """Test the register_to_signals method.""" yield self.remote_client.register_to_signals() self.addCleanup(self.remote_client.unregister_to_signals) for signal in self.remote_client.signal_handlers: self.assertIn(signal, self.service.dummy.clients_per_signal) @defer.inlineCallbacks def test_unregister_to_signals(self): """Test the register_to_signals method.""" yield self.remote_client.register_to_signals() yield self.remote_client.unregister_to_signals() for signal in self.remote_client.signal_handlers: actual = len(self.remote_service.clients_per_signal[signal]) self.assertEqual(0, actual) @skipIfOS('win32', 'Unix domain sockets not supported on windows.') class DomainDummyClientTestCase(TCPDummyClientTestCase): """Test the status client class.""" def get_server(self): """Return the server to be used to run the tests.""" return TidyUnixServer() class RemoteMetaTestCase(TestCase): """Tests for the RemoteMeta metaclass.""" def test_remote_calls_renamed(self): """The remote_calls are renamed.""" test_token = object() # pylint: disable=W0232 class TestClass(ipc.meta_base(ipc.RemoteMeta)): """A class for testing.""" remote_calls = ['test_method'] def test_method(self): """Fake call.""" return test_token # pylint: enable=W0232 tc = TestClass() self.assertEquals(tc.test_method(), test_token) # pylint: disable=E1101 self.assertEquals(tc.remote_test_method(), test_token) # pylint: enable=E1101 class SignalBroadcasterTestCase(TestCase): """Test the signal broadcaster code.""" @defer.inlineCallbacks def setUp(self): yield super(SignalBroadcasterTestCase, self).setUp() self.client = FakeRemoteClient() self.sb = ipc.SignalBroadcaster() self.memento = MementoHandler() ipc.logger.addHandler(self.memento) ipc.logger.setLevel(logging.DEBUG) self.addCleanup(ipc.logger.removeHandler, self.memento) def test_remote_register_to_signals(self): """Assert that the client was added.""" signals = ["demo_signal1", "demo_signal2"] self.sb.remote_register_to_signals(self.client, signals) for signal in signals: clients = self.sb.clients_per_signal[signal] self.assertTrue(self.client in clients) def test_emit_signal(self): """Assert that the client method was called.""" first = 1 second = 2 word = 'word' signal_name = 'on_test' self.client.callRemote(signal_name, first, second, word=word) signals = [signal_name] self.sb.remote_register_to_signals(self.client, signals) self.sb.emit_signal(signal_name, first, second, foo=word) self.assertEqual(self.client.called, ((first, second), dict(foo=word))) def test_emit_signal_dead_reference(self): """Test dead reference while emitting a signal.""" sample_signal = "sample_signal" fake_remote_client = FakeRemoteClient(dead_remote=True) self.sb.remote_register_to_signals(fake_remote_client, [sample_signal]) self.assertIn(fake_remote_client, self.sb.clients_per_signal[sample_signal]) self.sb.emit_signal(sample_signal) self.assertNotIn(fake_remote_client, self.sb.clients_per_signal[sample_signal]) def test_emit_signal_some_dead_some_not(self): """Test a clean reference after a dead one.""" sample_signal = "sample_signal" fake_dead_remote = FakeRemoteClient(dead_remote=True) fake_alive_remote = FakeRemoteClient() self.sb.remote_register_to_signals(fake_dead_remote, [sample_signal]) self.sb.remote_register_to_signals(fake_alive_remote, [sample_signal]) self.sb.emit_signal(sample_signal) self.assertTrue(fake_alive_remote.called, "The alive must be called.") def test_emit_signal_ignore_missing_handlers(self): """A missing signal handler should just log a debug line.""" fake_remote_client = FakeRemoteClient() signal = fake_remote_client.missing_signal signals = [signal] self.sb.remote_register_to_signals(fake_remote_client, signals) sb_clients = self.sb.clients_per_signal[signal] self.assertIn(fake_remote_client, sb_clients) self.sb.emit_signal(signal) expected = ipc.SignalBroadcaster.MSG_NO_SIGNAL_HANDLER % ( signal, fake_remote_client, ) self.assertTrue(self.memento.check_debug(*expected)) def test_emit_signal_log_other_errors(self): """Other errors should be logged as warnings.""" fake_remote_client = FakeRemoteClient() signal = fake_remote_client.failing_signal signals = [signal] self.sb.remote_register_to_signals(fake_remote_client, signals) sb_clients = self.sb.clients_per_signal[signal] self.assertIn(fake_remote_client, sb_clients) self.sb.emit_signal(signal) expected = ipc.SignalBroadcaster.MSG_COULD_NOT_EMIT_SIGNAL % ( signal, fake_remote_client, fake_remote_client.random_exception, ) self.assertTrue(self.memento.check_warning(*expected)) class FakeRootObject(object): """A fake root object.""" def __init__(self, called, remote_obj): """Create a new instance.""" self.called = called self.remote_obj = remote_obj # pylint: disable=C0103 def callRemote(self, method_name): """A fake call remove method.""" self.called.append(method_name) return defer.succeed(self.remote_obj) # pylint: enable=C0103 class FakeWorkingRemoteClient(object): """A fake remote client.""" def __init__(self, called): """Create a new instance.""" self.remote = None self.called = called def register_to_signals(self): """Register to signals.""" self.called.append('register_to_signals') return defer.succeed(True) class ReconnectTestCase(TestCase): """Test the reconnection when sso is dead.""" @defer.inlineCallbacks def setUp(self): """Set the different tests.""" yield super(ReconnectTestCase, self).setUp() self.called = [] self.remote_obj = 'remote' self.root_obj = FakeRootObject(self.called, self.remote_obj) def fake_get_root_object(): """Fake getting the root object.""" self.called.append('getRootObject') return defer.succeed(self.root_obj) def fake_client_connect(factory, service_name, cmd, description): """Fake the client connect.""" self.called.append('client_connect') self.patch(factory, 'getRootObject', fake_get_root_object) return defer.succeed(True) self.patch(ipc, 'client_connect', fake_client_connect) @defer.inlineCallbacks def test_reconnect_method(self): """Test the execcution of the reconnect method.""" clients = dict(first=FakeWorkingRemoteClient(self.called), second=FakeWorkingRemoteClient(self.called)) base_client = ipc.BaseClient() base_client.clients = clients for name, client in clients.items(): setattr(base_client, name, client) yield base_client.reconnect() # assert that we did call the correct methods self.assertIn('client_connect', self.called) self.assertIn('getRootObject', self.called) for name in clients: self.assertIn('get_%s' % name, self.called) self.assertEqual(len(clients), self.called.count('register_to_signals')) ubuntu-sso-client-13.10/ubuntu_sso/utils/tests/__init__.py0000664000202700020270000000270412151461656024175 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # Author: Alejandro J. Cura # # Copyright 2010-2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Test for the utility modules.""" ubuntu-sso-client-13.10/ubuntu_sso/utils/tests/test_locale.py0000664000202700020270000001006012151461656024726 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2013 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Tests for the locale utilities.""" from twisted.trial.unittest import TestCase from ubuntu_sso.utils import locale NO_VALUE = object() class LocaleTestCase(TestCase): """Test case for functions related to locale.""" def setUp(self): d = super(LocaleTestCase, self).setUp() self.save_environ("LC_CTYPE") self.save_environ("LANG") return d def save_environ(self, env_var_name): """Save the value of an environment variable.""" old_value = locale.os.environ.get(env_var_name, NO_VALUE) self.addCleanup(self.restore_environ, env_var_name, old_value) locale.os.environ[env_var_name] = "fake_locale" def restore_environ(self, env_var_name, old_value): """Restore the value of an environment variable.""" if old_value is NO_VALUE: if env_var_name in locale.os.environ: del(locale.os.environ[env_var_name]) else: locale.os.environ[env_var_name] = old_value def test_fix_turkish_locale_when_turkish(self): """The fix_turkish_locale function skips when no locale set.""" locale.os.environ["LANG"] = "tr_TR.UTF-8" del(locale.os.environ["LC_CTYPE"]) locale.fix_turkish_locale() self.assertEqual(locale.os.environ["LC_CTYPE"], locale.SAFE_LOCALE) def test_fix_turkish_locale_when_other(self): """The fix_turkish_locale function skips when no locale set.""" locale.os.environ["LANG"] = "en_EN.UTF-8" del(locale.os.environ["LC_CTYPE"]) locale.fix_turkish_locale() self.assertEqual(locale.os.environ.get("LC_CTYPE", NO_VALUE), NO_VALUE) def test_fix_turkish_locale_when_LANG_unset(self): """The fix_turkish_locale function skips when no locale set.""" del(locale.os.environ["LANG"]) del(locale.os.environ["LC_CTYPE"]) locale.fix_turkish_locale() self.assertEqual(locale.os.environ.get("LC_CTYPE", NO_VALUE), NO_VALUE) def test_fix_turkish_locale_when_LC_CTYPE_not_turkish(self): """The fix is skipped if the LC_CTYPE is already non-turkish.""" original = "es_ES.UTF-8" locale.os.environ["LANG"] = "tr_TR.UTF-8" locale.os.environ["LC_CTYPE"] = original locale.fix_turkish_locale() self.assertEqual(locale.os.environ.get("LC_CTYPE", NO_VALUE), original) def test_fix_turkish_locale_when_LC_CTYPE_is_turkish(self): """The fix is applied if the LC_CTYPE is turkish.""" locale.os.environ["LANG"] = "es_ES.UTF-8" locale.os.environ["LC_CTYPE"] = "tr_TR.UTF-8" locale.fix_turkish_locale() self.assertEqual(locale.os.environ.get("LC_CTYPE", NO_VALUE), locale.SAFE_LOCALE) ubuntu-sso-client-13.10/ubuntu_sso/utils/tests/test_parse_args.py0000664000202700020270000001026712151461656025626 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Tests for the parse_args function.""" from __future__ import unicode_literals import sys from twisted.trial.unittest import TestCase from ubuntu_sso.utils import ui as main APP_NAME = 'Foo Bar' DEFAULTS = dict( app_name=APP_NAME, help_text='', login_only=False, ping_url='', policy_url='', tc_url='', window_id=0, ) DUMMY_TEXT = """Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed risus orci, lacinia ac tincidunt fermentum, vestibulum suscipit orci. Aliquam quis aliquet magna. Morbi vitae ligula ut libero porttitor imperdiet. Vestibulum et ipsum sapien, pellentesque ultricies risus. Aenean in lectus orci. Cras a lorem sollicitudin dui mollis varius. In hac habitasse platea dictumst.""" PROGRAM = 'foo-bar' SOME_URL = 'http://example.com/foo/bar' class ParseArgsTestCase(TestCase): """Test case for the parse_args function.""" def assert_parse_args_custom_field(self, option_name=None, option_value=None): """The args are correctly set when using a custom value.""" expected = dict(DEFAULTS) argv = [PROGRAM, '--app_name=%s' % APP_NAME] if option_name is not None: if option_value is not None: argv.append('--%s=%s' % (option_name, option_value)) expected[option_name] = option_value else: argv.append('--%s' % (option_name,)) expected[option_name] = True self.patch(sys, 'argv', argv) result = main.parse_args() # Access to a protected member, pylint: disable=W0212 self.assertEqual(expected, dict(result._get_kwargs())) def test_parse_args_defaults(self): """The args are correctly set when using defaults.""" self.assert_parse_args_custom_field() def test_parse_args_help_text(self): """The args are correctly set when using a custom help_text.""" self.assert_parse_args_custom_field('help_text', DUMMY_TEXT) def test_parse_args_ping_url(self): """The args are correctly set when using a custom ping_url.""" self.assert_parse_args_custom_field('ping_url', SOME_URL) def test_parse_args_policy_url(self): """The args are correctly set when using a custom policy_url.""" self.assert_parse_args_custom_field('policy_url', SOME_URL) def test_parse_args_tc_url(self): """The args are correctly set when using a custom tc_url.""" self.assert_parse_args_custom_field('tc_url', SOME_URL) def test_parse_args_window_id(self): """The args are correctly set when using a custom window_id.""" self.assert_parse_args_custom_field('window_id', 42) def test_parse_args_login_only(self): """The args are correctly set when using a custom login_only.""" self.assert_parse_args_custom_field('login_only') ubuntu-sso-client-13.10/ubuntu_sso/utils/tests/test_txsecrets.py0000664000202700020270000012115612151461656025524 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # Author: Alejandro J. Cura # # Copyright 2010-2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Tests for txkeyring.""" import logging import uuid import dbus.service from twisted.internet.defer import inlineCallbacks, returnValue from ubuntuone.devtools.testcases.dbus import DBusTestCase from ubuntu_sso.utils import txsecrets # DBus exported objects have different naming conventions than vanilla python # pylint: disable=C0103 # Dear pylint, my clock says... 2010. Do you need a tutorial on decorators? # pylint: disable=C0322 # pylint complains when things are a little too dynamic # pylint: disable=E1101 # Use of super on an old style class # pylint: disable=E1002 ERROR_CREATE_BUT_LOCKED = "Cannot create an item in a locked collection" PROMPT_BASE_PATH = "/org/freedesktop/secrets/prompt" SESSION_BASE_PATH = "/org/freedesktop/secrets/session" COLLECTION_BASE_PATH = "/org/freedesktop/secrets/collection/" SAMPLE_CONTENT_TYPE = "text/plain; charset=utf8" class InvalidProperty(Exception): """An exception for when invalid properties are passed in.""" class SampleMiscException(Exception): """An exception that will be turned into a DBus Exception.""" class ItemMock(dbus.service.Object): """An item contains a secret, lookup attributes and has a label.""" get_secret_fail = False delete_fail = False delete_prompt = False dismissed = False def __init__(self, collection, label, attributes, value, *args, **kwargs): """Initialize this instance.""" # pylint: disable=E1002 super(ItemMock, self).__init__(*args, **kwargs) self.collection = collection self.label = label self.attributes = attributes self.value = value @dbus.service.method(dbus_interface=txsecrets.ITEM_IFACE, out_signature="o") def Delete(self): """Delete this item.""" if self.delete_fail: raise SampleMiscException() self.collection.items.remove(self) if self.delete_prompt: prompt_path = create_object_path(PROMPT_BASE_PATH) prompt = self.dbus_publish(prompt_path, PromptMock, result="", dismissed=self.dismissed) return prompt else: return "/" @dbus.service.method(dbus_interface=txsecrets.ITEM_IFACE, in_signature="o", out_signature="(oayay)") def GetSecret(self, session): """Retrieve the secret for this item.""" if self.get_secret_fail: raise SampleMiscException() return (session, "", self.value) def matches(self, search_attr): """See if this item matches a given search.""" for k, val in search_attr.items(): if k not in self.attributes: return False if self.attributes[k] != val: return False return True class PromptMock(dbus.service.Object): """A prompt necessary to complete an operation.""" def __init__(self, dismissed=True, result=dbus.String("", variant_level=1), *args, **kwargs): """Initialize this instance.""" # pylint: disable=E1002 super(PromptMock, self).__init__(*args, **kwargs) self.dismissed = dismissed self.result = result @dbus.service.method(dbus_interface=txsecrets.PROMPT_IFACE, in_signature="s") def Prompt(self, window_id): """Perform the prompt.""" self.Completed(self.dismissed, self.result) @dbus.service.signal(dbus_interface=txsecrets.PROMPT_IFACE, signature="bv") def Completed(self, dismissed, result): """The prompt and operation completed.""" class BaseCollectionMock(dbus.service.Object): """Base collection of items containing secrets.""" SUPPORTS_MULTIPLE_OBJECT_PATHS = True SUPPORTS_MULTIPLE_CONNECTIONS = True create_item_prompt = False dismissed = False create_item_fail = False locked = False unlock_prompts = False item_mock_class = ItemMock item_attrs_property = txsecrets.ITEM_ATTRIBUTES_PROPERTY_OLD item_label_property = txsecrets.ITEM_LABEL_PROPERTY_OLD clxn_label_property = txsecrets.CLXN_LABEL_PROPERTY_OLD def __init__(self, label, *args, **kwargs): """Initialize this instance.""" # pylint: disable=E1002 super(BaseCollectionMock, self).__init__(*args, **kwargs) self.items = [] self.label = label def _create_item(self, properties, secret, replace): """Create an item with the given attributes, secret and label. If replace is set, then it replaces an item already present with the same values for the attributes. """ if self.create_item_fail: raise SampleMiscException() if self.locked: raise SampleMiscException(ERROR_CREATE_BUT_LOCKED) attributes = properties[self.item_attrs_property] item_label = properties[self.item_label_property] value = secret[2] item_path = create_object_path(make_coll_path(self.label)) item = self.dbus_publish(item_path, self.item_mock_class, self, item_label, attributes, value) self.items.append(item) if self.create_item_prompt: prompt_path = create_object_path(PROMPT_BASE_PATH) prompt = self.dbus_publish(prompt_path, PromptMock, result=item, dismissed=self.dismissed) return "/", prompt else: return item, "/" @dbus.service.method(dbus_interface=txsecrets.PROPERTIES_IFACE, in_signature="ss", out_signature="v") def Get(self, interface, propname): """The only property implemented is Label.""" if interface == txsecrets.COLLECTION_IFACE and \ propname == self.clxn_label_property: return dbus.String(self.label) raise InvalidProperty("Invalid property: {}".format(propname)) class CollectionMock(BaseCollectionMock): """Collection of items containing secrets.""" @dbus.service.method(dbus_interface=txsecrets.COLLECTION_IFACE, in_signature="a{sv}(oayay)b", out_signature="oo", byte_arrays=True) def CreateItem(self, properties, secret, replace): """Expose the _create_item method on DBus.""" assert len(secret) == 3 return self._create_item(properties, secret, replace) class SessionMock(dbus.service.Object): """A session tracks state between the service and a client application.""" @dbus.service.method(dbus_interface=txsecrets.SESSION_IFACE) def Close(self): """Close this session.""" def make_coll_path(label): """Make the path to a collection with its label""" return COLLECTION_BASE_PATH + label class SecretServiceMock(dbus.service.Object): """The Secret Service manages all the sessions and collections.""" create_collection_prompt = False create_collection_fail = False open_session_fail = False dismissed = False collection_mock_class = CollectionMock clxn_label_property = txsecrets.CLXN_LABEL_PROPERTY_OLD collections_property = txsecrets.COLLECTIONS_PROPERTY_OLD def __init__(self, *args, **kwargs): """Initialize this instance.""" # pylint: disable=E1002 super(SecretServiceMock, self).__init__(*args, **kwargs) self.sessions = {} self.collections = {} self.aliases = {} @dbus.service.method(dbus_interface=txsecrets.SERVICE_IFACE, in_signature="sv", out_signature="vo") def OpenSession(self, algorithm, algorithm_parameters): """Open a unique session for the caller application.""" if self.open_session_fail: raise SampleMiscException() session_path = create_object_path(SESSION_BASE_PATH) session = self.dbus_publish(session_path, SessionMock) self.sessions[session_path] = session return True, session @dbus.service.method(dbus_interface=txsecrets.SERVICE_IFACE, in_signature="a{sv}", out_signature="oo") def CreateCollection(self, properties): """Create a new collection with the specified properties.""" if self.create_collection_fail: raise SampleMiscException() label = str(properties[self.clxn_label_property]) coll_path = make_coll_path(label) collection = self.dbus_publish(coll_path, self.collection_mock_class, label) self.collections[label] = collection if self.create_collection_prompt: prompt_path = create_object_path(PROMPT_BASE_PATH) prompt = self.dbus_publish(prompt_path, PromptMock, result=collection, dismissed=self.dismissed) return "/", prompt else: return collection, "/" @dbus.service.method(dbus_interface=txsecrets.SERVICE_IFACE, in_signature="a{ss}", out_signature="aoao") def SearchItems(self, attributes): """Find items in any collection.""" unlocked_items = [] locked_items = [] for c in self.collections.values(): if c.locked: append_item = locked_items.append else: append_item = unlocked_items.append for i in c.items: if i.matches(attributes): append_item(i) return unlocked_items, locked_items def unlock_objects(self, objects): """Unlock the objects or its containers.""" for c in self.collections.values(): for l in c.locations: path = l[1] if path in objects: c.locked = False for i in c.items: for l in i.locations: path = l[1] if path in objects: c.locked = False @dbus.service.method(dbus_interface=txsecrets.SERVICE_IFACE, in_signature="ao", out_signature="aoo") def Unlock(self, objects): """Unlock the specified objects.""" locked = [] unlocked = [] for c in self.collections.values(): for i in c.items: path = i.__dbus_object_path__ if path in objects: if c.unlock_prompts: locked.append(path) else: unlocked.append(path) if locked: prompt_path = create_object_path(PROMPT_BASE_PATH) self.unlock_objects(objects) prompt = self.dbus_publish(prompt_path, PromptMock, result=locked, dismissed=self.dismissed) return unlocked, prompt else: self.unlock_objects(objects) return objects, "/" @dbus.service.method(dbus_interface=txsecrets.SERVICE_IFACE, in_signature="s", out_signature="o") def ReadAlias(self, name): """Get the collection with the given alias.""" result = self.aliases.get(name, "/") return result @dbus.service.method(dbus_interface=txsecrets.SERVICE_IFACE, in_signature="so") def SetAlias(self, name, collection_path): """Setup a collection alias.""" self.aliases[name] = collection_path @dbus.service.method(dbus_interface=txsecrets.PROPERTIES_IFACE, in_signature="ss", out_signature="v") def Get(self, interface, propname): """The only property implemented is Collections.""" if interface == txsecrets.SERVICE_IFACE and \ propname == self.collections_property: coll_paths = [make_coll_path(l) for l in self.collections] return dbus.Array(coll_paths, signature="o", variant_level=1) raise InvalidProperty("Invalid property: {}".format(propname)) class AltItemMock(ItemMock): """The secret in this item has a content_type.""" @dbus.service.method(dbus_interface=txsecrets.ITEM_IFACE, in_signature="o", out_signature="(oayays)") def GetSecret2(self, session): """Retrieve the secret for this item.""" if self.get_secret_fail: raise SampleMiscException() return (session, "", self.value, SAMPLE_CONTENT_TYPE) class AltCollectionMock(BaseCollectionMock): """The secrets in this collection have a content_type field.""" item_mock_class = AltItemMock item_attrs_property = txsecrets.ITEM_ATTRIBUTES_PROPERTY item_label_property = txsecrets.ITEM_LABEL_PROPERTY clxn_label_property = txsecrets.CLXN_LABEL_PROPERTY @dbus.service.method(dbus_interface=txsecrets.COLLECTION_IFACE, in_signature="a{sv}(oayays)b", out_signature="oo", byte_arrays=True) def CreateItem(self, properties, secret, replace): """Expose the _create_item method on DBus.""" assert len(secret) == 4 return self._create_item(properties, secret, replace) class AltSecretServiceMock(SecretServiceMock): """The secrets in this service have a content_type field.""" collection_mock_class = AltCollectionMock clxn_label_property = txsecrets.CLXN_LABEL_PROPERTY collections_property = txsecrets.COLLECTIONS_PROPERTY # pylint: disable=W0221 @dbus.service.method(dbus_interface=txsecrets.SERVICE_IFACE, in_signature="a{sv}s", out_signature="oo") def CreateCollection(self, properties, alias): """Create a new collection with the specified properties.""" # pylint: disable=E1002 collection, prompt = super(AltSecretServiceMock, self).CreateCollection(properties) self.SetAlias(alias, collection) return collection, prompt # pylint: enable=W0221 def create_object_path(base): """Create a random object path given a base path.""" random = uuid.uuid4().hex return base + "/" + random class TextFilter(object): """Prevents the logging of messages containing a given text.""" def __init__(self, *args): """Initialize this filter.""" super(TextFilter, self).__init__() self.filtered_strings = args def filter(self, record): """See if we need to filter a given log record.""" return not any(s in record.msg for s in self.filtered_strings) class BaseTestCase(DBusTestCase): """Base class for DBus tests.""" timeout = 10 secret_service_class = SecretServiceMock @inlineCallbacks def setUp(self): yield super(BaseTestCase, self).setUp() self.session_bus = dbus.SessionBus() self.mock_service = self.dbus_publish(txsecrets.SECRETS_SERVICE, self.secret_service_class) self.secretservice = txsecrets.SecretService() self.silence_dbus_logging() def silence_dbus_logging(self): """Silence the warnings printed by dbus that pollute test results.""" logger = logging.getLogger('dbus.connection') logfilter = TextFilter("Unable to set arguments") logger.addFilter(logfilter) self.addCleanup(logger.removeFilter, logfilter) def dbus_publish(self, object_path, object_class, *args, **kwargs): """Create an object and publish it on the bus.""" name = self.session_bus.request_name(txsecrets.BUS_NAME, dbus.bus.NAME_FLAG_DO_NOT_QUEUE) self.assertNotEqual(name, dbus.bus.REQUEST_NAME_REPLY_EXISTS) mock_object = object_class(*args, object_path=object_path, conn=self.session_bus, **kwargs) self.addCleanup(mock_object.remove_from_connection, connection=self.session_bus, path=object_path) mock_object.dbus_publish = self.dbus_publish return mock_object @inlineCallbacks def create_sample_collection(self, label, make_alias=True, publish_default_path=False): """Create a collection with a given label.""" coll = yield self.secretservice.create_collection(label) if make_alias: coll_path = make_coll_path(label) self.mock_service.SetAlias("default", coll_path) if publish_default_path: mock_object = self.mock_service.collections[label] mock_object.add_to_connection(self.session_bus, txsecrets.DEFAULT_COLLECTION) self.addCleanup(mock_object.remove_from_connection, connection=self.session_bus, path=txsecrets.DEFAULT_COLLECTION) returnValue(coll) class SecretServiceTestCase(BaseTestCase): """Test the Secret Service class.""" @inlineCallbacks def test_open_session(self): """The secret service session is opened.""" result = yield self.secretservice.open_session() self.assertEqual(result, self.secretservice) @inlineCallbacks def test_open_session_throws_dbus_error_as_failure(self): """The secret service open session throws a dbus error as a failure.""" d = self.secretservice.open_session() self.mock_service.open_session_fail = True yield self.assertFailure(d, dbus.exceptions.DBusException) @inlineCallbacks def test_open_session_fails_before_opening_as_failure(self): """A dbus error before opening the session is thrown as a failure.""" def fail(*args, **kwargs): """Throw a DBus exception.""" raise dbus.exceptions.DBusException() self.patch(txsecrets.dbus, "SessionBus", fail) d = self.secretservice.open_session() self.mock_service.open_session_fail = True yield self.assertFailure(d, dbus.exceptions.DBusException) @inlineCallbacks def test_create_collection(self): """The secret service creates a collection.""" yield self.secretservice.open_session() collection_label = "sample_keyring" yield self.create_sample_collection(collection_label) self.assertIn(collection_label, self.mock_service.collections) @inlineCallbacks def test_create_collection_prompt(self): """The secret service creates a collection after a prompt.""" yield self.secretservice.open_session() self.mock_service.create_collection_prompt = True collection_label = "sample_keyring" yield self.create_sample_collection(collection_label) self.assertIn(collection_label, self.mock_service.collections) @inlineCallbacks def test_create_collection_prompt_dismissed(self): """The service fails to create collection when prompt dismissed.""" yield self.secretservice.open_session() self.mock_service.create_collection_prompt = True self.mock_service.dismissed = True collection_label = "sample_keyring" yield self.assertFailure( self.create_sample_collection(collection_label), txsecrets.UserCancelled) @inlineCallbacks def test_create_collection_throws_dbus_error(self): """The service fails to create collection on a DBus error.""" yield self.secretservice.open_session() self.mock_service.create_collection_fail = True collection_label = "sample_keyring" yield self.assertFailure( self.create_sample_collection(collection_label), dbus.exceptions.DBusException) @inlineCallbacks def test_prompt_accepted(self): """A prompt is accepted.""" yield self.secretservice.open_session() expected_result = "hello world" prompt_path = "/prompt" self.dbus_publish(prompt_path, PromptMock, result=expected_result, dismissed=False) result = yield self.secretservice.do_prompt(prompt_path) self.assertEqual(result, expected_result) @inlineCallbacks def test_prompt_dismissed(self): """A prompt is dismissed with a UserCancelled failure.""" yield self.secretservice.open_session() expected_result = "hello world2" prompt_path = "/prompt" self.dbus_publish(prompt_path, PromptMock, result=expected_result, dismissed=True) d = self.secretservice.do_prompt(prompt_path) self.assertFailure(d, txsecrets.UserCancelled) @inlineCallbacks def test_search_unlocked_items(self): """The secret service searchs for unlocked items.""" yield self.secretservice.open_session() coll = yield self.create_sample_collection("sample_keyring") attr = {"key-type": "Ubuntu SSO credentials"} sample_secret = "secret83!" yield coll.create_item("Cucaracha", attr, sample_secret) items = yield self.secretservice.search_items(attr) self.assertEqual(len(items), 1) value = yield items[0].get_value() self.assertEqual(value, sample_secret) @inlineCallbacks def test_search_locked_items(self): """The secret service searchs for locked items.""" yield self.secretservice.open_session() collection_name = "sample_keyring" coll = yield self.create_sample_collection(collection_name) mock_collection = self.mock_service.collections[collection_name] attr = {"key-type": "Ubuntu SSO credentials"} sample_secret = "secret99!" yield coll.create_item("Cucaracha", attr, sample_secret) mock_collection.locked = True items = yield self.secretservice.search_items(attr) self.assertEqual(len(items), 1) value = yield items[0].get_value() self.assertEqual(value, sample_secret) @inlineCallbacks def test_search_locked_items_prompts(self): """The secret service searchs for locked items after a prompt.""" yield self.secretservice.open_session() collection_name = "sample_keyring" coll = yield self.create_sample_collection(collection_name) mock_collection = self.mock_service.collections[collection_name] attr = {"key-type": "Ubuntu SSO credentials"} sample_secret = "secret99!" yield coll.create_item("Cucaracha", attr, sample_secret) mock_collection.locked = True mock_collection.unlock_prompts = True items = yield self.secretservice.search_items(attr) self.assertEqual(len(items), 1) value = yield items[0].get_value() self.assertEqual(value, sample_secret) @inlineCallbacks def test_search_locked_items_prompts_dismissed(self): """Service fails search for locked items after dismissed prompt.""" yield self.secretservice.open_session() collection_name = "sample_keyring" coll = yield self.create_sample_collection(collection_name) mock_collection = self.mock_service.collections[collection_name] self.mock_service.dismissed = True attr = {"key-type": "Ubuntu SSO credentials"} sample_secret = "secret99!" yield coll.create_item("Cucaracha", attr, sample_secret) mock_collection.locked = True mock_collection.unlock_prompts = True d = self.secretservice.search_items(attr) yield self.assertFailure(d, txsecrets.UserCancelled) @inlineCallbacks def test_search_items_merges_unlocked_and_locked_items(self): """search_items merges unlocked and locked items.""" yield self.secretservice.open_session() attr = {"key-type": "Ubuntu SSO credentials"} collection_name = "coll1" coll = yield self.create_sample_collection(collection_name) mock_coll1 = self.mock_service.collections[collection_name] unlocked_secret = "coll 1 secret!" yield coll.create_item("Cucaracha", attr, unlocked_secret) mock_coll1.locked = False mock_coll1.unlock_prompts = False collection_name = "coll2" coll = yield self.create_sample_collection(collection_name) mock_coll2 = self.mock_service.collections[collection_name] locked_secret = "coll 2 secret!" yield coll.create_item("Cucaracha", attr, locked_secret) mock_coll2.locked = True mock_coll2.unlock_prompts = False result = yield self.secretservice.search_items(attr) self.assertEqual(len(result), 2) @inlineCallbacks def test_search_items_merges_unlocked_locked_and_prompt_items(self): """search_items merges unlocked, locked and prompt items.""" yield self.secretservice.open_session() attr = {"key-type": "Ubuntu SSO credentials"} collection_name = "coll1" coll = yield self.create_sample_collection(collection_name) mock_coll1 = self.mock_service.collections[collection_name] unlocked_secret = "coll 1 secret!" yield coll.create_item("Cucaracha", attr, unlocked_secret) mock_coll1.locked = False mock_coll1.unlock_prompts = False collection_name = "coll2" coll = yield self.create_sample_collection(collection_name) mock_coll2 = self.mock_service.collections[collection_name] locked_secret = "coll 2 secret!" yield coll.create_item("Cucaracha", attr, locked_secret) mock_coll2.locked = True mock_coll2.unlock_prompts = False collection_name = "coll3" coll = yield self.create_sample_collection(collection_name) mock_coll3 = self.mock_service.collections[collection_name] locked_secret = "coll 3 secret!" yield coll.create_item("Cucaracha", attr, locked_secret) mock_coll3.locked = True mock_coll3.unlock_prompts = True result = yield self.secretservice.search_items(attr) self.assertEqual(len(result), 3) @inlineCallbacks def test_get_collections(self): """The list of all collections is returned.""" collection_names = ["collection1", "collection2"] yield self.secretservice.open_session() for name in collection_names: yield self.create_sample_collection(name) collections = yield self.secretservice.get_collections() self.assertEqual(len(collections), len(collection_names)) @inlineCallbacks def test_get_default_collection_honours_default_path(self): """The default collection is returned from the default path.""" yield self.secretservice.open_session() collection_name = "sample_default_keyring" yield self.create_sample_collection(collection_name, make_alias=False, publish_default_path=True) self.assertEqual(len(self.mock_service.collections), 1) yield self.secretservice.get_default_collection() self.assertEqual(len(self.mock_service.collections), 1) @inlineCallbacks def test_get_default_collection_honours_readalias(self): """The default collection is returned if default alias set.""" yield self.secretservice.open_session() collection_name = "sample_default_keyring" yield self.create_sample_collection(collection_name) self.assertEqual(len(self.mock_service.collections), 1) yield self.secretservice.get_default_collection() self.assertEqual(len(self.mock_service.collections), 1) @inlineCallbacks def test_get_default_collection_created_if_no_default(self): """The default collection is created if there's no default.""" yield self.secretservice.open_session() collection_name = "sample_nondefault_keyring" yield self.create_sample_collection(collection_name, make_alias=False) self.assertEqual(len(self.mock_service.collections), 1) yield self.secretservice.get_default_collection() self.assertEqual(len(self.mock_service.collections), 2) @inlineCallbacks def test_get_default_collection_created_if_nonexistent(self): """The default collection is created if it doesn't exist yet.""" yield self.secretservice.open_session() self.assertEqual(len(self.mock_service.collections), 0) yield self.secretservice.get_default_collection() self.assertEqual(len(self.mock_service.collections), 1) @inlineCallbacks def test_get_default_collection_set_as_default_if_nonexistent(self): """The default collection is set as default if it doesn't exist yet.""" yield self.secretservice.open_session() yield self.secretservice.get_default_collection() self.assertIn(txsecrets.DEFAULT_LABEL, self.mock_service.aliases) @inlineCallbacks def test_get_default_collection_is_unlocked_default_path(self): """The default collection is unlocked before being returned.""" yield self.secretservice.open_session() collection_name = "sample_keyring" self.assertEqual(len(self.mock_service.collections), 0) coll = yield self.create_sample_collection(collection_name, make_alias=False, publish_default_path=True) self.assertEqual(len(self.mock_service.collections), 1) mock_collection = self.mock_service.collections[collection_name] mock_collection.locked = True yield self.secretservice.get_default_collection() attr = {"key-type": "Ubuntu 242 credentials"} sample_secret = "secret!" yield coll.create_item("Cucaracha", attr, sample_secret) self.assertEqual(len(mock_collection.items), 1) @inlineCallbacks def test_get_default_collection_is_unlocked_readalias(self): """The default collection is unlocked before being returned.""" yield self.secretservice.open_session() collection_name = "sample_keyring" self.assertEqual(len(self.mock_service.collections), 0) coll = yield self.create_sample_collection(collection_name) self.assertEqual(len(self.mock_service.collections), 1) mock_collection = self.mock_service.collections[collection_name] mock_collection.locked = True yield self.secretservice.get_default_collection() attr = {"key-type": "Ubuntu 242 credentials"} sample_secret = "secret!" yield coll.create_item("Cucaracha", attr, sample_secret) self.assertEqual(len(mock_collection.items), 1) class CollectionTestCase(BaseTestCase): """Test the Collection class.""" @inlineCallbacks def test_get_label(self): """The collection gets its own label from the keyring.""" yield self.secretservice.open_session() expected_label = "sample_keyring" yield self.create_sample_collection(expected_label) coll = yield self.secretservice.get_default_collection() result = yield coll.get_label() self.assertEqual(result, expected_label) @inlineCallbacks def test_create_item(self): """The collection creates an item.""" yield self.secretservice.open_session() collection_label = "sample_keyring" yield self.create_sample_collection(collection_label) coll = yield self.secretservice.get_default_collection() mock_collection = self.mock_service.collections[collection_label] attr = {"key-type": "Ubuntu 242 credentials"} sample_secret = "secret!" yield coll.create_item("Cucaracha", attr, sample_secret) self.assertEqual(len(mock_collection.items), 1) self.assertEqual(mock_collection.items[0].value, sample_secret) @inlineCallbacks def test_create_item_prompt(self): """The collection creates an item after a prompt.""" yield self.secretservice.open_session() collection_label = "sample_keyring" yield self.create_sample_collection(collection_label) coll = yield self.secretservice.get_default_collection() mock_collection = self.mock_service.collections[collection_label] mock_collection.create_item_prompt = True attr = {"key-type": "Ubuntu 242 credentials"} sample_secret = "secret2!" yield coll.create_item("Cucaracha", attr, sample_secret) self.assertEqual(len(mock_collection.items), 1) self.assertEqual(mock_collection.items[0].value, sample_secret) @inlineCallbacks def test_create_item_prompt_dismissed(self): """The collection fails to create an item when prompt is dismissed.""" yield self.secretservice.open_session() collection_label = "sample_keyring" yield self.create_sample_collection(collection_label) coll = yield self.secretservice.get_default_collection() mock_collection = self.mock_service.collections[collection_label] mock_collection.create_item_prompt = True mock_collection.dismissed = True attr = {"key-type": "Ubuntu 242 credentials"} sample_secret = "secret3!" yield self.assertFailure(coll.create_item("Cuca", attr, sample_secret), txsecrets.UserCancelled) @inlineCallbacks def test_create_item_throws_dbus_error(self): """The collection fails to create an item when DBus fails.""" yield self.secretservice.open_session() collection_label = "sample_keyring" yield self.create_sample_collection(collection_label) coll = yield self.secretservice.get_default_collection() mock_collection = self.mock_service.collections[collection_label] mock_collection.create_item_fail = True attr = {"key-type": "Ubuntu 242 credentials"} sample_secret = "secret4!" yield self.assertFailure(coll.create_item("Cuca", attr, sample_secret), dbus.exceptions.DBusException) class ItemTestCase(BaseTestCase): """Test the Item class.""" @inlineCallbacks def test_get_value(self): """The secret value is retrieved from the item.""" yield self.secretservice.open_session() coll = yield self.create_sample_collection("sample_keyring") attr = {"key-type": "Ubuntu SSO credentials"} sample_secret = "secret83!" yield coll.create_item("Cucaracha", attr, sample_secret) items = yield self.secretservice.search_items(attr) self.assertEqual(len(items), 1) value = yield items[0].get_value() self.assertEqual(value, sample_secret) @inlineCallbacks def test_get_value_throws_dbus_error(self): """The secret value is not retrieved if DBus fails.""" yield self.secretservice.open_session() collection_label = "sample_keyring" coll = yield self.create_sample_collection(collection_label) attr = {"key-type": "Ubuntu SSO credentials"} sample_secret = "secret83!" yield coll.create_item("Cucaracha", attr, sample_secret) items = yield self.secretservice.search_items(attr) self.assertEqual(len(items), 1) mock = self.mock_service.collections[collection_label].items[0] mock.get_secret_fail = True yield self.assertFailure(items[0].get_value(), dbus.exceptions.DBusException) @inlineCallbacks def test_delete(self): """The item is deleted.""" yield self.secretservice.open_session() coll = yield self.create_sample_collection("sample_keyring") attr = {"key-type": "Ubuntu SSO credentials"} sample_secret = "secret83!" yield coll.create_item("Cucaracha", attr, sample_secret) items = yield self.secretservice.search_items(attr) self.assertEqual(len(items), 1) yield items[0].delete() items = yield self.secretservice.search_items(attr) self.assertEqual(len(items), 0) @inlineCallbacks def test_delete_prompt(self): """The item is deleted after a prompt.""" yield self.secretservice.open_session() collection_label = "sample_keyring" coll = yield self.create_sample_collection(collection_label) attr = {"key-type": "Ubuntu SSO credentials"} sample_secret = "secret83!" yield coll.create_item("Cucaracha", attr, sample_secret) items = yield self.secretservice.search_items(attr) self.assertEqual(len(items), 1) mock_item = self.mock_service.collections[collection_label].items[0] mock_item.delete_prompt = True yield items[0].delete() items = yield self.secretservice.search_items(attr) self.assertEqual(len(items), 0) @inlineCallbacks def test_delete_prompt_dismissed(self): """The item is not deleted after a dismissed prompt.""" yield self.secretservice.open_session() collection_label = "sample_keyring" coll = yield self.create_sample_collection(collection_label) attr = {"key-type": "Ubuntu SSO credentials"} sample_secret = "secret83!" yield coll.create_item("Cucaracha", attr, sample_secret) items = yield self.secretservice.search_items(attr) self.assertEqual(len(items), 1) mock_item = self.mock_service.collections[collection_label].items[0] mock_item.delete_prompt = True mock_item.dismissed = True yield self.assertFailure(items[0].delete(), txsecrets.UserCancelled) @inlineCallbacks def test_delete_throws_dbus_error(self): """The item is not deleted when a DBus error happens.""" yield self.secretservice.open_session() collection_label = "sample_keyring" coll = yield self.create_sample_collection(collection_label) attr = {"key-type": "Ubuntu SSO credentials"} sample_secret = "secret83!" yield coll.create_item("Cucaracha", attr, sample_secret) items = yield self.secretservice.search_items(attr) self.assertEqual(len(items), 1) mock_item = self.mock_service.collections[collection_label].items[0] mock_item.delete_fail = True yield self.assertFailure(items[0].delete(), dbus.exceptions.DBusException) class AltItemTestCase(BaseTestCase): """Test the Item class with 4 fields in the secret struct.""" secret_service_class = AltSecretServiceMock @inlineCallbacks def test_create_item_four_fields_per_secret(self): """The collection creates an item when the dbus struct has 4 fields.""" yield self.secretservice.open_session() collection_label = "sample_keyring" yield self.create_sample_collection(collection_label) coll = yield self.secretservice.get_default_collection() mock_collection = self.mock_service.collections[collection_label] attr = {"key-type": "Ubuntu 242 credentials"} sample_secret = "secret!" yield coll.create_item("Cucaracha", attr, sample_secret) self.assertEqual(len(mock_collection.items), 1) self.assertEqual(mock_collection.items[0].value, sample_secret) @inlineCallbacks def test_get_value_four_fields_per_secret(self): """The code works fine when the secret dbus struct has 4 fields.""" yield self.secretservice.open_session() collection_label = "sample_keyring" coll = yield self.create_sample_collection(collection_label) attr = {"key-type": "Ubuntu SSO credentials"} sample_secret = "secret83!" yield coll.create_item("Cucaracha", attr, sample_secret) items = yield self.secretservice.search_items(attr) self.assertEqual(len(items), 1) value = yield items[0].get_value() self.assertEqual(value, sample_secret) ubuntu-sso-client-13.10/ubuntu_sso/utils/tests/test_translation.py0000664000202700020270000002202312151461656026027 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Test the platform-specific translation functions.""" import os import sys from twisted.internet import defer from ubuntuone.devtools.testcases import TestCase, skipIfNotOS from ubuntu_sso.utils import translation TEST_DOMAIN = 'test-domain' TEST_LANG_DEFAULTS_EN_FIRST = ['en', 'pt-PT'] TEST_LANG_DEFAULTS = ['es', 'en', 'pt-PT'] TEST_FALLBACK_PATH = 'test-path/to/mofiles' TEST_FROZEN_PATH = 'frozen-test-path/to/mofiles' class MockGettextTranslations(object): """Mock translations to test properties""" ugettext = 'ugettext' gettext = 'gettext' class MockNSUserDefaults(object): """Mock defaults for _get_languages on darwin.""" def standardUserDefaults(self): return {'AppleLanguages': TEST_LANG_DEFAULTS} class TranslationsTestCase(TestCase): """Test getting the right gettext translations.""" @defer.inlineCallbacks def setUp(self): yield super(TranslationsTestCase, self).setUp() self._called = [] def _set_called(self, *args, **kwargs): """call recorder""" self._called.append((args, kwargs)) return MockGettextTranslations() def test_import(self): """Test whether import translation defines _ as a builtin.""" import ubuntu_sso.utils.translation assert ubuntu_sso.utils.translation self.assertFalse('_' in __builtins__) @skipIfNotOS('darwin', 'Test requires pyobjc-Cocoa') def test_get_languages_darwin(self): """Test getting the user's list of preferred languages.""" import Cocoa assert Cocoa self.patch(Cocoa, 'NSUserDefaults', MockNSUserDefaults()) langs = translation._get_languages() self.assertEqual(langs, TEST_LANG_DEFAULTS) def test_get_languages_linux(self): """Test that we will use gettext defaults on linux.""" self.patch(sys, 'platform', 'linux2') langs = translation._get_languages() self.assertEqual(langs, None) def test_get_translations_data_path_darwin_frozen(self): """Test getting the location of the compiled translation files.""" self.patch(sys, 'platform', 'darwin') sys.frozen = 'yes' self.addCleanup(delattr, sys, 'frozen') self.patch(translation, '__file__', os.path.join('path', 'to', 'Main.app', 'ignore', 'me')) path = translation._get_translations_data_path() self.assertEqual(path, os.path.join('path', 'to', 'Main.app', 'Contents', 'Resources', 'translations')) def test_get_translations_data_path_darwin_unfrozen_nofallback(self): """Test that we use gettext defaults on darwin when not frozen.""" self.patch(sys, 'platform', 'darwin') path = translation._get_translations_data_path() self.assertEqual(path, None) def test_get_translations_data_path_darwin_unfrozen_fallback(self): """Test that we use fallback on darwin when not frozen.""" self.patch(sys, 'platform', 'darwin') expected = "a-test-path" path = translation._get_translations_data_path(expected) self.assertEqual(path, expected) def test_get_translations_data_path_linux(self): """Test that we use gettext defaults on linux.""" path = translation._get_translations_data_path() self.assertEqual(path, None) def _call_get_gettext(self, platform, py_version, fallback=None): """Helper function to patch and call translation.get_gettext.""" self.patch(sys, 'platform', platform) self.patch(sys, 'version_info', py_version) self.patch(translation.gettext, 'translation', self._set_called) if fallback: g_func = translation.get_gettext(TEST_DOMAIN, fallback) else: g_func = translation.get_gettext(TEST_DOMAIN) if py_version == (2,): self.assertEqual(g_func, 'ugettext') else: self.assertEqual(g_func, 'gettext') def test_get_gettext_linux_py2(self): """test get_gettext on linux py2""" self._call_get_gettext('linux2', py_version=(2,)) def test_get_gettext_linux_py3(self): """test get_gettext on linux py3""" self._call_get_gettext('linux2', py_version=(3,)) def _call_get_gettext_nonlinux(self, frozen, py_version, lang_en_first=False): """Helper function for non-linux runs of get_gettext.""" if lang_en_first: lang_rv = TEST_LANG_DEFAULTS_EN_FIRST else: lang_rv = TEST_LANG_DEFAULTS self.patch(translation, '_get_languages', lambda: lang_rv) if frozen: expected_path = TEST_FROZEN_PATH sys.frozen = 'yes' self.addCleanup(delattr, sys, 'frozen') else: expected_path = TEST_FALLBACK_PATH self.patch(translation, '_get_translations_data_path', lambda x: expected_path) self._call_get_gettext('notlinux', py_version) # This tests a special case if 'en' is the first language, we # don't give the path, so we will get the fallback # NullTranslation instance that will use the keys and not look # for en translations, which we do not ship. if lang_en_first: expected_arg = ((TEST_DOMAIN,), {'fallback': True}) self.assertEqual(self._called, [expected_arg]) else: # Check for lang_rv[:1] (must be a list) because we only # send first language, in order to fall back to 'en' even # though we don't ship an en.mo expected_arg = ((TEST_DOMAIN, expected_path), {'languages': lang_rv[:1], 'fallback': True}) self.assertEqual(self._called, [expected_arg]) def test_get_gettext_nonlinux_frozen_py2(self): """test get_gettext on nonlinux frozen and py2""" self._call_get_gettext_nonlinux(frozen=True, py_version=(2,)) def test_get_gettext_nonlinux_frozen_py3(self): """test get_gettext on nonlinux frozen and py3""" self._call_get_gettext_nonlinux(frozen=True, py_version=(3,)) def test_get_gettext_nonlinux_unfrozen_py2(self): """test get_gettext on nonlinux un-frozen and py2""" self._call_get_gettext_nonlinux(frozen=False, py_version=(2,)) def test_get_gettext_nonlinux_unfrozen_py3(self): """test get_gettext on nonlinux un-frozen and py3""" self._call_get_gettext_nonlinux(frozen=False, py_version=(3,)) def test_get_gettext_nonlinux_frozen_py2_enfirst(self): """test get_gettext returning nulltranslations when lang[0] = en""" self._call_get_gettext_nonlinux(frozen=True, py_version=(2,), lang_en_first=True) def test_get_gettext_darwin_unfrozen_fallback(self): """test using fallback path from source""" self.patch(translation, '_get_languages', lambda: ['not-en']) self._call_get_gettext('darwin', (2,), TEST_FALLBACK_PATH) self.assertEqual(self._called, [((TEST_DOMAIN, TEST_FALLBACK_PATH), {'languages': ['not-en'], 'fallback': True})]) def test_get_gettext_win32_unfrozen_fallback(self): """test using fallback path from source""" self.patch(translation, '_get_languages', lambda: ['not-en']) self._call_get_gettext('win32', (2,), TEST_FALLBACK_PATH) self.assertEqual(self._called, [((TEST_DOMAIN, TEST_FALLBACK_PATH), {'languages': ['not-en'], 'fallback': True})]) ubuntu-sso-client-13.10/ubuntu_sso/utils/tests/test_common.py0000664000202700020270000002666712151461736025002 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2011-2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Tests for the oauth_headers helper function.""" from __future__ import unicode_literals import logging import sys import os from twisted.internet import defer from twisted.web import resource from ubuntuone.devtools.handlers import MementoHandler from ubuntuone.devtools.testing.txwebserver import HTTPWebServer from ubuntu_sso import utils from ubuntu_sso.tests import TestCase, EMAIL, TOKEN CONSTANTS_MODULE = 'ubuntu_sso.constants' NOT_DEFINED = object() class FakeWebclient(object): """A fake webclient.""" def __init__(self): self.called = [] def request(self, *args, **kwargs): """Save a webclient request.""" self.called.append((args, kwargs)) response = utils.webclient.common.Response(content="response") return response def shutdown(self): """Shutdown this fake webclient.""" class FakedConstantsModule(object): """Fake the 'ubuntuone.controlpanel.constants' module.""" PROJECT_DIR = '/tmp/foo/bar' BIN_DIR = '/tmp/foo/bin' class GetProjectDirTestCase(TestCase): """Test case for get_project_dir when constants module is not defined.""" DIR_NAME = utils.DATA_SUFFIX DIR_CONSTANT = 'PROJECT_DIR' DIR_GETTER = 'get_project_dir' @defer.inlineCallbacks def setUp(self): yield super(GetProjectDirTestCase, self).setUp() self._constants = sys.modules.get(CONSTANTS_MODULE, NOT_DEFINED) sys.modules[CONSTANTS_MODULE] = None # force ImportError self.memento = MementoHandler() self.memento.setLevel(logging.DEBUG) utils.logger.addHandler(self.memento) self.addCleanup(utils.logger.removeHandler, self.memento) self.get_dir = getattr(utils, self.DIR_GETTER) @defer.inlineCallbacks def tearDown(self): if self._constants is not NOT_DEFINED: sys.modules[CONSTANTS_MODULE] = self._constants else: sys.modules.pop(CONSTANTS_MODULE) yield super(GetProjectDirTestCase, self).tearDown() def test_get_dir_relative(self): """The relative path for the data directory is correctly retrieved.""" module = utils.os.path.dirname(utils.__file__) rel_data = utils.os.path.join(module, utils.os.path.pardir, utils.os.path.pardir, self.DIR_NAME) expected_dir = utils.os.path.abspath(rel_data) # ensure expected_path exists at os level self.patch(utils.os.path, 'exists', lambda path: path == expected_dir) result = self.get_dir() self.assertEqual(expected_dir, result) def test_get_dir_none_exists(self): """No data directory exists, return None and log as error.""" self.patch(utils.os.path, 'exists', lambda path: False) sys.modules[CONSTANTS_MODULE] = None self.assertRaises(AssertionError, self.get_dir) msg = 'get_dir: can not build a valid path.' self.assertTrue(self.memento.check_error(msg)) class GetProjectDirWithConstantsTestCase(GetProjectDirTestCase): """Test case for get_dir when constants module is defined.""" @defer.inlineCallbacks def setUp(self): yield super(GetProjectDirWithConstantsTestCase, self).setUp() self.patch(utils.os.path, 'exists', lambda path: False) self._constants = sys.modules.get(CONSTANTS_MODULE, NOT_DEFINED) sys.modules[CONSTANTS_MODULE] = FakedConstantsModule() def test_get_dir(self): """If the constants.py module exists, use PROJECT_DIR from it.""" result = self.get_dir() expected = getattr(sys.modules[CONSTANTS_MODULE], self.DIR_CONSTANT) self.assertEqual(expected, result) class GetBinDirTestCase(GetProjectDirTestCase): """Test case for get_bin_dir when constants module is not defined.""" DIR_NAME = utils.BIN_SUFFIX DIR_CONSTANT = 'BIN_DIR' DIR_GETTER = 'get_bin_dir' class GetBinDirWithConstantsTestCase(GetProjectDirWithConstantsTestCase): """Test case for get_bin_dir when constants module is defined.""" DIR_NAME = utils.BIN_SUFFIX DIR_CONSTANT = 'BIN_DIR' DIR_GETTER = 'get_bin_dir' class GetDataFileTestCase(TestCase): """Test cases for get_data_file.""" def test_get_data_file(self): """The path for a data file is correctly retrieved.""" dummy_dir = '/yadda/yadda' dummy_file = 'test.png' self.patch(utils, 'get_project_dir', lambda: dummy_dir) result = utils.get_data_file(dummy_file) expected = utils.os.path.join(dummy_dir, dummy_file) self.assertEqual(expected, result) class GetCertDirTestCase(TestCase): """Test determining the cert location.""" @defer.inlineCallbacks def setUp(self): yield super(GetCertDirTestCase, self).setUp() def test_win(self): """Test geting a path when Common AppData is defined.""" self.patch(utils, "__file__", os.path.join("path", "to", "ubuntu_sso", "utils", "__init__.py")) self.patch(sys, "platform", "win32") path = utils.get_cert_dir() self.assertEqual(path, os.path.join("path", "to", "data")) def test_darwin_frozen(self): """Test that we get a path with .app in it on frozen darwin.""" self.patch(sys, "platform", "darwin") sys.frozen = "macosx-app" self.addCleanup(delattr, sys, "frozen") self.patch(utils, "__file__", os.path.join("path", "to", "Main.app", "ignore")) path = utils.get_cert_dir() self.assertEqual(path, os.path.join("path", "to", "Main.app", "Contents", "Resources")) def test_darwin_unfrozen(self): """Test that we get a source-relative path on unfrozen darwin.""" self.patch(sys, "platform", "darwin") self.patch(utils, "__file__", os.path.join("path", "to", "ubuntuone", "utils", "__init__.py")) path = utils.get_cert_dir() self.assertEqual(path, os.path.join("path", "to", "data")) def test_linux(self): """Test that linux gets the right path.""" self.patch(sys, "platform", "linux2") path = utils.get_cert_dir() self.assertEqual(path, "/etc/ssl/certs") class RootResource(resource.Resource): """A root resource that logs the number of calls.""" isLeaf = True def __init__(self, *args, **kwargs): """Initialize this fake instance.""" resource.Resource.__init__(self, *args, **kwargs) self.count = 0 self.request_headers = [] # pylint: disable=C0103 def render_HEAD(self, request): """Increase the counter on each render.""" self.count += 1 self.request_headers.append(request.requestHeaders) return "" class MockWebServer(HTTPWebServer): """A mock webserver for testing.""" def __init__(self): """Start up this instance.""" # pylint: disable=E1101 root = RootResource() super(MockWebServer, self).__init__(root) class FakedError(Exception): """A mock, test, sample, and fake exception.""" class PingUrlTestCase(TestCase): """Test suite for the URL pinging.""" @defer.inlineCallbacks def setUp(self): yield super(PingUrlTestCase, self).setUp() self.url = 'http://example.com/' self.wc = FakeWebclient() self.patch(utils.webclient, "webclient_factory", lambda *args: self.wc) @defer.inlineCallbacks def test_ping_url(self): """The url is opened.""" yield utils.ping_url(url=self.url, email=EMAIL, credentials=TOKEN) args, _kwargs = self.wc.called[0] self.assertEqual(args[0], self.url + EMAIL) @defer.inlineCallbacks def test_ping_url_result(self): """The result is returned.""" result = yield utils.ping_url(url=self.url, email=EMAIL, credentials=TOKEN) self.assertEqual(result.content, 'response') @defer.inlineCallbacks def test_request_is_signed_with_credentials(self): """The http request to url is signed with the credentials.""" yield utils.ping_url(url=self.url, email=EMAIL, credentials=TOKEN) _args, kwargs = self.wc.called[0] self.assertEqual(kwargs["oauth_credentials"], TOKEN) @defer.inlineCallbacks def test_ping_url_formatting(self): """The email is added as the first formatting argument.""" self.url = 'http://example.com/{email}/something/else' yield utils.ping_url(url=self.url, email=EMAIL, credentials=TOKEN) expected = self.url.format(email=EMAIL) assert len(self.wc.called) > 0 args, _kwargs = self.wc.called[0] self.assertEqual(expected, args[0]) @defer.inlineCallbacks def test_ping_url_formatting_with_query_params(self): """The email is added as the first formatting argument.""" self.url = 'http://example.com/{email}?something=else' yield utils.ping_url(url=self.url, email=EMAIL, credentials=TOKEN) expected = self.url.format(email=EMAIL) assert len(self.wc.called) > 0 args, _kwargs = self.wc.called[0] self.assertEqual(expected, args[0]) @defer.inlineCallbacks def test_ping_url_formatting_no_email_kwarg(self): """The email is added as the first formatting argument.""" self.url = 'http://example.com/{0}/yadda/?something=else' yield utils.ping_url(url=self.url, email=EMAIL, credentials=TOKEN) expected = self.url.format(EMAIL) assert len(self.wc.called) > 0 args, _kwargs = self.wc.called[0] self.assertEqual(expected, args[0]) @defer.inlineCallbacks def test_ping_url_formatting_no_format(self): """The email is appended if formatting could not be accomplished.""" self.url = 'http://example.com/yadda/' yield utils.ping_url(url=self.url, email=EMAIL, credentials=TOKEN) expected = self.url + EMAIL assert len(self.wc.called) > 0 args, _kwargs = self.wc.called[0] self.assertEqual(expected, args[0]) ubuntu-sso-client-13.10/ubuntu_sso/utils/tests/test_qtwisted.py0000664000202700020270000000562112151461656025342 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Tests for the platform specific functions (for Windows).""" import thread from twisted.internet import defer from twisted.trial.unittest import TestCase from ubuntu_sso.utils.qtwisted import qtDeferToThread class FakeException(Exception): """A Fake exception.""" class QtDeferToThreadTestCase(TestCase): """A Qt-based implementation of deferToThread.""" @defer.inlineCallbacks def test_executes_function_returns_result(self): """The passed function is executed and returns the result.""" def fake_operation(first, second="world!"): """Testing positional and keyword arguments.""" return first + " " + second result = yield qtDeferToThread(fake_operation, "hola", second="mundo!") self.assertEqual(result, "hola mundo!") @defer.inlineCallbacks def test_exceptions_become_failures(self): """Any exception while running the function becomes a failure.""" def fake_raise(): """Throw the fake exception.""" raise FakeException yield self.assertFailure(qtDeferToThread(fake_raise), FakeException) @defer.inlineCallbacks def test_function_runs_in_new_thread(self): """The concerned function is run in a different thread.""" def inner_function(): """This should be run in a different thread.""" return thread.get_ident() other_thread_id = yield qtDeferToThread(inner_function) this_thread_id = thread.get_ident() self.assertNotEqual(this_thread_id, other_thread_id) ubuntu-sso-client-13.10/ubuntu_sso/utils/txsecrets.py0000664000202700020270000003625612151461656023331 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # Author: Alejandro J. Cura # # Copyright 2010-2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """ Provides a twisted interface to access the system keyring via DBus. Implements the Secrets Service API Draft: * http://code.confuego.org/secrets-xdg-specs/ """ import dbus from twisted.internet.defer import Deferred BUS_NAME = "org.freedesktop.secrets" SERVICE_IFACE = "org.freedesktop.Secret.Service" PROMPT_IFACE = "org.freedesktop.Secret.Prompt" SESSION_IFACE = "org.freedesktop.Secret.Session" COLLECTION_IFACE = "org.freedesktop.Secret.Collection" ITEM_IFACE = "org.freedesktop.Secret.Item" PROPERTIES_IFACE = "org.freedesktop.DBus.Properties" SECRETS_SERVICE = "/org/freedesktop/secrets" DEFAULT_COLLECTION = "/org/freedesktop/secrets/aliases/default" SESSION_COLLECTION = "/org/freedesktop/secrets/collection/session" SECRET_CONTENT_TYPE = "application/octet-stream" ALGORITHM = "plain" ALGORITHM_PARAMS = "" CLXN_LABEL_PROPERTY = "org.freedesktop.Secret.Collection.Label" CLXN_LABEL_PROPERTY_OLD = "Label" ITEM_LABEL_PROPERTY = "org.freedesktop.Secret.Item.Label" ITEM_LABEL_PROPERTY_OLD = "Label" ITEM_ATTRIBUTES_PROPERTY = "org.freedesktop.Secret.Item.Attributes" ITEM_ATTRIBUTES_PROPERTY_OLD = "Attributes" COLLECTIONS_PROPERTY = "org.freedesktop.Secret.Service.Collections" COLLECTIONS_PROPERTY_OLD = "Collections" DEFAULT_LABEL = "default" class UserCancelled(Exception): """The user cancelled a prompt.""" def no_op(*args): """Do nothing.""" class SecretService(object): """The Secret Service manages all the sessions and collections.""" service = None properties = None session = None bus = None window_id = None def open_session(self, window_id=0): """Open a unique session for the caller application.""" d = Deferred() try: self.window_id = str(window_id) self.bus = dbus.SessionBus() service_object = self.bus.get_object(BUS_NAME, SECRETS_SERVICE) self.service = dbus.Interface(service_object, dbus_interface=SERVICE_IFACE) self.properties = dbus.Interface(service_object, dbus_interface=PROPERTIES_IFACE) def session_opened(result, session): """The session was successfully opened.""" self.session = self.bus.get_object(BUS_NAME, session) d.callback(self) parameters = dbus.String(ALGORITHM_PARAMS, variant_level=1) self.service.OpenSession(ALGORITHM, parameters, reply_handler=session_opened, error_handler=d.errback) except dbus.exceptions.DBusException as e: d.errback(e) return d def do_prompt(self, prompt_path): """Show a prompt given its path.""" d = Deferred() prompt_object = self.bus.get_object(BUS_NAME, prompt_path) prompt = dbus.Interface(prompt_object, dbus_interface=PROMPT_IFACE) def prompt_completed(dismissed, result): """The prompt was either completed or dismissed.""" sigcompleted.remove() if dismissed: d.errback(UserCancelled()) else: d.callback(result) sigcompleted = prompt.connect_to_signal("Completed", prompt_completed) prompt.Prompt(self.window_id, reply_handler=no_op, error_handler=d.errback) return d def make_item_list(self, object_path_list): """Make a list of items given their paths.""" return [Item(self, o) for o in object_path_list] def search_items(self, attributes): """Find items in any collection.""" d = Deferred() result = [] def prompt_handle(unlocked): """Merge the items that were just unlocked.""" result.extend(unlocked) return result def unlock_handler(unlocked, prompt): """The items were unlocked, or a prompt should be shown first.""" result.extend(unlocked) if prompt != "/": d2 = self.do_prompt(prompt) d2.addCallback(prompt_handle) d2.chainDeferred(d) else: d.callback(result) def items_found(unlocked, locked): """Called with two lists of found items.""" result.extend(unlocked) if len(locked) > 0: self.service.Unlock(locked, reply_handler=unlock_handler, error_handler=d.errback) else: d.callback(result) self.service.SearchItems(attributes, reply_handler=items_found, error_handler=d.errback) d.addCallback(self.make_item_list) return d def create_collection(self, label, alias=''): """Create a new collection with the specified properties.""" d = Deferred() def createcollection_handler(collection, prompt): """A collection was created, or a prompt should be shown first.""" if prompt != "/": self.do_prompt(prompt).chainDeferred(d) else: d.callback(collection) def error_fallback(error): """Fall back to using the old property name.""" properties = {CLXN_LABEL_PROPERTY_OLD: dbus.String( label, variant_level=1)} self.service.CreateCollection( properties, reply_handler=createcollection_handler, error_handler=d.errback) properties = {CLXN_LABEL_PROPERTY: dbus.String(label, variant_level=1)} try: self.service.CreateCollection( properties, alias, reply_handler=createcollection_handler, error_handler=error_fallback) except TypeError: error_fallback(None) d.addCallback(lambda p: Collection(self, p)) return d def get_collections(self): """Return the list of all collections.""" d = Deferred() def propertyget_handler(collection_paths): """The list of collection paths was retrieved.""" result = [] for path in collection_paths: collection = Collection(self, path) result.append(collection) d.callback(result) def error_fallback(error): """Fall back to the old property name.""" self.properties.Get(SERVICE_IFACE, COLLECTIONS_PROPERTY_OLD, reply_handler=propertyget_handler, error_handler=d.errback) self.properties.Get(SERVICE_IFACE, COLLECTIONS_PROPERTY, reply_handler=propertyget_handler, error_handler=error_fallback) return d def get_default_collection(self): """The collection where default items should be created.""" d = Deferred() def prompt_handle(unlocked): """Handle showing a prompt.""" collection_path = unlocked[0] return Collection(self, collection_path) def unlock_handler(unlocked, prompt): """The objects were unlocked.""" if prompt != "/": d2 = self.do_prompt(prompt) d2.addCallback(prompt_handle) d2.chainDeferred(d) else: d.callback(prompt_handle(unlocked)) def set_default_alias(collection): """Set the newly created collection as the default one.""" d4 = Deferred() alias_set = lambda: d4.callback(collection) object_path = dbus.ObjectPath(collection.object_path) self.service.SetAlias(DEFAULT_LABEL, object_path, reply_handler=alias_set, error_handler=d4.errback) return d4 def readalias_handler(collection_path): """ReadAlias returned.""" if collection_path != "/": # The collection was found, make sure it's unlocked objects = dbus.Array([collection_path], signature="o") self.service.Unlock(objects, reply_handler=unlock_handler, error_handler=d.errback) else: # The collection was not found, so create it d3 = self.create_collection(DEFAULT_LABEL) d3.addCallback(set_default_alias) d3.chainDeferred(d) def default_collection_not_found(e): """Try the default alias.""" self.service.ReadAlias(DEFAULT_LABEL, reply_handler=readalias_handler, error_handler=d.errback) def found_default_collection(label): """Make sure the default collection is unlocked.""" objects = dbus.Array([DEFAULT_COLLECTION], signature="o") self.service.Unlock(objects, reply_handler=unlock_handler, error_handler=d.errback) collection = Collection(self, DEFAULT_COLLECTION) d0 = collection.get_label() d0.addCallback(found_default_collection) d0.addErrback(default_collection_not_found) return d class Collection(object): """A collection of items containing secrets.""" def __init__(self, service, object_path): """Initialize a new collection.""" self.service = service self.object_path = object_path collection_object = service.bus.get_object(BUS_NAME, object_path, introspect=False) self.collection_iface = dbus.Interface(collection_object, dbus_interface=COLLECTION_IFACE) self.properties = dbus.Interface(collection_object, dbus_interface=PROPERTIES_IFACE) def get_label(self): """Return the label for this collection from the keyring.""" d = Deferred() def error_fallback(error): """Fall back to the old property name.""" self.properties.Get(COLLECTION_IFACE, CLXN_LABEL_PROPERTY_OLD, reply_handler=d.callback, error_handler=d.errback) self.properties.Get(COLLECTION_IFACE, CLXN_LABEL_PROPERTY, reply_handler=d.callback, error_handler=error_fallback) return d def create_item(self, label, attr, value, replace=True): """Create an item with the given attributes, secret and label. If replace is set, then it replaces an item already present with the same values for the attributes. """ d = Deferred() def createitem_handler(item, prompt): """An item was created, or a prompt should be shown first.""" if prompt != "/": self.service.do_prompt(prompt).chainDeferred(d) else: d.callback(item) properties = dbus.Dictionary(signature="sv") properties[ITEM_LABEL_PROPERTY] = label attributes = dbus.Dictionary(attr, signature="ss") properties[ITEM_ATTRIBUTES_PROPERTY] = attributes parameters = dbus.ByteArray(ALGORITHM_PARAMS) value_bytes = dbus.ByteArray(value) secret = (self.service.session, parameters, value_bytes, SECRET_CONTENT_TYPE) def error_fallback(error): """A fallback for using old property names and signature.""" oldprops = dbus.Dictionary(signature="sv") oldprops[ITEM_LABEL_PROPERTY_OLD] = label oldprops[ITEM_ATTRIBUTES_PROPERTY_OLD] = attributes secret = (self.service.session, parameters, value_bytes) self.collection_iface.CreateItem(oldprops, secret, replace, reply_handler=createitem_handler, error_handler=d.errback) self.collection_iface.CreateItem(properties, secret, replace, reply_handler=createitem_handler, error_handler=error_fallback) return d class Item(object): """An item contains a secret, lookup attributes and has a label.""" def __init__(self, service, object_path): """Initialize this new Item.""" self.service = service self.object_path = object_path item_object = service.bus.get_object(BUS_NAME, object_path) self.item_iface = dbus.Interface(item_object, dbus_interface=ITEM_IFACE) def get_value(self): """Retrieve the secret for this item.""" d = Deferred() def getsecret_handler(secret): """The secret for this item was found.""" # pylint: disable=W0612 value = secret[2] d.callback(value) self.item_iface.GetSecret(self.service.session, byte_arrays=True, reply_handler=getsecret_handler, error_handler=d.errback) return d def delete(self): """Delete this item.""" d = Deferred() def delete_handler(prompt): """The item was deleted, or a prompt should be shown first.""" if prompt != "/": self.service.do_prompt(prompt).chainDeferred(d) else: d.callback(True) self.item_iface.Delete(reply_handler=delete_handler, error_handler=d.errback) return d ubuntu-sso-client-13.10/ubuntu_sso/credentials.py0000664000202700020270000002417012151461656022432 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2010-2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Credential management utilities. 'Credentials' provides the following fault-tolerant methods: * find_credentials * clear_credentials * store_credentials * register * login All the methods return a Deferred that will be fired when the operation was completed. For details, please read the Credentials class documentation. """ from functools import wraps from twisted.internet import defer from ubuntu_sso import ( UI_EXECUTABLE_QT, USER_CANCELLATION, USER_SUCCESS, ) from ubuntu_sso.keyring import Keyring from ubuntu_sso.logger import setup_logging from ubuntu_sso.utils import compat, get_bin_cmd, runner logger = setup_logging('ubuntu_sso.credentials') APP_NAME_KEY = 'app_name' TC_URL_KEY = 'tc_url' HELP_TEXT_KEY = 'help_text' WINDOW_ID_KEY = 'window_id' PING_URL_KEY = 'ping_url' POLICY_URL_KEY = 'policy_url' UI_EXECUTABLE_KEY = 'ui_executable' class CredentialsError(Exception): """Generic credentials error.""" class UserCancellationError(CredentialsError): """The user cancelled the process of authentication.""" class UserNotValidatedError(CredentialsError): """The user is not validated.""" class GUINotAvailableError(CredentialsError): """No user graphical interface is available.""" def handle_failures(msg): """Handle failures using 'msg' as error message.""" def middle(f): """Decorate 'f' to catch all errors.""" @wraps(f) @defer.inlineCallbacks def inner(self, *a, **kw): """Call 'f' within a try-except block. If any exception occurs, the exception is logged and re-raised. """ result = None try: result = yield f(self, *a, **kw) except: logger.exception('%s (app_name: %s): %s.', f.__name__, self.app_name, msg) raise defer.returnValue(result) return inner return middle class Credentials(object): """Credentials management gateway.""" def __init__(self, app_name, tc_url=None, help_text='', window_id=0, ping_url=None, policy_url=None, ui_executable=UI_EXECUTABLE_QT): """Return a Credentials management object. 'app_name' is the application name to be displayed in the GUI. 'tc_url' is the url pointing to Terms & Conditions. If None, no TOS agreement will be displayed. 'help_text' is an explanatory text for the end-users, will be shown below the headers. 'window_id' is the id of the window which will be set as a parent of the GUI. If 0, no parent will be set. 'ping_url' is the url that will be pinged when a user registers/logins successfully. The user email will be attached to 'ping_url'. 'policy_url' is the url pointing to the privacy policy. If None, no privacy policy agreement will be displayed. When the credentials are retrieved successfully, a dictionary like the one below is returned: {'token': , 'token_secret': , 'consumer_key': , 'consumer_secret': , 'name': } """ self.app_name = app_name self.help_text = help_text self.window_id = window_id self.ping_url = ping_url self.tc_url = tc_url self.policy_url = policy_url self.ui_executable = ui_executable @defer.inlineCallbacks def _show_ui(self, login_only): """Show the UI and wait for it to finish. Upon analyzing returning code from the UI process, emit proper signals to the caller. The caller can specify a preference for the UI, but if the preferred one is not available, the service will try to open any available UI. If no GUI is available, GUINotAvailableError will be raised. """ guis = (self.ui_executable, UI_EXECUTABLE_QT) for gui_exe_name in guis: try: args = get_bin_cmd(gui_exe_name) except OSError: logger.error('The given UI %r does not exist.', gui_exe_name) else: break else: raise GUINotAvailableError('Can not find a GUI to present to the ' 'user (tried with %r). Aborting.' % repr(guis)) for arg in ('app_name', 'help_text', 'ping_url', 'policy_url', 'tc_url', 'window_id'): value = getattr(self, arg) if value: args.append('--%s' % arg) if not isinstance(value, compat.basestring): value = compat.text_type(value) args.append(value) if login_only: args.append('--login_only') return_code = yield runner.spawn_program(args) logger.info('_show_ui: received from the ui return code %r.', return_code) credentials = None if return_code == USER_SUCCESS: credentials = yield self.find_credentials() elif return_code == USER_CANCELLATION: raise UserCancellationError() else: raise CredentialsError(return_code) defer.returnValue(credentials) def _do_login(self, email, password): """Login using email/password, connect outcome signals.""" from ubuntu_sso.main import SSOLogin d = defer.Deferred() class DummyProxy(object): """A temporary proxy to handle non-traditional login.""" # pylint: disable=C0103 def LoggedIn(self, app_name, result): """User was logged in.""" d.callback(result) def LoginError(self, app_name, error): """There was an error on login.""" error = CredentialsError(error['errtype']) d.errback(error) def UserNotValidated(self, app_name, email): """User is not validated.""" d.errback(UserNotValidatedError(email)) # pylint: enable=C0103 inner = SSOLogin(proxy=DummyProxy()) inner.login(app_name=self.app_name, email=email, password=password, ping_url=self.ping_url) d.addCallback(lambda _: self.find_credentials()) return d @defer.inlineCallbacks def _login_or_register(self, login_only, email=None, password=None): """Get credentials if found else prompt the GUI. Will return either the credentials, or will raise UserCancellationError if the user aborted the operation when the UI was opened. """ logger.info("_login_or_register: login_only=%r email=%r.", login_only, email) token = yield self.find_credentials() if not token: if email and password: token = yield self._do_login(email, password) else: token = yield self._show_ui(login_only) defer.returnValue(token) @handle_failures(msg='Problem while getting credentials from the keyring') @defer.inlineCallbacks def find_credentials(self): """Get the credentials for 'self.app_name'. Return {} if not there.""" creds = yield Keyring().get_credentials(self.app_name) logger.info('find_credentials: self.app_name %r, ' 'result is {}? %s', self.app_name, creds is None) defer.returnValue(creds if creds is not None else {}) @handle_failures(msg='Problem while clearing credentials in the keyring') def clear_credentials(self): """Clear the credentials for 'self.app_name'.""" return Keyring().delete_credentials(self.app_name) @handle_failures(msg='Problem while storing credentials in the keyring') def store_credentials(self, token): """Store the credentials for 'self.app_name'.""" return Keyring().set_credentials(self.app_name, token) @handle_failures(msg='Problem while performing register') def register(self): """Get credentials if found else prompt the GUI to register.""" return self._login_or_register(login_only=False) @handle_failures(msg='Problem while performing login') def login(self, email=None, password=None): """Get credentials if found else prompt the GUI to login. if 'email' and 'password' are given, do not prompt the user and use that to retrieve a token. """ if email is None or password is None: return self._login_or_register(login_only=True) else: return self._login_or_register(login_only=True, email=email, password=password) ubuntu-sso-client-13.10/ubuntu_sso/constants.py.in0000664000202700020270000000461512165077706022564 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Some generated constants. DO NO EDIT! This is a generated file. It will be built at installation time. """ import os import platform import urllib from ubuntu_sso import SSO_UONE_BASE_URL VERSION = '@VERSION@' PROJECT_NAME = '@PROJECT_NAME@' PROJECT_DIR = os.path.join('@prefix@', 'share', PROJECT_NAME) BIN_DIR = os.path.join('@prefix@', 'lib', PROJECT_NAME) # Ubuntu One sso constants APP_NAME = u"Ubuntu One" TC_URL = u"%s/terms/" % SSO_UONE_BASE_URL POLICY_URL = u"%s/privacy/" % SSO_UONE_BASE_URL BASE_PING_URL = \ u"%s/oauth/sso-finished-so-get-tokens/{email}" % SSO_UONE_BASE_URL def platform_data(): result = {'platform': platform.system(), 'platform_version': platform.release(), 'platform_arch': platform.machine(), 'client_version': VERSION} # urlencode will not encode unicode, only bytes result = urllib.urlencode(result) return result # the result of platform_data is given by urlencode, encoded with ascii PING_URL = BASE_PING_URL + u"?" + platform_data().decode('ascii') ubuntu-sso-client-13.10/ubuntu_sso/tests/0000755000202700020270000000000012225013301020675 5ustar dobeydobey00000000000000ubuntu-sso-client-13.10/ubuntu_sso/tests/files/0000755000202700020270000000000012225013301021777 5ustar dobeydobey00000000000000ubuntu-sso-client-13.10/ubuntu_sso/tests/files/captcha.png0000664000202700020270000000700612151461656024137 0ustar dobeydobey00000000000000ÿØÿàJFIFÿÛC    ' .)10.)-,3:J>36F7,-@WAFLNRSR2>ZaZP`JQROÿÀ 9,ÿÄÿÄ9!1AQ"aq‘#2¡±B¢Á$²%3b‚’ÂðÿÚ?éÔ¥*&í©lÖpDùí6àòÁܯ°Éªìþ¡n1íñ-N¼üÙiKp!*RFG=þdº.é“.˜} ¤©ÆÃe`z/²|ûþÕtÖ7[)”þžqÈ+HZd±!.#i¹H wž Î ïXu6´r6˜…u³!*ö¥ã. ìÇpGÜVÆ…ÕïêD<ÔØ©iö¹ÞÒHmCêO5o¥)JR”¥+Rç0[à9)IÜÆG×LP·ñTqß ÁýÇù¯Cª¶Ppä)ÿö%ÿa[qz‘b“· ÖN0èHÇÙF­‘d³2:$Fp8ÒÆR¡çYkî¶Ê Þq  wRŽyjTwˆ ¾Ó„öÚ°sY¤¤eJ|M}A åúÏWßlú‘Ö¡ïj2. ¨úƒVÝ©¨­>#¥[\<„ŒèjÇJR”¥+kÍxa)v»#¤IIï¤Ë9ý#>|~üW.2ä*w¶­Â¹'ŠV®IVs“õ©í[ª?¼Å¸ÆiÈæ;i P8P$äW_Ó—vu6Dµ4”øÁM¼Ös´ö#ê0~µZÑ—wã]ßÑ—6ÚR"%hedrêAÎìAIÈã°¯W¹P¬wqc›iCö{˜ a  Óœ$¤L€xÆ7V}+?I[î/Áµ:ìY/+bØ|¨{ÉÏð~3WE)(R€¹5ôFAÍ)JR”¥+ ¸ÍÌŠäw†[p`ŠäZïE 2 Â Š£…$÷I­]£ÚÔISïÉØÓjÚ¤ïSQh‡í÷Hð­jTÇ$d„ d¤gúXì÷ÛÅŠ+:n5£Û®  ©jmÜ¡ç /~*"ÿu×0í¨—uœ¸IyÏ ¶[HBÏ')™ÍnôÑ–®’æÍ½HDçl"B¼RžTBÁà`çÌÖÍæÓYjÊÓW˜­{5bé ›U’ZBRC¸*Ç$Åt R”¨ûõÄÚ,’® l8c£~Âq»žÙª…›©¬\® CrØãKya¥À ?aRú²mæTy6½7 nÉÀKχP€ÐPòÉwñ\¢÷¥o¶ˆ¦}Ö8B¼)EÔ¬•3‚j_FhA¨àò'ö!QÆ9Éàw©—tvžgGݤÇ}RäE.bG)Ú¤G¡ø‘Þ¶:6ë†ßsdçÃC¨R~dÚ+_Rÿ¥êý©Øü-ß~>$ ÿmHutxv{t¦ÔPûRÿ-I8)ÊIÈ?4Š×–â-¶-DØ •%¶Äƒ“¹nl IÇÑY?*’ÖˆÕ“ÛbxjT7€H,{ÛÆëÒsçP×[. ÒhÓÑxqµ){VÂ8IòÀì|ê×m×XÑiº¿rd°°ËéAÇ8ýDã€qQк¨^[ÉrÒµ(ZKKÉW=™çáR0:j~RX›øyýK_)OÏþÕšåÔ« 7ˆêvfSÍ'ð9ÅHi}aQ©ÆÙBÙy„+ÌzÕŽ”¥*“ÕInFÓˆm) Cî«>\g5I³µ'LZ—u™=ÈŽ¼ qä“Ü‚Žù)=±Æjë£îIsÐÍvEÒW¾W5?œ8å[B}xOþ/'KkÉîGZ’϶)/%)­¯%#=‰eêÛ~ÙÕpŒ’¶“â%jO!9ÚFO—U4ô§¬¶KÚ<ß燲2€Ê*ÊTO©?âµ]ÓyÅt˜ëÈxŒ¼Ù°RHÆìùÖßS0æÁ²G‘(Ƈ´lq^êˆÈJ°8'g¼À»5|Ñsm—=ŽL‚+ŠÆâ‘Üz’íSw›“9ïµâº})JVµÂ7D„­§S‚2>Õùö~5ð*ÞKŽFRÜIÈNR€TOؾô•Ùrîw‰²‰â„PåKÉ=ûzçé[a!Ø6÷›Cªe¥/ÄÚÙ)Nv€T¯.x¹5õë“Ú#§VöÚÕÒG¼”8œIÜ¢GÀ+^ìµZzAµϸ”•+Ì— pÿhÅLô¦²é?i#Þ–ò—ŸúGº?p~õ mÿŽõ†TƒËP7`y{€ qÍaëâäû}±;^PeGý§ïXµØUÖǦŸЀ©GÉJÚ•àýU_.ÆïªfǵéÆÜ†y{Êó>B u¶}¢Lh—«“\-o)*$7ÏnMYe«/I[Í¥O\98`3õ«?NìŒ[ôÜi+aÕ ²ŸxØf¨}EŽÔqìðÆ]t!+ {çüÕÒý§íM ) ÛšqÆÙsfVUÆNîãÖ«}aÅ]&¾<44V{‚Oö?jë4¥)\÷Qjˆ—ièÓì0Û¯.JYË£Ý Ýƒš‹ê†ž¸*oâ±Ú ·²Â8W(9Ç ûTn„Ò÷§nöËÂ#%RæòòœO`H#Îx#µEëÔ¥ÖæAÀ®>)üÕ»¦NºØnzYp©yYNã‚ÙÀ8ôÁÇÜzUc]*,+¡±ÚŠÑ†U¸x¤eD“ØóŠÞélKÕšQ–V¥¸ BNFÜŒg'ö5%ÔWÕ6ýADgÖÞÔ–÷…mRI# à‚~ßÙ“j¯´à½!ÖÓ}i•±`¤áJÚ•$’SG|óTæí}>·e\ír›`²ãJ^ܤ$¤döîENtš|x·Ùßp!r[ hêVsŠì4¥)JäÚ-i>¥E¹¡Œê·¹¹' ÊWŒzš¶ë bÞ›f*£FnK’ÁXü͸`‘Žr3ϬI0.ð½¬Kˆð Nä…¥^`à×êMè]µ"ÙoÅKPw1±ÀBˆÁìp*Ñ®â®_N-2ÙRCQÛeÅP¤ŒåV}R­l)íá‘õÜsU~šGy:žüû9³z‘â¥[ÎF}kGWÃTΤ,Ê,FKÍ¡)Ép¤d$Š»ü3ZÚIjï&]Æ*›fVä¾µ«Þ Wr;óYžéÕú%Ý×ìÏ0Ó(Yð§Žý¾Yâ¾Üºkyr'µ€—,$e¥g9óDÔuêß­$Ú"ÛçÛThŸ£bR¢qÀÎ9í]M\f1¢Ñ"å ô;¢ J}åØà÷Ë­·vfkö.·ËBä…ž3´öâº_Rf¡%!À#j3ú†FjŽéN’´”øªw ó€?“WÚR”ª¥ÛBÛe.LÈAQî.:Û¡e;]9!YŽy®M+Qê.bʺNJš_)SŠJÒ¡A=ýx­wo×—™[/]ç¸ÒÒR¤*JÊTpFy¢t´] ¬¶;«iÀúÔæ˜¼ÈÓK“siË}…1¸’PVÙVpGdçêE@­JZÊÖ¢¥(ä’rI¯JuÕ6–ÔâÊúRTp>B¼Vä ÂÜ¥þ6Dbæ7\)ÝŽÙÇ~çï]oHÙ.³íÞ6¯qÉHQ F³‚7(c¾ʾµÓ‹l[ÄkŒ9/6X}/Î8VqWZR”¥Ej ?PÅD{‚VRÚ·!HV5ϵ¾†“ÜÄ«t‰3ZŠŸ ²° ŒðSÏ~|ûTn×#OY¤Ay‡_QQSµŽÄzgš§É}ÉR\úÊÜuEjQ$’Oή—-m V„oO·GŽe¢â¶„å$ãœÿMHÛ:m²Øa[àÛul2”¬©a +ÆTGsʉ5\‡¬oÈ[ñ- Ktµ¼„/zÏéýu!§å[ìûÄ•JºJ8â”NÄù$}jËJR„0FA¨iZNÁ){ݵEÞN⤠$“ô¬:I@Ô˜eç`1ú GŒz`ñZzKG+LO’ëSÔû··ÃR0AƒŸ¿Þ­t¥)JæAÐËû—{+#r\–SÆO}ÀzŸ1õõ®\ RHP ŽàÕÒÏÔm:~=¥»S%F÷VHVTUÛZ®Þï.Þik+L#Ãiˆé)m$œ ÷$óQ•éS‹JIRÔ@JR2Iôk²töùtPT†½¬)RB±êçûWNÓš.ѧÈy†Ôü¼`¾éÉç¾aüóÞ¬T¥)JR” ƒÈ®s©úf™’=¦Âë1Ê¿[.’óöÇÖ¨’ô†¢†…®E©ð„¥)8Pw9Öœ{âS)z-ªsÍ+;VÜu©'=jvÑÓËýÄ6ã¬l©XQÝXäíïüWPÓ:FÙ§Ý4¢0¹xóä<‡Ê¬¥)JR”¥)JR«·ýd¿/Œ˜‘œ—£…+çÁæF~5M“ÒY R[»KIÎòãE$z`sçéZÌt¦ê·TŸ¦ÂˆJ€R”G®<¾õ7 ¥ÆðfÜe>G“iK`ÿ?Í[í ]š:´mÉÞS•Ÿš5'JR”¥)JR”¥)JR”¥)JR”¥)JR”¥)JR”¥ÿÙubuntu-sso-client-13.10/ubuntu_sso/tests/__init__.py0000664000202700020270000001036312151461656023035 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2009-2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Tests for the Ubuntu SSO library.""" from __future__ import unicode_literals import os from collections import defaultdict from functools import wraps from twisted.internet import defer from twisted.trial import unittest from ubuntu_sso.keyring import get_token_name APP_NAME = 'Ubuntu One' CAPTCHA_ID = 'test ñiña' CAPTCHA_PATH = os.path.abspath(os.path.join(os.curdir, 'ubuntu_sso', 'tests', 'files', 'captcha.png')) CAPTCHA_SOLUTION = 'william Byrd ñandú' EMAIL = 'test@example.com' EMAIL_TOKEN = 'B2P☺ gtf' GUI_EXE = 'ubuntu-sso-login-qt' HELP_TEXT = ('☛ Lorem ipsum dolor sit amet, consectetur adipiscing elit. ' 'Nam sed lorem nibh. Suspendisse gravida nulla non nunc suscipit ' 'pulvinar tempus ut augue. Morbi consequat, ligula a elementum ' 'pretium, dolor nulla tempus metus, sed viverra nisi risus non ' 'velit.') NAME = 'Juanito ☀ Pérez' PASSWORD = 'h3lloWorld☑ ' PING_URL = 'http://localhost/ping-me/' POLICY_URL = 'http://localhost/policy/' RESET_PASSWORD_TOKEN = '8G5Wtq' TOKEN = {'consumer_key': 'xQ7xDAz', 'consumer_secret': 'KzCJWCTNbbntwfyCKKjomJDzlgqxLy', 'token_name': 'test', 'token': 'GkInOfSMGwTXAUoVQwLUoPxElEEUdhsLVNTPhxHJDUIeHCPNEo', 'token_secret': 'qFYImEtlczPbsCnYyuwLoPDlPEnvNcIktZphPQklAWrvyfFMV'} TOKEN_NAME = get_token_name(APP_NAME) TC_URL = 'http://localhost/' WINDOW_ID = 5 class TestCase(unittest.TestCase): """Customized test case that keeps tracks of method calls.""" @defer.inlineCallbacks def setUp(self): yield super(TestCase, self).setUp() self._called = False def _set_called(self, *args, **kwargs): """Keep track of a method call.""" self._called = (args, kwargs) class Recorder(object): """A class that records every call clients made to it.""" no_wrap = ['_called'] _next_result = None def __init__(self, *args, **kwargs): self._called = defaultdict(list) def __getattribute__(self, attr_name): """Override so we can record calls to members.""" try: result = super(Recorder, self).__getattribute__(attr_name) except AttributeError: result = lambda *a, **kw: self._next_result super(Recorder, self).__setattr__(attr_name, result) if attr_name in super(Recorder, self).__getattribute__('no_wrap'): return result called = super(Recorder, self).__getattribute__('_called') def wrap_me(f): """Wrap 'f'.""" @wraps(f) def inner(*a, **kw): """Keep track of calls to 'f', execute it and return result.""" called[attr_name].append((a, kw)) return f(*a, **kw) return inner if callable(result): return wrap_me(result) else: return result ubuntu-sso-client-13.10/ubuntu_sso/tests/test_credentials.py0000664000202700020270000004405712151461656024641 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2010-2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Tests for the Credentials module.""" import logging import os from twisted.internet import defer from twisted.trial.unittest import TestCase from ubuntuone.devtools.handlers import MementoHandler import ubuntu_sso.main from ubuntu_sso import credentials from ubuntu_sso.credentials import ( APP_NAME_KEY, HELP_TEXT_KEY, PING_URL_KEY, POLICY_URL_KEY, TC_URL_KEY, UI_EXECUTABLE_KEY, WINDOW_ID_KEY, ) from ubuntu_sso.tests import ( APP_NAME, EMAIL, HELP_TEXT, PASSWORD, PING_URL, POLICY_URL, TC_URL, TOKEN, WINDOW_ID, ) # Access to a protected member of a client class # pylint: disable=W0212 # Attribute defined outside __init__ # pylint: disable=W0201 # Instance of 'class' has no 'x' member (but some types could not be inferred) # pylint: disable=E1103 KWARGS = { APP_NAME_KEY: APP_NAME, HELP_TEXT_KEY: HELP_TEXT, WINDOW_ID_KEY: WINDOW_ID, PING_URL_KEY: PING_URL, POLICY_URL_KEY: POLICY_URL, TC_URL_KEY: TC_URL, UI_EXECUTABLE_KEY: 'foo-bar-baz', } UI_KWARGS = { APP_NAME_KEY: APP_NAME, HELP_TEXT_KEY: HELP_TEXT, PING_URL_KEY: PING_URL, POLICY_URL_KEY: POLICY_URL, TC_URL_KEY: TC_URL, WINDOW_ID_KEY: WINDOW_ID, } class SampleMiscException(Exception): """An error to be used while testing.""" class FakedSSOLogin(object): """Fake a SSOLogin.""" proxy = None def __init__(self, proxy): """Nothing.""" FakedSSOLogin.proxy = proxy def login(self, *args, **kwargs): """Fake login.""" class BasicTestCase(TestCase): """Test case with a helper tracker.""" bin_dir = 'some/bin/dir' @defer.inlineCallbacks def setUp(self): """Init.""" yield super(BasicTestCase, self).setUp() self._called = False # helper self.memento = MementoHandler() self.memento.setLevel(logging.DEBUG) credentials.logger.addHandler(self.memento) self.addCleanup(credentials.logger.removeHandler, self.memento) self.patch(credentials, 'get_bin_cmd', lambda x: [os.path.join(self.bin_dir, KWARGS[UI_EXECUTABLE_KEY])]) def _set_called(self, *args, **kwargs): """Set _called to True.""" self._called = (args, kwargs) class CredentialsTestCase(BasicTestCase): """Test suite for the Credentials class.""" timeout = 5 @defer.inlineCallbacks def setUp(self): """Init.""" yield super(CredentialsTestCase, self).setUp() self.obj = credentials.Credentials(**KWARGS) class CredentialsCallbacksTestCase(CredentialsTestCase): """Test suite for the Credentials callbacks.""" def test_creation_parameters_are_stored(self): """Creation parameters are stored.""" for key, value in KWARGS.items(): self.assertEqual(getattr(self.obj, key), value) def test_tc_url_defaults_to_none(self): """The T&C url defaults to None.""" newkw = KWARGS.copy() newkw.pop(TC_URL_KEY) self.obj = credentials.Credentials(**newkw) self.assertEqual(getattr(self.obj, TC_URL_KEY), None) def test_help_text_defaults_to_empty_string(self): """The T&C url defaults to the emtpy string.""" newkw = KWARGS.copy() newkw.pop(HELP_TEXT_KEY) self.obj = credentials.Credentials(**newkw) self.assertEqual(getattr(self.obj, HELP_TEXT_KEY), '') def test_window_id_defaults_to_zero(self): """The T&C url defaults to 0.""" newkw = KWARGS.copy() newkw.pop(WINDOW_ID_KEY) self.obj = credentials.Credentials(**newkw) self.assertEqual(getattr(self.obj, WINDOW_ID_KEY), 0) def test_ping_url_defaults_to_none(self): """The ping url defaults to None.""" newkw = KWARGS.copy() newkw.pop(PING_URL_KEY) self.obj = credentials.Credentials(**newkw) self.assertEqual(getattr(self.obj, PING_URL_KEY), None) def test_policy_url_defaults_to_none(self): """The policy url defaults to None.""" newkw = KWARGS.copy() newkw.pop(POLICY_URL_KEY) self.obj = credentials.Credentials(**newkw) self.assertEqual(getattr(self.obj, POLICY_URL_KEY), None) def test_ui_executable_default(self): """The ui class defaults to Qt.""" newkw = KWARGS.copy() newkw.pop(UI_EXECUTABLE_KEY) self.obj = credentials.Credentials(**newkw) self.assertEqual(getattr(self.obj, UI_EXECUTABLE_KEY), credentials.UI_EXECUTABLE_QT) class FindCredentialsTestCase(CredentialsTestCase): """Test suite for the find_credentials method.""" @defer.inlineCallbacks def test_find_credentials(self): """A deferred with credentials is returned when found.""" self.patch(credentials.Keyring, 'get_credentials', lambda kr, app: defer.succeed(TOKEN)) token = yield self.obj.find_credentials() self.assertEqual(token, TOKEN) @defer.inlineCallbacks def test_credentials_not_found(self): """find_credentials returns {} when no credentials are found.""" self.patch(credentials.Keyring, 'get_credentials', lambda kr, app: defer.succeed(None)) token = yield self.obj.find_credentials() self.assertEqual(token, {}) @defer.inlineCallbacks def test_keyring_failure(self): """Failures from the keyring are handled.""" expected_error = SampleMiscException() self.patch(credentials.Keyring, 'get_credentials', lambda kr, app: defer.fail(expected_error)) yield self.assertFailure(self.obj.find_credentials(), SampleMiscException) class ClearCredentialsTestCase(CredentialsTestCase): """Test suite for the clear_credentials method.""" @defer.inlineCallbacks def test_clear_credentials(self): """The credentials are cleared.""" self.patch(credentials.Keyring, 'delete_credentials', lambda kr, app: defer.succeed(self._set_called(app))) yield self.obj.clear_credentials() self.assertEqual(self._called, ((APP_NAME,), {})) @defer.inlineCallbacks def test_keyring_failure(self): """Failures from the keyring are handled.""" expected_error = SampleMiscException() self.patch(credentials.Keyring, 'delete_credentials', lambda kr, app: defer.fail(expected_error)) yield self.assertFailure(self.obj.clear_credentials(), SampleMiscException) class StoreCredentialsTestCase(CredentialsTestCase): """Test suite for the store_credentials method.""" @defer.inlineCallbacks def test_store_credentials(self): """The credentials are stored.""" self.patch(credentials.Keyring, 'set_credentials', lambda kr, *a: defer.succeed(self._set_called(*a))) yield self.obj.store_credentials(TOKEN) self.assertEqual(self._called, ((APP_NAME, TOKEN,), {})) @defer.inlineCallbacks def test_keyring_failure(self): """Failures from the keyring are handled.""" expected_error = SampleMiscException() self.patch(credentials.Keyring, 'set_credentials', lambda kr, app, token: defer.fail(expected_error)) yield self.assertFailure(self.obj.store_credentials(TOKEN), SampleMiscException) class RegisterTestCase(CredentialsTestCase): """Test suite for the register method.""" operation = 'register' login_only = False kwargs = {} @defer.inlineCallbacks def setUp(self): yield super(RegisterTestCase, self).setUp() self.deferred = defer.Deferred() self.patch_inner(self.fake_inner) self.exe_path = os.path.join(self.bin_dir, KWARGS[UI_EXECUTABLE_KEY]) self.inner_args = [ self.exe_path, '--app_name', APP_NAME, '--help_text', HELP_TEXT, '--ping_url', PING_URL, '--policy_url', POLICY_URL, '--tc_url', TC_URL, '--window_id', str(WINDOW_ID), ] if self.login_only: self.inner_args.append('--login_only') self._next_inner_result = 0 self.method_call = getattr(self.obj, self.operation) def patch_inner(self, f): """Patch the inner call.""" self.patch(credentials.runner, 'spawn_program', f) def fake_inner(self, args): """Fake the runner.spawn_program.""" self.deferred.callback(args) if self._next_inner_result == credentials.USER_SUCCESS: # fake that tokens were retrieved from the UI self.patch(credentials.Keyring, 'get_credentials', lambda kr, app: defer.succeed(TOKEN)) return defer.succeed(self._next_inner_result) def fail_inner(self, args): """Make the inner call fail.""" return defer.fail(SampleMiscException(args)) def assert_exc_msg_logged(self, exception_class, msg): """Check that 'msg' was logged as part as the logger.exception call.""" for rec in self.memento.records: if rec.exc_info and rec.exc_info[0] == exception_class: self.assertIn(msg, rec.getMessage()) break @defer.inlineCallbacks def test_with_existent_token(self): """The operation returns the credentials if already in keyring.""" self.patch(credentials.Keyring, 'get_credentials', lambda kr, app: defer.succeed(TOKEN)) result = yield self.method_call(**self.kwargs) self.assertEqual(result, TOKEN) self.assertFalse(self.deferred.called, 'No program was spawnned.') @defer.inlineCallbacks def test_without_existent_token_and_return_code_success(self): """The operation returns the credentials gathered by the inner call.""" self.patch(credentials.Keyring, 'get_credentials', lambda kr, app: defer.succeed(None)) self._next_inner_result = credentials.USER_SUCCESS result = yield self.method_call(**self.kwargs) self.assertEqual(result, TOKEN) # the ui was opened and proper params were passed args = yield self.deferred self.assertEqual(self.inner_args, args) @defer.inlineCallbacks def test_ui_executable_fall_back(self): """The executable falls back to the Qt UI if given does not exist.""" self.patch(credentials.Keyring, 'get_credentials', lambda kr, app: defer.succeed(None)) self._next_inner_result = credentials.USER_SUCCESS def get_bin_cmd_raises_if_not_qt(path): """Simulates nonexistence of exes that aren't qt.""" if not path.endswith(credentials.UI_EXECUTABLE_QT): raise OSError() return [os.path.join(self.bin_dir, credentials.UI_EXECUTABLE_QT)] self.patch(credentials, 'get_bin_cmd', get_bin_cmd_raises_if_not_qt) result = yield self.method_call(**self.kwargs) self.assertEqual(result, TOKEN) # the ui was opened and proper params were passed args = yield self.deferred self.inner_args[0] = os.path.join(self.bin_dir, credentials.UI_EXECUTABLE_QT) self.assertEqual(self.inner_args, args) @defer.inlineCallbacks def test_raises_exception_if_no_ui_available(self): """If no GUI is available, raise GUINotAvailableError.""" self.patch(credentials.Keyring, 'get_credentials', lambda kr, app: defer.succeed(None)) def get_bin_cmd_just_raises(*args, **kwargs): """Workaround for lambda: raise.""" raise OSError() self.patch(credentials, 'get_bin_cmd', get_bin_cmd_just_raises) f = self.method_call(**self.kwargs) yield self.assertFailure(f, credentials.GUINotAvailableError) @defer.inlineCallbacks def test_without_existent_token_and_return_code_cancel(self, exc=None): """The operation returns exc if defined, else UserCancellationError.""" self.patch(credentials.Keyring, 'get_credentials', lambda kr, app: defer.succeed(None)) self._next_inner_result = credentials.USER_CANCELLATION if exc is None: exc = credentials.UserCancellationError yield self.assertFailure(self.method_call(**self.kwargs), exc) @defer.inlineCallbacks def test_without_existent_token_and_return_other_code(self, result=None): """The operation returns CredentialsError with 'result'.""" self.patch(credentials.Keyring, 'get_credentials', lambda kr, app: defer.succeed(None)) self._next_inner_result = credentials.USER_CANCELLATION * 2 # other exc = yield self.assertFailure(self.method_call(**self.kwargs), credentials.CredentialsError) if result is None: result = self._next_inner_result self.assertEqual(exc.args, (result,)) @defer.inlineCallbacks def test_with_exception_on_credentials(self): """The operation calls the error callback if a exception occurs.""" self.patch(credentials.Keyring, 'get_credentials', lambda kr, app: defer.fail(SampleMiscException())) yield self.assertFailure(self.method_call(**self.kwargs), SampleMiscException) self.assertTrue(self.memento.check_exception(SampleMiscException)) msg = 'Problem while getting credentials from the keyring' self.assert_exc_msg_logged(SampleMiscException, msg) @defer.inlineCallbacks def test_with_exception_on_inner_call(self): """The operation calls the error callback if a exception occurs.""" self.patch(credentials.Keyring, 'get_credentials', lambda kr, app: defer.succeed(None)) self.patch_inner(self.fail_inner) yield self.assertFailure(self.method_call(**self.kwargs), SampleMiscException) self.assertTrue(self.memento.check_exception(SampleMiscException)) msg = 'Problem while performing %s' % self.operation self.assert_exc_msg_logged(SampleMiscException, msg) class LoginTestCase(RegisterTestCase): """Test suite for the login method.""" operation = 'login' login_only = True class LoginEmailPasswordTestCase(RegisterTestCase): """Test suite for the login_email_password method.""" operation = 'login' login_only = True kwargs = {'email': EMAIL, 'password': PASSWORD} @defer.inlineCallbacks def setUp(self): yield super(LoginEmailPasswordTestCase, self).setUp() self.patch(ubuntu_sso.main, 'SSOLogin', FakedSSOLogin) self.patch_inner(self.fake_inner) self.inner_args = dict(app_name=APP_NAME, email=EMAIL, password=PASSWORD, ping_url=PING_URL) def patch_inner(self, f): """Patch the inner call.""" self.patch(FakedSSOLogin, 'login', f) def fake_inner(self, **kwargs): """Fake the runner.spawn_program.""" self.deferred.callback(kwargs) if self._next_inner_result == credentials.USER_SUCCESS: # fake that tokens were retrieved from the UI self.patch(credentials.Keyring, 'get_credentials', lambda kr, app: defer.succeed(TOKEN)) FakedSSOLogin.proxy.LoggedIn(APP_NAME, EMAIL) elif self._next_inner_result == credentials.USER_CANCELLATION: FakedSSOLogin.proxy.UserNotValidated(APP_NAME, EMAIL) else: FakedSSOLogin.proxy.LoginError(APP_NAME, {'errtype': 'foo'}) def fail_inner(self, **kwargs): """Make the inner call fail.""" raise SampleMiscException(kwargs) def test_ui_executable_fall_back(self): """This check does not apply for this test case.""" def test_ui_executable_uses_qt_ui_if_none_available(self): """This check does not apply for this test case.""" def test_raises_exception_if_no_ui_available(self): """This check does not apply for this test case.""" def test_without_existent_token_and_return_code_cancel(self, exc=None): """The operation returns UserNotValidatedError.""" exc = credentials.UserNotValidatedError return super(LoginEmailPasswordTestCase, self).\ test_without_existent_token_and_return_code_cancel(exc=exc) def test_without_existent_token_and_return_other_code(self, result=None): """The operation returns CredentialsError with 'result'.""" result = 'foo' return super(LoginEmailPasswordTestCase, self).\ test_without_existent_token_and_return_other_code(result=result) ubuntu-sso-client-13.10/ubuntu_sso/tests/linux.py0000664000202700020270000000312512151461656022433 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Copyright 2011 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . """Helpful code for testing on linux.""" from twisted.internet import defer from ubuntuone.devtools.testcases.dbus import DBusTestCase # pylint complains about callables # pylint: disable=E1102 class BaseServiceTestCase(DBusTestCase): """Set the ipc to a random port for this instance.""" client_class = None # the BaseClient instance service_class = None # the BaseService instance @defer.inlineCallbacks def setUp(self): yield super(BaseServiceTestCase, self).setUp() self.service = None self.client = None if self.service_class is not None: self.service = self.service_class() self.client = self.client_class() # pylint: disable=E1102 yield self.service.start() self.addCleanup(self.service.shutdown) yield self.client.connect() self.addCleanup(self.client.disconnect) ubuntu-sso-client-13.10/ubuntu_sso/tests/test_account.py0000664000202700020270000004540512151461656023776 0ustar dobeydobey00000000000000# -*- coding: utf-8 -*- # # Author: Natalia Bidart # Author: Alejandro J. Cura # # Copyright 2010-2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Tests for the SSO account code.""" from __future__ import unicode_literals import os # pylint: disable=W0621,F0401,E0611 try: import urllib.request as url_lib except ImportError: import urllib2 as url_lib # pylint: enable=W0621,F0401,E0611 from twisted.trial.unittest import TestCase from twisted.internet import defer from ubuntu_sso import account from ubuntu_sso.account import ( Account, AuthenticationError, EmailTokenError, InvalidEmailError, InvalidPasswordError, NewPasswordError, SERVICE_URL, RegistrationError, ResetPasswordTokenError, SSO_STATUS_OK, SSO_STATUS_ERROR, ) from ubuntu_sso.tests import ( APP_NAME, CAPTCHA_ID, CAPTCHA_PATH, CAPTCHA_SOLUTION, EMAIL, EMAIL_TOKEN, NAME, PASSWORD, RESET_PASSWORD_TOKEN, TOKEN, TOKEN_NAME, ) from ubuntu_sso.utils import compat CANT_RESET_PASSWORD_CONTENT = "CanNotResetPassowrdError: " \ "Can't reset password for this account" RESET_TOKEN_INVALID_CONTENT = "AuthToken matching query does not exist." EMAIL_ALREADY_REGISTERED = 'a@example.com' STATUS_UNKNOWN = {'status': 'yadda-yadda'} STATUS_ERROR = {'status': SSO_STATUS_ERROR, 'errors': {'something': ['Bla', 'Ble']}} STATUS_OK = {'status': SSO_STATUS_OK} STATUS_EMAIL_UNKNOWN = {'status': 'yadda-yadda'} STATUS_EMAIL_ERROR = {'errors': {'email_token': ['Error1', 'Error2']}} STATUS_EMAIL_OK = {'email': EMAIL} FAKE_NEW_CAPTCHA = { 'image_url': "file://" + compat.text_type(CAPTCHA_PATH), 'captcha_id': CAPTCHA_ID, } class FakeWebClientResponse(object): """A fake webclient.Response.""" content = open(CAPTCHA_PATH, "rb").read() class FakeWebClient(object): """A fake webclient.""" def __init__(self): self.started = True def request(self, url): """Do a fake request, return a fake Response.""" return FakeWebClientResponse() def shutdown(self): """Turn off this webclient.""" self.started = False class FakeRestfulClient(object): """A fake restfulclient.""" preferred_email = EMAIL def __init__(self): self.started = True def shutdown(self): """Stop this restfulclient.""" self.started = False def fake_captchas_new(self): """Return a local fake captcha.""" return FAKE_NEW_CAPTCHA def fake_registration_register(self, email, password, displayname, captcha_id, captcha_solution): """Fake registration. Return a fix result.""" if email == EMAIL_ALREADY_REGISTERED: return {'status': SSO_STATUS_ERROR, 'errors': {'email': 'Email already registered'}} elif captcha_id is None and captcha_solution is None: return STATUS_UNKNOWN elif captcha_id != CAPTCHA_ID or captcha_solution != CAPTCHA_SOLUTION: return STATUS_ERROR else: return STATUS_OK def fake_registration_request_password_reset_token(self, email): """Fake password reset token. Return a fix result.""" if email is None: return STATUS_UNKNOWN elif email != EMAIL: raise account.WebClientError("Misc error", CANT_RESET_PASSWORD_CONTENT) else: return STATUS_OK def fake_registration_set_new_password(self, email, token, new_password): """Fake the setting of new password. Return a fix result.""" if email is None and token is None and new_password is None: return STATUS_UNKNOWN elif email != EMAIL or token != RESET_PASSWORD_TOKEN: raise account.WebClientError("Misc error", RESET_TOKEN_INVALID_CONTENT) else: return STATUS_OK def fake_authentications_authenticate(self, token_name): """Fake authenticate. Return a fix result.""" if not token_name.startswith(TOKEN_NAME): raise account.WebClientError() else: return TOKEN def fake_accounts_validate_email(self, email_token): """Fake the email validation. Return a fix result.""" if email_token is None: return STATUS_EMAIL_UNKNOWN elif email_token == EMAIL_ALREADY_REGISTERED: return { 'status': SSO_STATUS_ERROR, 'errors': {'email': 'Email already registered'} } elif email_token != EMAIL_TOKEN: return STATUS_EMAIL_ERROR else: return STATUS_EMAIL_OK def fake_accounts_me(self): """Fake the 'me' information.""" return {'username': 'Wh46bKY', 'preferred_email': self.preferred_email, 'displayname': '', 'unverified_emails': ['aaaaaa@example.com'], 'verified_emails': [], 'openid_identifier': 'Wh46bKY'} def check_all_kwargs_unicode(self, **kwargs): """Check that the values of all keyword arguments are unicode.""" for (key, value) in kwargs.items(): if isinstance(value, compat.binary_type): raise AssertionError("Error: kwarg '%s' is non-unicode." % key) def restcall(self, method_name, **kwargs): """Fake an async restcall.""" self.check_all_kwargs_unicode(**kwargs) method = getattr(self, "fake_" + method_name.replace(".", "_")) try: return defer.succeed(method(**kwargs)) # pylint: disable=W0703 except Exception as e: return defer.fail(e) class AccountTestCase(TestCase): """Test suite for the SSO login processor.""" @defer.inlineCallbacks def setUp(self): """Set up.""" yield super(AccountTestCase, self).setUp() def fake_urlopen(url): """Fake an urlopen which will read from the disk.""" f = open(url) self.addCleanup(f.close) return f self.patch(url_lib, 'urlopen', fake_urlopen) # fd to the path self.processor = Account() self.register_kwargs = dict(email=EMAIL, password=PASSWORD, displayname=NAME, captcha_id=CAPTCHA_ID, captcha_solution=CAPTCHA_SOLUTION) self.login_kwargs = dict(email=EMAIL, password=PASSWORD, token_name=TOKEN_NAME) self.frc = FakeRestfulClient() self.patch(account.restful, "RestfulClient", lambda *args, **kwargs: self.frc) self.addCleanup(self.verify_frc_shutdown) def verify_frc_shutdown(self): """Verify that the FakeRestfulClient was stopped.""" assert self.frc.started is False, "Restfulclient must be shut down." @defer.inlineCallbacks def test_generate_captcha(self): """Captcha can be generated.""" filename = self.mktemp() self.addCleanup(lambda: os.remove(filename) if os.path.exists(filename) else None) wc = FakeWebClient() self.patch(account.webclient, "webclient_factory", lambda: wc) captcha_id = yield self.processor.generate_captcha(filename) self.assertEqual(CAPTCHA_ID, captcha_id, 'captcha id must be correct.') self.assertTrue(os.path.isfile(filename), '%s must exist.' % filename) with open(CAPTCHA_PATH) as f: expected = f.read() with open(filename) as f: actual = f.read() self.assertEqual(expected, actual, 'captcha image must be correct.') self.assertFalse(wc.started, "Webclient must be shut down.") @defer.inlineCallbacks def test_register_user_checks_valid_email(self): """Email is validated.""" self.register_kwargs['email'] = 'notavalidemail' d = self.processor.register_user(**self.register_kwargs) yield self.assertFailure(d, InvalidEmailError) @defer.inlineCallbacks def test_register_user_checks_valid_password(self): """Password is validated.""" self.register_kwargs['password'] = '' d = self.processor.register_user(**self.register_kwargs) yield self.assertFailure(d, InvalidPasswordError) # 7 chars, one less than expected self.register_kwargs['password'] = 'tesT3it' d = self.processor.register_user(**self.register_kwargs) yield self.assertFailure(d, InvalidPasswordError) self.register_kwargs['password'] = 'test3it!' # no upper case d = self.processor.register_user(**self.register_kwargs) yield self.assertFailure(d, InvalidPasswordError) self.register_kwargs['password'] = 'testIt!!' # no number d = self.processor.register_user(**self.register_kwargs) yield self.assertFailure(d, InvalidPasswordError) # register @defer.inlineCallbacks def test_register_user_if_status_ok(self): """A user is succesfuy registered into the SSO server.""" result = yield self.processor.register_user(**self.register_kwargs) self.assertEqual(EMAIL, result, 'registration was successful.') @defer.inlineCallbacks def test_register_user_if_status_error(self): """Proper error is raised if register fails.""" self.register_kwargs['captcha_id'] = CAPTCHA_ID * 2 # incorrect d = self.processor.register_user(**self.register_kwargs) failure = yield self.assertFailure(d, RegistrationError) for k, val in failure.args[0].items(): self.assertIn(k, STATUS_ERROR['errors']) self.assertEqual(val, "\n".join(STATUS_ERROR['errors'][k])) @defer.inlineCallbacks def test_register_user_if_status_error_with_string_message(self): """Proper error is raised if register fails.""" self.register_kwargs['email'] = EMAIL_ALREADY_REGISTERED d = self.processor.register_user(**self.register_kwargs) failure = yield self.assertFailure(d, RegistrationError) for k, val in failure.args[0].items(): self.assertIn(k, {'email': 'Email already registered'}) self.assertEqual(val, 'Email already registered') @defer.inlineCallbacks def test_register_user_if_status_unknown(self): """Proper error is raised if register returns an unknown status.""" self.register_kwargs['captcha_id'] = None self.register_kwargs['captcha_solution'] = None d = self.processor.register_user(**self.register_kwargs) failure = yield self.assertFailure(d, RegistrationError) self.assertIn('Received unknown status: %s' % STATUS_UNKNOWN, failure) # login @defer.inlineCallbacks def test_login_if_http_error(self): """Proper error is raised if authentication fails.""" # use an invalid token name self.login_kwargs['token_name'] = APP_NAME * 2 d = self.processor.login(**self.login_kwargs) yield self.assertFailure(d, AuthenticationError) @defer.inlineCallbacks def test_login_if_no_error(self): """A user can be succesfully logged in into the SSO service.""" result = yield self.processor.login(**self.login_kwargs) self.assertEqual(TOKEN, result, 'authentication was successful.') # is_validated @defer.inlineCallbacks def test_is_validated(self): """If preferred email is not None, user is validated.""" result = yield self.processor.is_validated(token=TOKEN) self.assertTrue(result, 'user must be validated.') @defer.inlineCallbacks def test_is_not_validated(self): """If preferred email is None, user is not validated.""" self.frc.preferred_email = None result = yield self.processor.is_validated(token=TOKEN) self.assertFalse(result, 'user must not be validated.') @defer.inlineCallbacks def test_is_not_validated_empty_result(self): """If preferred email is None, user is not validated.""" self.patch(self.frc, "fake_accounts_me", lambda *args: {}) result = yield self.processor.is_validated(token=TOKEN) self.assertFalse(result, 'user must not be validated.') # validate_email @defer.inlineCallbacks def test_validate_email_if_status_ok(self): """A email is succesfuy validated in the SSO server.""" self.login_kwargs['email_token'] = EMAIL_TOKEN # valid email token result = yield self.processor.validate_email(**self.login_kwargs) self.assertEqual(TOKEN, result, 'email validation was successful.') @defer.inlineCallbacks def test_validate_email_if_status_error(self): """Proper error is raised if email validation fails.""" self.login_kwargs['email_token'] = EMAIL_TOKEN * 2 # invalid token d = self.processor.validate_email(**self.login_kwargs) failure = yield self.assertFailure(d, EmailTokenError) for k, val in failure.args[0].items(): self.assertIn(k, STATUS_EMAIL_ERROR['errors']) self.assertEqual(val, "\n".join(STATUS_EMAIL_ERROR['errors'][k])) @defer.inlineCallbacks def test_validate_email_if_status_error_with_string_message(self): """Proper error is raised if register fails.""" self.login_kwargs['email_token'] = EMAIL_ALREADY_REGISTERED d = self.processor.validate_email(**self.login_kwargs) failure = yield self.assertFailure(d, EmailTokenError) for k, val in failure.args[0].items(): self.assertIn(k, {'email': 'Email already registered'}) self.assertEqual(val, 'Email already registered') @defer.inlineCallbacks def test_validate_email_if_status_unknown(self): """Proper error is raised if email validation returns unknown.""" self.login_kwargs['email_token'] = None d = self.processor.validate_email(**self.login_kwargs) failure = yield self.assertFailure(d, EmailTokenError) self.assertIn('Received invalid reply: %s' % STATUS_UNKNOWN, failure) # reset_password @defer.inlineCallbacks def test_request_password_reset_token_if_status_ok(self): """A reset password token is succesfuly sent.""" result = yield self.processor.request_password_reset_token(email=EMAIL) self.assertEqual(EMAIL, result, 'password reset token must be successful.') @defer.inlineCallbacks def test_request_password_reset_token_if_http_error(self): """Proper error is raised if password token request fails.""" d = self.processor.request_password_reset_token(email=EMAIL * 2) exc = yield self.assertFailure(d, ResetPasswordTokenError) self.assertIn(CANT_RESET_PASSWORD_CONTENT, exc) @defer.inlineCallbacks def test_request_password_reset_token_if_status_unknown(self): """Proper error is raised if password token request returns unknown.""" d = self.processor.request_password_reset_token(email=None) exc = yield self.assertFailure(d, ResetPasswordTokenError) self.assertIn('Received invalid reply: %s' % STATUS_UNKNOWN, exc) @defer.inlineCallbacks def test_set_new_password_if_status_ok(self): """A new password is succesfuy set.""" result = yield self.processor.set_new_password(email=EMAIL, token=RESET_PASSWORD_TOKEN, new_password=PASSWORD) self.assertEqual(EMAIL, result, 'new password must be set successfully.') @defer.inlineCallbacks def test_set_new_password_if_http_error(self): """Proper error is raised if setting a new password fails.""" d = self.processor.set_new_password(email=EMAIL * 2, token=RESET_PASSWORD_TOKEN * 2, new_password=PASSWORD) exc = yield self.assertFailure(d, NewPasswordError) self.assertIn(RESET_TOKEN_INVALID_CONTENT, exc) @defer.inlineCallbacks def test_set_new_password_if_status_unknown(self): """Proper error is raised if setting a new password returns unknown.""" d = self.processor.set_new_password(email=None, token=None, new_password=None) exc = yield self.assertFailure(d, NewPasswordError) self.assertIn('Received invalid reply: %s' % STATUS_UNKNOWN, exc) class EnvironOverridesTestCase(TestCase): """Some URLs can be set from the environment for testing/QA purposes.""" def test_override_service_url(self): """The service url can be set from the env var USSOC_SERVICE_URL.""" fake_url = 'this is not really a URL, but ends with slash: /' old_url = os.environ.get('USSOC_SERVICE_URL') os.environ['USSOC_SERVICE_URL'] = fake_url try: proc = Account() self.assertEqual(proc.service_url, fake_url) finally: if old_url: os.environ['USSOC_SERVICE_URL'] = old_url else: del os.environ['USSOC_SERVICE_URL'] def test_no_override_service_url(self): """If the environ is unset, the default service url is used.""" proc = Account() self.assertEqual(proc.service_url, SERVICE_URL) def test_service_url_as_parameter(self): """If the parameter service url is given, is used.""" expected = 'http://foo/bar/baz/' proc = Account(service_url=expected) self.assertEqual(proc.service_url, expected) ubuntu-sso-client-13.10/pylintrc0000664000202700020270000002156612151461656017152 0ustar dobeydobey00000000000000# lint Python modules using external checkers. # # This is the main checker controlling the other ones and the reports # generation. It is itself both a raw checker and an astng checker in order # to: # * handle message activation / deactivation at the module level # * handle some basic but necessary stats'data (number of classes, methods...) # [MASTER] # Specify a configuration file. #rcfile= # Python code to execute, usually for sys.path manipulation such as # pygtk.require(). #init-hook= # Profiled execution. profile=no # Add to the black list. It should be a base name, not a # path. You may set this option multiple times. #ignore=qt # Pickle collected data for later comparisons. persistent=no # List of plugins (as comma separated values of python modules names) to load, # usually to register additional checkers. load-plugins= [MESSAGES CONTROL] # Enable only checker(s) with the given id(s). This option conflicts with the # disable-checker option #enable-checker= # Enable all checker(s) except those with the given id(s). This option # conflicts with the enable-checker option #disable-checker= # Enable all messages in the listed categories. #enable-cat= # Disable all messages in the listed categories. #disable-cat= # Disable the message(s) with the given id(s) or categories # W0142: Used * or ** magic # W0613: Unused argument 'yyy' # C0302: Too many lines in module # W0404: Reimport of module disable=R,I,W0142,W0613,C0302,W0404 [REPORTS] # Set the output format. Available formats are text, parseable, colorized, msvs # (visual studio) and html output-format=text # Include message's id in output include-ids=yes # Put messages in a separate file for each module / package specified on the # command line instead of printing them on stdout. Reports (if any) will be # written in a file name "pylint_global.[txt|html]". files-output=no # Tells whether to display a full report or only the messages reports=no # Python expression which should return a note less than 10 (10 is the highest # note). You have access to the variables errors warning, statement which # respectively contain the number of errors / warnings messages and the total # number of statements analyzed. This is used by the global evaluation report # (R0004). evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10) # Add a comment according to your evaluation note. This is used by the global # evaluation report (R0004). comment=no # Enable the report(s) with the given id(s). #enable-report= # Disable the report(s) with the given id(s). #disable-report= # try to find bugs in the code using type inference # [TYPECHECK] # Tells whether missing members accessed in mixin class should be ignored. A # mixin class is detected if its name ends with "mixin" (case insensitive). ignore-mixin-members=yes # List of classes names for which member attributes should not be checked # (useful for classes with attributes dynamically set). ignored-classes= # When zope mode is activated, add a predefined set of Zope acquired attributes # to generated-members. zope=no # List of members which are set dynamically and missed by pylint inference # system, and so shouldn't trigger E0201 when accessed. generated-members=REQUEST,acl_users,aq_parent # checks for # * unused variables / imports # * undefined variables # * redefinition of variable from builtins or from an outer scope # * use of variable before assignment # [VARIABLES] # Tells whether we should check for unused import in __init__ files. init-import=yes # A regular expression matching names used for dummy variables (i.e. not used). dummy-variables-rgx=_|dummy # List of additional names supposed to be defined in builtins. Remember that # you should avoid to define new builtins when possible. additional-builtins= # checks for : # * doc strings # * modules / classes / functions / methods / arguments / variables name # * number of arguments, local variables, branches, returns and statements in # functions, methods # * required module attributes # * dangerous default values as arguments # * redefinition of function / method / class # * uses of the global statement # [BASIC] # Required attributes for module, separated by a comma required-attributes= # Regular expression which should only match functions or classes name which do # not require a docstring no-docstring-rgx=(__.*__|setUp|tearDown) # Regular expression which should only match correct module names module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$ # Regular expression which should only match correct module level names const-rgx=(([A-Z_][A-Z0-9_]*)|(__.*__))$ # Regular expression which should only match correct class names class-rgx=[A-Z_][a-zA-Z0-9]+$ # Regular expression which should only match correct function names function-rgx=[a-z_][a-z0-9_]{2,79}$ # Regular expression which should only match correct method names method-rgx=([a-z_][a-z0-9_]{2,79}$|setUp|tearDown) # Regular expression which should only match correct instance attribute names attr-rgx=[a-z_][a-z0-9_]{1,30}$ # Regular expression which should only match correct argument names argument-rgx=[a-z_][a-z0-9_]{1,30}$ # Regular expression which should only match correct variable names variable-rgx=[a-z_][a-z0-9_]{1,30}$ # Regular expression which should only match correct list comprehension / # generator expression variable names inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$ # Good variable names which should always be accepted, separated by a comma good-names=d,e,f,g,i,j,k,ex,logger,Run,_ # Bad variable names which should always be refused, separated by a comma bad-names=foo,bar,baz,toto,tutu,tata # List of builtins function names that should not be used, separated by a comma bad-functions=apply,input # checks for sign of poor/misdesign: # * number of methods, attributes, local variables... # * size, complexity of functions, methods # [DESIGN] # Maximum number of arguments for function / method max-args=5 # Maximum number of locals for function / method body max-locals=15 # Maximum number of return / yield for function / method body max-returns=6 # Maximum number of branch for function / method body max-branchs=12 # Maximum number of statements in function / method body max-statements=50 # Maximum number of parents for a class (see R0901). max-parents=7 # Maximum number of attributes for a class (see R0902). max-attributes=7 # Minimum number of public methods for a class (see R0903). min-public-methods=2 # Maximum number of public methods for a class (see R0904). max-public-methods=20 # checks for : # * methods without self as first argument # * overridden methods signature # * access only to existent members via self # * attributes not defined in the __init__ method # * supported interfaces implementation # * unreachable code # [CLASSES] # List of interface methods to ignore, separated by a comma. This is used for # instance to not check methods defines in Zopes Interface base class. #ignore-iface-methods=isImplementedBy,deferred,extends,names,namesAndDescriptions,queryDescriptionFor,getBases,getDescriptionFor,getDoc,getName,getTaggedValue,getTaggedValueTags,isEqualOrExtendedBy,setTaggedValue,isImplementedByInstancesOf,adaptWith,is_implemented_by,providedBy # List of method names used to declare (i.e. assign) instance attributes. defining-attr-methods=__init__,__new__,setUp # checks for # * external modules dependencies # * relative / wildcard imports # * cyclic imports # * uses of deprecated modules # [IMPORTS] # Deprecated modules which should not be used, separated by a comma deprecated-modules=regsub,string,TERMIOS,Bastion,rexec # Create a graph of every (i.e. internal and external) dependencies in the # given file (report RP0402 must not be disabled) import-graph= # Create a graph of external dependencies in the given file (report RP0402 must # not be disabled) ext-import-graph= # Create a graph of internal dependencies in the given file (report RP0402 must # not be disabled) int-import-graph= # checks for : # * unauthorized constructions # * strict indentation # * line length # * use of <> instead of != # [FORMAT] # Maximum number of characters on a single line. max-line-length=79 # Maximum number of lines in a module max-module-lines=2000 # String used as indentation unit. This is usually " " (4 spaces) or "\t" (1 # tab). indent-string=' ' # checks for similarities and duplicated code. This computation may be # memory / CPU intensive, so you should disable it if you experiments some # problems. # [SIMILARITIES] # Minimum lines number of a similarity. min-similarity-lines=4 # Ignore comments when computing similarities. ignore-comments=yes # Ignore docstrings when computing similarities. ignore-docstrings=yes # checks for: # * warning notes in the code like FIXME, XXX # * PEP 263: source code with non ascii character but no encoding declaration # [MISCELLANEOUS] # List of note tags to take in consideration, separated by a comma. notes=FIXME,XXX,TODO,fixme,xxx,todo ubuntu-sso-client-13.10/COPYING0000664000202700020270000010451312151461656016410 0ustar dobeydobey00000000000000 GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . ubuntu-sso-client-13.10/bin/0000755000202700020270000000000012225013301016075 5ustar dobeydobey00000000000000ubuntu-sso-client-13.10/bin/ubuntu-sso-login0000775000202700020270000000534612151461656021311 0ustar dobeydobey00000000000000#!/usr/bin/python # -*- coding: utf-8 -*- # # Copyright 2009-2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Start the sso service.""" # Invalid name "ubuntu-sso-login", pylint: disable=C0103 # import decimal even if we don't need it, pylint: disable=W0611 import decimal assert(decimal) # This is a workaround for LP: #467397. Some module in our depency chain sets # the locale and imports decimal, and that generates the following trace: # Traceback (most recent call last): # File "/usr/lib/ubuntu-sso-client/ubuntu-sso-login", line 33 # from ubuntu_sso.main import SSOLogin # File "/usr/lib/pymodules/python2.6/ubuntu_sso/main.py", line 42 # from lazr.restfulclient.resource import ServiceRoot # File "/usr/lib/python2.6/dist-packages/lazr/restfulclient/resource.py", # line 34 # import simplejson # File "/usr/lib/pymodules/python2.6/simplejson/__init__.py", line 109 # from decimal import Decimal # File "/usr/lib/python2.6/decimal.py", line 3649, in # val = globals()[globalname] # KeyError: 'ROUND_CEiLiNG' import os import sys if sys.platform in ('win32', 'darwin'): from PyQt4 import QtGui # need to create the QApplication before installing the reactor if os.environ.get('TESTABILITY', False): sys.argv.append('-testability') app = QtGui.QApplication(sys.argv) # pylint: disable=F0401 import qt4reactor qt4reactor.install() from ubuntu_sso.main import main if __name__ == "__main__": main() ubuntu-sso-client-13.10/bin/ubuntu-sso-ssl-certificate-qt0000775000202700020270000000303212151461656023672 0ustar dobeydobey00000000000000#!/usr/bin/python # -*- coding: utf-8 -*- # # Copyright 2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Start the QT proxy creds dialog.""" # Invalid name, pylint: disable=C0103 from ubuntu_sso.qt.ssl_dialog import main if __name__ == "__main__": main() ubuntu-sso-client-13.10/bin/ubuntu-sso-proxy-creds-qt0000775000202700020270000000331612151461656023075 0ustar dobeydobey00000000000000#!/usr/bin/python # -*- coding: utf-8 -*- # # Copyright 2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Start the QT proxy creds dialog.""" # Invalid name, pylint: disable=C0103 import sys if sys.platform.startswith('linux'): # set the dbus main loop to be used from dbus.mainloop.qt import DBusQtMainLoop DBusQtMainLoop(set_as_default=True) from ubuntu_sso.qt.proxy_dialog import main if __name__ == "__main__": main() ubuntu-sso-client-13.10/bin/ubuntu-sso-login-qt0000775000202700020270000000353012151461656021724 0ustar dobeydobey00000000000000#!/usr/bin/python # -*- coding: utf-8 -*- # # Copyright 2012 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the # OpenSSL library under certain conditions as described in each # individual source file, and distribute linked combinations # including the two. # You must obey the GNU General Public License in all respects # for all of the code used other than OpenSSL. If you modify # file(s) with this exception, you may extend this exception to your # version of the file(s), but you are not obligated to do so. If you # do not wish to do so, delete this exception statement from your # version. If you delete this exception statement from all source # files in the program, then also delete it here. """Start the sso Qt UI.""" # Invalid name "ubuntu-sso-login-qt", pylint: disable=C0103 # Access to a protected member, pylint: disable=W0212 import sys if sys.platform in ('win32', 'darwin'): from PyQt4 import QtGui app = QtGui.QApplication(sys.argv) import qt4reactor qt4reactor.install() from ubuntu_sso.qt.main import main from ubuntu_sso.utils.ui import parse_args if __name__ == "__main__": args = parse_args() main(**dict(args._get_kwargs())) ubuntu-sso-client-13.10/run-tests.bat0000664000202700020270000000744012151461656020012 0ustar dobeydobey00000000000000:: Copyright 2010-12 Canonical Ltd. :: :: This program is free software: you can redistribute it and/or modify it :: under the terms of the GNU General Public License version 3, as published :: by the Free Software Foundation. :: :: This program is distributed in the hope that it will be useful, but :: WITHOUT ANY WARRANTY; without even the implied warranties of :: MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR :: PURPOSE. See the GNU General Public License for more details. :: :: You should have received a copy of the GNU General Public License along :: with this program. If not, see . :: :: In addition, as a special exception, the copyright holders give :: permission to link the code of portions of this program with the :: OpenSSL library under certain conditions as described in each :: individual source file, and distribute linked combinations :: including the two. :: You must obey the GNU General Public License in all respects :: for all of the code used other than OpenSSL. If you modify :: file(s) with this exception, you may extend this exception to your :: version of the file(s), but you are not obligated to do so. If you :: do not wish to do so, delete this exception statement from your :: version. If you delete this exception statement from all source :: files in the program, then also delete it here. @ECHO off SET PYTHONEXEPATH="" set PYTHONPATH=%PYTHONPATH%;. ECHO Checking for Python on the path :: Look for Python from buildout FOR %%A in (python.exe) do (SET PYTHONEXEPATH=%%~$PATH:A) FOR %%B in (u1trial.exe) do (SET TRIALPATH=%%~$PATH:B) FOR %%C in (u1lint.exe) do (SET LINTPATH=%%~$PATH:C) FOR %%D in (pep8.exe) do (SET PEP8PATH=%%~$PATH:D) IF NOT "%PYTHONEXEPATH%" == "" GOTO :PYTHONPRESENT ECHO Please ensure you have python installed GOTO :END :PYTHONPRESENT :: throw the first parameter away if is /skip-lint, :: the way we do this is to ensure that /skip-lint :: is the first parameter and copy all the rest in a loop :: the main reason for that is that %* is not affected :: by SHIFT, that is, it allways have all passed parameters SET PARAMS=%* SET SKIPLINT=0 IF "%1" == "/skip-lint" ( SET SKIPLINT=1 GOTO :CLEANPARAMS )ELSE ( GOTO :CONTINUEBATCH) :CLEANPARAMS SHIFT SET PARAMS=%1 :GETREST SHIFT if [%1]==[] ( GOTO CONTINUEBATCH) SET PARAMS=%PARAMS% %1 GOTO GETREST :CONTINUEBATCH ECHO Python found at %PYTHONEXEPATH%, building auto-generated modules... :: call setup.py build so that the qt uic is called ::START "Build code" /D%CD% /WAIT "%PYTHONEXEPATH%\python.exe" setup.py build "%PYTHONEXEPATH%" setup.py build ECHO Running tests :: execute the tests with a number of ignored linux only modules "%TRIALPATH%" -i "test_darwin.py, test_linux.py, test_txsecrets.py, test_qt.py, test_glib.py" --reactor=qt4 --gui %PARAMS% ubuntu_sso :: Clean the build from the setupt.py ECHO Cleaning the generated code before running the style checks... "%PYTHONEXEPATH%" setup.py clean IF %SKIPLINT% == 1 ( ECHO Skipping style checks GOTO :CLEAN) ECHO Performing style checks... SET IGNORE_LINT="ubuntu_sso\networkstate\linux.py,ubuntu_sso\main\linux.py,ubuntu_sso\main\tests\test_linux.py,ubuntu_sso\utils\txsecrets.py,ubuntu_sso\utils\tests\test_txsecrets.py,ubuntu_sso\tests\bin,bin\ubuntu-sso-login" SET USE_PYFLAKES=1 "%LINTPATH%" -i "%IGNORE_LINT%" ubuntu_sso :: test for style if we can, if pep8 is not present, move to the end ECHO Running PEP-8 Check... SET PEP8CMD="%PEP8PATH% --exclude .bzr,.pc,build --ignore=E126,E127,E128" FOR %%P in (bin\*) DO "%PEP8CMD%" "%%P" "%PEP8CMD%" . :CLEAN IF EXIST \.coverage RMDIR /s /q \.coverage :: Delete the temp folders IF "%TRIAL_TEMP_DIR%" == "" GOTO :TRIALTEMPEXISTS IF EXIST _trial_temp RMDIR /s /q _trial_temp :TRIALTEMPEXISTS IF EXIST "%TRIAL_TEMP_DIR%" RMDIR /s /q "%TRIAL_TEMP_DIR%" :END